您的位置:首页 > 数据库 > MySQL

MySQL从入门到精通_9多表数据记录查询

2016-11-14 21:52 260 查看
在上章中介绍了单表数据查询,即在关键字WHERE子句中只涉及一张表。再具体应用中,经常需要实现在一个查询语句中显示多张表的数据,这就是所谓的多表数据记录连接查询,简称连接查询。

MySQL软件也支持连接查询,再具体实现连接查询操作时,首先将两个或两个以上的表按照某个条件连接起来,然后在查询到所要求的数据记录,查看帮助文档可以发现,链接查询分为内连接查询和外连接查询。

再具体应用中,如果需要实现多张表数据库记录查询,一般不使用连接查询,应为该操作效率比较低,于是MySQL软件又提出连接查询的替代操作——子查询操作。

关系数据的各种操作

内连接查询

外连接查询

子查询

9.1 关系数据操作

在连接查询中,首先需要对两张或两张以上的表进行连接操作。连接操作时关系数据库操作中专门用于数据库操作的关系运算。本节将详细介绍关系数据操作中传统的运算——并(UNION)笛卡尔积(CARTESIAN PRODUCT)和专门针对数据库操作的运算——连接(JOIN)

9.1.1 并(JOIN)

在SQL语言中存在一种关系数据操作,叫作并操作。“并”就是把具有相同字段数目和字段类型的表合并到一起。举个例子,存在两张表分别表示计算机系学生和表(t_cstudent)和表示音乐系的学生表(t_mstudent),他们的数据记录如下

nameAre
ccjgong1
ccjgong2
ccjgong3
ccjgong4
ccjgong5
cmcjgong
t_cstudent的数据记录

nameAre
cmcjgong
mcjgong1
mcjgong2
mcjgong3
mcjgong4
mcjgong5
t_mstudent的数据记录

nameAre
ccjgong1
ccjgong2
ccjgong3
ccjgong4
ccjgong5
cmcjgong
mcjgong1
mcjgong2
mcjgong3
mcjgong4
mcjgong5
并操作后的数据记录

通过并操作的返回结果可以发现,会把两张表的数据记录结合并在一起,即并新关系的字段数为2(表t_cstudent字段数或表t_mstudent字段数);而并新关系的记录数为6(表t_cstudent记录数)+6(表t_mstudent记录数)-1(表t_cstudent和表t_mstudent重复记录数)=11

9.1.2笛卡尔积(CARTESIAN PRODUCT)

在SQL语言中存在一种关系数据操作,叫作笛卡尔积操作。笛卡尔积就是没有连接条件表关系返回结果。举个详细的例子,存在两张表,分别为表示部门的表(t_dep)和表示雇员的表(t_employee),他们的数据记录分别如下



t_dept的数据记录



t_employee的数据记录





笛卡尔积的数据记录

通过笛卡尔积的返回结果可以发现,前3个字段来自于表t_dept,后7个字段来自于表t_employee,即笛卡尔积新关系的字段数为3(t_dept字段数)+7(t_employee字段数)=10;而该笛卡尔积新关系的记录数为4(表t_dept记录数)×14(t_employee记录数)=56

9.1.3 内连接(INNER JOIN)

为了便于用户的操作,专门提供了一张针对于数据库操作的运算——连接(JOIN)。所谓连接就是在表关系的笛卡尔积数据记录中,按照相应字段值的比较条件进行选择生成一个新的关系。连接又分为内连接(INNER JOIN)外连接(OUTER JOIN)交叉连接(CROSS JOIN)

所谓内连接(INNER JOIN),就是在表关系的笛卡尔积数据记录中,保留表关系中所有匹配的数据记录,舍弃不匹配的数据记录。按照匹配的条件可以分成自然连接、等值连接和不等连接。

为了便于理解,本节将通过表示部门的表(t_dept)和表示雇员的表(t_employee)这两张表来讲解各种内连接,如下





