MySQL 子查询

1、where型的子查询

where型的子查询就是把内层查询的结果当作外层查询的条件。

--(1) 查询与27号运动 同一性别,同一城市的其他人

-- 第一步 查询27号球员的性别、城市
select sex,town from players where playno=27;
-- 第二步 将查询的结果放置where条件处
select playerno,sex,town from players 
where (sex,town) = (select sex,town from players where playerno= 27);


--(2)获取和27号球员出生在同一年的球员号码

--第一步 查询27号球员的出生年
select year(birth_date)from players where playerno =27;
-- 第二步 将查询的结果放置where条件处
select playerno,birth_date from players 
where year(birth_date)=(select year(birth_date)from players where playerno =27);

2、from型的子查询

from子查询就是把子查询的结果(内存里的一张表)当作一张临时表,然后再对它进行处理。

-- 获取编号小于10的男性球员号码
--普通写法: 
select*from players where sex = "m" and playerno <10;
--子查询写法
select*FROM (select *from players where playerno < 10) AS A WHERE SEX="M";

3、列 子查询

列子查询就是把返回一列的值,因此就不能用 = > < 等符号

配合以下条件符使用:

  • in 在指定项里
  • any 在子查询任何返回结果比较
  • all 在子查询所有返回结果比较
--(in 举例) 获取球员性别为女的所有球员的球号、名字及城市

-- 普通写法
select playerno,name,town from players where sex="f";
-- in 列子查询写法
select playerno,name,town from players 
where playerno in(select playerno from players where sex="f");

-- (any 举例)获取至少比同城另一位球员年轻的所有球员号码、生日、城市
select playerno,birth_date,town from players as p1
where birth_date > any(select birth_date from players as p2 where p1.town=p2.town)

--(all 举例)获取最老的球员的号码、名字和生日
--普通写法
select playerno,name,min(birth_date)from players;
-- all 列子查询写法
select playerno,name,birth_date from players where birth_date<= all(select birth_date from players);

4、exists 子查询

只要子句中至少返回一个值,则exists 语句就返回TRUE

-- (exists 举例)获取哪些至少支付了一次返款的球员姓名和首字母
select NAME,initials from players 
where exists
(select*from penalties where penalties.playerno=players.playerno);

-- (exists 举例)获取哪些从来没有付过罚款的球员姓名和首字母
select NAME,initials from players 
where  not exists
(select*from penalties where penalties.playerno =players.playerno);
原文地址:https://www.cnblogs.com/jennyyin/p/7904007.html