数据库的高级查询exists,数据库的三大范式,视图
2018-02-01 17:07
302 查看
1. EXISTS子查询:
a) SELECT …… FROM 表名 WHERE EXISTS(子查询);b) 子查询有返回结果:
i. EXISTS子查询结果为TRUE
c) 子查询无返回结果:
i. EXISTS子查询结果为FALSE,外层查询不执行
d) 简述:exists 是查询检测子查询是否为真
e) exists 和 in 是可以互换使用的,但in是逐个去查询,速度慢;而exists速度很快,它查询的结果只有两种:TRUE 或者FALSE,要么返回真,要么返回假,所以exists就分为了相关子查询、不相关子查询
i. 不相关子查询:就是指只负责查询,而没有条件,是真就进行查询
1. 比如:
select 字段 from 表名1 where exists (select 字段 from 表名2)
2. -->
显示的结果是 第一个表名里这个字段的数据
ii. 相关子查询:负责查询是否为真,并将俩个表联立起来:
1. 比如:
select 字段 from 表名1 where exists (select 字段 from 表名2 where 表名1.字段=表名2.字段)
2. -->
显示的结果是 表1和表2共有的数据
2. 子查询注意事项:
a) 任何允许使用表达式的地方都可以使用子查询b) 嵌套在父查询SELECT语句的子查询可包括
i. SELECT子句
ii. FROM子句
iii. WHERE子句
1. 用来筛选
FROM 子句中指定的操作所产生的行
iv. GROUP
BY子句
1. 用来分组
WHERE 子句的输出
v. HAVING子句
1. 用来从分组的结果中筛选行
2. 如果在一个查询里面用了where
之后还想加 条件可以用having
c) 只出现在子查询中而没有出现在父查询中的列不能包含在输出列中
注意:如果先进行了分组排序GROUP BY,就不能在它后面使用WHERE语句;这个时候如果还想继续添加条件,只能使用HAVING 语句
3. 常用的多表连接查询:
a) 内连接(INNER JOIN)b) 外连接
i. 左外连接
(LEFT JOIN)
ii. 右外连接
(RIGHT JOIN)
c) 比如:
select sno,cno,adgree from student inner join score where student.sno=score.cno inner join course where score.课程字段=course.课程字段
d) 上面这个例子是一个学生表,课程表,成绩表的查询,这三个表通过内连接的方法联系了起来,就能取到在这三个表的数据,关键点是这三个表之间有练习,比如说外键,在成绩表里存在学生表中学生号的外键,在成绩表里有课程表的外键;所以才能建立连接,取到这三个表中共同有的数据
e) 还有一种方式,例如:
select
sno,cno,adgree from student,score,course where student.sno=score.cno and score.课程字段=course.课程字段
这样也能实现多表连接,但是据说这种的速度比较慢
4. 数据库的三大范式:
a) 第一范式: 确保每列的原子性,即列不能够再分成其他几列。i. 如果每列(或者每个属性)都是不可再分的最小数据单元(也称为最小的原子单元),则满足第一范式.
例如:顾客表(姓名、编号、地址、……)其中"地址"列还可以细分为国家、省、市、区等。
b) 第二范式:除主键以外的其他字段只能传递依赖于主键,意思是每张表只能表达一件事情
i. 如果一个关系满足第一范式,并且除了主键以外的其它列,都依赖于该主键,则满足第二范式.
例如:订单表(订单编号、产品编号、定购日期、价格、……),"订单编号"为主键,"产品编号"和主键列没有直接的关系,即"产品编号"列不依赖于主键列,应删除该列。
c) 第三范式:在第二范式的基础上更近进一层,目的是确保每列都和主键之间相关,而不是间接相关
i. 如果一个关系满足第二范式,并且除了主键以外的其它列都不依赖于主键列,则满足第三范式.
ii. 例如:订单表(订单编号,定购日期,顾客编号,顾客姓名,……),初看该表没有问题,满足第二范式,每列都和主键列"订单编号"相关,再细看你会发现"顾客姓名"和"顾客编号"相关,"顾客编号"和"订单编号"又相关,最后经过传递依赖,"顾客姓名"也和"订单编号"相关。为了满足第三范式,应去掉"顾客姓名"列,放入客户表中。
视图:
1. 什么是视图?a) 视图是一张虚拟表
i. 表示一张表的部分数据或多张表的综合数据
ii. 其结构和数据是建立在对表的查询基础上
b)视图中不存放数据
i.数据存放在视图所引用的原始表中
c)一个原始表,根据不同用户的不同需求,可以创建不同的视图
2. 视图的用途
a) 筛选表中的行
b) 防止未经许可的用户访问敏感数据
c) 降低数据库的复杂程度
d) 将多个物理数据库抽象为一个逻辑数据库
3. 使用sql语句创建视图:
--> create view 视图名(注释:一般为view_视图名) as select语句;
4. 使用sql语句删除视图:
--> drop view [if exists] 视图名;
a) [这个里面为可选的,]
b) If exists 删除前判断视图是否存在
5. 使用sql语句查看视图:
--> select 字段 from 视图名 [where 条件];
6. 使用视图注意事项:
a) 视图中可以使用多个表
b) 一个视图可以嵌套另一个视图
c) 对视图数据进行添加、更新和删除操作直接影响所引用表中的数据
d) 当视图数据来自多个表时,不允许添加和删除数据
7. 查看所有的视图
--> use information_schema;
--> select * from views;
注意: 使用视图修改数据会有许多限制,一般在实际开发中视图仅用作查询
相关文章推荐
- SQL Server数据库设计和高级查询(1)-三大范式
- JAVA-20-数据约束、数据库设计三大范式、多表查询、存储过程、触发器、数据库权限
- mysql高级查询及设计三大范式
- 【Oracle】曾经的Oracle学习笔记(8-15)ER图,三大范式,数据库字典,视图,索引,序列
- 数据库设计三大范式
- 查询SQLServer2005中某个数据库中的表结构、索引、视图、存储过程、触发器以及自定义函数
- 数据库设计三大范式
- 数据库设计的三大范式
- 新人浅谈__(数据库的设计__数据库模型图,数据库E-R图,三大范式)
- 数据库设计三大范式
- ORA-01219: 数据库未打开: 仅允许在固定表/视图中查询解决之道
- 数据库设计三大范式
- 数据库三大范式详解
- 什么是数据库三大范式?
- 数据库三大范式
- MySQL、SqlServer、Oracle三大主流数据库分页查询
- 关系型数据库三大范式
- 第五部分:高级查询 第六部分:常规索引管理 第七部分:全文索引管理 第八部分:数据库的备份和恢复 第九部分:数据库的安全管理
- 数据库三大范式详解
- 数据库三大范式另一角度的理解