2022.10.31 第 3 章 SQL查询语句(更新中)

254 阅读6分钟

1.查询指定列

--SELECT classNo,className,institute
--FROM Class

2.消除重复元组

--SELECT DISTINCT institute
--FROM Class

3.查询所有列

--SELECT *
--FROM Class

4.给属性列起名(此处的AS可以省略也可以不省略)

--SELECT institute AS 所属学院,classNo AS 班级编号,className AS 班级名称
--FROM Class 

5.查询经过计算的列(LOWER 将课程名的大写字母转换为小写字母)

--SELECT courseNo  AS 课程号,LOWER(courseName)AS 课程名,courseHour/16 AS 周课时
--FROM Course

6.比较运算

--SELECT classNo 班级编号,className 班级名,institute 学院
--FROM Class
--WHERE grade = 2015

7.查询年龄

--SELECT studentNo 学号,studentName 学生姓名,birthday 出生日期
--FROM Student
--WHERE YEAR(GETDATE())-YEAR(birthday)>=19

8.范围查询((NOT)BETWEEN A AND B)(不在)在 (A,B)范围内

--8.1 在范围内的
--SELECT studentNo,courseNo,score
--FROM Score
--WHERE score BETWEEN 80 AND 90 (在这个范围内的)
--8.2 不在范围内的
--SELECT studentNo,courseNo,score
--FROM Score
--WHERE score NOT BETWEEN 80 AND 90(不在这个范围内的)

9.集合查询

--9.1 属于该集合查询
--SELECT studentNo,courseNo,score
--FROM Score
--WHERE courseNo IN (001,005,009)//'001','005','009'也可
--9.2 不属于该集合的查询(IN(a,b,c)   NOT IN(a,b,c))
--SELECT studentName,native,classNo
--FROM Student
--WHERE native NOT IN ('南昌','上海')

10.空值查询(IS NULL IS NOT NULL)

--10.1 查询空值
--SELECT *
--FROM Course
--WHERE priorCourse IS NULL
--10.2 查询非空值
--SELECT *
--FROM Course
--WHERE priorCourse IS NOT NULL

11.字符匹配查询(LIKE 任意一个字符用_ 任意多个字符串用%)

--11.1 %的使用
--SELECT *
--FROM Class
--WHERE className LIKE '%会计%'
--11.2 _的使用
--SELECT *
--FROM Student
--WHERE studentName LIKE '张__%'
--11.3  当不使用_或LIKE时,可以使用 =
--SELECT *
--FROM Student
--WHERE nation = '蒙古族'
--11.4 特别注意,当查询的字符串中本身包含通配符% 或 _ 就必须使用ESCAPE<换码字符>短语,对通配符进行转义处理
--SELECT *
--FROM Class
--WHERE className LIKE '%16\_%' ESCAPE '\'
--WHERE className LIKE '%16#_%' ESCAPE '#'

12.逻辑运算

--12.1 逻辑或OR运算查询
--SELECT *
--FROM Score
--WHERE courseNo='001'OR courseNo='005'OR courseNo='003'
--12.2 逻辑与AND运算查询
--SELECT *
--FROM Student
--WHERE YEAR(birthday) = 1998  AND nation = '汉族'
--12.3 不等于的扩展
--SELECT *
--FROM Student
--WHERE YEAR(birthday)! = 1999  AND nation != '汉族'
--12.4 成绩范围内查询
--SELECT *
--FROM Score
--WHERE score>=80 AND score <=90
--12.5 成绩范围外查询
--SELECT *
--FROM Score
--WHERE score<80 OR score >90

13.排序查询(升序 默认的,可以不填,要填就填ASC,降序为DESC)

--SELECT *
--FROM Student
--WHERE YEAR(birthday) = '1999'
--ORDER BY studentNo DESC

14.查询表

--SELECT *
--FROM (SELECT * FROM Student WHERE sex ='女') AS a
--WHERE YEAR(birthday) = 1999
--上面语句可以等价于下面语句
--SELECT *
--FROM Student
--WHERE YEAR(birthday) = 1999 AND sex = '女'

15.聚合查询(重点)

--count()计数  sum()求和  avg()平均值  max()最大值  min() 最小值
--15.1 查询学生的总人数
--SELECT count(*) AS 学生人数
--FROM Student
--15.2 查询所有选课的人数(注:去除重复的)
--SELECT COUNT(DISTINCT studentNo) AS 选课人数已经去掉重复
--FROM Student
--15.3 查询学号为1500003同学所选课程的平均分
--SELECT AVG(Score) AS 平均分
--FROM Score
--WHERE studentNo = '1500003'

16 分组查询(重点)

--GROUP BY 子句对查询结果按某一列或某几列进行分组,值相等的分为一组;
--HAVING子句对分组的结果进行选择,仅输出满足条件的组,配合GROUP BY 子句配合使用
--16.1 查询每个同学的选课门数,平均分数和最高分
--SELECT studentNo,count(*) AS 选课门数,AVG(score) AS 平均分,MAX(score)最高分
--FROM Score
--GROUP BY studentNo
--16.2 查询平均分在80分以上的每个同学的选课门数、平均分和最高分
--SELECT studentNo,count(*) AS 选课门数,AVG(score) AS 平均分,MAX(score)最高分
--FROM Score
--GROUP BY studentNo
--HAVING AVG(score)>= 70

