数据查询
SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式>]...
FROM <表名或视图名> [,<表名或视图名>] |(<SELECT语句>)[AS]<别名>
[WHERE <条件表达式>]
[GROUP BY <列名1> [HAVING <条件表达式>]]
[ORDER BY <列名2> [ASC|DESC]];
- 整个select语句的含义是,根据where子句的条件表达式从from自居指定的基本表、视图或派生表中找出满足条件的元组,再按select子句中的目标列表式选出元组中的属性值形成结果表
- 如果有group by子句,则将结果按<列名1>的值进行分组,该属性列值相等的元组为一个组。通常会在每组中作用聚集函数。
- 如果有order by子句,则结果表还要按<列名2>的值进行升序或降序排序
1. 单表查询
1. 选择表中的若干列
- 查询指定列
select Sno,Sname
from Student;
- 查询全部列
select *
from Student;
- 查询经过计算的值
select Sname,2019-Sage
from Student;
2. 选择表中的若干元组
- 消除取值重复的行
seletct Sno
from SC;
select distinct Sno
from SC;
- 查询满足条件的元组
通过where子句实现
常用的查询条件
- 比较大小
=, >, <, >=, <=, !=, <>, !>, !<, NOT+以上运算符- 确定范围
between and, not between and- 确定集合
in ,not in- 字符匹配
like, not like- 空值
is null, is not null- 多重条件(逻辑运算)
and, or, not
3. ORDER BY子句
用户可以用ORDER BY子句对查询结果按照一个或多个属性列的升序(ASC)或降序(DESC),默认为升序(ASC)
select *
from Student
order by Sdept,Sage desc;
4. 聚焦函数
- COUNT(*)
统计元组个数
select count(*)
from student;
- COUNT([DISTINTCT|ALL] <列名>)
统计一列中值的个数
select count(distinct Sno)
from SC;
- SUM([DISTINTCT|ALL] <列名>)
计算一列值的总和(此列必须是数值型) - AVG([DISTINTCT|ALL] <列名>)
计算一列值的平均值(此列必须是数值型)
select avg(Grade)
from SC
where Cno='1';
- MAX([DISTINTCT|ALL] <列名>)
求一列值中的最大值 - MIN([DISTINTCT|ALL] <列名>)
求一列值中的最小值
5. GROUP BY子句
GROUP BY子句将查询结果按某一列或多列的值分组,值相等的为一组。
select Cno,count(Sno)
from SC
group by Cno;
select Sno
from SC group by Sno
having count(*)>3
2. 连接查询
1. 等值与非等值连接查询
[<表名1>.] <列名1> <比较运算符> [<表名2>.] <列名2>
# 比较运算符只要有 =, >, <, >=, <=, !=(或<>)等。
或使用以下形式
[<表名1>.] <列名1> BETWEEN [<表名2>.] <列名2> AND [<表名2>.] <列名3>
连接符号为=时,称为等值连接;使用其他运算符为非等值连接。
select Student.*,SC.*
from Student,SC
where Student.Sno = SC.Sno;
2. 自身连接
连接操作不仅可以在两个表之间进行,也可以是一个表与其自己进行连接,称为表的自身连接。
select first.Cno,second.cpno
from Course first,Course second
where first.Cpno= second.Cno;
3. 外连接
通常的连接操作中,只有满足连接条件的元组才能作为结果输出。不满足条件的元组,也就是被舍弃的元组称为悬浮元组。如果想把悬浮元组也保存在结果关系中,而在其他属性上填空值(NULL),这种连接就叫做外连接。
左外连接列出左边关系中所有的元组
右外连接列出右边关系中所有的元组
select Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
from Student
left outer join SC on
(Student.Sno=SC.Sno);
4. 多表连接
两个以上的表进行连接通常称为多表连接。
3. 嵌套查询
- 在SQL语言中,一个select-from-where语句称为一个查询块,将一个查询块嵌套在另一个查询块的where子句或having短语的条件中的查询称为嵌套查询。
- 上层的查询块称为外层查询或父查询,下层查询块称为内层查询或子查询。
- 子查询的select语句中不能使用order by子句,order by子句只能对最终结果排序。
1. 带有IN谓词的子查询
select Sno,Sname,Sdept
from Student
where Sdept in
(select Sdept
from Student
where Sname='liuchen');
2. 带有比较运算符的子查询
比较运算符:<, >, =, <=, >=, !=,<>
可以用in代替=
3. 带有ANY(SOME)或ALL谓词的子查询
>ANY 大于子查询结果中的某个值
>ALL 大于子查询结果中的所有值
<ANY 小于子查询结果中的某个值
<ALL 小于子查询结果中的所有值
>=ANY 大于等于子查询结果中的某个值
>=ALL 大于等于子查询结果中的所有值
<=ANY 小于等于子查询结果中的某个值
<=ALL 小于等于子查询结果中的所有值
=ANY 等于子查询结果中的某个值
=ALL 等于子查询结果中的所有值(通常没有实际意义)
!=(或<>)ANY 不等于子查询结果中的某个值
!=(或<>)ALL 不等于子查询结果中的任何一个值
4. 带有exists谓词的子查询
4. 集合查询
集合操作主要包括并操作UNION,交操作INTERSECT和差操作EXCEPT
参加集合操作的各查询结果的列数必须相同;对应项的数据类型也必须相同。
5. 基于派生表的查询
子查询不仅可以出现在where语句中,还可以出现在from子句中,这时子查询生成的临时派生表成为主查询的查询对象。
数据更新
1. 插入数据
1. 插入元组
INSERT
INTO <表名> [(<属性列1> [, <属性列2>] ...)]
VALUES (<常量1> [, <常量2>]...);
2. 插入子查询结果
INSERT
INTO <表名> [(<属性列1> [, <属性列2>] ...)]
子查询;
2. 修改数据
UPDATE <表名>
SET <列名>=<表达式> [,<列名>=<表达式>]...
[WHERE <条件>]
1. 修改某一个元组的值
2. 修改多个元组的值
3. 带子查询的修改语句
3. 删除数据
DELETE
FROM <表名>
[WHERE <条件>]