基础
一对多:部门和员工
多的一方设置外键,指向对方的主键
多对多:学生和课程
设置中间表,至少包含两个外键,并将其关联
一对一:用户和用户详情
任意一方加入外键,关联另一方的主键,并设置为unique
笛卡尔积:集合A和集合B的所有组合情况
select * from A,B;
这种情况很容易产生答案冗余,所以需要将不需要的笛卡尔积筛除
select * from A,B where 筛选条件;
以下为连接的数据集
use test;
create table dept(
id int auto_increment comment 'ID' primary key,
name varchar(50) not null comment '部门名称'
)comment '部门表';
INSERT INTO dept (id, name) VALUES (1, '研发部'), (2, '市场部'),(3, '财务部'), (4,
'销售部'), (5, '总经办'), (6, '人事部');
-- 创建emp表,并插入数据
create table emp(
id int auto_increment comment 'ID' primary key,name varchar(50) not null comment '姓名',
age int comment '年龄',
job varchar(20) comment '职位',
salary int comment '薪资',
entrydate date comment '入职时间',
managerid int comment '直属领导ID',
dept_id int comment '部门ID'
)comment '员工表';
-- 添加外键
alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references
dept(id);
INSERT INTO emp (id, name, age, job,salary, entrydate, managerid, dept_id)
VALUES
(1, '金庸', 66, '总裁',20000, '2000-01-01', null,5),
(2, '张无忌', 20, '项目经理',12500, '2005-12-05', 1,1),
(3, '杨逍', 33, '开发', 8400,'2000-11-03', 2,1),
(4, '韦一笑', 48, '开发',11000, '2002-02-05', 2,1),
(5, '常遇春', 43, '开发',10500, '2004-09-07', 3,1),
(6, '小昭', 19, '程序员鼓励师',6600, '2004-10-12', 2,1),
(7, '灭绝', 60, '财务总监',8500, '2002-09-12', 1,3),
(8, '周芷若', 19, '会计',48000, '2006-06-02', 7,3),
(9, '丁敏君', 23, '出纳',5250, '2009-05-13', 7,3),
(10, '赵敏', 20, '市场部总监',12500, '2004-10-12', 1,2),
(11, '鹿杖客', 56, '职员',3750, '2006-10-03', 10,2),
(12, '鹤笔翁', 19, '职员',3750, '2007-05-09', 10,2),
(13, '方东白', 19, '职员',5500, '2009-02-12', 10,2),
(14, '张三丰', 88, '销售总监',14000, '2004-10-12', 1,4),
(15, '俞莲舟', 38, '销售',4600, '2004-10-12', 14,4),
(16, '宋远桥', 40, '销售',4600, '2004-10-12', 14,4),
(17, '陈友谅', 42, null,2000, '2011-10-12', 1,null);内连接
A,B交集
显式内连接和隐式内连接
案例:查询每一个员工的姓名 , 及关联的部门的名称 (隐式内连接实现)
select...from...where...
select emp.name ,dept.name from emp, dept where emp.dept_id=dept.id;显式外连接
SELECT ... FROM A [ INNER ] JOIN B ON 连接条件 ... ;
外连接
左外连接
左表所有数据以及两表交集
left outer join on
右外连接
右表所有数据以及两表交集
right outer join on
案例:查询emp表的所有数据, 和对应的部门信息
查询一张表的所有信息以及对应的部门信息,那就是查询emp,dept的交集部分以及emp表的所有数据
左外连接和右外连接在某些程度上是可以互换的:以下两个语句获取到的表是一样的
select emp.*,dept.name from emp left outer join dept on emp.dept_id=dept.id
select emp.*,dept.name form dept right outer join emp on emp.dept_id=dept.id
自连接
自己连自己,注意起别名
案例:
查询员工 及其 所属领导的名字
select a.name,b.name from emp a,emp b where a.managerid=b.id;起别名的原因防止报错,比如下面的语句就会报错
select emp.name,emp.name from emp,emp where emp.managerid=emp.id;
联合查询
关键字union 后面可以加上all
条件:多张表的列数需要保持一致,字段类型也要保持一致
注意:联合查询得到的结果与两表之间or或者and可能不同
select * from emp where salary<5000 or age>50
该条语句表达的是:查询员工中工资少于5000或者年龄大于50岁的
select * from emp where salary<5000 and age>50
该条语句表达的是:查询员工中工资少于5000并且年龄大于50岁的
而联合查询是两个语句简单合并,就像"+",可能会出现重复现象
select * from emp where salary<5000
select * from emp where age>50
以上两个语句使用联合查询
select * from emp where salary<5000
union all
select * from emp where age>50
得到的结果为,与and,or得到的结果不同

可以发现,"鹿杖客"的数据出现了两次,出现了重复现象
当使用union时不使用all就可以自动去重,如下
select * from emp where salary<5000
union
select * from emp where age>50;注意:如果多条查询语句查询出来的结果,字段数量不一致,在进行union/union all联合查询时,将会报错