SQL语言_多表查询和TOP限制结果集_PAGE3

多表查询

--01.内连接
SElECT * FROM Student
	INNER JOIN SC ON Student.Sid=SC.Sid--Student与SC连接起来

SElECT Sname,Cid,Grade FROM Student S--为表取别名,AS可以省略
	JOIN SC ON S.Sid=SC.Sid--INNER可以省略

SELECT Sname,Cname,Grade
	FROM Student S 
	JOIN SC ON S.Sid=SC.Sid
	JOIN Course C JOIN C.Cid=SC.Cid--涉及三张表,多一个表就多一个JOIN
	WHERE Sdept='计算机系'
		AND Cname='计算机操作系统'
		
SELECT Sname,Sdept
	FROM Student S 
	JOIN SC ON S.Sid=SC.Sid
	JOIN Course C JOIN C.Cid=SC.Cid--要查询的列与元组与SC无关,但是S与C要靠SC连接
	WHERE Cname='JAVA'

SELECT Cid,COUNT(*) AS Total,AVG(Grade) AS AvgGrade,
	MAX(Grade) AS MaxGrade,MIN(Grade) AS MinGrade
	FROM Student S 
	JOIN SC ON SC.Sid=S.Sid
	WHERE Sdept='计算机系'
	GROUP BY Cid
	
--02.自连接
SELECT S2.Sname,S2.Sdept FROM Student S1 
	JOIN Student S2 ON S1.Sdept=S2.Sdept--要让物理上为同一张表在逻辑上成为两个表
	WHERE S1.Sname='张三' 
		AND S2.Sname!='张三'--查询与张三在同一个系的学生
		
--03.外连接

--查询学生的选课情况,包括选了课程的学生和没选课程的学生
--不满足表连接条件的也要显示出来,并在相应列上放置NULL
--03.01左外连接
SELECT Student.Sid,Sname,Cid,Grade
	FROM Student LEFT OUTER JOIN SC--限制表2(这里指SC)中的数据必须满足连接条件,表1无所谓
	ON Student.Sid=Sc.Sid

--03.02右外连接	
SELECT Student.Sid,Sname,Cid,Grade
	FROM SC RIGHT OUTER JOIN Student--限制表1(这里指SC)中的数据必须满足连接条件,表2无所谓
	ON Student.Sid=Sc.Sid
	
--查询哪些课程没有人选,列出其课程名
SELECT Cname FROM Course C LEFT JOIN SC
	ON C.Cid=SC.Cid
	WHERE SC.Cid IS NULL

TOP限制结果集

TOP n [percent] [WITH TIES]
--WITH TIES表示包括并列结果

--查询年龄最大的三名学生
SELECT TOP 3 Sname,Sid,Sdept
	FROM Student
	ORDER BY Sage DESC
	
--查询Java成绩前三包括并列的学生
SELECT TOP 3 WITH TIES Sname,Sid,Grade
	FROM Student S JOIN SC ON S.Sid=SC.Sid
	JOIN Course C ON C.Sid=SC.Sid
	WHERE Cname="Java"
	ORDER BY Grade DESC
posted @ 2024-11-23 14:40  OrianaGuo  阅读(55)  评论(0)    收藏  举报