~单表查询的查询仅涉及一个表~
一、 选择表中的若干列
1、查询指定列
[例1] 查询全体学生的学号与姓名。
SELECT Sno,Sname
FROM Student;[例2] 查询全体学生的姓名、学号、所在系。
SELECT Sname,Sno,Sdept
FROM Student;
2. 查询全部列
选出所有属性列:
在SELECT关键字后面列出所有列名
将<目标列表达式>指定为 *
[例] 查询全体学生的详细记录。
SELECT Sno,Sname,Ssex,Sage,Sdept
FROM Student;
或
SELECT *
FROM Student;
3.查询经过计算的值
SELECT子句的<目标列表达式>可以为:
•算术表达式
•字符串常量
•函数
•列别名
[例] 查全体学生的姓名及其出生年份。
SELECT Sname,2015-Sage /假定当年的年份为2016年/
FROM Student;
输出结果:
Sname | 2015-Sage |
---|---|
李勇 | 1987 |
刘晨 | 1988 |
王敏 | 1989 |
张立 | 1988 |
使用列别名改变查询结果的列标题:
SELECT Sname NAME,’Year of Birth: ’ BIRTH,
2015-Sage BIRTHYEAR,LOWER(Sdept) DEPARTMENT
FROMStudent:
输出结果:
NAME | BIRTH | BIRTHYEAR | DEPARTMENT |
---|---|---|---|
李勇 | Year of Birth: | 1987 | cs |
刘晨 | Year of Birth: | 1988 | is |
王敏 | Year of Birth: | 1989 | ma |
张立 | Year of Birth: | 1988 | is |
二、 选择表中的若干元组
1. 消除取值重复的行
如果没有指定DISTINCT关键词,则缺省为ALL
指定DISTINCT关键词,去掉表中重复的行
假如查询选修课程表的学生学号。
SELECT Sno FROM SC;
( 等价于: SELECT ALL Sno FROM SC;)
执行上面的SELECT语句后,结果为:
Sno |
---|
200215121 |
200215121 |
200215121 |
200215122 |
200215122 |
SELECT DISTINCT Sno
FROM SC;
执行结果:
Sno |
---|
200215121 |
200215122 |
2.查询满足条件的元组
常用的查询条件
(1)比较大小
[例1] 查询计算机科学系全体学生的名单。
SELECT Sname
FROM Student
WHERE Sdept=‘CS’;[例2] 查询所有年龄在20岁以下的学生姓名及其年龄。
SELECT Sname,Sage
FROM Student
WHERE Sage < 20;[例3] 查询考试成绩有不及格的学生的学号。
SELECT DISTINCT Sno
FROM SC
WHERE Grade<60;
(2)确定范围
•谓词: BETWEEN … AND …
NOT BETWEEN … AND …[例1] 查询年龄在20~23岁(包括20岁和23岁)之间的学生的姓名、系别和年龄
SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage BETWEEN 20 AND 23;[例2] 查询年龄不在20~23岁之间的学生姓名、系别和年龄
SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage NOT BETWEEN 20 AND 23;
(3)确定集合
谓词:IN <值表>, NOT IN <值表>
可以用来查询属性值属于指定集合的元组.[例1]查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别。
SELECT Sname,Ssex
FROM Student
WHERE Sdept IN ( ‘IS’,’MA’,’CS’ );[例2]查询既不是信息系、数学系,也不是计算机科学系的学生的姓名和性别。
SELECT Sname,Ssex
FROM Student
WHERE Sdept NOT IN ( ‘IS’,’MA’,’CS’ );
(4)字符匹配
谓词: [NOT] LIKE ‘<匹配串>’ [ESCAPE ‘ <换码字符>’]
其含义是寻找指定的属性列值与<匹配串 >相匹配的元组.
<匹配串>可以是一个完整的字符串,也可以包含有通配符’%’和’_’
%(百分号)代表任意长度(可以为0)的字符串.
例如a%b, ab ahhb,aabb,都可以相匹配.
_(下横线)代表任意单个字符
A)匹配串为固定字符串
[例1] 查询学号为200215121的学生的详细情况。
SELECT *
FROM Student
WHERE Sno LIKE‘200215121’;等价于:
SELECT *
FROM Student
WHERE Sno = ‘200215121’;
B) 匹配串为含通配符的字符串
[例2] 查询所有姓刘学生的姓名、学号和性别。
SELECT Sname,Sno,Ssex
FROM Student
WHERE SnameLIKE ‘刘%’;[例3] 查询姓”欧阳”且全名为三个汉字的学生的姓名。
SELECT Sname
FROM Student
WHERE SnameLIKE ‘欧阳__’;[例4] 查询名字中第2个字为”阳”字的学生的姓名和学号。
SELECT Sname,Sno
FROM Student
WHERE Sname LIKE ‘__阳%’;[例5] 查询所有不姓刘的学生姓名。
SELECT Sname,Sno,Ssex
FROM Student
WHERE Sname NOT LIKE ‘刘%’;
C) 使用换码字符将通配符转义为普通字符
如果用户查询的字符串本身就含有通配符%或_,这是就要使用ESCAPE
<换码子符>短语对通配符进行转义了.
ESCAPE ‘\’ 表示“ \” 为换码字符
[例6] 查询DB_Design课程的课程号和学分。
SELECT Cno,Ccredit
FROM Course
WHERE Cname LIKE ‘DB_Design’ ESCAPE ‘\’;[例7] 查询以”DB_”开头,且倒数第3个字符为 i的课程的详细情况。
SELECT *
FROM Course
WHERE Cname LIKE ‘DB_%i_ _’ ESCAPE ‘\’;
(5)涉及空值的查询
谓词: IS NULL 或 IS NOT NULL
“IS” 不能用 “=” 代替
[例1] 某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学生的学号和相应的课程号。
SELECT Sno,Cno
FROM SC
WHERE Grade IS NULL[例2] 查所有有成绩的学生学号和课程号。
SELECT Sno,Cno
FROM SC
WHERE Grade IS NOT NULL;
(6)多重条件查询
逻辑运算符:AND和 OR来联结多个查询条件
• AND的优先级高于OR
• 可以用括号改变优先级
•可用来实现多种其他谓词
• [NOT] IN
• [NOT] BETWEEN … AND …[例] 查询计算机系年龄在20岁以下的学生姓名。
SELECT Sname
FROM Student
WHERE Sdept= ‘CS’ AND Sage<20;•改写
[例] 查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别。
SELECT Sname,Ssex
FROM Student
WHERE Sdept IN ( ‘IS’,’MA’,’CS’ )可改写为:
SELECT Sname,Ssex
FROM Student
WHERE Sdept= ’ IS ’ OR Sdept= ’ MA’ OR Sdept= ’ CS ‘;
三、 ORDER BY子句
•ORDER BY子句
可以按一个或多个属性列排序
升序:ASC;降序:DESC;缺省值为升序
•当排序列含空值时
ASC:排序列为空值的元组最后显示
DESC:排序列为空值的元组最先显示
[例1] 查询选修了3号课程的学生的学号及其成绩,查询结果按分数降序排列。
SELECT Sno,Grade
FROM SC
WHERE Cno= ’ 3 ’
ORDER BY Grade DESC;[例2] 查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列。
SELECT *
FROM Student
ORDER BY Sdept,Sage DESC;
四、 聚集函数
聚集函数:
•计数
COUNT([ DISTINCT | ALL ] *)
COUNT([ DISTINCT | ALL ] <列名>)
•计算总和
SUM([ DISTINCT | ALL ] <列名>)
• 计算平均值
AVG([ DISTINCT | ALL ] <列名>)
•最大最小值
MAX([ DISTINCT | ALL ] <列名>)
MIN([ DISTINCT | ALL ] <列名>)
使用示例:
[例1] 查询学生总人数。
SELECT COUNT(*)
FROM Student;[例2] 查询选修了课程的学生人数。
SELECT COUNT(DISTINCT Sno)
FROM SC;[例3] 计算1号课程的学生平均成绩。
SELECT AVG(Grade)
FROM SC
WHERE Cno= ’ 1 ‘;[例4] 查询选修1号课程的学生最高分数。
SELECT MAX(Grade)
FROM SC
WHER Cno= ‘1 ’;
五、 GROUP BY子句
•GROUP BY子句分组:
细化聚集函数的作用对象
• 未对查询结果分组,聚集函数将作用于整个查询结果
•对查询结果分组后,聚集函数将分别作用于每个组
•作用对象是查询的中间结果表
•按指定的一列或多列值分组,值相等的为一组
[示例] 求各个课程号及相应的选课人数。
SELECT Cno,COUNT(Sno)
FROM SC
GROUP BY Cno;
详解:这条语句对查询结果按Cno分组,所有Cno值相同的分为一组,
然后再对Sno进行统计.
查询结果:
Cno | COUNT(Sno) |
---|---|
1 | 22 |
2 | 34 |
3 | 44 |
4 | 33 |
5 | 48 |
如果分组后还要求按照一定的条件对这些组进行筛选,最终只输出满足指定条件的组,
则可以使用HAVING短语指定筛选条件
•HAVING短语与WHERE子句的区别:
•作用对象不同
•WHERE子句作用于基表或视图,从中选择满足条件的元组
•HAVING短语作用于组,从中选择满足条件的组。
使用示例:
- [例] 查询选修了3门以上课程的学生学号。
- SELECT Sno
- FROM SC
GROUP BY Sno
- HAVING COUNT(*) >3;