时间:2023-10-27来源:系统城装机大师作者:佚名
子查询使用规则:
1 2 3 4 |
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); |
返回tbl2的所有num2列,将tbl1中的num值与之进行比较,只要大于num2的任意一值,即为符合条件的结果。
1 2 |
SELECT num1 FROM tbl1 WHERE num1 > SOME ( SELECT num2 FROM tbl2); |
1 2 |
SELECT num1 FROM tbl1 WHERE num1 > ANY ( SELECT num2 FROM tbl2); |
1 2 |
SELECT num1 FROM tbl1 WHERE num1 > ALL ( SELECT num2 FROM tbl2); |
新建一个orderitems表
1 2 3 4 5 6 7 8 |
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) ); |
填入数据
1 2 3 4 5 6 7 8 9 10 11 12 |
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); |
#在orderitem表中查询f_id为c0 的订单号,并根据订单号查询具有订单号的客户c_id,SQL语句如下:
1 2 3 |
SELECT c_id FROM orders WHERE o_num IN ( SELECT o_num FROM orderitems WHERE f_id = 'c0' ); |
1 2 3 |
SELECT c_id FROM orders WHERE o_num NOT IN ( SELECT o_num FROM orderitems WHERE f_id = 'c0' ); |
(也可以解决这个问题,但有空值,但子查询更容易阅读和编写)
1 2 3 4 |
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语句如下:
1 | 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表中,查询所有非该供应商供应的水果种类名称。
1 2 3 4 |
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关键字后是任意一个子查询:
若至少返回一行,则结果为True,此时外层将进行查询。
若没有返回任何行,则返回的结果为false,此时外层语句将不进行查询。
NOT EXISTS 和 EXISTS 的使用方法相同,返回的结果相反。
查询suppliers中是否存在s_id 的供应商,若存在,则查询fruits表中所有记录:
1 2 3 |
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的记录:
1 2 3 |
SELECT * FROM fruits WHERE f_price >10.20 AND EXISTS ( SELECT s.s_id FROM suppliers AS s WHERE s.s_id = 107); |
到此这篇关于mysql子查询(单行子查询,多行子查询,多列子查询)的文章就介绍到这了
2023-10-30
windows上的mysql服务突然消失提示10061 Unkonwn error问题及解决方案2023-10-30
MySQL非常重要的日志bin log详解2023-10-30
详解MySQL事务日志redo log一、单表查询 1、排序 2、聚合函数 3、分组 4、limit 二、SQL约束 1、主键约束 2、非空约束 3、唯一约束 4、外键约束 5、默认值 三、多表查询 1、内连接 1)隐式内连接: 2)显式内连接: 2、外连接 1)左外连接 2)右外连接 四...
2023-10-30
Mysql删除表重复数据 表里存在唯一主键 没有主键时删除重复数据 Mysql删除表中重复数据并保留一条 准备一张表 用的是mysql8 大家自行更改 创建表并添加四条相同的数据...
2023-10-30