您的位置:首页 > 数据库

数据库的高级查询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;

注意: 使用视图修改数据会有许多限制,一般在实际开发中视图仅用作查询

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: