MySQL数据库——多表查询(2)-内连接、外连接

目录 

内连接

查询语法

内连接演示

外连接

查询语法

外连接演示


内连接

内连接查询的是两张表交集的部分,返回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)的右外连接。

猜你喜欢

转载自blog.csdn.net/li13437542099/article/details/132460975