9.1.3.1自然连接(NATURAL JOIN)

在SQL语言中存在一张关系数据操作,叫作自然连接,自然连接操纵就是表关系的笛卡尔积中,首先根据表关系中相同名称的字段自动进行记录匹配,然后去掉重复的字段。举个详细的例子,部门(t_dept)、雇员两张表(t_employee),求这两张表自然连接后的数据记录,如下



通过自然连接的返回结果可以发现,第1个字段为去除重读的字段,第2个和第3个字段来自于表t_dept,后7个字段来自于表t_employee,即自然连接新关系的字段数为1(去重复字段)+2(表t_dept字段数)+7(表t_employee字段数) =10;而该自然连接新关系的记录数为4(表t_dept记录数)×14(报表t_employee记录数)-42(两表相同字段deptno的值不相等记录数)=14

通过数据操作结果,可以发现自然连接关系数据操作的特点如下:

在具体执行连接时,会自动判断相同名词的字段,然后信息数据值的匹配。

在执行完自然连接的新关系中,虽然可以指定包含哪些字段,但不能指定执行过程中的匹配条件,即哪些字段的值进行匹配

在执行完自然连接的新关系中,执行过程中所匹配的字段名只有一个,即会去掉重复字段。

9.1.3.2等值连接

在SQL语言中 存在以照顾你关系数据操作,叫做等值连接,所谓等值链接操作就是表关系笛卡尔积中,选择所匹配字段值相等(=符号)的数据记录。举个详细的例子,存在两张表分别为表示部门的表(t_dept)和表示雇员表的(t_employee),求这两张表的等值连接的数据记录如下:



通过等值连接操作的返回结果可以发现,前三个字段来自表t_dept,后8个字段来自表t_employee,即等值连接关系的字段数为3(表t_dept字段数)+8(t_employee字段数) = 11;而该等值连接新关系的记录数为4(表t_dept记录数)×14(表t_employee记录数)-42(两表字段detno的值不相等记录数)=14

可以发现与自然链接相比,等值连接关系数据操作需要在执行过程中得用“符号=”指定匹配条件,在新关系中不会去掉重复字段。

9.1.3.3不等连接

在SQL语言中存在一种关系数据操作,叫做不等连接,不等连接操作就是表关系的笛卡尔积中,选择所匹配字段值不相等(!=符号)的数据记录。举个详细的例子,存在两者表,分别为表示部门表的表(t_dept)和表示雇员的表(t_employee),求这两张表的不等连接数据操作记录如下:



通过不等值连接的返回结果可以发现,前三个字段来自于表t_dept,后8个字段来自于表t_employee,即等值连接新关系的字段数为3(t_dept字段数)+8(表t_employee字段数)=11;而该不等值连接新关系的记录数为4(t_dept记录数)×14(表t_employee记录数)-14(两表字段deptno的值相等记录数)=42

可以发现与自然链接相比,不等连接关系数据操作需要在执行过程中用符号(!=符号)指定匹配条件,在新关系中不会去掉重复字段

9.1.4外连接(OUTER JOIN)

所谓外连接(OUTER JOIN),就是在表关系的笛卡尔积数据记录中,不仅保留表关系中所有匹配的数据记录,而且还会保留部分不匹配的数据记录。按照保留不匹配条件数据记录来源可以分为左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)和全外连接(FULL OUTER JOIN)

为了便于理解,本节将通过表示部门的表(t_dept)和表示雇员的表(t_employee)这两张表来讲解各种外连接,如下





9.1.4.1左外连接

在SQL语言中存在一种关系数据操作,叫做左外连接,所谓左外连接操作就是表关系的笛卡尔积中,除了选择相匹配的数据就,还包含关联左边表中不匹配的数据记录。举个详细的例子,存在两张表,分别为表示部门的表(t_dept)和表示雇员的表(t_employee),求部门表左外连接雇员表的数据记录 如下:



