多表联合查询
- 内连接
- 左链接
- 右链接
- 子查询
1在多表链接中只有一个主表其他的都是子表
1内链接
- where 链接条件 (这是一个隐性内连接)
- inner join on
准备数据
1准备dog表
create table dog(
id int(11)primary key auto_increment,
dogname varchar(20) not null default "旺财",
dogsex enum("1","0") default 1,
dogmasterid int(11)
);
2 准备dogmaster表
create table dogmaster(
uid int(11) primary key,
mname varchar(20) not null,
salary int(9) unsigned default 1500,
jobnum int(4) unsigned not null,
Depid int(4) unsigned not null
)
3 准备公司表
create table com(
cjobnum int(4) unsigned not null,
cdepid int(4) unsigned not null,
cdepname varchar(16) not null,
bonus int(8) unsigned
) engine = innodb charset = utf8mb4
1.1构建dog表数据
insert into dog(dogname,dogsex,dogmasterid) values("灰灰","1",100167),("小黑","0",100168),("小紫","0",100169),("云安","1",100169),("于山","0",100670),("开饭","0",20081),("米啾","1",20081),("葡萄","0",20081);
+----+---------+--------+-------------+
| id | dogname | dogsex | dogmasterid |
+----+---------+--------+-------------+
| 1 | 灰灰 | 1 | 100167 |
| 2 | 小黑 | 0 | 100168 |
| 3 | 小紫 | 0 | 100169 |
| 4 | 云安 | 1 | 100169 |
| 5 | 于山 | 0 | 100670 |
| 6 | 开饭 | 0 | 20081 |
| 7 | 米啾 | 1 | 20081 |
| 8 | 葡萄 | 0 | 20081 |
+----+---------+--------+-------------+
1.2构建dogmaster表数据
insert into dogmaster VALUEs
(100167,"赵敏",4700,1379,10),
(100168,"河东君",3725,1380,20),
(100169,"徐霞客",3000,1381,30),
(100670,"云雾",3000,1382,20),
(20081,"鱼幼薇",7000,1383,20)
+--------+--------+--------+--------+-------+
| uid | mname | salary | jobnum | Depid |
+--------+--------+--------+--------+-------+
| 20081 | 鱼幼薇 | 7000 | 1383 | 20 |
| 100167 | 赵敏 | 4700 | 1379 | 10 |
| 100168 | 河东君 | 3725 | 1380 | 20 |
| 100169 | 徐霞客 | 3000 | 1381 | 30 |
| 100670 | 云雾 | 3000 | 1382 | 20 |
+--------+--------+--------+--------+-------+
1.3构建公司表数据
INSERT into com VALUES
(1379,10,"金庸部门",3333),
(1380,20,"秦淮八绝",6578),
(1381,30,"自由摸鱼人",75),
(1382,20,"秦淮八绝",7755),
(1383,20,"秦淮八绝",9735)
+---------+--------+------------+-------+
| cjobnum | cdepid | cdepname | bonus |
+---------+--------+------------+-------+
| 1379 | 10 | 金庸部门 | 3333 |
| 1380 | 20 | 秦淮八绝 | 6578 |
| 1381 | 30 | 自由摸鱼人 | 75 |
| 1382 | 20 | 秦淮八绝 | 7755 |
| 1383 | 20 | 秦淮八绝 | 9735 |
+---------+--------+------------+-------+
可以直接复制
1.1where连接
- 语法是 表1,表2。。。。表n where 连接条件
- 那张表在前面取决你的from 的表顺序
1 dog 和dogmaster链接
select * from dog,dogmaster where dog.dogmasterid = dogmaster.uid;
+----+---------+--------+-------------+--------+--------+--------+--------+-------+
| id | dogname | dogsex | dogmasterid | uid | mname | salary | jobnum | Depid |
+----+---------+--------+-------------+--------+--------+--------+--------+-------+
| 1 | 灰灰 | 1 | 100167 | 100167 | 赵敏 | 4700 | 1379 | 10 |
| 2 | 小黑 | 0 | 100168 | 100168 | 河东君 | 3725 | 1380 | 20 |
| 3 | 小紫 | 0 | 100169 | 100169 | 徐霞客 | 3000 | 1381 | 30 |
| 4 | 云安 | 1 | 100169 | 100169 | 徐霞客 | 3000 | 1381 | 30 |
| 5 | 于山 | 0 | 100670 | 100670 | 云雾 | 3000 | 1382 | 20 |
| 6 | 开饭 | 0 | 20081 | 20081 | 鱼幼薇 | 7000 | 1383 | 20 |
| 7 | 米啾 | 1 | 20081 | 20081 | 鱼幼薇 | 7000 | 1383 | 20 |
| 8 | 葡萄 | 0 | 20081 | 20081 | 鱼幼薇 | 7000 | 1383 | 20 |
+----+---------+--------+-------------+--------+--------+--------+--------+-------+
2 三张表一起链接
首先我们来理一下想要的效过 我想要
公司表——》狗主人表——》狗表
那么from 后面顺序就应该是和上面的结果一样
select * from com,dogmaster as dm,dog where com.cjobnum = dm.jobnum and dm.uid = dog.dogmasterid;
结果为 如果不喜欢重复字段可以自己加筛选条件过滤结果集
+---------+--------+------------+-------+--------+--------+--------+--------+-------+----+---------+--------+-------------+
| cjobnum | cdepid | cdepname | bonus | uid | mname | salary | jobnum | Depid | id | dogname | dogsex | dogmasterid |
+---------+--------+------------+-------+--------+--------+--------+--------+-------+----+---------+--------+-------------+
| 1379 | 10 | 金庸部门 | 3333 | 100167 | 赵敏 | 4700 | 1379 | 10 | 1 | 灰灰 | 1 | 100167 |
| 1380 | 20 | 秦淮八绝 | 6578 | 100168 | 河东君 | 3725 | 1380 | 20 | 2 | 小黑 | 0 | 100168 |
| 1381 | 30 | 自由摸鱼人 | 75 | 100169 | 徐霞客 | 3000 | 1381 | 30 | 3 | 小紫 | 0 | 100169 |
| 1381 | 30 | 自由摸鱼人 | 75 | 100169 | 徐霞客 | 3000 | 1381 | 30 | 4 | 云安 | 1 | 100169 |
| 1382 | 20 | 秦淮八绝 | 7755 | 100670 | 云雾 | 3000 | 1382 | 20 | 5 | 于山 | 0 | 100670 |
| 1383 | 20 | 秦淮八绝 | 9735 | 20081 | 鱼幼薇 | 7000 | 1383 | 20 | 6 | 开饭 | 0 | 20081 |
| 1383 | 20 | 秦淮八绝 | 9735 | 20081 | 鱼幼薇 | 7000 | 1383 | 20 | 7 | 米啾 | 1 | 20081 |
| 1383 | 20 | 秦淮八绝 | 9735 | 20081 | 鱼幼薇 | 7000 | 1383 | 20 | 8 | 葡萄 | 0 | 20081 |
+---------+--------+------------+-------+--------+--------+--------+--------+-------+----+---------+--------+-------------+
3我不想要这么多字段,我只想要每个员工养狗狗的只数
select cjobnum,mname 员工名,count(dogname) 狗的只数 from com,dogmaster as dm,dog where com.cjobnum = dm.jobnum and dm.uid = dog.dogmasterid group by cjobnum;
+---------+--------+----------+
| cjobnum | 员工名 | 狗的只数 |
+---------+--------+----------+
| 1379 | 赵敏 | 1 |
| 1380 | 河东君 | 1 |
| 1381 | 徐霞客 | 2 |
| 1382 | 云雾 | 1 |
| 1383 | 鱼幼薇 | 3 |
+---------+--------+----------+
还想筛选自己晒辣不会在问我辣。
1.2inner join on连接
- 语法是 from 表1 inner join 表2 on 条件[inner join 表3 on 条件]
- 所有这玩意感觉都一样。就是以哪个表为主
1 dog 和dogmaster链接
select * from dog inner join dogmaster as dm on dog.dogmasterid = dm.uid;
结果和上面相同 喜欢用哪个就用哪个
+----+---------+--------+-------------+--------+--------+--------+--------+-------+
| id | dogname | dogsex | dogmasterid | uid | mname | salary | jobnum | Depid |
+----+---------+--------+-------------+--------+--------+--------+--------+-------+
| 1 | 灰灰 | 1 | 100167 | 100167 | 赵敏 | 4700 | 1379 | 10 |
| 2 | 小黑 | 0 | 100168 | 100168 | 河东君 | 3725 | 1380 | 20 |
| 3 | 小紫 | 0 | 100169 | 100169 | 徐霞客 | 3000 | 1381 | 30 |
| 4 | 云安 | 1 | 100169 | 100169 | 徐霞客 | 3000 | 1381 | 30 |
| 5 | 于山 | 0 | 100670 | 100670 | 云雾 | 3000 | 1382 | 20 |
| 6 | 开饭 | 0 | 20081 | 20081 | 鱼幼薇 | 7000 | 1383 | 20 |
| 7 | 米啾 | 1 | 20081 | 20081 | 鱼幼薇 | 7000 | 1383 | 20 |
| 8 | 葡萄 | 0 | 20081 | 20081 | 鱼幼薇 | 7000 | 1383 | 20 |
+----+---------+--------+-------------+--------+--------+--------+--------+-------+
2 三张表一起链接
select * from com inner join dogmaster as dm on com.cjobnum = dm.jobnum inner join dog on dog.dogmasterid = dm.uid;
+---------+--------+------------+-------+--------+--------+--------+--------+-------+----+---------+--------+-------------+
| cjobnum | cdepid | cdepname | bonus | uid | mname | salary | jobnum | Depid | id | dogname | dogsex | dogmasterid |
+---------+--------+------------+-------+--------+--------+--------+--------+-------+----+---------+--------+-------------+
| 1379 | 10 | 金庸部门 | 3333 | 100167 | 赵敏 | 4700 | 1379 | 10 | 1 | 灰灰 | 1 | 100167 |
| 1380 | 20 | 秦淮八绝 | 6578 | 100168 | 河东君 | 3725 | 1380 | 20 | 2 | 小黑 | 0 | 100168 |
| 1381 | 30 | 自由摸鱼人 | 75 | 100169 | 徐霞客 | 3000 | 1381 | 30 | 3 | 小紫 | 0 | 100169 |
| 1381 | 30 | 自由摸鱼人 | 75 | 100169 | 徐霞客 | 3000 | 1381 | 30 | 4 | 云安 | 1 | 100169 |
| 1382 | 20 | 秦淮八绝 | 7755 | 100670 | 云雾 | 3000 | 1382 | 20 | 5 | 于山 | 0 | 100670 |
| 1383 | 20 | 秦淮八绝 | 9735 | 20081 | 鱼幼薇 | 7000 | 1383 | 20 | 6 | 开饭 | 0 | 20081 |
| 1383 | 20 | 秦淮八绝 | 9735 | 20081 | 鱼幼薇 | 7000 | 1383 | 20 | 7 | 米啾 | 1 | 20081 |
| 1383 | 20 | 秦淮八绝 | 9735 | 20081 | 鱼幼薇 | 7000 | 1383 | 20 | 8 | 葡萄 | 0 | 20081 |
+---------+--------+------------+-------+--------+--------+--------+--------+-------+----+---------+--------+-------------+
#和上面一样 筛选自己写啊我十几岁我好累
2左右连接
- 左连接 主表 left join 子表 on 连接条件
- 右连接 主表 left join 子表 on 连接条件
select * 的时候主表的数据项全部显示 如果子表没有该数据则会自动添加一个万用链接补齐该项(null)
新增一条数据以查看结果
insert into dog(dogname,dogmasterid) value("蓝狗",7563)
1左连接 即以主表为主
select * from dog left join dogmaster on dog.dogmasterid = dogmaster.uid;
因为蓝狗的主人id右表没有所以自动添加一个万用链接
结果如下
+----+---------+--------+-------------+--------+--------+--------+--------+-------+
| id | dogname | dogsex | dogmasterid | uid | mname | salary | jobnum | Depid |
+----+---------+--------+-------------+--------+--------+--------+--------+-------+
| 6 | 开饭 | 0 | 20081 | 20081 | 鱼幼薇 | 7000 | 1383 | 20 |
| 7 | 米啾 | 1 | 20081 | 20081 | 鱼幼薇 | 7000 | 1383 | 20 |
| 8 | 葡萄 | 0 | 20081 | 20081 | 鱼幼薇 | 7000 | 1383 | 20 |
| 1 | 灰灰 | 1 | 100167 | 100167 | 赵敏 | 4700 | 1379 | 10 |
| 2 | 小黑 | 0 | 100168 | 100168 | 河东君 | 3725 | 1380 | 20 |
| 3 | 小紫 | 0 | 100169 | 100169 | 徐霞客 | 3000 | 1381 | 30 |
| 4 | 云安 | 1 | 100169 | 100169 | 徐霞客 | 3000 | 1381 | 30 |
| 5 | 于山 | 0 | 100670 | 100670 | 云雾 | 3000 | 1382 | 20 |
| 9 | 蓝狗 | 1 | 7563 | NULL | NULL | NULL | NULL | NULL |
+----+---------+--------+-------------+--------+--------+--------+--------+-------+
2 以右表为主连接
因为右边的主表不包含那一项,所以就算你左边有也不显示
select * from dog right join dogmaster on dog.dogmasterid = dogmaster.uid;
+------+---------+--------+-------------+--------+--------+--------+--------+-------+
| id | dogname | dogsex | dogmasterid | uid | mname | salary | jobnum | Depid |
+------+---------+--------+-------------+--------+--------+--------+--------+-------+
| 1 | 灰灰 | 1 | 100167 | 100167 | 赵敏 | 4700 | 1379 | 10 |
| 2 | 小黑 | 0 | 100168 | 100168 | 河东君 | 3725 | 1380 | 20 |
| 3 | 小紫 | 0 | 100169 | 100169 | 徐霞客 | 3000 | 1381 | 30 |
| 4 | 云安 | 1 | 100169 | 100169 | 徐霞客 | 3000 | 1381 | 30 |
| 5 | 于山 | 0 | 100670 | 100670 | 云雾 | 3000 | 1382 | 20 |
| 6 | 开饭 | 0 | 20081 | 20081 | 鱼幼薇 | 7000 | 1383 | 20 |
| 7 | 米啾 | 1 | 20081 | 20081 | 鱼幼薇 | 7000 | 1383 | 20 |
| 8 | 葡萄 | 0 | 20081 | 20081 | 鱼幼薇 | 7000 | 1383 | 20 |
+------+---------+--------+-------------+--------+--------+--------+--------+-------+
3子查询
- any 大于子查询结果中某个结果的值
- all 大于子查询结果中的所有值
- union 并集 可以去重完全啊不一样的
- union all 把表中数据都罗列出来
- union和union all 用在两个select 语句之间
select * from dog where id> all (select id from dog where dogname in ("灰灰","米啾","于山","开饭"));
结果如下
+----+---------+--------+-------------+
| id | dogname | dogsex | dogmasterid |
+----+---------+--------+-------------+
| 8 | 葡萄 | 0 | 20081 |
| 9 | 蓝狗 | 1 | 7563 |
+----+---------+--------+-------------+
SELECT dog.dogmasterid,dog.dogname FROM dog UNION all SELECT mname,uid from dogmaster;
+-------------+---------+
| dogmasterid | dogname |
+-------------+---------+
| 100167 | 灰灰 |
| 100168 | 小黑 |
| 100169 | 小紫 |
| 100169 | 云安 |
| 100670 | 于山 |
| 20081 | 开饭 |
| 20081 | 米啾 |
| 20081 | 葡萄 |
| 7563 | 蓝狗 |
| 鱼幼薇 | 20081 |
| 赵敏 | 100167 |
| 河东君 | 100168 |
| 徐霞客 | 100169 |
| 云雾 | 100670 |
+-------------+---------+