SQL数据查询——单表查询(二)

集合查询+单表查询相关实例

集合查询

SQL SERVER集合操作主要包括
并操作 UNION
交操作 INERSECT
差操作 EXCEPT

1.UNION

使用UNION能实现多个查询结果的合并,并形成一个完整的查询结果,系统会自动去掉重复的元组

#例:查询年龄不大于19岁的学生以及CS系的学生
SELECT *
FROM Student
WHERE Sage<=19 OR Sdept='CS';  --OR表示取并集

#若用UNION并操作,同样可以处理上述问题
SELECT *
FROM Student
WHERE Sage<=19
UNION  --UNION实现多个查询结果的合并
SELECT *
FROM Student
WHERE Sdept='CS';

2.INTERSECT

INTERSECT可以将两个查询结果集合实现集合交操作即返回两个查询结果集合中都返回的所有非重复行

#例:查询年龄不大于19岁且为CS系的学生
SELECT *
FROM Student
WHERE Sage<=19 AND Sdept='CS';  --AND表示取交集

#若用INTERSECT交操作,同样可以处理上述问题
SELECT *
FROM Student
WHERE Sage<=19
INTERSECT
SELECT *
FROM Student
WHERE Sdept='CS'

3.EXCEPT

EXCEPT实现两个查询结果集的集合差操作即从左查询中返回右查询没有找到的所有非重复行

相关实例

实例1

实验中要使用包括如下三个表的“教学管理”数据库JXGL:
(1)学生表Student,由学号(Sno)、姓名(Sname)、性别(Ssex)、年龄(Sage)、所在系(Sdept)五个属性组成
   记作:Student(Sno,Sname,Ssex,Sage,Sdept),其中主码为Sno;
(2)课程表Course,由课程号(Cno)、课程名(Cname)、先修课号(Cpno)、学分(Ccredit)四个属性组成
   记作:Course(Cno,Cname,Cpno,Ccredit),其中主码为Cno;
(3)学生选课SC,由学号(Sno)、课程号(Cno)、成绩(Grade)三个属性组成
   记作:SC(Sno,Cno,Grade),其中主码为(Sno,Cno)。

基于“教学管理”数据库JXGL,试用SQL的查询语句表达下列查询:
(1)检索年龄大于23岁的男学生的学号和姓名

SELECT Sno,Sname
FROM Student
WHERE Sage>23 AND Ssex = '男'

//上述也可以用交操作进行查询
SELECT Sno,Sname
FROM Student
WHERE Sage>23
INTERSECT
SELECT Sno,Sname
FROM Student
WHERE Ssex = '男'

(2)检索至少选修两门课程的学生学号

SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(Cno)>=2

(3)统计有学生选修的课程门数

SELECT COUNT(DISTINCT Cno)
FROM SC

(4)统计每门课程的学生选修人数,超过3人的课程才统计。要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列

SELECT Cno,COUNT(*)
FROM SC
GROUP BY Cno
HAVING COUNT(*)>3
ORDER BY COUNT(*) DESC,Cno ASC

//Sno在一个组内也可以具有标识作用,因此COUNT(Sno)也可以
SELECT Cno,COUNT(Sno)
FROM SC
GROUP BY Cno
HAVING COUNT(Sno)>3
ORDER BY COUNT(Sno) DESC,Cno ASC

(5)检索姓名以王打头的所有学生的姓名和年龄

扫描二维码关注公众号,回复: 10908652 查看本文章
SELECT Sname,Sage
FROM Student
WHERE Sname LIKE '王%'

(6)在SC中检索成绩为空值的学生学号和课程号

SELECT Sno,Cno
FROM SC
WHERE Grade IS NULL

(7)检索选修2号课程的学生中成绩最高的学生的学号

SELECT TOP (1) WITH TIES Sno
FROM SC
WHERE Cno='2'
ORDER BY Grade DESC

(8)检索学生姓名及其所选修课程的课程号和成绩