通过左外连接的返回结果可以发现,前3个字段来自表t_dept,后8个字段来自表t_employee,即等值连接新关系的字段数为3(表t_dept字段数)+8(表t_employee字段数)=11;而该左外连接新关系记录数为4(表t_dept记录数)×14(表t_employee记录数)-42(两表子弹deptno的值不相等记录数)+1(左表t_dept中未匹配记录数)=15

9.1.4.2右外连接

在SQL语言中存在一种关系数据操作,叫做右外连接。右外连接操作就是变关系笛卡尔积中,除了选择匹配(相等)的数据记录,还包含关联右边表中不匹配的数据记录。举个详细的例子,存在两张表,分别为表示部门的表(t_dept)和表示雇员的表(t_employee),求部门表右外连接雇员表的数据记录 如下:



通过右外连接的返回结果可以发现,前3个字段来自于表t_dept,后8个字段来自于表t_employee,即等值连接新关系的字段数为3(表t_dept字段数)+8(表t_employee字段数)=11;而该右外连接新关系的记录数为4(表t_dept记录数)×14(表t_employee记录数)-42(两表字段deptno的值不相等记录数)+1(右表t_employee中未匹配的记录数)=15

9.1.4.3全外连接

在SQ语言中存在一种关系数据操作,叫做全外连接。全外连接操作就是表关系的笛卡尔积中,除了选择匹配(相等)的数据记录,还包含关联左右两表中不匹配的数据记录。举个详细的例子,存在两张表,分别为表示部门的表(t_dept)和表示雇员的表(t_employee),求部门表全外连接雇员表后的数据记录

通过全外连接操作的定义可以知道,前3个字段来自于表t_dept,后8个字段来自于表t_employee,即全外连接新关系的字段数为3(表t_dept字段数)+8(表t_employee字段数)=11;而该全外连接新关系的记录数为4(t_dept记录数)×14(t_employee记录数)-42(两表字段deptno的值不相等的记录数)+2(左表t_dept中未匹配为的记录数和右表t_employee中未匹配为的记录数)=16

在连接操作中,除了内连接和外连接外,还存在一种名叫交叉连接(CROSS JOIN)的连接操作。交叉连接,其实就是表关系笛卡尔积数据记录,不需要任何配条件,有时候该操作的结果没有任何实际意义。

9.2 内连接查询

在MySQL软件中可以通过两种语法形式来实现内连接查询,一种方式实在FROM子句中利用逗号(,)区分多个表,在WHERE子句中通过逻辑表达式来实现匹配条件,从而实现表的连接,只是早期MySQL软件连接的语法形式;另一种是ANSI连接语法形式,在FROM字句中使用JOIN ON关键字,而连接条件写在关键字ON字句中,MySQL软件推荐使用ANSI语法形式的连接。

在MySQL中内连接数据查询通过SQL语句INNER JOIN ON 来实现,语法形式如下:

SELECT field1,field2...fieldn
FROM join_tablename1 INNER JOIN join_tablename2
ON join_condition


在上述语句中,参数 fieldn表示所要查询的字段名字,来源于所连接的表join_tablename1和join_tablename2,关键字INNER JOIN表示表进行连接,参数join_condition表示进行匹配的条件。

按照匹配情况,内连接查询可以分为以下两类:

- 等值连接

- 不等连接

为了便于讲解,准备数据 表示部门的表t_dept 和 表示雇员的表 t_employee 如下:





9.2.1自连接

内连接查询中存在一种特殊的等值连接——自连接,所谓自连接就是指表与其自身进行连接

实例:

通过执行SQL语句“INNER JOIN ON”,查询每个雇员的姓名、职位、领导姓名。

(1)确定需要查询的表和所查询的字段的来源

根据需求需要查询两张表t_employee和表t_employee,前者需要查询出雇员的姓名和职位,后者需要查询出领导的姓名。

*注意 由于表t_employee综合了雇员和领导的信息,所以表t_employee即是雇员表也是领导表

