目录
内连接
查询语法
内连接演示
外连接
查询语法
外连接演示
内连接
内连接查询的是两张表交集的部分,返回A表和B表交集部分的数据。内连接分为两种形式:隐式内连接和显式内连接。
查询语法
隐式内连接
SELECT 字段列表 FROM 表1,表2 WHERE 条件...;
显式内连接
SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 连接条件 ...;
内连接演示
准备数据
create table dept(id int auto_increment comment 'ID' primary key,name varchar(50) not null comment '部门名称'
)comment '部门表';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 dept (id, name)VALUES (1, '研发部'), (2, '市场部'),(3, '财务部'), (4, '销售部'), (5, '总经办'), (6, '人事部');
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);
1.查询每一个员工的姓名,及关联的部门的名称(隐式内连接实现)
- 表结构:emp,dept
- 连接条件:emp.dept_id = dept.id
select e.name '姓名', d.name '部门' from emp e,dept d where e.dept_id = d.id;
运行结果:
(有一个员工暂时没有部门)
2.查询每一个员工的姓名,及关联的部门的名称(显式内连接方式)
- 表结构:emp,dept
- 连接条件:emp.dept_id = dept.id
select e.name '姓名',d.name '部门' from emp e inner join dept d where e.dept_id = d.id;
-- inner可以省略
运行结果:
外连接
查询语法
左外连接
SELECT 字段列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON 条件 ...;
相当于查询表1(左表)的所有数据,包含表1和表2交集部分的数据
右外连接
SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 条件...;
相当于查询表2(右表)的所有数据,包含表1和表2交集部分的数据
外连接演示
1.查询emp表的所有数据,和对应的部门信息(左外连接)
- 表结构:emp,dept
- 连接条件:emp.dept_id = dept.id
select e.*,d.name from emp e left outer join dept d on e.dept_id = d.id;
-- outer可省略
查询结果:
语法上对表1(emp)和表2(dept)进行左外连接的查询,即表1的数据+表1与表2交集的数据。因而能够查询到第十七号员工,其属于表1的内容,但不属于两表交集的数据。
2.查询dept表的所有数据,和对应的员工信息(右外连接)
select d.*,e.* from emp e right outer join dept d on e.dept_id = d.id;
查询结果:
同理,此处的右外连接查询的是表2的数据+表1与表2交集的所有数据,因而能够查询到为空的人事部。
同时,可以用左外连接的方式来实现右外连接,
select d.*,e.* from dept d left outer join emp e on e.dept_id = d.id;
只需要将两个表调换一下位置,此处表1(dept)和表2(emp)的左外连接就相当于上一处的表1(emp)和表2(dept)的右外连接。