子查询使用规则:

  • 子查询放在圆括号中
  • 子查询放在比较条件右边(非强制)
  • 子查询中不需要ORDER BY 子句
  • 在单行子查询中使用单行运算符,在多行子查询中用多行运算符。

单行运算符:子查询结果 只有一个 :< > = <= >= !=
多行子查询:子查询结果是 单列多行 :in , any,all
多列子查询:子查询为多列,一定要在FROM后作为表,且一定要取别名,否则无法访问这张表中的字段。

#创建初始表

CREATE TABLE tbl1 (num1 INT NOT NULL);
CREATE TABLE tbl2 (num2 INT NOT NULL);
INSERT INTO tbl1 VALUES(1),(5),(13),(27);
INSERT INTO tbl2 VALUES(6),(14),(11),(20);

#ANY SOME 关键字的子查询
#返回tbl2的所有num2列,将tbl1中的num值与之进行比较,只要大于num2的任意一值,即为符合条件的结果。

SELECT num1 FROM tbl1 
WHERE num1 > SOME(SELECT num2 FROM tbl2);
SELECT num1 FROM tbl1 
WHERE num1 > ANY (SELECT num2 FROM tbl2);

#ALL 关键字

SELECT num1 FROM tbl1 
WHERE num1 > ALL (SELECT num2 FROM tbl2);

#新建一个orderitems表

