基于中国人民大学 中国慕课数据库系统概论(基础篇)
一、查询语句的基本功能分解
可分为三类。
查询全部信息 (student表中)
select * from student;
select 是不去重的,如果需要消除取值重复的行,需要指定DISTINST关键词,如果没有,则缺省为ALL。如下例(sc表中)
select distinct sno from sc;
常见运算符
查询年龄是否不在20~23之间的学生姓名、系别和年龄(student表)(使用between … and 和not between … and)
select sname,sdept,sage from sage not between 20 and 23;
查询既不是计算机科学系、数学系,也不是信息系的学生的姓名和性别(使用IN<值表>,not in<值表>)
select sname,ssex from sage where sdept not in ('is','ma','cs');
谓词:[not] like ‘<匹配串>’ [escape ‘<转换字符>’]
%(百分号)表示任意长度,如刘%即 刘后面多少个字都可以(0也可以),都能返回true
__ (下划线)表示单个字符,如刘_即后面只有在一个字符时是匹配的
escape 使用换码字符将通配符转义为普通字符
查询DB_design 课程时,需要escape 来完成_(下划线)变为普通字符
(以\为界,后面的第一个字符不为普通字符,其余不变)
select Cno,Ccredit from course where cname like 'DB\_design' escape'\';
order by可以进行排序(asc/desc)(根据顺序,第一个填写的为第一排序段,第二填写的为第二排序段)
select Cno,Ccredit from course order by sno,sname asc;
二、聚集函数
group by子句分组:
查询平均成绩大于等于90分的学生学号和平均成绩(聚集函数的判断只能用having 不能用where)
select sno,avg(grade) from sc group by sno having avg(grade) > 90;
三、连接查询
一般格式:[<表名1>.]<列名1> <比较运算符>[<表名2>.]<列名2>
分情况进行介绍
3.1等值连接
三种基本办法(查询优化的时候还会讲)
3.1.1嵌套循环法
3.1.2排序合并
3.1.3索引连接
3.2自身连接
select first.cname,second.cname
from course first,course second
where first.cpno = second.cno;
3.3外连接
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno, Grade
FROM Student LEFT OUT JOIN SC ON Student.Sno=sC.Sno;
3.4多表连接
SELECT Student. Sno, Sname, Cname, Grade
FROM Student, SC, Course /*多表连接*/
WHERE Student. Sno = SC.Sno
AND SC.Cno = Course.Cno;
五.嵌套查询
分四种情况介绍
4.1带有in谓词的子查询
4.2带有比较运算符的子查询
4.3带有any(some)或all谓词的子查询
4.4带有EXISTS谓词的子查询
六、集合查询
查询计算机科学系的学生及年龄不大于19岁的学生。
SELECT *
FROM Student
WHERE Sdept= 'CS'
UNION
SELECT *
FROM Student
WHERE Sage<= 19;
■UNION:将多个查询结果合并起来时,系统自动去掉重复元组
■UNIONALL:将多个查询结果合并起来时,保留重复元组
查询计算机科学系的学生与年龄不大于19岁的学生的交集。
SELECT *
FROM Student
WHERE Sdept ='CS'
INTERSECT
SELECT *
FROM Student
WHERE Sage<=19
查询计算机科学系的学生与年龄不大于19岁的学生的差集。
SELECT *
FROM Student
WHERE Sdept ='CS'
EXCEPT
SEL ECT
FROM Student
WHERE Sage <=19;