SELECT Sname,Cno,Grade
FROM Student,SC
WHERE Student.Sno=SC.Sno  --此处用到了连接

(9)检索选修及格的4门以上课程的学生总成绩(不统计不及格的课程),并要求按总成绩的降序排列出来

SELECT Sno,SUM(Grade)
FROM SC
WHERE Grade>=60
GROUP BY Sno
HAVING COUNT(*)>=4
ORDER BY SUM(Grade) DESC

实例2

设有如下4个基本表:
(1)学生表STUDENT,由学号(SNO)、姓名(SNAME)、性别(SEX)、年龄(AGE)、所在班级(CLASS)五个属性组成
   记作:STUDENT(SNO,SNAME,SEX,AGE,CLASS),其中主码为SNO;
(3)教师表TEACHER,由教师号(TNO)、姓名(TNAME)、性别(SEX)、年龄(AGE)、职称(PROF)、所在系(DEPT)六个属性组成
   记作:TEACHER(TNO,TNAME,SEX,AGE,PROF,DEPT),其中主码为TNO;
(2)课程表COURSE,由课程号(CNO)、课程名(CNAME)、教授教师号(TNO)三个属性组成
   记作:COURSE(CNO,CNAME,TNO),其中主码为CNO;
(3)学生选课SC,由学号(SNO)、课程号(CNO)、成绩(GRADE)三个属性组成
   记作:SC(SNO,CNO,GRADE),其中主码为(SNO,CNO)。

根据表结构实践以下SQL命令操作:
(1)查询选修课程’8105’且成绩在80到90之间的所有记录

SELECT *
FROM SC
WHERE CNO = '8105' AND GRADE BETWEEN 80 AND 90

//上述也可以用交操作实现查询
SELECT *
FROM SC
WHERE CNO = '8105'
INTERSECT
SELECT *
FROM SC
WHERE GRADE BETWEEN 80 AND 90

(2)查询成绩为79、89或99的记录

SELECT *
FROM SC
WHERE GRADE IN(79,89,99)

(3)查询9803班的学生人数

SELECT COUNT(SNO)
FROM STUDENT
WHERE CLASS='9803'

(4)查询至少有20名学生选修的并以8开头的课程的平均成绩

SELECT CNO,AVG(GRADE)
FROM SC
WHERE CNO LIKE '8%'
GROUP BY CNO
HAVING COUNT(SNO)>=20

(5)查询最低分大于80,最高分小于95的SNO与平均分

SELECT SNO,AVG(GRADE)
FROM SC
GROUP BY SNO
HAVING MIN(GRADE)>80 AND MAX(GRADE)<95

(6)查询9803班学生所选各课程的课程号及其平均成绩

SELECT SC.CNO,AVG(GRADE)
FROM STUDENT,SC
WHERE STUDENT.CLASS = '9803' AND SC.SNO = STUDENT.SNO
GROUP BY SC.CNO

(7)列出所有教师和同学的姓名、SEX、AGE

SELECT SNAME,SEX,AGE
FROM STUDENT
UNION
SELECT TNAME,SEX,AGE
FROM TEACHER

(8)列出所有任课教师的TNAME和DEPT

SELECT TNAME,DEPT
FROM TEACHER INNER JOIN COURSE ON TEACHER.TNO=COURSE.TNO

(9)列出至少有4名男生的班号

SELECT CLASS
FROM STUDENT
WHERE SEX='男'
GROUP BY CLASS
HAVING COUNT(SEX)>=4

(10)查询不姓“张”的学生记录

SELECT *
FROM STUDENT
WHERE SNAME LIKE '[^张]%'

//也可以用NOT关键字实现上述查询
SELECT *
FROM STUDENT
WHERE SNAME NOT LIKE '[张]%'

本文到此结束,如有错误,欢迎大家批评指正。

发布了20 篇原创文章 · 获赞 16 · 访问量 1282

猜你喜欢

转载自blog.csdn.net/SAMSARS/article/details/105390226