(2)确定关联的匹配条件

t_employee.mgr(雇员表的领导编号) = t_employee.empno(领导表的领导编号)

得出SQL语句如下:

ANSI语法形式

SELECT e.enam employeename, e.job, l.ename loadername
FROM t_employee e INNER JOIN t_employee l
ON e.mgr = l.empno


FROM+逗号(,)

SELECT e.name employee, e.jon, l.ename loadername
FROM t_employee e, t_employee l
WHERE e.mgr = l.empno


执行结果显示,虽然SQL语句内容不同,但是执行结果是一致的

9.2.2 等值连接

内连接查询中的等值连接,就是在关键之ON后的匹配条件中通过等于关系运算符(=)来实现等值条件。

实例:

查询每个雇员的编号、姓名、职位、部门名称、位置。

(1)确定需要查询的表和所查询字段的来源。

根据要求需要查询两张表:部门表t_dept和雇员表t_employee,前者需要查询出部门的名称和位置,后者需要查询出雇员的编号、姓名和位置。

(2)确定关系匹配条件

t_dept.deptno = t_employee_deptno

得出SQL语句如下:

ANSI形式:

SELECT e.empno, e.name, e.job, d.name, d.loc
FROM t_employee e INNER JOIN t_dept d
ON e.deptno = d.deptno


FROM + 逗号(,)

SELECT e.empno, e.name, e.job, d.name, d.loc
FROM t_employee e , t_dept d
WHERE e.deptno = d.deptno


实例:

查询每个雇员的编号、姓名、基本工资、职位、领导姓名、历代部门名称、历代部门位置

(1)确定需要查询的表和所查询的字段来源

根据需求需要查询3张表:部门表t_dept、雇员表t_employee、和领导表t_employee

雇员表:雇员编号、雇员姓名、基本工资、职位

领导表:领导姓名

部门表:部门位置、部门名称

(2)确定关联的匹配条件

领导表连接部门表匹配条件:t_employee.deptno = t_dept.deptno

雇员表连接领导表匹配条件:t_employee.mgr = t_employee.deptno

得出SQL语句如下:

ANSI形式:

SELECT e.empno, e.ename employeename, e.sal, e.job, l.ename lodername, d.name,d.loc
FROM t_employee e INNER JOIN t_employee l ON e.mgr = l.empno INNER JOIN t_dept d ON l.deptno = d.deptno


FROM + 逗号(,)形式:

SELECT e.empno, e.ename employeename, e.sal, e.job, l.ename lodername, d.name,d.loc
FROM t_employee e, t_employee l, t_dept d
WHERE e.mrg = l.empno AND l.deptno = d.deptno


9.2.3 不等值连接

内连接查询中的不等连接,就是在关键字ON后的匹配条件中通过除了等于关系运算符来实现不等条件外,可以使用的关系运算符包括“>”、“>=”、“<”、“<=”、“!=”等运算符号

实例:

执行SQL语句,查询雇员编号大于其领导编号的每个雇员的姓名、职位、领导姓名

(1)确定需求查询的表和查询的字段来源

根据要求需要查询两张表雇员表(t_employee)和领导表(t_employee),前者需要查询出雇员姓名和职位,后者需要查询出领导姓名。

(2)确定关联的匹配条件

t_employee(雇员表的领导编号)=t_employee(领导表的领导编号)

t_employee(雇员表的雇员编号)>t_employee(领导表的领导编号)

得出SQL语句如下:

ANSI形式如下:

SELECT e.name employeename,e.job,l.ename、loadername
FROM t_employee e INNER JOIN t_employee l
ON e.mgr = l.empno AND e.empno = l.empno


FROM+逗号(,)形式如下:

SELECT e.name employeename,e.job,l.ename loadername
FROM t_employee e, t_employee l
WHERE e.mgr = l.empno AND e.empno > l.empno


9.3外连接查询

