一般把一的一方叫做父表,把多的一方叫做子表。
外键约束:解决多表数据之间的一致性和完整性问题。
-- 创建表时指定
create tablt 表名(
字段名 数据类型,
...
[constraint] [外键名称] foreign key(外键字段名) references 主表(字段名)
);
-- 建完表之后,添加外键
alter table 表名 add constrain 外键名称 foreign key(外键字段名) references 主表(字段名);
alter table tb_emp
add constraint tb_enp_fk_dept_id
foreign key (dept_id) references
tb_dept (id);
使用foteign key定义外键关系另外一张表
在业务层逻辑中,解决外键关联
多用于单表拆分,将一张表的基础字段放在一张表中,其他字段放在另一张表中,以提升操作效率。
在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(unique)
建立第三张中间表,中间表至少包含两个外键,分别关联两方主键。
笛卡尔积:两个集合的所有组合情况
在·多表查询时,需要消除无效的笛卡尔积
select * from tb_emp,tb_dept where tb_emp.dept_id = tb_dept.id;
查询A、B表交集部分数据
-- 隐式内连接
select 字段列表 from 表1,表2 where 条件...;
-- 起别名
select e.name, d.name from tb_emp e , tb_dept d where e.dept_id = d.id;
-- 显式内连接
select 字段列表 from 表1 [inner] join 表2 on 连接条件...;
查询左表所有数据(包括两张表交集部分数据)
select 字段列表 from 表1 left [outer] join 表2 on 连接条件...;
查询右表所有数据(包括两张表交集部分数据)
select 字段列表 from 表1 right [outer] join 表2 on 连接条件...;
SQL语句中嵌套select语句
子查询外部的语句可以是insert/update/select的任何一个,最常见的是select
select * from t1 where column1 = (select column1 from t2...);
子查询返回的结果为单个值(数字、字符串、日期等)
常见的操作符:= <> > >= < <=
子查询返回的结果为一列
常用操作符:in、not in
子查询返回的结果为一行
常用操作符:= <> in not in
select * from tb_emp where entrydate = (select entrydate from tb_emp where name = '韦一笑') and job = (select job from tb_emp where name = '韦一笑');
select * from tb_emp where (entrydate,job) = (select entrydate,job from tb_emp where name = '韦一笑';
子查询返回的结果为多行多列
常用操作符:in
先分析用到的表,然后分析表之间的关系,考虑条件和组合
是一组操作的集合,他是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,也就是说,这些操作要么都成功,要么一起失败。
-- 开启事务:
start transaction;
begin;
-- 提交事务:
commit;
-- 回滚事务
rollback;
事务是不可分割的最小单元,要么全部成功,要么全部失败
事务完成时,必须所有的数据都保持一致状态
数据库系统提供的隔离机制,保证事务在不收外部并发操作影响的独立环境下运行
事务一旦提交或回滚,它对数据库中的数据的改变就是永久的