数据查询
语句格式
SELECT子句
:指定要显示的属性列FROM子句
:指定查询对象(基本表或视图)WHERE子
句:指定查询条件GROUP BY
子句:对查询结果按指定序列的值分组(比如说男的一组,女的一组),该属性列值相等的元祖为一个组。通常会在每组中使用聚集函数(比如说对男生一组计数,女生一组计数)HAVING
短语:只有满足指定条件的组才予以输出
ORDER BY
子句:对查询结果表按指定列值的升序或降序排列
功能分解:
1.SELECT相关用法
[例1]查询全体学生的学号与姓名。
SELECT Sno,Sname //选择属性 SELECT * 代表所有列
From Student //指明表的来源
补充SELECT用法:
SELECT Sno,2020-Sage //可以得到出生年份,可以是表达式
SELECT LOWER(Sdept) //将得到的Sdept值全部化为小写
使用列的别名改变查询结果的列标题
SELECT Sname NAME,2020-Sage BIRTHDAY //定义别名
消除重复的行
- SELECT默认是不会删除重复的行的,消除重复的行需要使用DISTINCT关键字
SELECT DISTINCT Sno
2.WHERE相关用法
查询条件 | 谓词 |
---|---|
比较 | =,>,>=,!=, !> |
确定范围 | BETWEEN AND , NOT BETWEEN AND |
确定集合 | IN , NOT IN |
字符匹配 | LIKE , NOT LIKE |
空值 | IS NULL , IS NOT NULL |
逻辑运算 | AND , OR , NOT |
比较:
例2.查询计算机科学系 且 年龄小于20岁 的学生名单
SECLECT Sname
FROM Student
WHERE Sdept='CS' AND Sage<20; //注意,这个分号不能少
确定范围:
例3.查询年龄不在20-23岁之间的学生姓名、系别和年龄
SELECT Sname,Sdpt,Sage
FROM Student
WHERE Sage NOT BETWEEN 20 AND 23;
确定集合:
例4.查询计算机系(CS)、数学系(MA)学生的姓名和性别
SELECT Sname, Ssex
FROM Student
WHERE Sdept IN('CS','MA');
字符匹配:
- 语法: 谓词: [NOT] LIKE ‘<匹配串>’ [ESCAPE ‘<换码字符>’]
- <字符串>可以是一个完整的字符串,也可以含有通配符%和_
- % 代表人已长度的字符串,a%b,代表以a开头,b结尾的任意长度字符串
- _ 代表任意单个字符
例5.查询学号为1830130281的学生的详细情况
SELECT *
FROM Student
WHERE Sno LIKE '1830130281' //<==> WHERE Sno = '1830130281'
- ESCAPE换码字符的用法
- 作用:使用换码字符将统配符转义为普通字符。
例6.查询DB_Design课程的课程号和学分
- 作用:使用换码字符将统配符转义为普通字符。
SELECT Cno , Ccredit
From Course
WHERE Cname LIKE 'DB\_Design'ESCAPE'\';
3.ORDER BY 子句
- 作用:可以按一个或多个属性列排列
- 升序:ASC ; 降序:DESC;缺省值为升序
例7.查询结果按分数降序排列,体现ORDER BY子句的用法即可
SELECT .....
FROM ....
WHERE ....
ORDER BY Grade DESC;
例8.查询结果所在系号升序,年龄降序
SELECT ...
FROM ...
WHERE ...
ORDER BY Sdept ASC , Sage DESC; //ASC省略也可以
4.聚集函数 (常配合GROUP BY中的HAVING或SELECT一起使用)
- 只能用于
SELECT
与HAVING
- 统计元祖个数 :
COUNT(*)
- 统计一列中值得个数:
COUNT( [ DISTINCT|ALL ] <列名>)
- 计算一列总和:
SUM(同第二行)
- 计算一列平均值 :
AVG(同第二行)
- 求一列中的最大值和最小值:
MAX(同第二行), MIN(同第二行)
注意
:DISTINCT
并不是一定要有,它的意思是去重(缺省值是ALL)
例9.查询选修了课程的学生人数。
SELECT COUNT(DISTINCT Sno)
FROM SC;
5.GROUP BY子句分组
- 按指定的一列或多列值分组,值相等的为一组。
用法注意:
错误示例:
SELECT Cnpo //
FROM SC //
GROUP BY Cno //
SELECT 后面的表达式必须和GROUP BY 后面的表达式对应。如果GROUP BY y 则 SELECT y ,如果不想对应 则必须SELECT后面跟聚集函数,比如COUNT(Cnpo)
例10.求各个课程号及相应的选课人数。(思路:相同的课程号为一组)
SELECT Cno, COUNT(Sno)
FROM SC
GROUP BY Cno; //意思是课程号相等的所有列为一组。
查询结果类似下方表格所示:
Cno | COUNT(Sno) |
---|---|
1 | 22 |
2 | 34 |
3 | 45 |
4 | 12 |
例11.查询选修了3门以上课程的学生学号
SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*)>3; //HAVING函数是在对每一个组进行操作,某一组列数大于3的输出
例12.查询平均成绩大于等于90分的学生学号和平均成绩
SELECT Sno , AVG(Grade)
FROM SC
GROUP BY Sno
HAVING AVG(Grade)>=90; //AVG不能放在WHERE中!!!
例题13.按系并区分男女统计各系学生的人数,并按照桉降序排序
SELECT Sdept, Ssex , COUNT(Sno)
FROM Student
GROUP BY Sdept , Ssex
ORDER BY COUNT(Sno) DESC;