目录
多表关系
讲述:
一个项目需要很多张表才能完成。例如:一个商城项目就需要分类表、商品表、订单表等多张表。且这些表的数据之间存在一定的关系。
Mysql多表之间的关系可以概括为:一对一,一对多/多对一关系,多对多
一对一关系
- 一个学生只有一张身份证;一张身份证只能对应一个学生
- 在任一表中添加唯一外键,指向另一方主键,确保一对一关系。
- 一般一对一关系很少见,遇到一对一关系的表最好是合并表。
一对多/多对一关系
部门和员工
分析:一个部门有多个员工,一个员工只能对应一个部门
实现原则:在多的一方建立外键,指向一的一方的主键
多对多关系
学生和课程
一个学生可以选择很多门课程,一个课程也可以被很多学生选择
原则:多对多关系实现需要借助第三张中间表。中间表至少包含俩个字段,将多对多的关系,拆成一对多的关系,中间表至少要有俩个外键,这俩个外键分别指向原来的拿俩张表的主键
外键约束
概念:
Mysql外键约束是表的一个特殊字段,经常与主键约束一起使用。对于俩个具有关联关系的表而言,相关联字段中主键所在的表就是主表,外键所在的表就是从表。
外键用来建立主表与从表的关联关系,为俩个表的数据建立连接,约束俩个表中数据的一致性和完整性。比如一个水果摊,只有苹果、桃子、李子、西瓜等四种水果,那么,你来到水果摊要买水果就只能从这四种里面选择。
特点:
定义一个外键时,需要遵守下列规则:
- 主表必须已经存在于数据库中,或者是当前正在创建的表。
- 必须为主表定义主键
- 主键不能包含空值,但允许在外键中出现空值。也就是说,只要外键的每个非空值出现在指定的主键中,这个外键的内容就是正确的。
- 在主表的表名后面指定列名或列名的组合。这个列或列的组合必须是主表的主键或候选键。
- 外键中列的数目必须和主表的主键中列的数目相同。
- 外键中列的数据类型必须和主表主键中对应列的数据类型相同。
操作:
在create table 语句中,通过foreign key 关键字来指定外键。
[constraint<外建名>]foreign key 字段名 [,字段名2,....] references<主表名>
主键列1 [,主键列2,...]
实现部门表和员工表
create table if not exists dept(
deptno varchar(20) primary key, -- 部门号
name varchar(20) -- 部门名字
);
create table if not exists emp(
eid varchar(20) primary key, -- 员工编号
ename varchar(20), -- 员工名字
age int , -- 员工年龄
dept_id varchar(20), -- 员工所属部门
constraint emp_fk foreign key(dept_id) references dept(deptno) --外键约束
);
创建表时设置外键约束
外键约束也可以在修改表时添加,但是添加外键约束的前提是:从表中外键列中的数据必须与主表中主键列中的数据一致或者是没有数据。
alter table<数据表名> add constraint <外建名> foreign key (<列名>) references
<主表名>(<列名>);
删除数据
注意:
- 主表的数据被从表依赖时,不能删除,否则可以删除
- 从表的数据可以随便删除
删除外键:
当一个表中不需要外键约束时,就需要从表中将其删除。外键一旦删除,就会解除主表和从表间的关联关系
alter table<表名> drop foreign key<外键约束名>;
多表联合查询
交叉连接查询(产生笛卡尔积)
交叉连接查询
- 交叉连接查询返回被连接的俩个表所有数据行的笛卡尔积
- 笛卡尔积可以理解为一张表的每一行去和另外一张表的任意一行进行匹配
- 假如A表有m行数据,B表有n行数据,则返回m*n行数据
- 笛卡尔积会产生很多冗余的数据,后期的其他查询可以在该集合的基础上进行条件筛选
格式:
select *from 表1,表2,表3...;
内连接查询
内连接查询就是求俩张表交集的部分,输出。
格式:
-- 隐式内连接
select *from A,B where 条件;
-- 显示内连接
select *from A inner join B on 条件 -- inner可以忽略
外连接查询
外连接分为左外连接,右外连接,满外连接.
注意:oracle里面有full join,可是在mysql对full join 支持的不好。我们可以使用union来达到目的。
有A和B俩张表
左外连接
-- 返回A表的数据和(B表与A表的交集的数据)
select *from A left join B on 条件
右外连接
-- 返回B表的数据,并且返回(A表与B表相交的数据)
select *from A right join B on 条件;
满外连接
-- 返回A和B的所有数据
select *from A full join B on 条件;
子查询
子查询就是指的在一个完整的查询语句中,嵌套若干个不同功能的小查询,从而一起完成复杂查询的一种编码形式,通俗一点就是包含select嵌套的查询。
特点:
子查询可以返回的数据类型一共分为四种:
- 单行单列:返回的是一个具体列的内容,可以理解为一共单值数据;
- 单行多列:返回一行数据中多个列的内容
- 多行单列:返回多行记录之中同一列的内容,相当于给出了一共操作范围;
- 多行多列:查询返回的结果是一张临时表
子查询关键字
- all关键字
- any关键字
- some关键字
- in 关键字
- exists 关键字
ALL
格式:
select...from..where c>all(查询语句)
特点:
- all与子查询返回的所有值比较为true,则返回true
- all可以与=、>、<=、>=、<>结合使用
- all表示指定列中的值必须要大于子查询集的每一个值,即必须要大于子查询集的最大值;如果是小于号即小于子查询集的最小值。同理可推出其他比较运算符的情况
ANY和SOME(作用一样)
格式:
select...from..where c>any(查询语句)
特点:
- any与子查询返回的任何值比较为true,则返回true
- any可以和其他比较运算符结合
- 表示制定列中的值要大于子查询中的任意一个值,即必须要大于子查询集中的最小值。同理可以退出其他比较运算符的情况
- some和any的作用一样,可以理解为some为any的别名
IN
格式:
select..from..where c in(查询语句)
特点:
- in关键字,用于判断某个记录的值,是否在指定的集合中
- 在in关键字前边加上not可以将条件反过来
EXISTS
格式:
select...from...where exists(查询语句)
特点:
- 该子查询如果有数据结果,则该exists()的结果为true,外层执行,否则为false
- exists后面的子查询不返回任何实际数据,只返回真或假
- 注意,exists关键字,比in关键字的运算效率高,因此,在实际开发中,特别是大数据量时,推荐使用exists关键字
表自关联
概念:mysql有时在信息查询时需要进行对表自身进行关联查询,即一张表自己和自己关联,一张表当成多张表来用。注意自关联时表必须给表起别名
格式:
select 字段列表 from 表1 a,表1 b where 条件;
或者
select 字段列表 from 表1 a [left] join 表1 b on 条件