> 文档中心 > SQL子查询

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 中使用的、接下来我们将学习子查询中的两个特殊关键字语法——ANYALL

 三、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 的使用其实比较少,多加练习理解即可。
  • 子查询重在积少成多和融汇贯通,请务必多加练习形成自己的知识网。