详细聊聊关于Mysql联合查询的那些事儿
目录
- 联合查询之union
- 1. 查询中国各省的ID以及省份名称
- 2. 湖南省所有地级市ID、名字
- 3. 用union将他们合并
- 联合查询之union all
- 联合查询之inner join
- 1. 查询湖北省有多少地级市
- 2. 统计各省地级市的数量,输出省名、地级市数量
- 3. 查询拥有20个以上区县的城市,输出城市名,区县数量
- 联合查询之三表联合
- 1. 区县最多的3个城市是哪个省的哪个市,查询结果包括省名,市名,区县数量
- 联合查询之left join&right join
- 查询所有省份和它的城市信息
- 查询所有省份和它的城市信息和没有城市的省份信息
- 查询所有省份和它的城市信息和没有省份的城市信息
- 总结
联合查询之union
union可以合并两个以上 select语句查询出来的表,并消除表中的重复行。
其中,select语句需要拥有相同数量和相同数据类型的列。
1. 查询中国各省的ID以及省份名称
?1 | select ProID,ProName from T_Province |
2. 湖南省所有地级市ID、名字
?1 2 3 4 | select CityID,CityName from T_City where ProID = ( select ProID from T_Province where ProName= "湖南省" ); |
3. 用union将他们合并
?1 2 3 4 5 6 | select ProID,ProName from T_Province union select CityID,CityName from T_City where ProID = ( select ProID from T_Province where ProName= "湖南省" ); |
这样就得到两个查询结果的并集了。
UNION 合并后的集合中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。
联合查询之union all
?1 2 3 4 5 6 | select ProID,ProName from T_Province union all select CityID,CityName from T_City where ProID = ( select ProID from T_Province where ProName= "湖南省" ); |
当使用union all,不会消除重复行。
联合查询之inner join
1. 查询湖北省有多少地级市
不用联合查询:
?1 2 | select count (CityID) from T_City where ProID = ( select ProID from T_Province where ProName= "湖北省" ) |
通过ProID将两张表连接在一起
?1 2 3 4 5 | select ProName,CityName from ( T_City join T_Province on T_City.ProID = T_Province.ProID ) where ProName= "湖北省" |
2. 统计各省地级市的数量,输出省名、地级市数量
?1 2 3 4 5 6 | select T_City.ProID,ProName, count (CityID) as cc from ( T_City join T_Province on T_City.ProID = T_Province.ProID ) group by T_City.ProID order by cc desc ; |
什么的select语句中要输出的ProID应该是T_City和T_Province中的一个,不然就会报错。
两个表之间需要有共同的(列名不一定相同)“语言”才能join。
可以给表起个别名,将T_City表的别名设为tc,将T_Province的别名设为tp。
?1 2 3 4 5 6 | select tc.ProID,ProName, count (CityID) as cc from ( T_City tc join T_Province tp on T_City.ProID = T_Province.ProID ) group by tc.ProID order by cc desc ; |
3. 查询拥有20个以上区县的城市,输出城市名,区县数量
?1 2 3 4 5 6 | select CityName, count (DisName) disCount from ( T_City tc join T_District td on tc.CityID = td.CityID ) group by CityName having disCount > 20; |
联合查询之三表联合
1. 区县最多的3个城市是哪个省的哪个市,查询结果包括省名,市名,区县数量
?1 2 3 4 5 6 7 8 9 | select tp.ProName,tcd.CityName,tcd.ci from ( select ProID,CityName, count (ID) ci from (T_City tc join T_District td on tc.CityID = td.CityID) group by tc.CityID order by ci desc limit 3 )tcd join T_Province tp on tcd.ProID = tp.ProID; |
联合查询之left join&right join
内连接是基于左右两表公共的部分
左连接是基于左右两表公共的部分加上左表特有的部分
右连接是基于左右两表公共的部分加上右表特有的部分
查询所有省份和它的城市信息
?1 2 3 4 | select * from ( T_Province tp join T_City tc on tp.ProID = tc.ProID ); |
查询所有省份和它的城市信息和没有城市的省份信息
?1 2 3 4 | select * from ( T_Province tp left join T_City tc on tp.ProID = tc.ProID ); |
查询所有省份和它的城市信息和没有省份的城市信息
?1 2 3 4 | select * from ( T_Province tp right join T_City tc on tp.ProID = tc.ProID ); |
总结
到此这篇关于Mysql联合查询的文章就介绍到这了,更多相关Mysql联合查询内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://juejin.cn/post/7017412409203621902
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。