CREATE TABLE orderitems(
o_num INT NOT NULL,
o_item INT NOT NULL,
f_id CHAR(10) NOT NULL,
quantity INT NOT NULL,
item_price DECIMAL(8,2) NOT NULL,
PRIMARY KEY(o_num,o_item)

#填入数据

INSERT INTO orderitems(o_num,o_item,f_id,quantity,item_price)
VALUES(3001,1,'a1',10,5.2),
(3001,2,'b2',3,7.6),
(3001,3,'bs1',5,11.2),
(3001,4,'bs2',15,9.2),
(3002,1,'b3',2,20.0),
(3003,1,'c0',100,10),
(3004,1,'o2',50,2.50),
(3005,1,'c0',5,10),
(3005,2,'b1',10,8.99),
(3005,3,'a2',10,2.2),
(3005,4,'m1',5,14.99);

带 IN 关键字 的子查询

#在orderitem表中查询f_id为c0 的订单号,并根据订单号查询具有订单号的客户c_id,SQL语句如下:

SELECT c_id FROM orders
WHERE o_num IN
(SELECT o_num FROM orderitems WHERE f_id = 'c0');

NOT IN

SELECT c_id FROM orders
WHERE o_num NOT IN
(SELECT o_num FROM orderitems WHERE f_id = 'c0');

在这里插入图片描述
#连接查询(也可以解决这个问题,但有空值,但子查询更容易阅读和编写)

SELECT c_id 
FROM orderitems left JOIN orders
ON orders.o_num = orderitems.o_num 
AND orderitems.f_id = 'c0';

在这里插入图片描述
多列子查询

在 orderitems 表中查询 f_id 为 c0 的订单号的所有信息,并根据订单号查询具有订单号的客户的所有信息,SQL语句如下:

SELECT * FROM orders ord ,
(SELECT * FROM orderitems AS o WHERE f_id='c0') ite 
WHERE ord.o_num=ite.o_num ;

在这里插入图片描述
*注意:子查询结果为多列,一定在FROM后做为表,且一定要取别名,否则无法访问这张表中的字段。

带比较运算符的子查询

#在suppliers表中查询s_city等于‘tianjin’的供应商s_id,然后在fruits表中,查询所有非该供应商供应的水果种类名称。

SELECT s_id,f_name FROM fruits f
WHERE f.s_id !=
(SELECT s1.s_id 
FROM suppliers AS s1 WHERE s1.s_city = 'tianjin');

带EXISTS 关键字的子查询

EXISTS关键字后是任意一个子查询:

  • 若至少返回一行,则结果为True,此时外层将进行查询。
  • 若没有返回任何行,则返回的结果为false,此时外层语句将不进行查询。
    NOT EXISTSEXISTS 的使用方法相同,返回的结果相反。
    查询suppliers中是否存在s_id 的供应商,若存在,则查询fruits表中所有记录:
SELECT * FROM fruits 
WHERE EXISTS 
(SELECT s.s_id FROM suppliers AS  s WHERE s.s_id = 107);

返回结果:
在这里插入图片描述
EXISTS也可以和条件表达式一起使用

例:查询suppliers中是否存在s_id 的供应商,若存在,则查询fruits表中f_price>10.20的记录:

SELECT * FROM fruits 
WHERE f_price >10.20 AND EXISTS
 (SELECT s.s_id FROM suppliers AS  s WHERE s.s_id = 107);
(1)使用IN操作符进行多行子查询。(总结:IN操作符后可用多行子查询)
比如:查询各个职位中工资最高的员工信息。
SQL>select ename, job, sal from emp where sal
in (select max(sal) from emp group by job);——单列子查询
SQL>select ename, jo
 --当需要的数据在一张表中,考虑使用单表查询--多表联合查询:
 --当需要查询的数据分布在多张表中,考虑使用多表联合--子查询学习:
 --使用时机:当查询的筛选条件不明确时,考虑使用子查询。
 --单行子查询
 --多行子查询
----------------------------------------------------------------
--单行子...
				
1、查询部分分为主查询和子查询; 2、根据返回值的记录多少分为单行子查询多行子查询单行子查询单行比较符=连接;多行子查询多行比较符in连接; 3、子查询的内容可以放在FROM后面,也可以放在WHERE后面,也可以放在HAVING后面; 4、完整的SELECT语句可以拥有GROUP BY,HAVING子句,也可以使用组函数;也可以从多个表中查询; 5、子查询的内容必须用小括号来界定;
--显示雇员的名字,雇员的工资和所在部门的名称 --如果两张表都有相同名字的字段,则需要带表明 select ename,sal,loc,emp.deptno,dept.deptno from emp ,dept where dname='sales' and dept.deptno=emp.deptno --显示部门号位10的部门号、员工名和工资 select #拿到题目先思考限定条件,我们需要查询的限定条件是location_id的区域。 #1.查询location_id 在1200-1400的部门id信息 SELECT DISTICT department_id
前面聊了一些查询的东西,现在聊SELECT中相对而言最难的一部分—子查询子查询指一个查询语句中嵌套在另一个查询语句内部的查询,这个特性从MYSQL4.1开始引入。 SQL中子查询的使用大大增强了SELECT查询的能力,因为很多时候查询需要从结果集中获取数据,或者需要从同一个表中先计算得出一个数据结果,然后与这个数据的结果进行比较。 说实话这个地方用文字进行描述的话,有点绕。 还是多用操作演示,这样比较好理解,先看一下所用的表 提出一个需求,那就是工资比SCOTT工资高的员工有谁? -- 按照
ANY|SOME 和子查询返回的某一个值比较 ALL 和子查询返回的所有值比较 案例1:返回location_id是1400或1700的部门中的所有员工姓名 1.查询location_id是1400或1700的部门编号 SELECT DISTINCT department_id FROM departments WHERE location_id IN(1400,1 MYSQL错误:check the manual that corresponds to your MySQL server version for the right syntax to use 39085 【错误解决】docker安装elasticsearch时,Exception in thread “main“ java.nio.file.NotDirectoryE CSDN-Ada助手: 恭喜作者发布了第18篇博客!对于docker安装elasticsearch时遇到的问题,你的解决方法对很多人来说都是非常有帮助的。接下来,我建议你可以继续分享关于docker和elasticsearch更多的使用经验,或者可以尝试探讨一些相关的技术问题,让读者能够更全面地了解这个领域。希望你在创作的道路上越走越远,加油! 【错误解决】requests.exceptions.SSLError:wrong version number (_ssl.c:1131) CSDN-Ada助手: 恭喜您写了第19篇博客,标题看起来很专业呢!对于解决requests.exceptions.SSLError这个错误的分享,我觉得非常有帮助。不过我想提个建议,可以考虑结合具体的案例或者实际操作步骤,更详细地分享解决方法,这样会更加全面和实用。希望您能继续坚持创作,期待您的下一篇博客! 【错误解决】Linux虚拟机 Docker安装RabbitMQ3.9主机无法打开admin-user界面解决办法 星星落在海那边: 是的,我换3.10就解决了,主要是官方镜像3.9中的erlang不兼容,无解。 【错误解决】Linux虚拟机 Docker安装RabbitMQ3.9主机无法打开admin-user界面解决办法 Guiver: 3.9版本才这样,我换成3.11就没问题了,无解