【SQL】双层嵌套< exists not exists >
EXISTS 运算符
EXISTS 运算符用于判断查询子句是否有记录,如果有一条或多条记录存在返回 True,否则返回 False。
语法
SELECT column_name(s)
FROM table_name
WHERE EXISTS
(SELECT column_name FROM table_name WHERE condition);
实例1
查找总访问量(count 字段)大于 200 的网站是否存在。返回网站名,地址
Websites
access_log
SELECT Websites.name, Websites.url
FROM Websites
WHERE EXISTS (
SELECT count
FROM access_log
WHERE Websites.id = access_log.site_id
AND count > 200
);
实例2
表格如下:
Create table `sc`(
`sno` char(10),-- 学生学号
`cno` char(3), -- 课程号
`grade` int ,-- 分数
Primary key(`sno`,`cno`));
查找出选了001号课程和003号课程的学生,返回学号。
select s1.sno -- 选择学生
from sc s1 -- 对于这个同学
where exists(-- 存在
select s2.sno
from sc s2
where s1.sno=s2.sno and s1.cno='001' and s2.cno='003'-- 选了001号和003号
);
NOT EXISTS 运算符
查找出不符合查询语句的记录。
语法
SELECT column_name(s)
FROM table_name
WHERE NOT EXISTS
(SELECT column_name FROM table_name WHERE condition);
实例1
返回 访问量没有超过200的网站。
SELECT Websites.name, Websites.url
FROM Websites
WHERE NOT EXISTS (
SELECT count
FROM access_log
WHERE Websites.id = access_log.site_id AND count > 200
);
实例2
返回 学生选择1号课程没有选3号课程 的学号
-- 选择 学生的学号
select s1.sno from sc s1
-- 对于这个学生
where s1.Cno='001' and not EXISTS
-- 选了课程号为001的,并且不存在这样的学生(选了001号和003号)
(select s2.sno from sc s2
-- 选择学生的学号
where s2.sno=s1.sno and s2.Cno='003'
-- 这个学生选了001号课程和003号课程
)