SQL子查询
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
文章目录
前言
一、语法
二、子查询 (select delete update inset) 相关例题
例1 Select 搭配子查询
例2 Insert 搭配子查询
例3 Update 搭配子查询
例4 Delete 搭配子查询
三、ANY 和 ALL特殊关键字
1.ANY 和 ALL
2.ANY 和 ALL的作用
3.举例
例1 子查询使用 ANY
例2 子查询使用 ALL
4. 小结
前言
本小节,我们将一起学习 SQL 子查询
先创建本章节需要的表
DROP TABLE IF EXISTS imooc_user;CREATE TABLE imooc_user( id int PRIMARY KEY, username varchar(20), age int, score int);INSERT INTO imooc_user(id,username,age,score) VALUES (1,'peter', 18, 100),(2,'pedro', 24, 200),(3,'jerry', 28, 500),(4,'mike', 12, 300),(5,'tom', 27, 1000);
进入本章的学习
一、语法
子查询的语法其实与普通查询的语法没有什么区别,只不过多了相应的子查询部分。
SELECT [col] FROM [table_name]WHERE [col] [operator]( SELECT [col] FROM [table_name]; WHERE [col] [operator] );
二、子查询 (select delete update inset) 相关例题
例1 Select 搭配子查询
请书写 SQL 语句,获取imooc_user
表中小于最大年龄的用户名
SELECT username FROM imooc_user WHERE age < (SELECT age FROM imooc_user ORDER BY age DESC LIMIT 1);-- 结果如下+----------+| username |+----------+| peter || pedro || mike || tom |+----------+
例2 Insert 搭配子查询
请书写 SQL 语句,获取imooc_user
表中小于最大年龄的用户名,并将用户名插入到 username_copy
表中
CREATE TABLE username_copy(username varchar(20));INSERT INTO username_copy SELECT username FROM imooc_user WHERE age < (SELECT age FROM imooc_user ORDER BY age DESC LIMIT 1);-- 结果如下+----------+| username |+----------+| peter || pedro || mike || tom |+----------+
例3 Update 搭配子查询
请书写 SQL 语句,将imooc_user
表中年龄大于 25 岁的用户积分增加 100
UPDATE imooc_user SET score = score + 100 WHERE id IN (SELECT id FROM imooc_user WHERE age > 25);-- 如果你使用 MySQL,那么上面语句会无法执行,因为 MySQL 不支持在同一张表中查询又更新,因此我们可以使用如下的方式来改写 SQL,使 MySQL 来支持UPDATE imooc_user SET score = score + 100 WHERE id IN ( SELECT a.id FROM(SELECT id FROM imooc_user WHERE age > 25) as a);-- 结果如下+----------+-------+| username | score |+----------+-------+| peter | 100 || pedro | 200 || jerry | 600 || mike | 300 || tom | 1100 |+----------+-------+
例4 Delete 搭配子查询
请书写 SQL 语句,删除imooc_user
表中积分大于 500 的用户
DELETE FROM imooc_user WHERE id IN (SELECT id FROM imooc_user WHERE score > 500);-- 同样的,MySQL 不支持在一张表中同时删除和查询,因此我们改写一下DELETE FROM imooc_user WHERE id IN ( SELECT a.id FROM(SELECT id FROM imooc_user WHERE score > 500) as a);-- 结果如下+----------+-------+| username | score |+----------+-------+| peter | 100 || pedro | 200 || mike | 300 |+----------+-------+
以上我们学习了 SQL 子查询的语法,并介绍了 SQL 子查询是如何在 Insert、Select、Update 和 Delete 中使用的、接下来我们将学习子查询中的两个特殊关键字语法——ANY
和ALL
三、ANY 和 ALL特殊关键字
开始前先在数据库执行以下内容
DROP TABLE IF EXISTS imooc_user;CREATE TABLE imooc_user( id int PRIMARY KEY, username varchar(20), age int, score int);INSERT INTO imooc_user(id,username,age,score) VALUES (1,'peter', 18, 100),(2,'pedro', 24, 200),(3,'jerry', 28, 500),(4,'mike', 12, 300),(5,'tom', 27, 1000);DROP TABLE IF EXISTS imooc_user_score_rank;CREATE TABLE imooc_user_score_rank( id int PRIMARY KEY, srank int, score int);INSERT INTO imooc_user_score_rank(id,srank,score) VALUES (1,1,10000),(2,2,8000),(3,9,700);
1.ANY 和 ALL
ANY 和 ALL 主要解决,子查询返回多条记录而主查询需要使用单值比较符的问题
2.ANY 和 ALL的作用
简单的理解,ALL 和 ANY 让单值比较符跟子查询结果集中的每一条记录都做比较,ALL 必须满足所有比较才为真,而 ANY 只需满足任意一个比较则为真
3.举例
例1 子查询使用 ANY
请书写 SQL 语句,获取imooc_user
表中分数大于imooc_user_score_rank
表中任意一个分数的用户
SELECT username FROM imooc_user WHERE score > ANY(SELECT score FROM imooc_user_score_rank);-- 结果如下+----------+| username |+----------+| tom |+----------+
例2 子查询使用 ALL
请书写 SQL 语句,获取imooc_user
表中分数大于imooc_user_score_rank
表中所有分数的用户
SELECT username FROM imooc_user WHERE score > ALL(SELECT score FROM imooc_user_score_rank);-- 结果如下+----------+| username |+----------+
4. 小结
- 子查询的难点在于如何熟练搭配和使用查询,这是一个
积少成多
的过程,因此请务必多多练习。 - 子查询也有诸多限制,而且性能不高,因此如果可以用一次查询解决的问题尽量不要使用子查询。
- ALL 和 ANY 的使用其实比较少,多加练习理解即可。
- 子查询重在积少成多和融汇贯通,请务必多加练习形成自己的知识网。