共计 2923 个字符,预计需要花费 8 分钟才能阅读完成。
MySQL 之多表查询
创建表
# 创建表
create table department(id int,name varchar(20));
create table employee1(
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 employee1(name,sex,age,dep_id) values('egon','male',18,200),('alex','female',48,201),('tom','male',38,201),('yuanhao','female',28,202),('lidawei','male',18,200),('jinkezhou','female',18,204);
# 查看表
mysql> select * from employee1;
+----+-----------+--------+------+--------+
| id | name | sex | age | dep_id |
+----+-----------+--------+------+--------+
| 1 | egon | male | 18 | 200 |
| 2 | alex | female | 48 | 201 |
| 3 | tom | male | 38 | 201 |
| 4 | yuanhao | female | 28 | 202 |
| 5 | lidawei | male | 18 | 200 |
| 6 | jinkezhou | female | 18 | 204 |
+----+-----------+--------+------+--------+
6 rows in set (0.00 sec)
mysql> select * from department;
+------+--------------+
| id | name |
+------+--------------+
| 200 | 技术 |
| 201 | 人力资源 |
| 202 | 销售 |
| 203 | 运营 |
+------+--------------+
4 rows in set (0.00 sec)
多表连接查询
交叉连接
交叉连接:不适用任何匹配条件。生成笛卡尔积
mysql> select * from employee1 ,department;
内连接
内连接:找两张表共有的部分,相当于利用条件从笛卡尔积结果中筛选出了正确的结果。(只连接匹配的行)
# 找两张表共有的部分,相当于利用条件从笛卡尔积结果中筛选出了正确的结果
#department 没有 204 这个部门,因而 employee 表中关于 204 这条员工信息没有匹配出来
mysql> select * from employee1,department where employee1.dep_id=department.id;
#上面用 where 表示的可以用下面的内连接表示,建议使用下面的那种方法
mysql> select * from employee1 inner join department on employee1.dep_id=department.id;
# 也可以这样表示哈
mysql> select employee1.id,employee1.name,employee1.age,employee1.sex,department.name from employee1,department where employee1.dep_id=department.id;
左连接 left
优先显示左表全部记录。
#左链接:在按照 on 的条件取到两张表共同部分的基础上,保留左表的记录
mysql> select * from employee1 left join department on department.id=employee1.dep_id;
mysql> select * from department left join employee1 on department.id=employee1.dep_id;
右连接 right
优先显示右表全部记录。
#右链接:在按照 on 的条件取到两张表共同部分的基础上,保留右表的记录
mysql> select * from employee1 right join department on department.id=employee1.dep_id;
mysql> select * from department right join employee1 on department.id=employee1.dep_id;
全部连接 join
mysql> select * from department full join employee1;
符合条件多表查询
示例 1:以内连接的方式查询 employee 和 department 表,并且 employee 表中的 age 字段值必须大于 25,
即找出公司所有部门中年龄大于 25 岁的员工
mysql> select * from employee1 inner join department on employee1.dep_id=department.id and age>25;
示例 2:以内连接的方式查询 employee 和 department 表,并且以 age 字段的升序方式显示
mysql> select * from employee1 inner join department on employee1.dep_id=department.id and age>25 and age>25 order by age asc;
子查询
#1:子查询是将一个查询语句嵌套在另一个查询语句中。
#2:内层查询语句的查询结果,可以为外层查询语句提供查询条件。
#3:子查询中可以包含:IN、NOT IN、ANY、ALL、EXISTS 和 NOT EXISTS 等关键字
#4:还可以包含比较运算符:=、!=、>、< 等
示例:
# 查询平均年龄在 25 岁以上的部门名
mysql> select name from department where id in (select dep_id from employee1 group by dep_id having avg(age) > 25 );
# 查看技术部员工姓名
mysql> select name from employee1 where dep_id = (select id from department where name='技术');
# 查看小于 2 人的部门名
mysql> select name from department where id in (select dep_id from employee1 group by dep_id having count(id) < 2) union select name from department where id not in (select distinct dep_id from employee1);
# 提取空部门 #有人的部门
mysql> select * from department where id not in (select distinct dep_id from employee1);
正文完
星哥玩云-微信公众号