在MySQL软件中外连接查询会返回所操作表中至少一个表的所有数据记录,查看帮助文档发现,在MySQL中数据查询通过SQL语句“OUTER JOIN ON”来实现,外连接数据查询语法形式如下:

SELECT field1,field2...fidlen
FROM join_tablename1 LEFT|RIGHT|FULL[OUTER] JOIN join_tablename2
ON join_condition


在上述语句中,参数field表示索要查询的字段名字,来源于所连接的表join_tablename1和join_tbalename2,关键字OUTER JOIN 便是进行外连接,参数join_condition表示进行匹配的条件

按照外连接的关键字,外连接查询可以分为以下三类:

- 左外连接

- 右外连接

- 全外连接

为了便于讲解提供数据表如下;表示部门信息的表t_dept和表示雇员信息的表t_employee





9.3.1左外连接

外连接查询中的左外连接,就是指新关系中执行匹配条件时,以关键字LEFT JOIN 左边的表为参考表。

实例:

查询每个雇员的姓名、职位、领导姓名,由于名为KING的雇员位置公司最高职位,所以没有领导信息,本实例中需要显示出名为KING雇员的信息

(1)确定需要查询的表和所需要查询的字段的来源

根据要求需要查询两张表雇员表(t_employee)和领导表(t_dept),前者需要查询出雇员的姓名、职位,后者需要查询出领导的姓名。

(2)确定关联关系匹配条件

t_employee.mgr(雇员领导编号)=t_employee.empno(领导表的领导编号)

得出SQL语句如下:

ANSI形式如下:

SELECT e.ename employeename,e.job,l.ename loadername
FROM t_employee e LEFT JOIN t_employee l
ON e.mgr = l.empno


FROM+逗号(,)形式如下:

SELECT e.ename employeename,e.job,l.ename loadername
FROM t_employee e, t_employee l
WHERE e.mgr = l.empno


9.3.2右外连接

外连接查询中的右外连接,就是新关系中之心匹配条件时,以关键字RIGHT JOIN右边的表为参考表。

实例:

查询每个雇员的编号、姓名、职位、部门名称、位置,由于名为cjgong的雇员所存在的部门编号50在部门表中不存在,所以该雇员没有部门消息,本实例中要实现名为cjgong雇员信息

(1)需要确定需要查询的表和所要查询的字段来源

根据要求需要查询两张表 t_employee雇员表和t_dept部门表,前者需要查询雇员信息姓名、职位、部门编号,后者需要查询部门信息部门名称、位置

(2)确定关联匹配条件

t_dept.deptno=t_employee.deptno

得出SQL语句如下

-ANSI形势如下:

SELECT e.empno,e.ename,e.job,d.dname,d.loc
FROM t_dept d RIGHT JOIN t_employee e
ON d.deptno=e.deptno


FROM+逗号(,)形式如下:

SELECT e.ename,e.empno,e.job,d.dname,d.loc
FROM t_employee e,t_dept d
WHERE e.deptno=d.deptno


9.4合并查询数据记录

在MySQL软件中通过关键之UNION来实现并操作,即可以通过其他多个SELECT语句的查询结果合并在一起组成新的关系。查看帮助文档发现,在MySQL软件中实现查询数据记录合并通过SQL语句UNION具体语法形式如下:

SELECT field1,field2...fidlen
FROM tablename1
UNION | UNION ALL
SELCT field1,field2...fieldn
FROM tablename2
UNION | UNION ALL
SELECT field1,field2...fieldn
FROM tablename3
UNION | UNION ALL
......


上述语句中存在多个查询数据记录语句,每个查询数据语句之间使用关键字UNIONUNION ALL进行连接

为了便于讲解提供数据表如下;计算机系学生的表t_cstudent 和表示音乐系学生的表t_msutdent;如下:





9.4.1带有关键字UNION的合并操作

关键字UNION会把查询的结果集直接合并在一起,同时将会去掉重复的数据记录。

