数据库基础篇(二)—— SQL之数据查询

数据库基础篇(二)—— SQL之数据查询,第1张

接下来,我们将使用员工相关的四张样本数据表,来学习SQL,建议你在学习过程中多动手练习,理解才会更深刻。表和字段含义,如下图:

如何利用SQL语句来 *** 作以上数据呢?我们必须将样本数据导入MySQL客户端(如:Navicat)中。可以在客户端 *** 作数据,或者在终端窗口。工作中经常在客户端 *** 作,所以本文所有SQL语句将在Navicat中学习。

首先将sql脚本保存到桌面(获取方式:关注"Python之每日一课"公众号,后来回复"sql基础数据",即可。),导入SQL脚本的具体 *** 作流程如下:

现在数据准备完成。这里是导入sql脚本;导出同理,选择”转储SQL“文件。当然了,Navicat也支持将当前表或查询结果导出Excel、CSV等文件类型。

下面可以写SQL语句了(每个sql脚本可以保存,下次直接使用),如下:

类似于Python中 :print(要打印的东西)

①通过select查询完的结果 ,是一个虚拟的表格,不是真实存在

② 要查询的东西 可以是常量值、表达式、字段、也可以是函数

补充:可以给字段起别名,好处是提高可读性,更方便理解;多表连接时,区分字段。用AS 或 空格来实现。如下:

2、 条件查询

条件查询:根据条件过滤原始表的数据,查询到想要的数据

1)语法

2)分类

①条件表达式

②逻辑表达式

③模糊查询

⭐ 注意:where 一定要放到 from 后面。NULL 不是假,也不是真,而是"空";任何运算符,判断符碰到NULL,都得NULL;NULL的判断只能用is null,is not null;NULL 影响查询速度,一般避免使值为NULL。exists查询可以与in型子查询互换,它们之间区别以后语句优化时会详细讲解。

3、 排序查询

1)语法

2)举栗

⭐ 注意:order by 一定要放到 语句最后(limit前面)

4、分组查询

1)语法

2)特点

①可以按单个字段分组

②和分组函数一同查询的字段最好是分组后的字段

③分组筛选(where 和 having区别)

④可以按多个字段分组,字段之间用逗号隔开

⑤可以支持排序

⑥having后可以支持别名

3)举栗

⭐ 注意:关键字顺序是where —>group by—>having—>order by—>limit( having不能单独使用,需结合group by ,表示对分组后的结果进行筛选;而 group by 必须结合分组聚合函数一起使用 ,比如:count()、max()等)

5、 常见函数

1)单行函数

2)分组函数

3)分组函数特点

①以上五个分组函数都忽略null值,除了count()

②sum和avg一般处理数值型,max、min、count可以处理任何数据类型

③都可以搭配distinct使用,用于统计去重后的结果

④count的参数可以支持:字段、、常量值,一般放1

6、连接查询(多表查询)

单个表不能满足需求时,需要结合多张表,去除有关联的数据。这时就需要用连接查询,连接查询有三种,通常join使用的最多。

①等值连接的结果 = 多个表的交集

②多个表不分主次,没有顺序要求

③一般为表起别名,提高阅读性和性能

①语法

②好处

语句上,连接条件和筛选条件实现了分离,简洁。

⭐ 注意:左右连接可互换 A left join B 等价于B right join A;内连接是左</pre>

右连接的交集;mysql没有外连接。

自连接相当于等值连接,但是等值连接涉及多个表,而自连接仅仅是它自己。如下:在员工信息表里,查询员工名和直接上级的名。

7、子查询

一条查询语句中又嵌套了另一条完整的select语句,其中被嵌套的select语句,称为子查询或内查询。在外面的查询语句,称为主查询或外查询。

①子查询都放在小括号内

②子查询可以放在from后面、select后面、where后面、having后面,但一般放在条件的右侧

③子查询优先于主查询执行,主查询使用了子查询的执行结果

④子查询根据查询结果的行数不同分为以下两类:

2)举栗

8、分页查询 (可选)

实际web开发中,当显示的数据,一页显示不完时,需要分页提交sql请求。

2)特点

①起始条目索引默认从0开始

②limit子句放在查询语句的最后

③公式:select from 表 limit (page-1)sizePerPage,

3)举栗

9、union联合查询

union用于把涉及多个表的SELECT语句的结果组合到一个结果集合中。适用于查询条件较多,多个表之间没有连接关系的场景。</pre>

2)特点

①多条查询语句的查询的列数必须是一致的

②多条查询语句的查询的列的类型几乎相同

③union 代表去重,union all 代表不去重

3)举栗

UNION 和 UNION ALL 运行结果的区别如下:

⭐ 注意:在多个 SELECT 语句中,第一个 SELECT 语句中被使用的字段名称将被用于结果的字段名称。当使用 UNION 时,MySQL 会把结果集中重复的记录删掉,而使用 UNION ALL ,MySQL 会把所有的记录返回,且效率高于 UNION

好,今天学习到这里。工作中用的最多就是查询。如果能消化本文涉及到的所有内容,大概能解决80%的工作需求。本文更多的是原理介绍,例子不多,只有先知道是什么,才能知道怎么学。那么,接下来最重要的是要多练习实践。因为实际的业务场景要复杂很多,给大家推荐两个刷题的网站,力扣和牛客网,里面有大量的sql面试题。能进一步提高我们sql的水平。这篇文章主要是SQL的常用查询。明天继续学习SQL的DML增删改。一起加油!

