目录
一、关联查询
同时查询多张表的方式称为关联查询。n张表进行关联查询至少需要n-1个连接条件
select * from emp, dept;
直接对两张表进行关联查询,会产生笛卡尔积,假设两张表的数据分别为m, n,则最后查询的数据量为m * n;
笛卡尔积的产生导致查询结果的不正确性,数据大量冗余;为了避免笛卡尔积,所以需要添加where条件,使用等值连接或者内连接,得到表之间的数据交集
1.等值连接内连接
等值连接和内连接都是关联查询的方式:推荐使用内连接
等值连接:select * from emp, dept where emp.id == dept.id;
内连接:select * from emp join dept on emp.id = dept.id;
2.外连接
目的获取一张表的全部数据以及和另一张表的交集数据。外连接包括左外连接和右外连接,两者类似;
如左外连接:对于两张表A, B; A称为主表,B称为副表,语句格式:
select * from A left join B on A.args = B.args
查询结果得到主表A中的所有数据;查询结果中B不包含的数据用NULL表示;右外连接相反。
3.外键约束
什么是外键? 一张表中的字段是另一张表中的主键
语法格式:[CONSTRAINT <外键名>] FOREIGN KEY 字段名 [,字段名2,…] REFERENCES <主表名> 主键列1 [,主键列2,…]
实际开发中,很少使用外键,因为外键的引入,不方便数据的修改,删除操作
4.设计表的原则
一对一:两张表A,B,A,B中的数据一一对应。选择一张表添加外键指向主表的主键
一对多:多的表设置外键
多对多:三张表,设置一张关系表,存储主表和副表的主键
二、其他
1.视图
视图:可以理解为是一张虚拟的表,目的取代一段sql语句,对外屏蔽真正的表数据;取代一段sql语句,实现重用,提高效率,隐藏敏感信息。
语法格式:create view 视图名 as (子查询) -》 与表的创建修改类似
视图分类:
- 简单视图:创建视图的子查询不包括去重,分组查询和聚合函数;关联查询的视图可以称为简单视图,可以进行增删改查
- 复杂视图:与简单视图相反,只能进行查询。
在插入过程中,如果插入一条数据在原表中显示但是在视图中不显示,称为数据污染
解决方法: 在创建视图的语句后面添加 with check option
1. 创建视图:
2.插入数据
这里的意思通过视图插入一条数据,但是没有添加deptno,而该视图仅仅select deptno = 20的元组。导致原表和视图数据不匹配,称为数据污染。
2.索引
什么是索引:索引是数据库中提高查询效率的技术,类似于字典的目录
为什么使用索引:如果不使用索引数据会零散的保存在每一个磁盘块中,要想找到数据需要挨个遍历每一个磁盘块,使用索引后,磁盘块会以树状结构保存,查询数据时能够大大降低磁盘块的访问量从而提高查询效率
索引是越多越好吗? 不是,索引会占存储空间,如果数据量小的话添加索引反而会降低查询效率。只针对常用的查询字段创建索引,否则就浪费存储空间
创建索引的格式:索引是给字段添加的
create index 索引名 on 表名(字段名)
3.数据库三范式
简单叙述,需要补充
1.第一范式:表中的字段不可再分
2.第二范式:表中数据(每一条元组)唯一,表中数据项完全依赖于主键;否则,将不具有完全依赖的列属性和部分依赖差分成新的表。
3.第三范式:简而言之,不存在非主属性依赖。即所有属性仅对主键完全依赖。
总结
对于关联查询,范式,索引进行简要总结