实例:

合并计算机系学生和音乐系学生的数据记录信息

利用UNION,合并查询两张表的查询记录;得出SQL语句如下

SELECT * FROM t_cstudent
UNION
SELECT * FROM t_mstudent


得出查询结果如下:



显示合并后的数据记录,同时去掉了重复的数据记录。使得新关系里没有任何重复的数据记录。

9.4.2带关键之UNION ALL的合并操作

关键之UNION ALL会把查询结果集直接合并在一起。

实例:

合并计算机系学生和音乐系学生的数据记录信息

利用UNION,合并查询两张表的查询记录;得出SQL语句如下

SELECT * FROM t_cstudent
UNION ALL
SELECT * FROM t_mstudent


得出查询结果如下:



显示合并后的数据记录,没有去掉重复的数据记录。使得新关系里有存在重复的数据记录。

9.5 子查询

在MySQL软件中虽然可以通过连接查询实现多表的查询数据记录,但是却不建议使用,这是应为连接查询的性能很差。 因此出现了连接查询的替代子查询。再具体开发应用中,MySQL软件推荐使用子查询来实现多表的数据记录查询。

9.5.1 为什么要使用子查询

为了讲清楚“为什么要使用子查询”这个问题,需要从多表查询数据记录的开发经验开始。在日常开发中,用户经常会接触到查询多表数据记录操作,例如 需要查询部门表t_dept和雇员表t_employee的数据记录。

对于新手可能会执行如下SQL语句:

SELECT *
FROM t_dept d,t_employee l
WHERE d.dpetno = l.deptno;


在上述语句中执行过程中,首先会对两边进行笛卡尔积操作,然后在选取符合匹配条件的数据记录。进行笛卡尔积操纵时,会生成两个数表数据记录数的乘积条数据记录,如果这两张表的数据记录比较大,则在进行笛卡尔积时就会造成死机。

于是对于有经验的用户,首先会通过统计函数查看所操作的表笛卡尔积的数据记录数,然后才会进行多表查询,因此多表查询一般会经过如下步骤:

(1)通过统计函数(COUNT())查询所关联表笛卡尔积后的数据记录,具体SQL语句如下:

SELECT COUNT(*)
FROM t_dept d,t_employee l


(2)如果查询到的数据记录数MySQL软件可以接受,然后才进行多表连接查询,否则就应该考虑通过其他方式来实现。

那么如果查询到笛卡尔积后的数据记录数远远大于MySQL软件可以承受的范围,则如何实现多表查询呢?为了解决这个问题,MySQL软件提供了子查询来实现多表查询。

所谓子查询,就是指在一个查询之中嵌套了其他若干查询,即在一个SELECT查询语句的WHERE 或 FROM 字句中包含另外一个SELECT查询语句。在查询语句中,外层SELECT查询语句称为主查询,WHERE字句中的SELECT语句称为子查询,也被称为嵌套查询。

通过子查询可以实现多表查询,该查询语句中包含IN、ANY、EXISTS等关键字,除此之外还可能包含比较运算符。理论上子查询可以出现在查询语句的任意位置,但是在实际开发过程中,子查询经常出现在SELECT和FROM字句中。

WHERE 字句中的子查询:该位置处的子查询一般返回但行单列、多行多列、单行多列数据记录。

FROM 字句中的子查询:该位置处的子查询一般返回多行多列数据记录,可有当做一张临时表。

9.5.2 返回结果为单行单列和单行多列子查询

当子查询的返回结果为单行单列数据记录时,该子查询语句一般在祝查询语句的WHERE字句里,通过会包括比较运算符号(>、<、=、!=等)。

9.5.2.1 返回结果为单行单列子查询

实例:

查询雇员表(t_employee)中工资比SMITH还要高的全部雇员信息

具体SQL如下:

SELECT *
FROM t_employee
WHERE sal > (
SELECT sal
FROM t_employee
WHERE ename=‘SMITH’
)


