数据库作业6:SQL练习3 - SELECT(单表查询)

查询满足条件的元组—④字符匹配
谓词: [NOT] LIKE ‘<匹配串>’ [ESCAPE ‘ <换码字符>’]
模糊查询

<匹配串>可以是一个完整的字符串,也可以含有通配符%和 _
% (百分号) 代表任意长度(长度可以为0)的字符串(例如a%b表示以a开头,以b结尾的任意长度的字符串)
_ (下横线) 代表任意单个字符。(例如a_b表示以a开头,以b结尾的长度为3的任意字符串)

字符匹配—(1)匹配串为固定字符串
【例3.29】查询学号为201215121的学生的详细情况。

SELECT *
FROM Student 
WHERE Sno LIKE '201215121';

由于要查询的学号是唯一的、准确的值,也可以通过比较大小的方法解决这个问题

--等价于
SELECT Sname,Sno,Ssex
FROM Student
WHERE Sname LIKE '刘%';

在这里插入图片描述
字符匹配----(2)匹配串为含通配符的字符串
【例3.30】查询所有姓刘学生的姓名、学号和性别.

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

“%”可以是任意长度的字符串,在测试时测边界值,”刘“后面没有字符、一个字符、两个字符,经测试可以是任意长的。
在这里插入图片描述
【例3.31】 查询姓"刘"且全名为三个汉字的学生的姓名。

SELECT Sname
FROM Student
WHERE Sname LIKE '刘__';/*这里两个汉字两个_,经过测试可得,我的计算机一个汉字用一个_来表示,*/

在这里插入图片描述
经测试得到:字数小于等于3个的姓“刘”的姓名都会显示出来。
【注】数据库字符集为ASCII时,一个汉字需要两个_;数据库字符集为 GBK 时,一个汉字需要一个_
【拓展】
字符集:是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,常见字符集名称:ASCII字符集、GB2312字符集、BIG5字符集、 GB18030字符集、Unicode字符集等。计算机要准确的处理各种字符集文字,需要进行字符编码,以便计算机能够识别和存储各种文字。
推论:当名字为英文字母时,一个_代表一个字符,所以在这里一个汉字和一个英文字母都只用一个_来表示,查询出来的结果只要字符个数不大于要查询的个数都会显示出来。

【例3.32】查询名字中第2个字为"阳"字的学生的姓名和学号。

--注意:经过测试得到我的计算机汉字需要一个_,如果你的计算机的字符集时ASCII时,一个汉字需要两个__
SELECT Sname,Sno
FROM Student
WHERE Sname LIKE '_阳%';

第二个字为“阳”,那么第一个字必须要有所以用“_”,第二个字后面有几个字符都可以,所以用“%”。
在这里插入图片描述
【例3.33】查询所有不姓刘的学生姓名、学号和性别。

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

在这里插入图片描述
字符匹配------(3)使用换码字符将通配符转义成普通字符
【3.34】查询DB_Design课程的课程号和学分。
使用换码字符将_转换成普通字符

SELECT Cno,Ccredit
FROM Course
WHERE Cname LIKE 'DB\_Design'ESCAPE'\';
在通配符“_”前面加'\',再在后面加ESCAPE '\' 表示“ \” 为换码字符

在这里插入图片描述
【拓展】如果没有将通配符变为普通字符,表示以’DB’开头,中间时任意一个字符,以’Design’结尾的,这里的"_"表示的是通配符。

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

在这里插入图片描述
【例3.35】查询以"DB_"开头,且倒数第3个字符为 i的课程的详细情况。

SELECT *
FROM Course
WHERE Cname LIKE 'DB\_%i__'ESCAPE'\';
--注意:要将"_"变为普通字符。

查询满足条件的元组—⑤涉及空值的查询
谓词: IS NULL 或 IS NOT NULL(注意:“IS” 不能用 “=” 代替,语法问题)

【例3.36】某些学生选修课程后没有参加考试,所以有选课记录,但没 有考试成绩。查询缺少成绩的学生的学号和相应的课程号。

SELECT Sno,Cno
FROM SC
WHERE Grade IS NULL;

【例3.37】查所有有成绩的学生学号和课程号。

SELECT Sno,Cno
FROM SC
WHERE Grade IS NOT NULL;

