1、初级 SQL 开发指南Select 语句概要数据库中数据的提取(查询)使用 select 语法,主要有以下几点作用 提取的数据(搜索) 提取的数据进行排序(排序) 执行计算或汇总Select 文表达方法SQL 文处理 Select 语句顺序步骤我们将说明数据库在处理查询的时候,不同阶段都会产生中间结果表.这些产生出来的中间结果表都是在数据库后台运行的我们无法观察到.我们最终看到的数据就是最后的中间结果表.从句 from 从数据库中检索出来第一个中间结果表开始,到 select 从句结束.分为以下几步1 通过 from 关键字将要查询的表中的所有数据读取到中间结果表。 (包括表中所有数据行与列,
2、行数不变,列数不变)2 在 where 关键字后面加上要读取数据的条件,生成一个新的中间结果表。3 如果业务需要分组,可以通过 Group by 将视图进行分组,在次生成一个新的中间结果表。4 使用 having 关键字为分组后的逻辑视图进行条件筛选,来生成一个中间结果表。5 通过 select 语句在最终的中间结果表中选择列。From 指定查询的表having 分组条件select 选择列Where 选择满足条件的行Group by 分组Select 列名 1,列名 2 查询要显示的列结果From 表名 数据库中表名Where 查询条件 条件表达式查询数据时,数据库后台中间结果表变化过程我们
3、将从数据库在执行 SQL 查询计划的时候,数据库内部的变化与运行的原理来理解 SQL 语句执行过程.(数据库中分为 2 种视图,1 为物理视图通过 create view 语句创建,2 为逻辑视图,就是我们提到的中间结果表)(人员信息表)编号 名称 部门 职务 年龄 性别 电话122 李晶晶 人力 职员 26 女 2234555123 张金 人力 职员 29 男 3322123124 王力 机材 经理 35 男 2245553125 李心 机材 职员 21 女 3332233例:给出所有职务为职员的用户名称,部门,电话.步骤一 执行 from 表名称 (人员信息表),数据库会在(人员信息表)表
4、中进行一个全表扫描,将所有表信息放入一个逻辑视图中, 逻辑视图包括表中的全部的行于列的数据.步骤一 产生的中间结果表122 李晶晶 人力 职员 26 女 2234555123 张金 人力 职员 29 男 3322123124 王力 机材 经理 35 男 2245553125 李心 机材 职员 21 女 3332233步骤二 通过 where 职务=职员 的判断条件将步骤一中产生的逻辑视图的数据进行过滤,将满足条件的行产成一个新的逻辑视图.步骤二 产生的中间结果表122 李晶晶 人力 职员 26 女 2234555123 张金 人力 职员 29 男 3322123125 李心 机材 职员 21
5、女 3332233步骤三 通过 select 名称,部门,电话 语句把步骤二的逻辑视图中,名称,部门,电话列的数据取出生成一个新视图.select 语句指定那些列必须出现在最终逻辑视图中.步骤三 产生的中间结果表李晶晶 人力 2234555张金 人力 3322123李心 机材 3332233步骤四 将产生的逻辑视图发送到客户端.完成本次 SQL 查询计划.SQL 编写顺序与逻辑视图生成过程.多表信息查询表达方法当多个表进行联合查询的时候,会发生一张表(A)中的数据行乘以别一张表(B)中的数据行,也就是 A*B=所有查询数据.该结果产生的合并表数据被我们称为笛卡儿积.通常笛卡儿积会产生很多重复行
6、的数据,我们要使用连接条件也就是 A 表和 B 表中指定的连接列来过滤掉重复和多余的笛卡儿积.1 通过 from 关键字后的表名称,到数据库中将表 A 和表 B 两个表中所有表数据取出到两个对应的中间结果表中.2 数据库会将两个中间结果表合成一个中间结果表,而生成的这个中间结果表就是我们说的笛卡儿积.它的数据内容就是 A 表的中间结果*B 表的中间结果.为A*B 的数学关系3 在笛卡儿积中间结果表中通过 where 关键字选择符合列连接条件或者满足条件的行,将符合条件的行再生成一个中间结果表.4 在中间结果表中通过 select 关键字选择列,生成最终中间结果表,把它传给客户端.Select
7、名称,部门,电话 步骤三 生成最终逻辑视图From 员工信息表 步骤一 生成全表逻辑视图Where 职务=职员 步骤二 生成符合条件的逻辑视图Select 表 1.列名, 表 2.列名 选择要表示的列From 表 1, 表 2 要合并查询的表Where 表 1.ID1=表 2.ID1 多表连接条件A 表 B 表笛卡儿积A*B 中间结果表WHERE 选择符合条件的行,生成中间结果表SELECT 选择列生成最终结果多表合并查询时数据库后台中间结果表变化过程(人员信息表)编号 名称 部门 ID 年龄 性别 电话122 李晶晶 1 26 女 2234555123 张金 1 29 男 332212312
8、4 王力 2 35 男 2245553125 李心 3 21 女 3332233( 部门信息表)部门 ID 部门名称 部门简称1 人力资源部 人力2 运行维护部 运维3 财务部 财务例:查询部门简称为财务的人员信息,信息包括人员名称,部门简称, 部门名称,性别,电话步骤一 执行 from 人员信息表,部门信息表.数据库对(人员信息表), ( 部门信息表)2 张表进行一个全表扫描.然后将 2 个表的数据生成一个笛卡儿积的逻辑视图.执行这个(select * from 人员信息表,部门信息表 )SQL 不加连接列条件我们就可以看到一个笛卡儿积数据.步骤一 产生的中间结果表的笛卡儿积编号 名称 部门
9、 ID 年龄 性别 电话 部门 ID 部门名称 部门简称122 李晶晶 1 26 女 2234555 1 人力资源部 人力122 李晶晶 1 26 女 2234555 2 运行维护部 运维122 李晶晶 1 26 女 2234555 3 财务部 财务123 张金 1 29 男 3322123 1 人力资源部 人力123 张金 1 29 男 3322123 2 运行维护部 运维123 张金 1 29 男 3322123 3 财务部 财务124 王力 2 35 男 2245553 1 人力资源部 人力124 王力 2 35 男 2245553 2 运行维护部 运维124 王力 2 35 男 224
10、5553 3 财务部 财务125 李心 3 21 女 3332233 1 人力资源部 人力125 李心 3 21 女 3332233 2 运行维护部 运维125 李心 3 21 女 3332233 3 财务部 财务步骤二 通过连接列条件取出步骤一逻辑视图中符合条件的行,生成一个新的逻辑视图. 连接列条件为 where 人员信息表.部门 ID=部门信息表. 部门 ID步骤二产生的中间结果表编号 名称 部门 ID 年龄 性别 电话 部门 ID 部门名称 部门简称122 李晶晶 1 26 女 2234555 1 人力资源部 人力123 张金 1 29 男 3322123 1 人力资源部 人力124
11、王力 2 35 男 2245553 2 运行维护部 运维125 李心 3 21 女 3332233 3 财务部 财务步骤三 通过判断条件 and 部门信息表 .部门简称=财务 取出上一个逻辑视图中符合条件的行.生成一个新的逻辑视图步骤三 产生的中间结果表编号 名称 部门 ID 年龄 性别 电话 部门 ID 部门名称 部门简称125 李心 3 21 女 3332233 3 财务部 财务步骤四 通过 select 人员信息表.人员名称,部门信息表.部门简称,人员信息表.部门信息表.部门名称, 人员信息表.性别, 人员信息表.电话 选择要列,生成一个最终逻辑视图.步骤四 最终中间结果表名称 部门名称
12、 部门简称 性别 电话李心 财务部 财务 女 3332233步骤五 将产生的逻辑视图发送到客户端.完成本次 SQL 查询计划.SQL 编写顺序与逻辑视图生成过程.总结通过上面的介绍,我们知道了数据库在执行查询 SQL 计划时逻辑视图变化过程.我们在编写查询计划的时候,需要按照逻辑视图变化过程来编写,先写 from 再写 where 最后 select 这个顺序.在多表的时候,需要 where 来指定表的接合条件来过滤笛卡儿积.Select 人员信息表.人员名称, 步骤四 选择列部门信息表.部门简称,人员信息表.部门名称,人员信息表.性别, 人员信息表.电话From 人员信息表,部门信息表 步骤
13、一 合并表数据 Where 人员信息表.部门 ID=部门信息表. 部门 ID 步骤二 选择部门 ID 相等行And 部门信息表.部门简称=财务 步骤三 选择部门名称为财务的行多表合并查询时候的内连接与外连接在上面我们使用多表查询的时候,对笛卡儿积的处理是使用 where 加列连接条件.这种方法也被称为隐性连接.在 SQL 标准语句中有一种 from 从句的扩展方法可以直接完成上面的功能. 这种从句的扩展方法也被成为显性内连接.关键字为 inner join on 后边指定连接条件。Inner join 表达方法数据库中有以下 2 张表(人员信息表)编号 名称 部门 ID 年龄 性别 电话122
14、 李晶晶 1 26 女 2234555123 张金 1 29 男 3322123124 王力 2 35 男 2245553125 李心 3 21 女 3332233( 部门信息表)部门 ID 部门名称 部门简称1 人力资源部 人力2 运行维护部 运维3 财务部 财务运行以下 SQL 文-获得结果-编号 名称 部门 ID 年龄 性别 电话 部门 ID 部门名称 部门简称122 李晶晶 1 26 女 2234555 1 人力资源部 人力123 张金 1 29 男 3322123 1 人力资源部 人力124 王力 2 35 男 2245553 2 运行维护部 运维125 李心 3 21 女 3332
15、233 3 财务部 财务Select 表 1.列名, 表 2.列名 要选择的列From 表 1 inner join 表 2 on 表 1.ID1=表 2.ID1 Where 行选择条件SELECT * FROM 人员信息表 inner join 部门信息表 on 人员信息表.部门 ID=部门信息表.部门 IDFrom 可以通过内连接直接获得到要得到的数据结果,而不产生笛卡儿积现象.我们也可以通过上面 WHERE 列连接条件的方法得到一个与内连接(inner join on) 相同的数据结构.可以说 WHERE 列连接条件和(inner join on)都是内连接.Where 是隐性连接, (
16、inner join on)为显性连接,大家可以根据个人习惯来选择那种方式来进行多表连接.内连接分为 2 种连接方法1 显性连接,FROM INNER JOIN ON 2 隐性连接,where 列的关联条件。在低版本数据库中,显性连接和隐性连接执行效率上会有差别,在现在的数据库中基本没有区别了。完全根据个人习惯或者项目要求来选择使用哪种连接方式。外连接虽然我们学会使用了内连接,但是还有很多复杂情况内连接无法解决.SQL 还给我们提供了一种连接方法叫外连接.在外连接的表合并过程中,我们要定义一个驱动表,以驱动表为基础与其他表进行多表合并的过程叫外连接. 外连接分为左连接和右连接,显性连接 fro
17、m (LEFT JOIN ON 列连接条件 ,RIGHT JOIN ON 列连接条件)隐性连接 where 列连接条件(+)=列连接条件,列连接条件 =列连接条件(+) 表示.SQL 表达方式显性连接隐性连接如果你想以表 1 为驱动表就在 where 表 1=表 2(+) 为左表连接如果你想以表 2 为驱动表就在 where 表 1(+)=表 2 为右表连接SELECT *FROM 人员信息表,部门信息表 WHERE 人员信息表.部门 ID=部门信息表.部门 ID SELECT *FROM 表 1 (left or right) join 表 2 on 表 1.ID1=表 2.ID1 WHER
18、E 选择行条件SELECT *FROM 表 1,表 2 WHERE 表 1.ID1=表 2.ID1(+) and 选择行条件或者 表 1.ID1(+)=表 2.ID1 and 选择行条件数据库有以下 3 张表(人员信息表)编号 名称 部门 ID 年龄 职务 ID 性别 电话122 李晶晶 1 26 1 女 2234555123 张金 1 29 null 男 3322123124 王力 2 35 1 男 2245553125 李心 3 21 2 女 3332233126 鲁兰 null 232 null 女 3486443( 职务信息表)职务 ID 职务名称1 职员2 经理( 部门信息表)部门
19、ID 部门名称1 人力资源部2 运行维护部3 财务部执行以下 SQL 时-获得结果-编号 名称 部门 ID 年龄 职务 ID 性别 电话 职务 ID 职务名称122 李晶晶 1 26 1 女 2234555 1 职员123 张金 1 29 null 女 3322123 null null124 王力 2 35 1 男 2245553 1 职员125 李心 3 21 2 女 3332233 2 经理126 鲁兰 null 232 null 女 3486443 null null我们以人员信息表为驱动表进行多表合并查询. 驱动表所有信息全部显示,和职务表没有关联条件人员信息也将被查询出来.如果我们
20、使用内连接,和职务表没有关联的那条信息将无法被查询出来。上面的结果粉色部分数据在内连接的时候不能被查询出来。只有我们以人员信息表为驱动表进行外连接才可以得到上面的数据。SELECT *FROM 人员信息表 left join 职务信息表 on 人员信息表.职务 ID=职务信息表.职务 ID 或者SELECT *FROM 人员信息表 ,职务信息表 WHERE 人员信息表.职务 ID=职务信息表.职务 ID(+)例:查询出部门名称不能为空的所有女性的员工名称, 部门名称,职务名称信息.SQL 执行过程如下图所示隐性连接 SQL 文部门 ID 为内连接条件人员信息表 部门信息表 职务信息表人员信息表
21、与部门信息表内连接中间结果表人员与部门的中间结果表和职务信息表外联合并中间结果表在中间结果表中选择所有性别为女性的行,生成新的中间结果表在中间结果表中选择列职务 ID 为外连接条件SELECT 人员信息表.名称, 部门信息表.部门名称, 职务表.职务名称FROM 人员信息表 ,部门信息表, 职务表WHERE 人员信息表.部门 ID=部门信息表.部门 ID 人员表与部门表进行内连接AND 人员信息表 .职务 ID=职务表.职务 ID(+) 与职务表进行外连接AND 人员信息表.性别=女显性连接 SQL 文步骤一 在(人员信息表)与 (部门信息表)表中执行一个内连接,内连接会将人员表中部门 ID为
22、空的人员信息从中间结果表中过滤掉.步骤一 产生的中间结果表编号 名称 部门 ID 年龄 职务 ID 性别 电话 部门 ID 部门名称122 李晶晶 1 26 1 女 2234555 1 人力资源部123 张金 1 29 女 3322123 运行维护部124 王力 2 35 1 男 2245553 1 运行维护部125 李心 3 21 2 女 3332233 2 财务部步骤二 中间结果表于( 职务信息表) 执行一个外连接,中间结果表为驱动表. 驱动表中即使职务 id 为空,新生成的中间结果表也会这条信息保存下来.步骤二 产生的中间结果表编号 名称 部门 id 年龄 职务 id 性别 电话 部门
23、id 部门名称 职务 id 职务名称122 李晶晶 1 26 1 女 2234555 1 人力资源部 1 职员123 张金 1 29 女 3322123 运行维护部124 王力 2 35 1 男 2245553 1 运行维护部 1 职员125 李心 3 21 2 女 3332233 2 财务部 2 经理步骤三 选择性别为女的所有行生成中间结果表.虽然职务有空值出现,但是通过外联它还是可以不被过滤掉.步骤三 产生的中间结果表122 李晶晶 1 26 1 女 2234555 1 人力资源部 1 职员123 张金 1 29 女 3322123 运行维护部125 李心 3 21 2 女 3332233 2 财务部 2 经理步骤四 选择要显示的列,生成最终中间结果表,将显示给客户端.步骤四 产生的中间结果表名称 部门名称 职务名称李晶晶 人力资源部 职员张金 运行维护部李心 财务部 经理SELECT 人员信息表.名称, 部门信息表.部门名称, 职务表.职务名称FROM 人员信息表 inner join 部门信息表 on 人员信息表.部门 ID=部门信息表.部门 ID left join 职务表 on 职务表.职务 ID=人员信息表 .职务 ID WHERE 人员信息表.性别=女