第6章

一、选择题

1C 2A 3A 4C 5A 6C 7C 8B 9A 10C 11B 12B 13C 14D 15B

二、填空题

1文件管理阶段数据库系统管理阶段

2相互区别实体集

3域

4关系

5数据结构数据 *** 纵数据完整性约束

6外模式模式内模式

7模式

8内模式

9外模式

第7章

一、选择题

1A 2C 3B 4B 5D 6A 7D 8C 9D 10B

二、填空题

1 矩形  椭圆  菱形  数字

2 第一

3 命名属性结构

4 参照

5 学号

第8章

一、选择题

1 D 2C 3A 4B 5D

二、填空题

1数据定义数据 *** 纵数据控制

2非过程化集合

3结构化查询语句 Structured Query Language

4不能

5select@变量名或select@@变量名

第9章

一、选择题

1A 2A 3B 4C 5D 6D 7B 8A

二、填空题

1一多多

2alter database

3dbcc shrinkfile

4将数据库userdb缩小到原来的30%

5drop database

第10章

选择题

1C 2D 3D 4B 5C

二、填空题

1可以重名

299999999

3无

4alter table

5primary key   unique   foreign key   check   default

6聚集索引非聚集索引

第11章

一、选择题

1B 2C 3A 4A 5C 6B

二、填空题

1distinct

2desc

3匹配多个字符匹配单个字符

4order by

5group by

第13章

选择题

1A 2D 3A 4C 5C

二、填空题

1子模式基本表视图

2alter view   drop view

第14章

选择题

1A 2D

二、填空题

1正确性相容性

2create rule

3sp_bind rule

4drop rule

第15章

选择题

1A 2C 3D 4A

二、填空题

1alter procedure

2@参数名

3exec[ute]<过程名>

4insert  update  delete

5deleted

6inserted

7deleted

>

首先你要理解SQL并写一个SQL的编译器。本来tokenizer和parser两部分就可以够程序员撕逼了,你还需要写一个你不知道文法(别看了,那书里绝对没有文法)的编译器。这块如果你没学过编译原理,我很好奇你需要怎么实现,甚至怎么寻找或设计文法到实现编译器的前端。

第二,你需要了解关系模型,并实现关系模型的存储。你需要对数据结构,其中最核心的是B+树索引和Hash索引,重点是实现他们在磁盘上的版本。由于磁盘的存储方式和内存不一样,你需要针对磁盘的存储进行特殊的处理。

第三,你需要实现查询引擎。查询引擎的原理是将SQL转换成一系列关系代数 *** 作符组成的 *** 作树。之前你已经实现了这个查询引擎,也就是SQL编译器的前端。现在你需要理解关系代数,并实现关系代数 *** 作符。并实现一个类似于解释器,或者叫调度器的工具,将关系 *** 作树给依次执行。其中关系代数 *** 作符里最麻烦的就是join *** 作,因为join *** 作有好几种join算法。如果需要的话,你还需要实现查询优化引擎。查询优化引擎姑且算是一个抽象的黑盒子,里面需要用到一些启发式的高级算法,需要你对动态规划和树遍历等等算法有了解。同时在cost estimation的部分需要从历史数据中估算cost,往大了说还是统计学和机器学习呢。

第四,你需要实现事务和恢复(回滚)机制,这是数据库最重要的功能之一。事务的话需要各种锁的机制实现,而回滚需要有完善的日志系统。这两部分需要大量的工作量和对 *** 作系统有深入的了解。

第五,你最好还要实现一个api。这就是把socket通信封个包的苦力了。

我很好奇150天中你要各分配给上面的东西多少天。举个例子,阿里一堆“大神”做oceanbase,当然transaction和存储复杂多了,用了四年。今年图灵奖得主michael stonebraker的学生做的voltdb的原型,接近十个人做一年。

我本科并没有实现一个数据库就毕业了。当时也是看着大神们说什么撸一个数据库感到各种膜拜。现在我回过头来反思,一个人撸一个数据库到底是不是一件很有意义的事情,而且也完不成。几个人一起分工各做一部分姑且能勉强完成任务。诚然,如上文所讲,还不完全(我没撸过数据库,所以上面讲的并不能如数家珍),数据库作为一个计算机软件是包含了计算机科学里许多模块的一个十分综合的软件系统。对数据库的学习可以延展到对算法与数据结构,编译器,计算理论, *** 作系统等等方方面面的学习,是非常好的一件事。同时做一个数据库一定需要对这些多方面的知识有着十分详细的了解才能做到游刃有余。这些绝对不是,也没必要是,一个大学低年级同学应该做到的。甚至不是大部分工程师应该做到的。因为工程师的业务绝大部分人涉及不到这么多方面,尤其是编译器部分。

以上就是关于数据库基础篇(二)—— SQL之数据查询全部的内容,包括:数据库基础篇(二)—— SQL之数据查询、求《数据库原理与应用》第二版课后习题答案!!!、大学生如何实现一个数据库等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/9503166.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-29
下一篇2023-04-29

发表评论

登录后才能评论

评论列表(0条)

    保存