mysql4表连接,mysql续集4-多表连接

1.多表连接查询

1.1准备表

#建表

create table department(

id int,

name varchar(20)

);

create table employee(

id int primary key auto_increment,

name varchar(20),

sex enum(‘male‘,‘female‘) not null default ‘male‘,

age int,

dep_id int

);

#插入数据

insert into department values

(200,‘技术‘),

(201,‘人力资源‘),

(202,‘销售‘),

(203,‘运营‘);

insert into employee(name,sex,age,dep_id) values

(‘egon‘,‘male‘,18,200),

(‘alex‘,‘female‘,48,201),

(‘wupeiqi‘,‘male‘,38,201),

(‘yuanhao‘,‘female‘,28,202),

(‘liwenzhou‘,‘male‘,18,200),

(‘jingliyang‘,‘female‘,18,204)

;

mysql> select * from department;

+------+--------------+

| id | name |

+------+--------------+

| 200 | 技术 |

| 201 | 人力资源 |

| 202 | 销售 |

| 203 | 运营 |

+------+--------------+

mysql> select * from employee;

+----+------------+--------+------+--------+

| id | name | sex | age | dep_id |

+----+------------+--------+------+--------+

| 1 | egon | male | 18 | 200 |

| 2 | alex | female | 48 | 201 |

| 3 | wupeiqi | male | 38 | 201 |

| 4 | yuanhao | female | 28 | 202 |

| 5 | liwenzhou | male | 18 | 200 |

| 6 | jingliyang | female | 18 | 204 |

+----+------------+--------+------+--------+

1.2多表连接

1.2.1语法

SELECT 字段列表

FROM 表1 INNER|LEFT|RIGHT JOIN 表2

ON 表1.字段 = 表2.字段;

1.2.2笛卡尔积

mysql> select * from employee,department;

+----+------------+--------+------+--------+------+--------------+

| id | name | sex | age | dep_id | id | name |

+----+------------+--------+------+--------+------+--------------+

| 1 | egon | male | 18 | 200 | 200 | 技术 |

| 1 | egon | male | 18 | 200 | 201 | 人力资源 |

| 1 | egon | male | 18 | 200 | 202 | 销售 |

| 1 | egon | male | 18 | 200 | 203 | 运营 |

| 2 | alex | female | 48 | 201 | 200 | 技术 |

| 2 | alex | female | 48 | 201 | 201 | 人力资源 |

| 2 | alex | female | 48 | 201 | 202 | 销售 |

| 2 | alex | female | 48 | 201 | 203 | 运营 |

| 3 | wupeiqi | male | 38 | 201 | 200 | 技术 |

| 3 | wupeiqi | male | 38 | 201 | 201 | 人力资源 |

| 3 | wupeiqi | male | 38 | 201 | 202 | 销售 |

| 3 | wupeiqi | male | 38 | 201 | 203 | 运营 |

| 4 | yuanhao | female | 28 | 202 | 200 | 技术 |

| 4 | yuanhao | female | 28 | 202 | 201 | 人力资源 |

| 4 | yuanhao | female | 28 | 202 | 202 | 销售 |

| 4 | yuanhao | female | 28 | 202 | 203 | 运营 |

| 5 | liwenzhou | male | 18 | 200 | 200 | 技术 |

| 5 | liwenzhou | male | 18 | 200 | 201 | 人力资源 |

| 5 | liwenzhou | male | 18 | 200 | 202 | 销售 |

| 5 | liwenzhou | male | 18 | 200 | 203 | 运营 |

| 6 | jingliyang | female | 18 | 204 | 200 | 技术 |

| 6 | jingliyang | female | 18 | 204 | 201 | 人力资源 |

| 6 | jingliyang | female | 18 | 204 | 202 | 销售 |

| 6 | jingliyang | female | 18 | 204 | 203 | 运营 |

+----+------------+--------+------+--------+------+--------------+

24 rows in set (0.00 sec)

mysql>

1.2.3inner join

"取出两张表中共有的部分

employee表中有dep_id=204

department表中有id=203

这两条是非共有数据"

mysql> select * from employee e inner join department d on e.dep_id=d.id;

+----+-----------+--------+------+--------+------+--------------+

| id | name | sex | age | dep_id | id | name |

+----+-----------+--------+------+--------+------+--------------+

| 1 | egon | male | 18 | 200 | 200 | 技术 |

| 2 | alex | female | 48 | 201 | 201 | 人力资源 |

| 3 | wupeiqi | male | 38 | 201 | 201 | 人力资源 |

| 4 | yuanhao | female | 28 | 202 | 202 | 销售 |

| 5 | liwenzhou | male | 18 | 200 | 200 | 技术 |

+----+-----------+--------+------+--------+------+--------------+

5 rows in set (0.00 sec)

mysql>

mysql> select * from employee e,department d where e.dep_id=d.id;

1.2.4left join

"以左表为准,左表的数据会全部显示

employee表中dep_id为204的那条,也会存在了"

mysql> select * from employee e left join department d on e.dep_id=d.id;

+----+------------+--------+------+--------+------+--------------+

| id | name | sex | age | dep_id | id | name |

+----+------------+--------+------+--------+------+--------------+

| 1 | egon | male | 18 | 200 | 200 | 技术 |

