mysql多表查询语句
发布于 2021-10-11 10:47
本篇文章主要讲解多表联合查询、多表连接查询以及子查询。因为在实际开发中多表查询是经常遇到的,也是编写sql的一个难点,所以多表查询是必须掌握的。其实单一的多表查询是比较简单的,困难的sql编写一般会是多表查询结合其他的一些关键字甚至函数。想要掌握好,除了了解关键字的用法,数据的存储位置,就是多练习了。为方便举例,用t_user和t_role这张表来举例,t_user字段及数据如下:
t_role表数据如下:
下面我们先来看看联合查询(使用较少)。
关键字union,是指将多个查询结果合并成一个结果显示。
语法:
select 查询 union 查询选项(all/ distinct(默认)) select 查询 ...;
注意:
查询语句的字段数量必须一致;
结果字段显示采用第一个查询语句的字段;
这里查询t_user的id和username字段以及t_role的id和name字段:
(查询结果数据没有截图完整)
联合查询排序:
order by 本身是对内存中的结果进行排序,union优先级高于order by ,所以默认order by是对union结果进行排序。
如果要单独对每个select进行排序:
1.将要排序的select用括号括起来
2.必须配合limit使用(数量够大就行)
select id from m1
UNION
select id from m2
order by id desc;
****************************
(select id from m1 order by id desc limit 9999)
UNION
(select id from m2 order by id desc limit 9999);
接下来就是多表连接查询:关键字join,将两张表依据某个条件进行数据拼接。就是通过字段拼接,将两张表的记录变成 一条记录,字段数量增加。效率比单表查询低。下面就来看看它的几种用法:
1.交叉连接
cross join,不需要连接条件的连接。其结果就是笛卡尔积;
没有实际数据价值,只是丰富了连接查询的完整性;我们要避免出现这种sql。
2.内连接
inner join,将两张表根据指定的条件连接起来,严格连接。就是将一张表中的数据与另一张表中的数据根据条件匹配:配皮成功:保留连接的数据;不成功:都不保留。
语法:左表 inner join 右表 on 连接条件
这里我们就来查询id都为1的数据:
3.外连接
outer join,是一种不严格的连接。分两种,有主表之分:
左连接:left join ,左表为主表
右连接:right join ,右表为主表
就是用主表的记录去匹配从表的记录:成功保留;不成功,也保留,只是从表数据设为null。
这就是与内连接的区别,即在数据匹配失败时,外连接始终都会保留一条记录,只是从表设为null。
值得注意的是,不论是左连接还是右连接,字段显示顺序不受影响,都是先显示左表的。
这里先以t_user为主表:
以t_role为主表:
4.自然连接(使用较少)
natural join,是一种自动寻找连接条件的连接查询。
包含自然内连接和自然外连接:
自然内连接:natural join
自然外连接:natural left/right join
条件匹配模式:
自动寻找相同字段名作为连接条件。
会将同名字段合并为一个字段。
select * from m2 natural left join m1 ;
5.using
连接查询时如果是同名字段作为连接条件,using可以代替on出现(比on更好)。
针对同名字段;
会自动合并对应字段为一个;
可以同时使用多个字段作为条件。
select * from m2 left join m1 using(id,sfz) ;
select * from m2 left join m1 using(sfz) ;
以上的多表连接,其实用得最多的就是外连接。下面所讲解的子查询也是比较重要的。
sub query,通过select查询结果当做另一个select的查询条件或者数据源。比外连接查询效率低。
1.子查询分类
2.标量子查询:
select id,name from m1 where id = (select id from m2 where sfz=456);
3.列子查询:
select id,name from m1 where id in(select id from m2 );
4.行子查询:
select id,name from m1 where (sex,age) =(select sex,age from m1 where name ='张三' );
5.exists子查询:
代入查询,将主表的每一行代入到子表(子查询)中进行校验。返回结果是布尔类型(true/false)而不是数据;
select m2.id,sfz from m2 where exists(select * from m1 where m2.id=m1.id and sex='男');
以上就是多表查询的全部内容,选择使用那种查询方式,需要结合相关业务来判断。这种sql只有多加练习,才会有感觉。至于sql的效率问题,优化问题,会在后面阶段在说明。
本文来自网络或网友投稿,如有侵犯您的权益,请发邮件至:aisoutu@outlook.com 我们将第一时间删除。
相关素材