建立三张表作为操作对象
学生表S
课程表C
课程表SC
查询语法
SELECT [ALL|DISTINCT] <目标列>[,<目标列>]...
FROM <表名>[,<表名>]...
[WHERE<条件表达式>]
[GROUP BY<列名>[HAVING<条件表达式>]]
[ORDER BY<列名>[ASC|DESC]];
S E L E C T \textcolor{red}{SELECT} SELECT:指定要输出的属性列
目标列的形式:
算术表达式,常量,函数,别名
查询实例
1.查询全体学生的姓名及其出生年份(表达式)
SELECT Sname 2022-Sage
FROM S;
2.查询全体学生的姓名,出生年份(常量+表达式),所在系的小写字符串(函数)
SELECT Sname,'Year of Birth:',2022-Sage,LOWER(Sdept)
FROM S;
3.使用列的别名
将步骤2中的输出列的字段修改为NAME ,BIRTH,BIRTHDAY,DEPARTMENT
SELECT Sname Name,'Year of Birth:' BIRTH,2013-Sage BIRTHDAY,LOWER(Sdept) AS DEPARTMENT
FROM S;
4.在结果中消除重复的值
查询了选修了课程的学生学号
SELECT DISTINCT Son
FROM SC;
F R O M \textcolor{red}{FROM} FROM:指定查询对象
W H E R E \textcolor{red}{WHERE} WHERE:指定查询条件
查询条件 | 语法 |
---|---|
比较 | [NOT] =,<,>,>=,<=,<>,!=,!>,!< |
确定范围 | [NOT] BETWEEN…AND… |
确定集和 | [NOT] IN |
字符匹配 | [NOT] LIKE |
空值 | IS NULL,IS NOT NULL |
多重条件 | AND,OR |
1.比较运算符
查询计算机系全体学生的信息
SELECT *
FROM S
WHERE Sdept='CS';
查询年龄不为20的学生信息
SELECT *
FROM S
WHERE Sage <> 20;
2.确定范围
查询年龄在[20,22]的学生信息
SELECT *
FROM S
WHERE Sage BETWEEN 20 AND 23;
3.确定集和
查询信息系(IS),数学系(MA),计算机科学系(CS)的学生的姓名和性别
SELECT Sname,Ssex
FROM S
WHERE Sdept IN('IS','MA','CS');
查询没有选信息系(IS),数学系(MA),计算机科学系(CS)的学生的姓名和性别
SELECT Sname,Ssex
FROM S
WHERE Sdept NOT IN ('IS','MA','CS');
4.字符串匹配
基本语法
[NOT] LIKE '<匹配模板>'[ESCAPE'<转义字符>'];
匹配模板
固定字符串或者含有 通配符 \textcolor{red}{通配符} 通配符的字符串
通配符
% 代表任意长度的字符串
_ 表示一个字符
转义字符
当要查询的字符串本身就含有%或者_时,需要用转义字符对其进行转义
比如/_
实例
查询所有姓刘的学生的信息
SELECT *
FROM S
WHERE Sname LIKE '刘%';
查询名字为两个字的学生信息
SELECT *
FROM S
WHERE Sname LIKE '__';
查询所有不姓刘的学生的信息
SELECT *
FROM S
WHERE Sname NOT LIKE '刘%';
使用转义符
查询课程DB_Design课程的学分
SELECT Ccredit
FROM C
WHERE Cname LIKE 'DB\_Design' ESCAPE '\';
5.空值
I S \textcolor{red}{IS} IS N U L L 不能用 = N U L L 代替 \textcolor{red}{NULL不能用 =NULL代替} NULL不能用=NULL代替
查询没有先导课程(Cpno)的课程
SELECT *
FROM C
WHERE Cpno IS NULL;
空值的运算
NULL和其他进行算术运算,结果为NULL;
NULL和其他进行比较运算,结果为UNKNOWN;
三值的逻辑运算表
X Y | X AND Y | X OR Y | NOT X |
---|---|---|---|
T T | T | T | F |
T U | U | T | F |
T F | F | T | F |
U T | U | T | U |
U U | U | U | U |
U F | F | U | U |
F T | F | T | T |
F U | F | U | T |
F F | F | F | T |
6.多重条件查询
A N D 的优先级高于 O R \textcolor{red}{AND的优先级高于OR} AND的优先级高于OR
查询年龄为20岁或者19岁的学生信息
SELECT *
FROM S
WHERE Sage=19 OR Sage =20;
聚集函数
计数
COUNT([DISTINCT|ALL]<列名>);
计算总和
SUM([DISTINCT|ALL]<列名>);
计算平均值
AVG([DISTINCT|ALL]<列名>);
计算最大值
MAX([DISTINCT|ALL]<列名>);
计算最小值
MIN([DISTINCT|ALL]<列名>);
G R O U P \textcolor{red}{GROUP} GROUP B Y \textcolor{red}{BY} BY:对查询结果按指定列的值分类,该属性列值相等的为一组
默认值作用
细化聚集函数的作用对象
未对查询结果分组,聚集函数作用于整个查询结果
对查询结果分组,聚集函数分别作用于每个组
使用GROUP BY后,SELECT字句的列名表中只能出现分组属性和聚集函数
实例
求各个课程号及相应的选课人数
SELECT Con ,COUNT(Son)
FROM SC
FROUP BY Con;
H A V I N G \textcolor{red}{HAVING} HAVING:筛选出指定条件的组
HAVING和WHERE的区别:
WHERE作用于基本表(原始数据),从中选择满足条件的元组
HAVING作用于中间结果
实例
查询有三门课程时90分以上的学生的学号及其90分以上的课程数
SELECT Son ,COUNT(*)
FROM SC
WHERE Grade>90
GROUP BY Son
HAVING COUNT(*)>3;
O R D E R \textcolor{red}{ORDER} ORDER B Y \textcolor{red}{BY} BY:对查询结果按指定列胜序排序或者降序排序
升序:ASC
降序:DESC
缺省值为升序(缺省值为默认值)