9.5.2.1 单行多列子查询

WHERE 字句中的子查询除了是返回单行单列的数据记录外,还可以是返回单行多列的数据记录,不过这种子查询很少出现。

实例:

查询雇员表(t_employee)中工资和职位与SMITH一样的全部雇员信息

具体SQL语句如下:

SELECT ename,sal,job
FROM t_employee
WHERE (sal,job)=(
SELECT sal,job
FROM t_employee
WHERE ename=‘SMITH’
)


9.5.3返回结果为单行单列的子查询

当子查询的返回结果为多行单列数据记录时,该子查询语句一般会在主查询语句的WHERE字句中出现,通常会包含IN、ANY、ALL、EXISTS等关键字。

9.5.3.1 带有关键字IN的子查询

当主查询的条件是子查询的查询结果中时,就可以通过关键字IN来进行判断。相反如果想实现祝查询的条件不是子查询的查询结果中时,就可以通过关键字NOT IN来进行判断。

实例:

查询雇员表(t_employee)中的数据记录,这些数据记录的部门编号(字段deptno)必须在部门表(t_dept)中出现

具体SQL语句如下:

SELECT *
FROM t_employee
WHERE deptno IN(
SELECT deptno
FROM t_dept
)


实例:

查询雇员表(t_employee)中的数据记录,这些数据记录的部门编号(字段deptno)不在部门表(t_dept)中出现

具体SQL语句如下:

SELECT *
FROM t_employee
WHERE deptno NOT IN(
SELECT deptno
FROM t_dept
)


9.5.3.2 带有关键字ANY的子查询

关键字ANY用来表示主查询的条件为满足子查询返回查询结果中任意一条数据记录时,该关键字有三中匹配方式,如下:

- =ANY:其功能与关键字IN一样

- >ANY(>=ANY):比子查询中返回数据记录中最小的还要大于(大于等于)数据记录;

-

SELECT ename,sal
FROM t_employee
WHERE sal>ANY(
SELECT sal
FROM t_employee
WHERE job = ‘MANAGER’
)


9.5.3.3 带有关键字ALL的子查询

关键字ALL用来表示主查询的条件为满足子查询返回查询结果中所有数据记录,该关键字有以下两种匹配方式:

>ALL(>=All):比子查询中返回数据记录中最大的还要大于(大于等于)数据记录;

SELECT ename,sal
FROM t_employee
WHERE sal > ALL(
SELECT sal
FROM t_employee
where job = ‘MANAGER’)


9.5.3.4 带有关键字EXISTS的子查询

关键字EXISTS是一个布尔类型,当返回结果集时为TRUE,不能返回结果集时为FALSE,查询时 EXISTS对外表采用遍历方式逐条查询,每次查询都会比较EXISTS的条件语句,当EXISTS里的条件语句返回记录行时则条件为真,此时返回当前遍历到的记录;反之,如果EXISTS里的条件语句不能返回记录行,则丢弃当前遍历到的记录。

实例:

查询部门表(t_dept)中的部门编号和部门名字,如该部门没有员工,则显示该部门

具体SQL语句如下:

SELECT *
FROM t_dept c
WHERE NOT EXISTS(
SELECT *
FROM t_employee
WHERE deptno = c.deptno
)


9.5.4 查询结果为多行多列子查询

当子查询的返回结果为多行多列时数据记录时,该子查询语句一般会在主查询语句的FROM字句里,被当做是一张临时表的方式处理。

实例:

查询雇员表(t_employee)中各部门的部门编号、部门名称、部门地址、雇员人数和平均工资

具体SQL语句如下:

SELECT d.deptno,d.dname,d.loc number,average
FROM t_dept d INNER JOIN (
SELECT deptno dno ,COUNT(empno) number,AVG(e.sal)average
FROM t_employee
GROUP BY deptno DESC)employee
ON d.deptno = employee.dno
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mysql