| 5 | liwenzhou | male | 18 | 200 | 200 | 技术 |

| 2 | alex | female | 48 | 201 | 201 | 人力资源 |

| 3 | wupeiqi | male | 38 | 201 | 201 | 人力资源 |

| 4 | yuanhao | female | 28 | 202 | 202 | 销售 |

| 6 | jingliyang | female | 18 | 204 | NULL | NULL |

+----+------------+--------+------+--------+------+--------------+

6 rows in set (0.00 sec)

mysql>

1.2.5right join

"以右表为准,右表中的数据全部显示

department表中id=203那条也会存在"

mysql> select * from employee e right join department d on e.dep_id=d.id;

+------+-----------+--------+------+--------+------+--------------+

| id | name | sex | age | dep_id | id | name |

+------+-----------+--------+------+--------+------+--------------+

| 1 | egon | male | 18 | 200 | 200 | 技术 |

| 2 | alex | female | 48 | 201 | 201 | 人力资源 |

| 3 | wupeiqi | male | 38 | 201 | 201 | 人力资源 |

| 4 | yuanhao | female | 28 | 202 | 202 | 销售 |

| 5 | liwenzhou | male | 18 | 200 | 200 | 技术 |

| NULL | NULL | NULL | NULL | NULL | 203 | 运营 |

+------+-----------+--------+------+--------+------+--------------+

6 rows in set (0.00 sec)

mysql>

1.2.6全外连接

"显示左右两个表中的全部记录

mysql中不支持全外连接 full join

mysql可以使用下面的方式实现全外连接"

mysql> select * from employee e right join department d on e.dep_id=d.id

-> union

-> select * from employee e left join department d on e.dep_id=d.id;

+------+------------+--------+------+--------+------+--------------+

| id | name | sex | age | dep_id | id | name |

+------+------------+--------+------+--------+------+--------------+

| 1 | egon | male | 18 | 200 | 200 | 技术 |

| 2 | alex | female | 48 | 201 | 201 | 人力资源 |

| 3 | wupeiqi | male | 38 | 201 | 201 | 人力资源 |

| 4 | yuanhao | female | 28 | 202 | 202 | 销售 |

| 5 | liwenzhou | male | 18 | 200 | 200 | 技术 |

| NULL | NULL | NULL | NULL | NULL | 203 | 运营 |

| 6 | jingliyang | female | 18 | 204 | NULL | NULL |

+------+------------+--------+------+--------+------+--------------+

7 rows in set (0.00 sec)

mysql>

"union与union all的区别:union会去掉相同的记录"

mysql> select * from employee e right join department d on e.dep_id=d.id union all select * from employee e left joinn department d on e.dep_id=d.id;

+------+------------+--------+------+--------+------+--------------+

| id | name | sex | age | dep_id | id | name |

+------+------------+--------+------+--------+------+--------------+

| 1 | egon | male | 18 | 200 | 200 | 技术 |

| 2 | alex | female | 48 | 201 | 201 | 人力资源 |

| 3 | wupeiqi | male | 38 | 201 | 201 | 人力资源 |

| 4 | yuanhao | female | 28 | 202 | 202 | 销售 |

| 5 | liwenzhou | male | 18 | 200 | 200 | 技术 |

| NULL | NULL | NULL | NULL | NULL | 203 | 运营 |

| 1 | egon | male | 18 | 200 | 200 | 技术 |

| 5 | liwenzhou | male | 18 | 200 | 200 | 技术 |

| 2 | alex | female | 48 | 201 | 201 | 人力资源 |

| 3 | wupeiqi | male | 38 | 201 | 201 | 人力资源 |

| 4 | yuanhao | female | 28 | 202 | 202 | 销售 |

| 6 | jingliyang | female | 18 | 204 | NULL | NULL |

+------+------------+--------+------+--------+------+--------------+

12 rows in set (0.00 sec)

mysql>

1.2.7符合条件的连接查询

"#示例1:以内连接的方式查询employee和department表,并且employee表中的age字段值必须大于25,即找出年龄大于25岁的员工以及员工所在的部门"

mysql> select * from employee e right join department d on e.dep_id=d.id where age>25;

+------+---------+--------+------+--------+------+--------------+

| id | name | sex | age | dep_id | id | name |

+------+---------+--------+------+--------+------+--------------+

| 2 | alex | female | 48 | 201 | 201 | 人力资源 |

| 3 | wupeiqi | male | 38 | 201 | 201 | 人力资源 |

| 4 | yuanhao | female | 28 | 202 | 202 | 销售 |

+------+---------+--------+------+--------+------+--------------+

3 rows in set (0.00 sec)

mysql>

"示例2:以内连接的方式查询employee和department表,并且以age字段的升序方式显示"

mysql> select * from employee e right join department d on e.dep_id=d.id where age>25 order by age desc;

+------+---------+--------+------+--------+------+--------------+

| id | name | sex | age | dep_id | id | name |

+------+---------+--------+------+--------+------+--------------+

| 2 | alex | female | 48 | 201 | 201 | 人力资源 |

| 3 | wupeiqi | male | 38 | 201 | 201 | 人力资源 |

| 4 | yuanhao | female | 28 | 202 | 202 | 销售 |

+------+---------+--------+------+--------+------+--------------+

3 rows in set (0.00 sec)

mysql>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值