在这里插入图片描述
查询满足条件的元组—⑥多重条件查询
逻辑运算符:AND和 OR来连接多个查询条件
注意:AND的优先级高于OR,但经常可以用括号改变优先级。(推荐使用括号更加直观,不易混淆。)

【例3.38】查询计算机系年龄在20岁以下的学生姓名。

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

两个条件都需要满足用AND,只需要满足其中一个条件的用OR。要查询的学生既是计算机系的,有需要年龄小于20岁,所以用AND。

改写【例3.27】查询计算机科学系(CS)、数学系(MA)和信息系(IS)学生的姓名和性别。

SELECT Sname,Ssex
FROM Student
WHERE Sdept IN('CS','MA','IS');
--可以改写为:
SELECT Sname,Ssex
FROM Student
WHERE Sdept='CS' OR Sdept='MA' OR Sdept='IS';

在这里用的是”或“。
单表查询------3.ORDER BY 子句(排序):可以按一个或多个属性列排序
升序:ASC;降序:DESC;缺省值为ASC
对于空值,排序时显示的次序由具体系统实现来决定

【例3.39】查询选修了3号课程的学生的学号及其成绩,查询结果按分数降序排列。

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

在这里插入图片描述
在这里降序时系统将空值放在了最后,当时经过测试升序时空值就被放在了最前面,所以我认为在这里把空值当作最小的对待。

【例3.40】查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列。

SELECT *
FROM Student
ORDER BY Sdept ASC,Sage DESC;

先按照系别排序,如果系别中有多个,则继续按照年龄排序;如果系别中只有一个,那年龄就失效了。
单表查询-----4.聚集函数
统计元组个数 COUNT(*)
统计一列中值的个数 COUNT([DISTINCT|ALL] <列名>)
计算一列值的总和 SUM([DISTINCT|ALL] <列名>)
计算一列值的平均值 AVG([DISTINCT|ALL] <列名>)
求一列中的最大值和最小值
MAX([DISTINCT|ALL] <列名>)
MIN([DISTINCT|ALL] <列名>)

【例3.41】查询学生总人数。

SELECT COUNT (*)
FROM Student;

【例3.42】查询选修了课程的学生人数。

SELECT COUNT (DISTINCT Sno)
FROM SC;

只要选修了就行,SC表中Sno有重复的,有一个人选修多门课程的,需要去掉重复值,按照学号计算。DISTINCT表示去掉重复值。

【例3.43】计算1号课程的学生平均成绩。

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

按照列来求值的需要写出列名,指明按照那一列计算。

【例3.44】查询选修1号课程的学生最高分数。

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

【例3.45】查询学生201215122选修课程的总学分数。

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

多表查询时使用符号连接起来,如果涉及到两个表的相同属性名时,要用表明加以区分。
在这里插入图片描述
单表查询-----5.GROUP BY子句(分组):细化聚集函数的作用对象
如果未对查询结果分组,聚集函数将作用于整个查询结果
对查询结果分组后,聚集函数将分别作用于每个组
按指定的一列或多列值分组,值相等的为一组

【例3.46】 求各个课程号及相应的选课人数。

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

按照课程号分组,每个组的人数
在这里插入图片描述
【例3.47】查询选修了3门以上课程的学生学号。

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

在这里插入图片描述
按照学号分组,HAVING作用于组上,记录有多少个,可以满足条件,只能跟着GROUP BY子句

【例3.48】查询平均成绩大于等于90分的学生学号和平均成绩.

/*下面的语句时错误的,因为WHERE子句中是不能用聚集函数作为条件表达式的*/
SELECT Sno,AVG(Grade)
FROM SC
WHERE AVG(Grade)>=90
GROUP BY Sno;

在这里插入图片描述

/*正确的查询语句是:*/
SELECT Sno,AVG(Grade)
FROM SC
GROUP BY Sno
HAVING AVG(Grade)>=90;

在这里插入图片描述
因为WHERE子句中是不能用聚集函数作为条件表达式,如果需要使用聚集函数作为条件使用HAVING ,而不能用WHERE

HAVING短语与WHERE子句的区别:
作用对象不同:(1)WHERE子句作用于表或视图,从中选择满足条件的元组
(2)HAVING短语作用于,从中选择满足条件的组。
另外,WHERE子句中是不能用聚集函数作为条件表达式,而HAVING 可以。

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值