MySQL学习(谓词查询+比较运算符)

交(INTERSECT):

#选出同时选修1号和2号课程的学生学号
SELECT Sno
FROM SC
WHERE Cno='1'
INTERSECT
SELECT Sno
FROM SC
WHERE Cno='2';

注:交运算不属于基本运算。
差(EXCEPT):

-- 选了1号课却没选2号课的学生学号
select Sno,Cno,Grade
FROM SC
WHERE Cno='1'
EXCEPT
SELECT Sno,Cno,Grade
FROM SC
WHERE Cno='2';

谓词any、all:
使用ANY / ALL时必须同时使用比较运算符。
当子查询返回多个值时使用。

-- 查询比计算机学院的学生都小的学生姓名和年龄
select sname,sage
from student
where sage<all
	(select sage
	from student
	where sdept='计算机');
-- 相当于使用最小值聚集函数
select sname,sage
from student
where sage<
	(select min(sage)
	from student
	where sdept='计算机');
= <> < <= > >=
ANY IN <=MAX >MIN >=MIN
ALL NOT IN <=MIN >MAX >=MAX

谓词EXISTS
查询结果只返回逻辑值”真“或者”假“,不返回任何数据。
嵌套查询:

-- 查询选修了数据库的学生学号和姓名:
select Sno,Sname
from student
where Sno in 
	(select Sno
	from sc
	where cno in
		(select cno 
		from course
		where cname='数据库'));

eg2:

-- 查询同时选修1号课程和2号课程的学生学号
-- 思路:从(选修过2号课程的)学号中选出(选修了1号课程的)学号
select sno
from sc
where cno='1'
and sno in
	(select sno
	from sc
	where cno='2')

eg3:

-- 查询选修了1号课程又没有选修2号课程的学生学号
select sno
from sc
where cno='1'
and sno not in
	(select sno
	from sc
	where cno='2')

带有比较运算符的子查询:
当用户能够确切知道内层查询返回的时单值时,可以使用比较运算符。

-- 找出每个学生超过他平均成绩的课程号
-- 思路:先计算出平均成绩,再进行筛选
select sno,cno
from sc x
where grade>
	select avg(grade)
	from sc	y
	where x.sno=y.sno

你可能感兴趣的:(数据库,MySQL,谓词,比较运算符)