数据查询
一、单表查询
二、连接查询
三、嵌套查询
四、集合查询
五、基于派生表的查询
一、单表查询
1.列查询
select [all|distinct] <表达式> [别名] [,<表达式> [别名]]... from <表名|视图名> [,<表名|视图名>]...|(<select语句>) [as] <别名> [where <条件表达式>] [group by <列名1> [having <条件表达式>]] [order by <列名2> [asc|desc]];
注:默认情况下select all
2.元组查询
- 限定all或distinct
- 增加where限定条件
where子句常用字符
查询条件 谓词 比较 =,>,<,>=,<=,!= 确定范围 between and,not between and 确定集合 in,not in 字符匹配 like,not like 空值 is null,is not null 逻辑运算 and,or,not
1.比大小
2.确定范围
between and包括两端的值
3.确定集合
4.字符匹配
格式:
[not] like '<匹配串>' [escape '<换码字符>']
%代表任意长度字符串,_代表任意单个字符
- 聚集函数
聚集函数
count(*) 元组个数 count([all|distict] <列名>) 该列值个数 sum([all|distict] <列名>) 该列值综合 avg([all|distict] <列名>) 该列平均值 max([all|distict] <列名>) 该列最大值 min([all|distict] <列名>) 该列最小值
注:聚集函数只能用于select子句和group by的having子句中,默认为all
- group by子句
作用:细化聚集函数的作用范围
3.order by
2.连接查询
- 等值连接与非等值连接
等值连接:连接运算符为=
非等值连接:连接运算符不为=
连接查询的两种形式:
[<表1>.]<列名1> <比较运算符> [<表2>.]<列名2>[<表1>.]<列1> between [<表2>.]<列2> and [<表2>.]<列3>
注:连接字段必须可比
Ex:查询选修2号课程且成绩在90分上所有学生的学号和姓名
注:先输入其他条件再输入连接条件执行效率更高
- 自身连接
EX:查询每一门课的先修课的先修课
- 外连接
EX:查询每个学生的选课信息时,默认情况下要是有学生没选课,那么这个学生的信息就不显示了,现在要求把没选课的学生也显示出来
- 多表连接
3.嵌套查询
查询块:一个select-from-where语句块
嵌套查询:查询块嵌入到另一个查询块的where或having子句中的查询
相关查询:子查询的查询条件依赖于父查询
不相关查询:子查询的查询条件不依赖于父查询
EX:查询和刘晨在同一个系中学习的学生
- 使用in来完成嵌套查询
select Sno,Sname,Sdept from Student where Sdept in ( select Sdept from Student where Sname='刘晨' );
- 使用比较运算符来完成嵌套查询(得确切知道内层查询只有一个值了)
select Sno,Sname,Sdept from Student where Sdept= ( select Sdept from Student where Sname='刘晨' );
EX:找出每个学生超过他自己选修课程平均成绩的课程号
select Sno,Cno from SC x where Grade>= ( select avg(Grade) from SC y where y.Sno=x.Sno );
注:这里为了区分子查询和父查询中的SC,分别对SC取不同的别名来指示。
- 带有any(some)或all谓词的子查询
注:用聚集函数实现子查询比直接用any或all查询效率要高。
- 带有exists谓词的子查询
注:
1.由exists引出的子查询,其目标列表达式通常用*,因为带exists的子查询只返回真或假值,给出列名无实际意义。
2.SQL中没有全称量词,只能用exists/not exists来代替。
EX:查询选修了全部课程的学生姓名
select Sname from Student where not exists ( select * from Course where not exists ( select * from SC where Sno=Student.Sno and Cno=Course.Cno ) )
注:按照SQL没有全称量词的尿性,只能用没有一门课程是他不选修的来代替。
4.集合查询
集合操作:并(union)、交(intersect)、差(except)
5.基于派生表的查询
子查询不仅可以在where和having子句,也插入在from子句中,以此生成一个派生表并成为主查询的查询对象
EX:查询所有选修了1号课程的学生姓名
select Sname from Student, (select Sno from SC where Cno='1') as SC1 where Student.Sno=SC1.Sno;
注:这里的as可以省略,SC1就是个派生表,现在SC1就可以当个普通的表来查询了