欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

详细聊聊关于Mysql联合查询的那些事儿

程序员文章站 2022-03-20 13:49:44
目录联合查询之union1. 查询中国各省的id以及省份名称2. 湖南省所有地级市id、名字3. 用union将他们合并联合查询之union all联合查询之inner join1. 查询湖北省有多少...

联合查询之union

union可以合并两个以上 select语句查询出来的表,并消除表中的重复行。

其中,select语句需要拥有相同数量和相同数据类型的列。

1. 查询中国各省的id以及省份名称

select proid,proname from t_province

2. 湖南省所有地级市id、名字

select cityid,cityname from t_city
where proid = (
    select proid from t_province where proname="湖南省"
);

3. 用union将他们合并

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

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. 查询湖北省有多少地级市

不用联合查询:

select count(cityid) from t_city
where proid = (select proid from t_province where proname="湖北省")

通过proid将两张表连接在一起

select proname,cityname from(
    t_city join t_province
    on t_city.proid = t_province.proid
)
where proname="湖北省"

2. 统计各省地级市的数量,输出省名、地级市数量

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。

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个以上区县的城市,输出城市名,区县数量

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个城市是哪个省的哪个市,查询结果包括省名,市名,区县数量

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

内连接是基于左右两表公共的部分

左连接是基于左右两表公共的部分加上左表特有的部分

右连接是基于左右两表公共的部分加上右表特有的部分

查询所有省份和它的城市信息

select * from(
t_province tp join t_city tc
on tp.proid = tc.proid
);

查询所有省份和它的城市信息和没有城市的省份信息

select * from(
t_province tp left join t_city tc
on tp.proid = tc.proid
);

查询所有省份和它的城市信息和没有省份的城市信息

select * from(
t_province tp right join t_city tc
on tp.proid = tc.proid
);

总结

到此这篇关于mysql联合查询的文章就介绍到这了,更多相关mysql联合查询内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!