mysql子查询(单行子查询,多行子查询,多列子查询)

2023-12-01 0 549
目录
  • 创建初始表
  • ANY SOME 关键字的子查询
  • ALL 关键字
  • 带 IN 关键字 的子查询
  • NOT IN
  • 连接查询
  • 多列子查询
  • 带比较运算符的子查询
  • 带EXISTS 关键字的子查询

子查询使用规则:

  • 子查询放在圆括号中
  • 子查询放在比较条件右边(非强制)
  • 子查询中不需要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\’);

mysql子查询(单行子查询,多行子查询,多列子查询)

NOT IN

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

mysql子查询(单行子查询,多行子查询,多列子查询)

连接查询

(也可以解决这个问题,但有空值,但子查询更容易阅读和编写)

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

mysql子查询(单行子查询,多行子查询,多列子查询)

多列子查询

在 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 ;

mysql子查询(单行子查询,多行子查询,多列子查询)*注意:子查询结果为多列,一定在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);

返回结果:

mysql子查询(单行子查询,多行子查询,多列子查询)

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);

mysql子查询(单行子查询,多行子查询,多列子查询)

到此这篇关于mysql子查询(单行子查询,多行子查询,多列子查询)的文章就介绍到这了,更多相关MySQL子查询 内容请搜索悠久资源网以前的文章或继续浏览下面的相关文章希望大家以后多多支持悠久资源网!

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悠久资源 Mysql mysql子查询(单行子查询,多行子查询,多列子查询) https://www.u-9.cn/database/mysql/4498.html

常见问题

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务