SQL练习3-SELECT

SELECT
字符匹配
可以用LIKE来进行字符串的匹配,语法一般如下:
[NOT] LIKE ‘<匹配串>’ [ESCAPE’<换码字符>’]
含义是找到指定的属性列值与<匹配串>相匹配的元组,<匹配串>可以是一个完整的字符串,也可以含有通配符%和_。
%:表示为代表容易长度(长度可以为0)的字符串,例如a%b表示以a开头,以b结尾的任意长度的字符串。如acb、abbbbd。
_:表示的是代表任意的单个字符。例如a_b表示的是以a开头,又以b结尾的长度为3的容易字符串。如acb、adb。
【例3.29】查询学号为201215121的学生的详细情况

SELECT *
FROM Student
WHERE Sno='201215121'
SELECT *
FROM Student
WHERE Sno='201215121'

在这里插入图片描述
在此处,LIKE后面的匹配串是不含调配符,则可以使用“="代替LIKE。也可以用“!=”或“<>”(不等于)来代替NOT LIKE
【例3.30】查询所有姓刘的学生的姓名、学号和性别

SELECT Sname,Sno,Ssex
FROM Student
WHERE Sname LIKE '刘%'

在这里插入图片描述
【例3.31】查询姓“佟”且全名为两个汉字的学生的姓名

SELECT Sname
FROM Student
WHERE Sname LIKE '佟_'

SELECT Sname
FROM Student
WHERE Sname LIKE '佟__'

在这里插入图片描述
数据库字符集为ASCII时,一个汉字需要两个_;当字符集为GBK(国标库)时需要一个_;
【例3.32】查询名字中第二个字为“陆”的学生的姓名和学号

SELECT Sname,Sno
FROM Student
WHERE Sname LIKE '_陆%'

在这里插入图片描述
【例3.33】查询所有不姓“佟”的学生的姓名、学号和性别

SELECT Sname,Sno,Ssex
FROM Student
WHERE Sname NOT LIKE '佟%'

在这里插入图片描述
【例3.34】查询DB_Design课程的课程号和学分

SELECT Cname,Cno,Ccredit
FROM Course
WHERE Cname LIKE 'DB\_Design' ESCAPE'\';

在这里插入图片描述
ESCAPE“\”表示的是“\”为换码字符。这样的匹配串中紧跟在“\”后面的字符“”不再具有通配符的含义,被转义为普通的“”字符
【例3.35】查询以“DB_”开头,且倒数第三个字符为i的课程的详细情况

SELECT *
FROM Course
WHERE Cname LIKE 'DB\_%__' ESCAPE'\';

在这里插入图片描述
第一个“”前有换码字符\,所以它被转移为普通的""字符,而i后面的两个_的前面均没有换码字符\,所以它们作为通配符。
【例3.36】查询有选课记录但是缺少成绩的学生学号和相应的课程号

SELECT Sno,Cno
FROM SC
WHERE Grade IS NULL

在这里插入图片描述
【例3.37】查询所有有成绩的学生的学号和课程号

SELECT Sno,Cno
FROM SC
WHERE Grade IS NOT NULL

在这里插入图片描述
【例3.38】查询计算机科学系年龄在20岁以下的学生姓名

SELECT Sname
FROM Student
WHERE Sdept='CS' AND Sage<20

在这里插入图片描述
多重条件查询AND和OR可以用来连接多个查询条件,AND的优先级高于OR
【例3.39】查询选修了3号课程的学生的学号及其成绩,查询结果按分数的降序排列

SELECT Sno,Grade
FROM SC
WHERE Cno='3'
ORDER BY Grade DESC

在这里插入图片描述
对于空值的显示,排序的显示的次序由具体的系统决定实现。
【例3.40】查询全体学生的情况,查询结果按所在系的系号升序排列,同一系的学生按照年龄降序排列

SELECT *
FROM Student
ORDER BY Sdept,Sage DESC

在这里插入图片描述
【例3.41】查询学生的总人数

SELECT COUNT(*)
FROM Student

在这里插入图片描述
COUNT(*):聚集函数,统计元组的个数
【例3.42】查询选修了课程的学生的总人数

SELECT COUNT(DISTINCT Sno)
FROM SC

在这里插入图片描述
COUNT([DISTINCT|ALL]<列名>):聚集函数,统计一列中值的个数。
学生每选修一门课,就会在SC中有一条相应的记录,一个学生要选修多门课程,为避免重复计算学生人数,必须在COUNT函数中用DISTINCT短语。
【例3.43】计算选修1号课程的学生的平均成绩

SELECT AVG(Grade)
FROM SC
WHERE Cno='1';

在这里插入图片描述
AVG([DISTINCT|ALL]<列名>):聚集函数,计算一列值的平均值(此列必须是数值型)
【例3.44】查询选修1号课程的学生最高分数

SELECT MAX(Grade)
FROM SC
WHERE Cno='1';

在这里插入图片描述
MAX([DISTINCT|ALL]<列名>):聚集函数,计算一列值的最大值(此列必须是数值型)
【例3.45】查询学生201215121选修课程的总学分数

SELECT SUM(Ccredit)
FROM SC,Course
WHERE Sno='201215121'AND SC.Cno=Course.Cno;

在这里插入图片描述
SUM([DISTINCT|ALL]<列名>):聚集函数,计算一列值的总和(此列必须是数值型)
当聚集函数遇到空值的时候,除COUNT(*)外,都跳过空值而只处理非空值。
【例3.46】求各个课程号及对应的选课人数

SELECT Cno,COUNT(Sno)
FROM SC
GROUP BY Cno

在这里插入图片描述
【例3.47】查询选修两门以上的课程的学生学号

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

在这里插入图片描述
【例3.48】查询平均成绩大于等于80分的学生学号和平均成绩

SELECT Sno,AVG(Grade)
FROM SC
WHERE AVG(Grade)>=80
GROUP BY Sno

出现错误,提示为:“聚合不应出现在 WHERE 子句中,除非该聚合位于 HAVING 子句或选择列表所包含的子查询中,并且要对其进行聚合的列是外部引用。”
因为WHERE语句是不能够用聚集函数作为条件表达式的,正确的查询语句为:

SELECT Sno,AVG(Grade)
FROM SC
GROUP BY Sno
HAVING AVG(Grade)>=80

在这里插入图片描述

发布了61 篇原创文章 · 获赞 9 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_44652687/article/details/104814609