SQL
数据查询
嵌套查询
注:子查询的select语句中不能使用order by字句,order by子句只能对最终结果排序。
相关子查询:子查询的查询条件依赖于父查询(对应的有‘不相关子查询’)
带有IN谓词的子查询
/*IN嵌套查询
查询在“Production”部门担任职位“Assistant Engineer”的员工编号、姓名*/
select emp_no,first_name,last_name
from employees
where emp_no in
(select emp_no
from titles
where title = "Assistant Engineer" and emp_no in
(select emp_no
from dept_emp
where dept_no in
(select dept_no
from departments
where dept_name = "Production")));
对于IN嵌套查询,要注意子查询所查找的元素一定是和父查询共有的主键(primary key)。
带有EXISTS谓词的子查询
带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真"true"和逻辑假值"false".
由EXISTS引出的子查询,其目标列表达式通常都用 * 。
'''
where not exists
(select *
...);
FROM子句中的子查询
FROM子句中使用子查询一般都是返回多行多列,可以将其当作一张数据表。
进行嵌套查询的时候子查询出来的的结果是作为一个派生表来进行上一级的查询的,所以子查询的结果必须要有一个别名。
'''
from (...) as [别名1],(...) as [别名2]
...
如果没有加‘别名’,会报错:
Error Code: 1248. Every derived table must have its own alias
集合查询
集合操作:UNION(并),INTERSECT(交),EXCEPT(差)
集合操作针对的是SELECT语句的结果
注:参加集合操作的各查询结果的列数必须相同;
对应项的数据类型也必须相同。
MySQL只提供了并集(union),没有提供差集,和交集,可以用union来实现交和差.
交集:
原理就是求table1与table2不去除重复条目的并集(union all),然后按名字分组,取其中重复条目。
select *
from (select *
from table1
union all
select *
from table2)temp
group by name
having count(*)>1;
差集:
其实和前面的并集,都可以将查询结果用 in 和 not in 来连接。
数据更新
插入数据
insert
into <表名> [(<属性列 1> [,<属性列2>]...)]
values(<常量 1> [,<常量 2>]...);
#或者
insert
into <表名> [(<属性列 1> [,<属性列2>]...)]
子查询;
修改数据
update <表名>
set <列名>=<表达式> [,<列名>=<表达式>] ...
[where <条件>];
删除数据
delete
from <表名>
[where <条件>];
空值的处理
外连接也会产生空值。空值的关系运算也会产生空值。
空值判断:is null 或 is not null
约束条件:属性定义(或者域定义)中有 NOT NULL 约束条件的不能取空值,加了UNIQUE限制的属性不能取空值,码属性不能取空值。
空值与另一个值的算术运算结果为空值,比较运算的结果为UNKNOWN。
有了UNKNOWN后,传统的逻辑运算中二值(TRUE,FALSE)逻辑就扩展成了三值
定律。
只有使where和having子句中的选择条件为true的元组才被选出作为输出结果。
视图
定义视图
一个或几个基本表(或视图)导出的表,是一个虚表。数据库中只存放视图的定义,不存放视图对应的数据,数据存放在原来的基本表中。后者变化,前者也会随之变化。可以在视图之上再定义视图,但对视图的更新操作有一定的限制。
建立视图:
create view <视图名> [(<列名> [,<列名>] ...)]
as <子查询>
[with check option] #在进行数据更新时会自动加上子查询里的where子句条件。
DBMS执行create view语句的结果只是把视图的定义存入数据字典,但并不执行其中的select语句。
属性列中包含不同表的同名列,则必须在视图名后明确给出视图的各个属性列名。如果修改了基本表的结构,最好删除原视图,然后重建视图。
删除视图:
drop view <视图名> [cascade]
使用cascade级联删除语句把视图和由它导出的所有视图一起删除。
基本表删除后,视图的定义还在字典中。
查询视图
查询过程(视图消解):从数据字典中取出视图的定义,再将定义中的子查询和用户的查询结合起来,转换成等价的对基本表的查询,再执行。(感觉像Java中的接口一样)
目前大多数DBMS对行列子集视图的查询均能进行正确转换,但对非行列子集视图的查询就不一定能做转换了。
视图可永久保存,而派生表是临时定义,执行后即被删除。
752

被折叠的 条评论
为什么被折叠?



