赞
踩
目录
本期我们学习MySQL中多表查询的内连接、外连接和自连接。这里我会通过相关的案例去讲解多表查询中的内外连接与自连接的查询方式,以方便大家的理解。
表数据准备:
-
- # 创建dept表以及插入数据
- 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);
-
-
创建后的emp表如下: 创建后的dept表如下:
语法结构:
SELECT 字段列表 FROM 表1 , 表2 WHERE 条件 ... ;
- select emp.name , dept.name from emp , dept where emp.dept_id = dept.id ;
- -- 为每一张表起别名,简化SQL编写
- select e.name,d.name from emp e , dept d where e.dept_id = d.id;
语法结构:
SELECT 字段列表 FROM 表1 [ INNER ] JOIN 表2 ON 连接条件 ... ;
- select e.name, d.name from emp e inner join dept d on e.dept_id = d.id;
- -- 为每一张表起别名,简化SQL编写
- select e.name, d.name from emp e join dept d on e.dept_id = d.id;
表的别名:①. tablea as 别名1 , tableb as 别名2 ;②. tablea 别名1 , tableb 别名2 ;注意事项:一旦为表起了别名,就不能再使用表名来指定对应的字段了,此时只能够使用别名来指定字段。
外连接分为两种,分别是:左外连接 和 右外连接。
语法结构:
SELECT 字段列表 FROM 表1 LEFT [ OUTER ] JOIN 表2 ON 条件 ... ;
- select e.*, d.name from emp e left outer join dept d on e.dept_id = d.id;
- select e.*, d.name from emp e left join dept d on e.dept_id = d.id;
执行结果如下:
SELECT 字段列表 FROM 表1 RIGHT [ OUTER ] JOIN 表2 ON 条件 ... ;
- select d.*, e.* from emp e right outer join dept d on e.dept_id = d.id;
- select d.*, e.* from dept d left outer join emp e on e.dept_id = d.id;
查询结果:
注意事项:左外连接和右外连接是可以相互替换的,只需要调整在连接查询时SQL中,表结构的先后顺序就可以了。而我们在日常开发使用时,更偏向于左外连接。
SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件 ... ;
select a.name ,b.name from emp a join emp b on a.managerid=b.id;
select a.name "员工",b.name "老板" from emp a left join emp b on a.managerid=b.id;
注意事项:在自连接查询中,必须要为表起别名,要不然我们不清楚所指定的条件、返回的字段,到底是哪一张表的字段。
语法结构:
- SELECT 字段列表 FROM 表A ...
- UNION [ ALL ]
- SELECT 字段列表 FROM 表B ....;
- select * from emp where salary<5000
- union all
- select * from emp where age >50;
- select * from emp where salary<5000
- union
- select * from emp where age >50;
以上就是本期的全部内容了,我们下次见!
分享一张壁纸:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。