一对多
- 在多的一方设置外键, 来建立两张表的联系
一对一
- 看成特殊的一对多, 在任意一张表中设置外键
多对多
- 建立中间表, 同时设置两张表的外键
注意
- 外键一般设置逻辑外键, 不再采用物理外键, 方便数据的处理
- 以上多对多, 一对多, 一对一都只是两张表之间的联系, 表示的是各表中数据的对应, 而不是表的数量
多表查询
- 在单表查询的基础上, 直接在加上另一张表即可
select * from tb_emp,tb_dept;
//直接这写会得到所有笛卡尔积的数据, 会有很多不符合要求的数据产生
//所以一般我们要加上查询条件, 去掉不需要的数据
select * from tb_emp,tb_dept where tb_emp.dept_id = tb_dept.id;
多表查询-连接查询
内连接
- 显式内连接的inner可以省略
- on后面跟连接条件, where后面跟查询条件
eg:
//隐式内连接
select tb_emp.name '姓名',tb_dept.name '部门名称' from tb_emp,tb_dept where tb_emp.dept_id = tb_dept.id;
//显式内连接
select tb_emp.name '姓名',tb_dept.name '部门名称' from tb_emp inner join tb_dept on tb_emp.dept_id = tb_dept.id;
外连接
- outer可以省略
eg:
//左外连接
//左外连接将返回左表中的所有记录,同时返回与右表匹配的记录。如果右表中没有匹配的记录,则将返回NULL。
select tb_emp.name '姓名',tb_dept.name '部门名称' from tb_emp left join tb_dept on tb_emp.dept_id = tb_dept.id;
//右外连接
//右外连接将返回右表中的所有记录,同时返回与左表匹配的记录。如果左表中没有匹配的记录,则将返回NULL。
select tb_emp.name '姓名',tb_dept.name '部门名称' from tb_emp right join tb_dept on tb_emp.dept_id = tb_dept.id;
子查询
eg:
//标量子查询
select name from tb_emp where dept_id = (select id from tb_dept where name = '教研部');
select * from tb_emp where entrydate > (select entrydate from tb_emp where name = '方东白');
//列子查询
//返回结果一列多行
select * from tb_emp where dept_id in(select id from tb_dept where name in('教研部','咨询部'));
//行子查询
//返回结果一行多列
select * from tb_emp where (entrydate,job) = (select entrydate,job from tb_emp where name = '韦一笑');
//表子查询
//返回结果多行多列,子表
select e.*,tb_dept.name from (select * from tb_emp where entrydate > '2006-01-01') e, tb_dept where e.dept_id = tb_dept.id;