1.名词
主键:一张从表中某个字段引用主表中的主键,维护多表之间的关系
从表:使用别人数据的表,被主表约束
2.外键
级联两个表,一个表的关键字段进行修改,另一个表也会随之修改
constraint [外键约束名] foreign key(外键字段) references 主表名(字段)
--删除外键
alter table 表名 drop foreign key 外键名;
--外键的级联
--级联更新
on update cascade
--级联删除
on delete cascade
3.【数据准备】
--创建公司部门表
CREATE TABLE dept(
id INT PRIMARY KEY auto_increment,
name VARCHAR(20)
);
INSERT INTO dept(name) VALUE('开发部'),('市场部'),('财务部'),('营销部');
-- 创建员工表
CREATE TABLE emp(
id INT PRIMARY KEY auto_increment,
name VARCHAR(10),
gender VARCHAR(10),
salary DOUBLE,
dept_id INT,
join_date VARCHAR(60)
);
4.多表查询
(1)交叉连接查询
特点:左表每条数据和右表每条数据一一匹配显示出来,数据是无用的
格式: select [字段字段][*] from a,b;
--查询所有字段
select * from dept,emp ;
(2)内连接
内连接是基于交叉连接的,显示出来的内容为两个表公共部分。内连接分为隐内连接,显内连接
--隐内连接
select [列名,列名][*] from 表1,表2 where
--显外连接【有inner关键字】
-- 实例
-- 隐内连接
select * from dept,emp where dept.id=emp.depT_id;
-- 显内连接
select * from dept INNER JOIN emp on dept.id=emp.depT_id;
(3)外连接
内连接查询出来的是公共部分,若要保证某张表全部数据情况下进行查询,可以使用外连接。外连接分为左外连接和右外连接,左/右外连接是保证左/右表数据完全显示
-- 左外连接
-- 语法:select [字段] [*] from a left [outer] join b on 条件
select * from dept left join emp on dept.id=emp.dept_id;
左外连接图
右外连接图
(5)子查询
子查询:一个查询至少包含两个select 语句【嵌套】
子查询的三个结果:
(1)一个值;
-- 查询工资最高的惹的信息
SELECT name from emp where salary=(SELECT max(salary) from emp);
(2)单列多行;
(3)多行多列
-- 查询2016年入职员工信息,包括部门名称
--方式1
SELECT emp.*,dept.name 部门 from emp right join dept on emp.dept_id=dept.id where emp.join_date>'2016-1-1';
--方式2
SELECT * from dept,(select * from emp WHERE join_date>'2016-1-1') e where e.dept_id=dept.id;