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 m1UNIONselect id from m2order by id desc;# 对union结果排序****************************(select id from m1 order by id desc limit 9999)UNION(select id from m2 order by id desc limit 9999); # 对每个select进行排序

接下来就是多表连接查询:关键字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 我们将第一时间删除。

相关素材