MySQL中的子查询
是在MySQL中经常使用到的一个操作,不仅仅是用在DQL语句中,在DDL语句、DML语句中也都会常用到子查询。
子查询的定义:
子查询是将一个查询语句嵌套在另一个查询语句中;
在特定情况下,一个查询语句的条件需要另一个查询语句来获取,内层查询(inner query)语句的查询结果,可以为外层查询(outer query)语句提供查询条件。
特点(规范):
①子查询必须放在小括号中
②子查询一般放在比较操作符的右边,以增强代码可读性
③子查询(小括号里的内容)可出现在几乎所有的SELECT子句中(如:SELECT子句、FROM子句、WHERE子句、ORDER BY子句、HAVING子句……)
(相关、不相关)子查询分类:
①标量子查询(scalar subquery):返回1行1列一个值
②行子查询(row subquery):返回的结果集是 1 行 N 列
③列子查询(column subquery):返回的结果集是 N 行 1列
④表子查询(table subquery):返回的结果集是 N 行 N 列
可以使用的操作符:= > < >= <= <> ANY IN SOME ALL EXISTS
注意:一个子查询会返回一个标量(就一个值)、一个行、一个列或一个表,这些子查询称之为标量、行、列和表子查询
1、如果子查询返回一个标量值(就一个值),那么外部查询就可以使用:=、>、<、>=、<=和<>符号进行比较判断;
2、如果子查询返回的不是一个标量值,而外部查询使用了比较符和子查询的结果进行了比较,那么就会抛出异常。
环境搭建:employee雇员表、department部门表、TENNIS数据库
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<span style="font-size: 16px;">mysql<span style="color: rgba(128, 128, 128, 1);">></span> <span style="color: rgba(0, 0, 255, 1);">select</span> <span style="color: rgba(128, 128, 128, 1);">*</span> <span style="color: rgba(0, 0, 255, 1);">from</span><span style="color: rgba(0, 0, 0, 1);"> department; </span><span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">----+-----------+--------------+---------------------+</span> <span style="color: rgba(128, 128, 128, 1);">|</span> d_id <span style="color: rgba(128, 128, 128, 1);">|</span> d_name <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(0, 0, 255, 1);">function</span> <span style="color: rgba(128, 128, 128, 1);">|</span> address <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">----+-----------+--------------+---------------------+</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1001</span> <span style="color: rgba(128, 128, 128, 1);">|</span> 科技部 <span style="color: rgba(128, 128, 128, 1);">|</span> 研发产品 <span style="color: rgba(128, 128, 128, 1);">|</span> 3号楼5层 <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1002</span> <span style="color: rgba(128, 128, 128, 1);">|</span> 生产部 <span style="color: rgba(128, 128, 128, 1);">|</span> 生产产品 <span style="color: rgba(128, 128, 128, 1);">|</span> 5号楼1层 <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1003</span> <span style="color: rgba(128, 128, 128, 1);">|</span> 销售部 <span style="color: rgba(128, 128, 128, 1);">|</span> 策划销售 <span style="color: rgba(128, 128, 128, 1);">|</span> 1号楼销售大厅 <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">----+-----------+--------------+---------------------+</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">3</span> rows <span style="color: rgba(128, 128, 128, 1);">in</span> <span style="color: rgba(0, 0, 255, 1);">set</span> (<span style="color: rgba(128, 0, 0, 1); font-weight: bold;">0.02</span><span style="color: rgba(0, 0, 0, 1);"> sec) mysql</span><span style="color: rgba(128, 128, 128, 1);">></span> <span style="color: rgba(0, 0, 255, 1);">select</span> <span style="color: rgba(128, 128, 128, 1);">*</span> <span style="color: rgba(0, 0, 255, 1);">from</span><span style="color: rgba(0, 0, 0, 1);"> employee; </span><span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">----+------+--------+------+------+--------------------+</span> <span style="color: rgba(128, 128, 128, 1);">|</span> num <span style="color: rgba(128, 128, 128, 1);">|</span> d_id <span style="color: rgba(128, 128, 128, 1);">|</span> name <span style="color: rgba(128, 128, 128, 1);">|</span> age <span style="color: rgba(128, 128, 128, 1);">|</span> sex <span style="color: rgba(128, 128, 128, 1);">|</span> homeaddr <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">----+------+--------+------+------+--------------------+</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1001</span> <span style="color: rgba(128, 128, 128, 1);">|</span> 张三 <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">26</span> <span style="color: rgba(128, 128, 128, 1);">|</span> 男 <span style="color: rgba(128, 128, 128, 1);">|</span> 北京市海淀区 <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">2</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1001</span> <span style="color: rgba(128, 128, 128, 1);">|</span> 李四 <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">24</span> <span style="color: rgba(128, 128, 128, 1);">|</span> 女 <span style="color: rgba(128, 128, 128, 1);">|</span> 上海市黄浦区 <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">3</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1002</span> <span style="color: rgba(128, 128, 128, 1);">|</span> 王五 <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">25</span> <span style="color: rgba(128, 128, 128, 1);">|</span> 男 <span style="color: rgba(128, 128, 128, 1);">|</span> 江西省赣州市 <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">4</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1004</span> <span style="color: rgba(128, 128, 128, 1);">|</span> Aric <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">15</span> <span style="color: rgba(128, 128, 128, 1);">|</span> 男 <span style="color: rgba(128, 128, 128, 1);">|</span> England <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">----+------+--------+------+------+--------------------+</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">4</span> rows <span style="color: rgba(128, 128, 128, 1);">in</span> <span style="color: rgba(0, 0, 255, 1);">set</span> (<span style="color: rgba(128, 0, 0, 1); font-weight: bold;">0.00</span> sec)</span> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<span style="font-size: 16px;">mysql<span style="color: rgba(128, 128, 128, 1);">></span> <span style="color: rgba(0, 0, 255, 1);">use</span><span style="color: rgba(0, 0, 0, 1);"> TENNIS Reading </span><span style="color: rgba(0, 0, 255, 1);">table</span> information <span style="color: rgba(0, 0, 255, 1);">for</span> completion <span style="color: rgba(0, 0, 255, 1);">of</span> <span style="color: rgba(0, 0, 255, 1);">table</span> <span style="color: rgba(128, 128, 128, 1);">and</span> <span style="color: rgba(0, 0, 255, 1);">column</span><span style="color: rgba(0, 0, 0, 1);"> names You can turn </span><span style="color: rgba(0, 0, 255, 1);">off</span> this feature <span style="color: rgba(0, 0, 255, 1);">to</span> get a quicker startup <span style="color: rgba(0, 0, 255, 1);">with</span> <span style="color: rgba(128, 128, 128, 1);">-</span><span style="color: rgba(0, 0, 0, 1);">A </span><span style="color: rgba(0, 0, 255, 1);">Database</span><span style="color: rgba(0, 0, 0, 1);"> changed mysql</span><span style="color: rgba(128, 128, 128, 1);">></span><span style="color: rgba(0, 0, 0, 1);"> show tables; </span><span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">-----------------+</span> <span style="color: rgba(128, 128, 128, 1);">|</span> Tables_in_TENNIS <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">-----------------+</span> <span style="color: rgba(128, 128, 128, 1);">|</span> COMMITTEE_MEMBERS <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">|</span> MATCHES <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">|</span> PENALTIES <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">|</span> PLAYERS <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">|</span> TEAMS <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">-----------------+</span> 5 rows <span style="color: rgba(128, 128, 128, 1);">in</span> <span style="color: rgba(0, 0, 255, 1);">set</span> (<span style="color: rgba(128, 0, 0, 1); font-weight: bold;">0.00</span> sec)<span style="font-family: verdana, Arial, Helvetica, sans-serif; line-height: 1.5; background-color: rgba(255, 255, 255, 1);"> </span></span> |
一、不相关子查询
不相关,主查询和子查询是不相关的关系。也就是意味着在子查询中没有使用到外部查询的表中的任何列。
先执行子查询,然后执行外部查询
1、标量子查询(scalar subquery):返回1行1列一个值
因为是标量子查询,结果是一个值,所以可用来进行算数运算。
可以使用 = > < >= <= <> 操作符对子查询的结果进行比较:
1 2 3 4 5 6 7 8 9 10 11 12 |
<span style="font-size: 16px;">mysql<span style="color: rgba(128, 128, 128, 1);">></span> <span style="color: rgba(0, 0, 255, 1);">select</span><span style="color: rgba(0, 0, 0, 1);"> num,name </span><span style="color: rgba(128, 128, 128, 1);">-></span> <span style="color: rgba(0, 0, 255, 1);">from</span><span style="color: rgba(0, 0, 0, 1);"> employee </span><span style="color: rgba(128, 128, 128, 1);">-></span> <span style="color: rgba(0, 0, 255, 1);">where</span> d_id<span style="color: rgba(128, 128, 128, 1);">=</span><span style="color: rgba(0, 0, 0, 1);">( </span><span style="color: rgba(128, 128, 128, 1);">-></span> <span style="color: rgba(0, 0, 255, 1);">select</span><span style="color: rgba(0, 0, 0, 1);"> d_id </span><span style="color: rgba(128, 128, 128, 1);">-></span> <span style="color: rgba(0, 0, 255, 1);">from</span><span style="color: rgba(0, 0, 0, 1);"> department </span><span style="color: rgba(128, 128, 128, 1);">-></span> <span style="color: rgba(0, 0, 255, 1);">where</span> d_name<span style="color: rgba(128, 128, 128, 1);">=</span><span style="color: rgba(255, 0, 0, 1);">'</span><span style="color: rgba(255, 0, 0, 1); font-family: 'Microsoft YaHei';">科技部</span><span style="color: rgba(255, 0, 0, 1);">'</span><span style="color: rgba(0, 0, 0, 1);">); </span><span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">----+--------+</span> <span style="color: rgba(128, 128, 128, 1);">|</span> num <span style="color: rgba(128, 128, 128, 1);">|</span> name <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">----+--------+</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1</span> <span style="color: rgba(128, 128, 128, 1);">|</span> 张三 <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">2</span> <span style="color: rgba(128, 128, 128, 1);">|</span> 李四 <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">----+--------+</span></span> |
1 2 3 4 5 6 7 |
<span style="font-size: 16px;">mysql<span style="color: rgba(128, 128, 128, 1);">></span> <span style="color: rgba(0, 0, 255, 1);">select</span><span style="color: rgba(0, 0, 0, 1);"> num,name </span><span style="color: rgba(128, 128, 128, 1);">-></span> <span style="color: rgba(0, 0, 255, 1);">from</span><span style="color: rgba(0, 0, 0, 1);"> employee </span><span style="color: rgba(128, 128, 128, 1);">-></span> <span style="color: rgba(0, 0, 255, 1);">where</span> d_id<span style="color: rgba(128, 128, 128, 1);">=</span><span style="color: rgba(0, 0, 0, 1);">( </span><span style="color: rgba(128, 128, 128, 1);">-></span> <span style="color: rgba(0, 0, 255, 1);">select</span><span style="color: rgba(0, 0, 0, 1);"> d_id </span><span style="color: rgba(128, 128, 128, 1);">-></span> <span style="color: rgba(0, 0, 255, 1);">from</span><span style="color: rgba(0, 0, 0, 1);"> department </span><span style="color: rgba(128, 128, 128, 1);">-></span> <span style="color: rgba(0, 0, 255, 1);">where</span> d_name<span style="color: rgba(128, 128, 128, 1);">=</span><span style="color: rgba(255, 0, 0, 1);">'</span><span style="color: rgba(255, 0, 0, 1); font-family: 'Microsoft YaHei';">财务部</span><span style="color: rgba(255, 0, 0, 1);">'</span><span style="color: rgba(0, 0, 0, 1);">); Empty </span><span style="color: rgba(0, 0, 255, 1);">set</span> (<span style="color: rgba(128, 0, 0, 1); font-weight: bold;">0.00</span><span style="color: rgba(0, 0, 0, 1);"> sec)</span></span> |
1 |
<span style="font-size: 18px; font-family: 'Microsoft YaHei';"><span style="color: rgba(255, 255, 255, 1); background-color: rgba(0, 0, 0, 1);">注意:</span>如果子查询返回空值,可能导致外部查询的where条件也为空,从而外部查询的结果集为空。</span> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<span style="font-size: 16px;">mysql<span style="color: rgba(128, 128, 128, 1);">></span> <span style="color: rgba(0, 0, 255, 1);">SELECT</span><span style="color: rgba(0, 0, 0, 1);"> playerno,town,sex </span><span style="color: rgba(128, 128, 128, 1);">-></span> <span style="color: rgba(0, 0, 255, 1);">FROM</span><span style="color: rgba(0, 0, 0, 1);"> PLAYERS </span><span style="color: rgba(128, 128, 128, 1);">-></span> <span style="color: rgba(0, 0, 255, 1);">WHERE</span> (town,sex) <span style="color: rgba(128, 128, 128, 1);">=</span> ((<span style="color: rgba(0, 0, 255, 1);">SELECT</span> town <span style="color: rgba(0, 0, 255, 1);">FROM</span> PLAYERS <span style="color: rgba(0, 0, 255, 1);">WHERE</span> playerno<span style="color: rgba(128, 128, 128, 1);">=</span><span style="color: rgba(128, 0, 0, 1); font-weight: bold;">7</span><span style="color: rgba(0, 0, 0, 1);">), </span><span style="color: rgba(128, 128, 128, 1);">-></span> (<span style="color: rgba(0, 0, 255, 1);">SELECT</span> sex <span style="color: rgba(0, 0, 255, 1);">FROM</span> PLAYERS <span style="color: rgba(0, 0, 255, 1);">WHERE</span> playerno<span style="color: rgba(128, 128, 128, 1);">=</span><span style="color: rgba(128, 0, 0, 1); font-weight: bold;">44</span><span style="color: rgba(0, 0, 0, 1);">)); </span><span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">--------+-----------+-----+</span> <span style="color: rgba(128, 128, 128, 1);">|</span> playerno <span style="color: rgba(128, 128, 128, 1);">|</span> town <span style="color: rgba(128, 128, 128, 1);">|</span> sex <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">--------+-----------+-----+</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">2</span> <span style="color: rgba(128, 128, 128, 1);">|</span> Stratford <span style="color: rgba(128, 128, 128, 1);">|</span> M <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">6</span> <span style="color: rgba(128, 128, 128, 1);">|</span> Stratford <span style="color: rgba(128, 128, 128, 1);">|</span> M <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">7</span> <span style="color: rgba(128, 128, 128, 1);">|</span> Stratford <span style="color: rgba(128, 128, 128, 1);">|</span> M <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">39</span> <span style="color: rgba(128, 128, 128, 1);">|</span> Stratford <span style="color: rgba(128, 128, 128, 1);">|</span> M <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">57</span> <span style="color: rgba(128, 128, 128, 1);">|</span> Stratford <span style="color: rgba(128, 128, 128, 1);">|</span> M <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">83</span> <span style="color: rgba(128, 128, 128, 1);">|</span> Stratford <span style="color: rgba(128, 128, 128, 1);">|</span> M <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">100</span> <span style="color: rgba(128, 128, 128, 1);">|</span> Stratford <span style="color: rgba(128, 128, 128, 1);">|</span> M <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">--------+-----------+-----+</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">7</span> rows <span style="color: rgba(128, 128, 128, 1);">in</span> <span style="color: rgba(0, 0, 255, 1);">set</span> (<span style="color: rgba(128, 0, 0, 1); font-weight: bold;">0.01</span> sec)</span> |
1 |
<span style="font-family: 'Microsoft YaHei';"><span style="font-size: 18px;"><span style="color: rgba(255, 255, 255, 1); background-color: rgba(0, 0, 0, 1);">注意:</span> (列,列,…)叫做行表达式,比较时是比较列的组合。</span></span> |
2、行子查询(row subquery):返回的结果集是 1 行 N 列
使用行表达式进行比较,可以使用 = > < >= <= <> in操作符
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<span style="font-size: 16px;">mysql<span style="color: rgba(128, 128, 128, 1);">></span> <span style="color: rgba(0, 0, 255, 1);">select</span> d_id <span style="color: rgba(0, 0, 255, 1);">from</span><span style="color: rgba(0, 0, 0, 1);"> department; </span><span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">----+</span> <span style="color: rgba(128, 128, 128, 1);">|</span> d_id <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">----+</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1001</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1002</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1003</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">----+</span> <span style="color: rgba(0, 0, 0, 1);"> mysql</span><span style="color: rgba(128, 128, 128, 1);">></span> <span style="color: rgba(0, 0, 255, 1);">select</span> <span style="color: rgba(128, 128, 128, 1);">*</span> <span style="color: rgba(0, 0, 255, 1);">from</span><span style="color: rgba(0, 0, 0, 1);"> employee </span><span style="color: rgba(128, 128, 128, 1);">-></span> <span style="color: rgba(0, 0, 255, 1);">where</span> d_id <span style="color: rgba(128, 128, 128, 1);">in</span> <span style="color: rgba(128, 128, 128, 1);">-></span> (<span style="color: rgba(0, 0, 255, 1);">select</span> d_id <span style="color: rgba(0, 0, 255, 1);">from</span><span style="color: rgba(0, 0, 0, 1);"> department); </span><span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">----+------+--------+------+------+--------------------+</span> <span style="color: rgba(128, 128, 128, 1);">|</span> num <span style="color: rgba(128, 128, 128, 1);">|</span> d_id <span style="color: rgba(128, 128, 128, 1);">|</span> name <span style="color: rgba(128, 128, 128, 1);">|</span> age <span style="color: rgba(128, 128, 128, 1);">|</span> sex <span style="color: rgba(128, 128, 128, 1);">|</span> homeaddr <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">----+------+--------+------+------+--------------------+</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1001</span> <span style="color: rgba(128, 128, 128, 1);">|</span> 张三 <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">26</span> <span style="color: rgba(128, 128, 128, 1);">|</span> 男 <span style="color: rgba(128, 128, 128, 1);">|</span> 北京市海淀区 <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">2</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1001</span> <span style="color: rgba(128, 128, 128, 1);">|</span> 李四 <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">24</span> <span style="color: rgba(128, 128, 128, 1);">|</span> 女 <span style="color: rgba(128, 128, 128, 1);">|</span> 上海市黄浦区 <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">3</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1002</span> <span style="color: rgba(128, 128, 128, 1);">|</span> 王五 <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">25</span> <span style="color: rgba(128, 128, 128, 1);">|</span> 男 <span style="color: rgba(128, 128, 128, 1);">|</span> 江西省赣州市 <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">----+------+--------+------+------+--------------------+</span></span> |
解析:此处首先查询出department表中所有d_id字段的信息,并将结果作为条件,接着查询employee表中以d_id为条件的所有字段信息;NOT IN的效果与上面刚好相反。
3、列子查询(column subquery):返回的结果集是 N 行 1列
必须使用 IN、ANY 和 ALL 操作符对子查询返回的结果进行比较
注意:ANY 和 ALL 操作符不能单独使用,其前面必须加上单行比较操作符= > < >= <= <>
1)带ANY关键字的子查询:ANY关键字表示满足其中任一条件
1 2 3 4 5 6 7 8 9 10 11 |
<span style="font-size: 16px;">mysql<span style="color: rgba(128, 128, 128, 1);">></span> <span style="color: rgba(0, 0, 255, 1);">select</span> <span style="color: rgba(128, 128, 128, 1);">*</span> <span style="color: rgba(0, 0, 255, 1);">from</span><span style="color: rgba(0, 0, 0, 1);"> employee </span><span style="color: rgba(128, 128, 128, 1);">-></span> <span style="color: rgba(0, 0, 255, 1);">where</span> d_id <span style="color: rgba(128, 128, 128, 1);">!=any</span> <span style="color: rgba(128, 128, 128, 1);">-></span> (<span style="color: rgba(0, 0, 255, 1);">select</span> d_id <span style="color: rgba(0, 0, 255, 1);">from</span><span style="color: rgba(0, 0, 0, 1);"> department); </span><span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">----+------+--------+------+------+--------------------+</span> <span style="color: rgba(128, 128, 128, 1);">|</span> num <span style="color: rgba(128, 128, 128, 1);">|</span> d_id <span style="color: rgba(128, 128, 128, 1);">|</span> name <span style="color: rgba(128, 128, 128, 1);">|</span> age <span style="color: rgba(128, 128, 128, 1);">|</span> sex <span style="color: rgba(128, 128, 128, 1);">|</span> homeaddr <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">----+------+--------+------+------+--------------------+</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1001</span> <span style="color: rgba(128, 128, 128, 1);">|</span> 张三 <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">26</span> <span style="color: rgba(128, 128, 128, 1);">|</span> 男 <span style="color: rgba(128, 128, 128, 1);">|</span> 北京市海淀区 <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">2</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1001</span> <span style="color: rgba(128, 128, 128, 1);">|</span> 李四 <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">24</span> <span style="color: rgba(128, 128, 128, 1);">|</span> 女 <span style="color: rgba(128, 128, 128, 1);">|</span> 上海市黄浦区 <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">3</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1002</span> <span style="color: rgba(128, 128, 128, 1);">|</span> 王五 <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">25</span> <span style="color: rgba(128, 128, 128, 1);">|</span> 男 <span style="color: rgba(128, 128, 128, 1);">|</span> 江西省赣州市 <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">4</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1004</span> <span style="color: rgba(128, 128, 128, 1);">|</span> Aric <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">15</span> <span style="color: rgba(128, 128, 128, 1);">|</span> 男 <span style="color: rgba(128, 128, 128, 1);">|</span> England <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">----+------+--------+------+------+--------------------+</span></span> |
2)带ALL关键字的子查询:ALL关键字表示满足其中所有条件
1 2 3 4 5 6 7 8 |
<span style="font-size: 16px;">mysql<span style="color: rgba(128, 128, 128, 1);">></span> <span style="color: rgba(0, 0, 255, 1);">select</span> <span style="color: rgba(128, 128, 128, 1);">*</span> <span style="color: rgba(0, 0, 255, 1);">from</span><span style="color: rgba(0, 0, 0, 1);"> employee </span><span style="color: rgba(128, 128, 128, 1);">-></span> <span style="color: rgba(0, 0, 255, 1);">where</span> d_id <span style="color: rgba(128, 128, 128, 1);">>=all</span> <span style="color: rgba(128, 128, 128, 1);">-></span> (<span style="color: rgba(0, 0, 255, 1);">select</span> d_id <span style="color: rgba(0, 0, 255, 1);">from</span><span style="color: rgba(0, 0, 0, 1);"> department); </span><span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">----+------+------+------+------+----------+</span> <span style="color: rgba(128, 128, 128, 1);">|</span> num <span style="color: rgba(128, 128, 128, 1);">|</span> d_id <span style="color: rgba(128, 128, 128, 1);">|</span> name <span style="color: rgba(128, 128, 128, 1);">|</span> age <span style="color: rgba(128, 128, 128, 1);">|</span> sex <span style="color: rgba(128, 128, 128, 1);">|</span> homeaddr <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">----+------+------+------+------+----------+</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">4</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1004</span> <span style="color: rgba(128, 128, 128, 1);">|</span> Aric <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">15</span> <span style="color: rgba(128, 128, 128, 1);">|</span> 男 <span style="color: rgba(128, 128, 128, 1);">|</span> England <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">----+------+------+------+------+----------+</span></span> |
注意:如果子查询的结果集中有null值,使用>ALL 和not in操作符时,必须去掉子查询结果集中的null值,否则查询结果错误
1 2 3 4 |
<span style="font-size: 16px;">mysql<span style="color: rgba(128, 128, 128, 1);">></span> <span style="color: rgba(0, 0, 255, 1);">select</span> <span style="color: rgba(128, 128, 128, 1);">*</span> <span style="color: rgba(0, 0, 255, 1);">from</span><span style="color: rgba(0, 0, 0, 1);"> department </span><span style="color: rgba(128, 128, 128, 1);">-></span> <span style="color: rgba(0, 0, 255, 1);">where</span> d_id <span style="color: rgba(128, 128, 128, 1);">>all</span> <span style="font-family: 'Microsoft YaHei'; color: rgba(255, 0, 0, 1);">#>all背后执行and操作 </span><span style="color: rgba(128, 128, 128, 1);">-></span> (<span style="color: rgba(0, 0, 255, 1);">select</span> d_id <span style="color: rgba(0, 0, 255, 1);">from</span><span style="color: rgba(0, 0, 0, 1);"> employee); Empty </span><span style="color: rgba(0, 0, 255, 1);">set</span> (<span style="color: rgba(128, 0, 0, 1); font-weight: bold;">0.01</span><span style="color: rgba(0, 0, 0, 1);"> sec)</span></span> |
1 |
<span style="font-size: 18px; font-family: 'Microsoft YaHei';">结果为空:子查询的结果集中包含null值(子查询结果集中没有主查询里的1004行,则为空)。</span> |
4、表子查询(table subquery):返回的结果集是 N 行 N 列
必须使用 IN、ANY 和 ALL 操作符对子查询返回的结果进行比较
示例:在committee_members表中,得到任职日期和卸任日期与具有Secretary职位的一行相同的所有行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<span style="font-size: 16px;">mysql<span style="color: rgba(128, 128, 128, 1);">></span> <span style="color: rgba(0, 0, 255, 1);">select</span> <span style="color: rgba(128, 128, 128, 1);">*</span> <span style="color: rgba(128, 128, 128, 1);">-></span> <span style="color: rgba(0, 0, 255, 1);">from</span><span style="color: rgba(0, 0, 0, 1);"> COMMITTEE_MEMBERS </span><span style="color: rgba(128, 128, 128, 1);">-></span> <span style="color: rgba(0, 0, 255, 1);">where</span> (begin_date,end_date) <span style="color: rgba(128, 128, 128, 1);">in</span> <span style="color: rgba(128, 128, 128, 1);">-></span><span style="color: rgba(0, 0, 0, 1);"> ( </span><span style="color: rgba(128, 128, 128, 1);">-></span> <span style="color: rgba(0, 0, 255, 1);">select</span><span style="color: rgba(0, 0, 0, 1);"> begin_date,end_date </span><span style="color: rgba(128, 128, 128, 1);">-></span> <span style="color: rgba(0, 0, 255, 1);">from</span><span style="color: rgba(0, 0, 0, 1);"> COMMITTEE_MEMBERS </span><span style="color: rgba(128, 128, 128, 1);">-></span> <span style="color: rgba(0, 0, 255, 1);">where</span> position<span style="color: rgba(128, 128, 128, 1);">=</span><span style="color: rgba(255, 0, 0, 1);">'</span><span style="color: rgba(255, 0, 0, 1);">Secretary</span><span style="color: rgba(255, 0, 0, 1);">'</span> <span style="color: rgba(128, 128, 128, 1);">-></span><span style="color: rgba(0, 0, 0, 1);"> ); </span><span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">--------+------------+------------+-----------+</span> <span style="color: rgba(128, 128, 128, 1);">|</span> PLAYERNO <span style="color: rgba(128, 128, 128, 1);">|</span> BEGIN_DATE <span style="color: rgba(128, 128, 128, 1);">|</span> END_DATE <span style="color: rgba(128, 128, 128, 1);">|</span> POSITION <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">+</span><span style="color: rgba(0, 128, 128, 1);">--</span><span style="color: rgba(0, 128, 128, 1);">--------+------------+------------+-----------+</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">6</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1990</span><span style="color: rgba(128, 128, 128, 1);">-</span><span style="color: rgba(128, 0, 0, 1); font-weight: bold;">01</span><span style="color: rgba(128, 128, 128, 1);">-</span><span style="color: rgba(128, 0, 0, 1); font-weight: bold;">01</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1990</span><span style="color: rgba(128, 128, 128, 1);">-</span><span style="color: rgba(128, 0, 0, 1); font-weight: bold;">12</span><span style="color: rgba(128, 128, 128, 1);">-</span><span style="color: rgba(128, 0, 0, 1); font-weight: bold;">31</span> <span style="color: rgba(128, 128, 128, 1);">|</span> Secretary <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">8</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1990</span><span style="color: rgba(128, 128, 128, 1);">-</span><span style="color: rgba(128, 0, 0, 1); font-weight: bold;">01</span><span style="color: rgba(128, 128, 128, 1);">-</span><span style="color: rgba(128, 0, 0, 1); font-weight: bold;">01</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1990</span><span style="color: rgba(128, 128, 128, 1);">-</span><span style="color: rgba(128, 0, 0, 1); font-weight: bold;">12</span><span style="color: rgba(128, 128, 128, 1);">-</span><span style="color: rgba(128, 0, 0, 1); font-weight: bold;">31</span> <span style="color: rgba(128, 128, 128, 1);">|</span> Treasurer <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">8</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1991</span><span style="color: rgba(128, 128, 128, 1);">-</span><span style="color: rgba(128, 0, 0, 1); font-weight: bold;">01</span><span style="color: rgba(128, 128, 128, 1);">-</span><span style="color: rgba(128, 0, 0, 1); font-weight: bold;">01</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1991</span><span style="color: rgba(128, 128, 128, 1);">-</span><span style="color: rgba(128, 0, 0, 1); font-weight: bold;">12</span><span style="color: rgba(128, 128, 128, 1);">-</span><span style="color: rgba(128, 0, 0, 1); font-weight: bold;">31</span> <span style="color: rgba(128, 128, 128, 1);">|</span> Secretary <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">27</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1990</span><span style="color: rgba(128, 128, 128, 1);">-</span><span style="color: rgba(128, 0, 0, 1); font-weight: bold;">01</span><span style="color: rgba(128, 128, 128, 1);">-</span><span style="color: rgba(128, 0, 0, 1); font-weight: bold;">01</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1990</span><span style="color: rgba(128, 128, 128, 1);">-</span><span style="color: rgba(128, 0, 0, 1); font-weight: bold;">12</span><span style="color: rgba(128, 128, 128, 1);">-</span><span style="color: rgba(128, 0, 0, 1); font-weight: bold;">31</span> <span style="color: rgba(128, 128, 128, 1);">|</span> Member <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">27</span> <span style="color: rgba(128, 128, 128, 1);">|</span> <span style="color: rgba(128, 0, 0, 1); font-weight: bold;">1991</span><span style="color: rgba(128, 128, 128, 1);">-</span><span style="color: rgba(128, 0, 0, 1); font-weight: bold;">01&l</span></span> |