SQL为使用者提供SELECT语句进行数据查询,语句一般格式为:
SELECT [ALL|DISTINCT]<目标列表达式1>,<目标列表达式2>,...
FROM <表名或视图名>
WHERE <条件表达式>
GROUP BY <列名1>
[HAVING <条件表达式>]
ORDER BY <列名> [ASC|DESC];
语句的含义为:根据WHERE子句的条件表达式从FROM子句指定的表中找出满足条件的元组,然后再按SELECT子句中的目标表达式选出元组中对应的属性值形成目标表。
如果有GROUP BY 子句,则将结果按<列名>的值进行分组,该属性值相等的元组为一个组。如果GROUP BY 子句后带有HAVING语句,则只有满足HAVING 语句的条件方可输出。
如果有ORDER BY 子句,结果还要按<列表2>的值进行升(降)序排序操作后输出。
单表查询
单表查询是指只涉及一个表的查询。
下面我们用一个学生的信息表为例讲解。
表名:Student
Sno | Sname | Ssex | Sage | Sdept |
学号 | 姓名 | 性别 | 年龄 | 专业 |
选择表中的若干列查询指定列
- 查询指定列
很多情况下,不同用户对于表中的一部分属性感兴趣,这是就可以运用SELECT语句查询用户指定列信息。
例:查询全体学生的姓名,学号,所在系。
SELECT Sname,Sno,Sdept
FROM Student;
当然也有一些用户需要对全部信息进行浏览统计:
SELECT *
FROM Student;
等价于
SELECT Sno,Sname,Ssex,Sage,Sdept
FROM Student;
- 查询计算后的值
SELECT 子句后的<目标列表达式>不仅可以是列名,也可以是表达式(计算表达式、函数表达式、字符串等)
SELECT Sname,2018-Sage,LOWER(Sdept)
FROM Student;
- 该语句输出的是全体学生的姓名及出生年份,LOWER()函数将其所在专业名转化为小写然后输出。
选择表中的若干元组
- 消除表中的重复行
两个本来并不完全相同的元组投影到指定的某些列上时,可能会变成相同的行,这时可以用DISTINCT消除他们:
SELECT DISTINCT Sno
FROM Student;
用户不指定DISTINCT关键词时,默认为ALL。
SELECT Sno
FROM Student;
等价于
SELECT ALL Sno
FROM Student;
- 查询满足条件的元组
查询条件 | 谓词 |
比较 | =,>,<,>=,<=,!=,<>,!>,!<;NOT+上述比较运算符 |
确定范围 | BETWEEN AND,NOT BETWEEN AND |
确定集合 | IN,NOT IN |
字符匹配 | LIKE,NOT LIKE |
多重条件 | AND,OR,NOT |
例:查询计算机专业全体学生名单。
SELECT Sname
FROM Student
WHERE Sdept='CS';
查询20岁以下的学生姓名及其年龄。
SELECT Sname,Sage
FROM Student
WHERE Sage<20;
确定范围在20~24岁之间的学生姓名、专业和年龄。
SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage BETWEEN 20 AND 24;
查找计算机(CS)、数学(MA)、和信息(IS)专业的学生姓名和性别。
SELECT Sname,Ssex
FROM Student
WHERE Sdept IN ('CS','MA','IS');
ORDER BY 子句
用户可以用ORDER BY 子句对查询结果进行属性值的升序(ASC)或降序(DESC)进行排序。默认值为升序。
例:查询选修了3号课程的学生的学号及其成绩,查询结果按分数的降序排列。
SELECT Sno,Grade
FROM Student
WHERE Cno='3'
ORDER BY Grade DESC;
对于空值,排序时现实的次序由具体系统实现来决定。各个系统的实现可以不同,只要保持一致就行。
聚集函数
COUNT(*) | 统计元组个数 |
COUNT( [DISTINCT|ALL] <列名> ) | 统计一列中值的个数 |
SUM( [DISTINCT|ALL] <列名> ) | 计算一列值的总和(此列必须是数值型) |
AVG( [DISTINCT|ALL] <列名> ) | 计算一列值的平均值(此列必须是数值型) |
MAX( [DISTINCT|ALL] <列名> ) | 求一列值的最大值 |
MIN( [DISTINCT|ALL] <列名> ) | 求一列值的最小值 |
GROUP BY 子句
GROUP BY 子句将查询结果按一列或多列的值分组,值相等的为一组。分组后聚集函数将作用于每一个组,即每一个组都有一个函数值。
如果分组后还要求按一定的条件对这些组进行筛选,最终只输出满足条件的组,则可以使用HAVING短语指定筛选条件。
例:查询选修了三门以上课程的学生学号。
SELECT Sno
FROM Student
GROUP BY Sno
HAVING COUNT(*)>3;
WHERE 子句作用于表,从中选出满足条件的组;(WHERE 子句不能用聚集函数作为条件表达式)
HAVING语句作用于组,从中选择满足条件的组。