子查询使用规则:
-
子查询放在圆括号中
-
子查询放在比较条件右边(非强制)
-
子查询中不需要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 EXISTS 和 EXISTS 的使用方法相同,返回的结果相反。
查询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助手:
【错误解决】requests.exceptions.SSLError:wrong version number (_ssl.c:1131)
CSDN-Ada助手:
【错误解决】Linux虚拟机 Docker安装RabbitMQ3.9主机无法打开admin-user界面解决办法
星星落在海那边:
【错误解决】Linux虚拟机 Docker安装RabbitMQ3.9主机无法打开admin-user界面解决办法
Guiver: