时间: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-27
MySQL之七种SQL JOINS实现的图文详解2023-10-27
解决mysql不是内部或外部命令的问题2023-10-27
在idea中如何操作MySQL数据库问题描述概述:用一个表中的字段去更新另外一个表中的字段, MySQL 中有相应的 update 语句来支持,不过这个 update 语法有些特殊。看一个例子就明白了。解决办法(推荐第三种)方法...
2023-10-27
1、查看是否启用 binlog 日志 2、查看所有 binlog 日志 3、查看正在使用的日志 4、查找日志所在文件夹 5、log 日志转 sql 6、delete 转 insert 恢复误删...
2023-10-27