17.连接查询(重点)

--17.1 等值连接
--SELECT studentNo,studentName,native,Student.classNo,className
--FROM Student,Class
--WHERE Student.classNo = Class.classNo AND institute = '会计学院'(连接条件为:classNo)
--当涉及到多个表的相同属性名,必须在相同的属性名前加上表名加以区分如 Student.classNo
--上述语句改写为:
--SELECT studentNo,studentName,native,S.classNo,className
--FROM Student S,Class
--WHERE S.classNo = Class.classNo AND institute = '会计学院'
--上述语句进一步简化
--SELECT studentNo,studentName,native,S.classNo,className
--FROM Student S,Class C
--WHERE S.classNo = C.classNo AND institute = '会计学院'

18.查找选修了课程名称为“计算机原理”的同学学号、姓名。

--SELECT studentName,st.studentNo
--FROM Course c,Student st,Score sc
--WHERE c.CourseName = '计算机原理' AND sc.studentNo  = st.studentNo  AND sc.courseNo  = c.courseNo 

19.查找同时选修为001和002课程的同学学号、姓名、课程号和相应成绩,并按学号输出

--SELECT sc.studentNo,studentName,c.courseNO,sc.score
--FROM Score sc,Student st,(SELECT* FROM Score WHERE courseNo = '002')c
--WHERE (sc.courseNo = '001') AND (sc.studentNo = st.studentNo) AND (st.studentNo  = c.studentNo)
--ORDER BY st.studentNo
--错误用法:sc.course ='001'AND sc.course = '002'错误点:在逻辑运算当中,不可以对同一个属性进行逻辑“与”的等值运算

20、查询获得的总学分(注:只有成绩合格才能获得该课程的学分)大于或等于28的同学的学号、姓名和总学分,并按学号排序输出。

--SELECT st.studentNo,st.studentName,SUM(c.creditHour) AS 总学分
--FROM Score sc,Course c,Student st
--WHERE st.studentNo = sc.studentNo AND c.courseNo = sc.courseNo AND sc.score>=60
--GROUP BY st.studentNo,studentName
--HAVING SUM(c.creditHour)>=28
--ORDER BY st.studentNo

21、实现成绩表Score和课程表Course的自然连接

--SELECT studentNo,a.courseNo,score,courseName,creditHour,courseHour,priorCourse
--FROM Score a,Course b
--WHERE a.courseNo = b.courseNo

22、查找同时选修了编号为001和002课程的同学学号、姓名、课程号和相应成绩,并按照学号输出

--SELECT a.studentNo,studentName,b.courseNo,b.score,c.courseNo,c.score
--FROM Student a,Score b,Score c
--WHERE b.courseNo = '001' AND c.courseNo = '002' AND b.studentNo = c.studentNo AND a.studentNo = b.studentNo
--ORDER BY a.studentNo

23、在学生表Student中查找与李宏冰同学在同一个班的同学的姓名,班级编号和出生日期

--SELECT a.studentName,a.classNo,a.birthday
--FROM Student a,Student b
--WHERE b.studentName='李宏冰' AND a.classNo = b.classNo

24、查询2015级每个班级的班级名称,所属学院、学生学号、学生姓名,按班级名称排序输出。

--SELECT className,institute,studentNo,studentName
--FROM Class a,Student b
--WHERE a.classNo = b.classNo AND grade = 2015
--ORDER BY className
--注意:班级表中的金融管理15=01班没有出现在查询结果中,原因是该班没有学生。

25、使用左外连接查询2015级每个班级的班级名称,所属学院、学生学号、学生姓名,按班级名称和学号排序输出。

--语法:表1 + LEFT(RIGHT) OUTER JOIN + 表2 + ON +连接条件
--SELECT className,institute,studentNo,studentName
--FROM Class a LEFT OUTER JOIN Student b ON a.classNo = b.classNo
--WHERE  grade = 2015
--ORDER BY className,studentNo
--注:相比外连接,这里把一个值为空的学生,也输出来了。

26、使用右外连接查询2015级每个班级的班级名称、所属学院、学生学号、学生姓名,按班级名称和学号排序输出

--SELECT className,institute,studentNo,studentName
--FROM Class a RIGHT OUTER JOIN Student b ON a.classNo = b.classNo
--WHERE  grade = 2015
--ORDER BY className,studentNo

27、使用全外连接查询2015级每个班级的班级名称、所属学院、学生学号、学生姓名,按班级名称和学号排序输出。

--SELECT className,institute,studentNo,studentName
--FROM Class a FULL OUTER JOIN Student b ON a.classNo = b.classNo
--WHERE  grade = 2015
--ORDER BY className,studentNo

28、查询选修过课程地学生姓名(IN子查询地运用)

--SELECT studentName
--FROM Student
--WHERE Student.studentNO IN (SELECT Score.studentNo FROM Score)

29、查找选修过课程名中包含“系统”地课程地同学学号、姓名和班级编号。(非相关子查询)

--SELECT studentNo,studentName,classNo
--FROM Student
--WHERE studentNo IN (SELECT studentNo FROM Score WHERE courseNo IN (SELECT courseNo FROM Course WHERE courseName LIKE '%系统%'))