MySQL速通——(七)连接查询

一、聚合函数查询

count()对除“ * ”以外的任何参数,返回所选择集合中非null值的行数,对于“ * ”,则返回全部行的数量
sum()求某个数值型字段的和
avg()求某个数值型字段的平均值
min()求最小值
max()最大值

具体语法都为: select 聚合函数(字段名) from 表名;

二、内连接查询

内连接要求构成连接的每个表都有共同的列匹配,不匹配的行将被排除。内连接包括相等连接和自然连接。具体语法如下:

select 列名1 ,列名2,列名3,……  from 表1,表2 where 连接条件;

连接条件可以是两个表的列中的相同数值。

三、外连接

外连接包括左外连接(left join)、右外连接(right join)和全外连接,是指使用 outer join 关键字将两个表连接起来。外连接生成的结果集不仅包含符合连接条件的行数据,还包括左表、右表或者两边连接表中所有的数据行。具体语法如下:

select 字段名 from 表1 left | right join 表2 on 表1.字段名1=表2.字段名2;

1.左外连接(left join)

是指将左表中的所有数据分别与右表中的每条数据进行连接组合,返回的结果除内连接的数据外,还包括左表中不符合条件的数据,并且在右表的相应位置添加null值。

2.右连接(right join)

指将右表中的所有数据分别与左表中的每条数据进行连接组合,返回的结果除内连接的数据外,还包括右表中不符合条件的数据,并且在左表的相应位置添加null值。

左连接和右连接其实都是一个意思,只是表的位置不同结果不同而已,下面通过力扣上的一个例子来说明:

表: Person

+-------------+---------+
| 列名         | 类型     |
+-------------+---------+
| PersonId    | int     |
| FirstName   | varchar |
| LastName    | varchar |
+-------------+---------+
personId 是该表的主键(具有唯一值的列)。
该表包含一些人的 ID 和他们的姓和名的信息。

表: Address

+-------------+---------+
| 列名         | 类型    |
+-------------+---------+
| AddressId   | int     |
| PersonId    | int     |
| City        | varchar |
| State       | varchar |
+-------------+---------+
addressId 是该表的主键(具有唯一值的列)。
该表的每一行都包含一个 ID = PersonId 的人的城市和州的信息

编写解决方案,报告 Person 表中每个人的姓、名、城市和州。如果 personId 的地址不在 Address 表中,则报告为 null 。

这道题主要就是考查表的连接,所以使用左连接或者右连接即可。

select FirstName,LastName,City,State 
from Address right join Person on Person.PersonId=Address.PersonId
person表                                 
| personId | lastName | firstName |   
| -------- | -------- | --------- |   
| 1        | Wang     | Allen     |    
| 2        | Alice    | Bob       |      

address表
| addressId | personId | city          | state      |
| --------- | -------- | ------------- | ---------- |
| 1         | 2        | New York City | New York   |
| 2         | 3        | Leetcode      | California |

最终结果如图所示:

最后引用一下力扣上有位大佬的总结,个人觉得非常清晰明了:

四、子查询

MySQL可以嵌套多个查询,类似于嵌套循环,在外面一层的查询中使用内层查询产生的结果集,这样就不是执行两个单独的查询。当遇到多层查询时,MySQL会从最内层开始查询,然后逐步向外查询,在这期间每个查询产生的结果集都会传递给它的父查询,然后父查询又继续这一步。

子查询和select查询的执行方式一样,子查询可以用在任何可以使用表达式的地方,它必须由父查询包围,并且它必须包含一个from子句。

1.带in关键字和带比较运算符的子查询

当子查询返回的结果列只包括一个值时,使用比较运算符;当返回的结果集是多个值时,就必须用in关键字。具体格式为:

select  * from 表名 where 条件 in (子查询语句);

2.带exists关键字的子查询

使用exists关键字时,内层查询语句不再返回查询的记录,而是返回true 或者false。比如内层查询到了满足条件的记录时,就返回true,反之就是false。只有为true时,外层查询才会进行查询;为false时外层查询将不进行查询或者查询不出任何记录。(not exists 则相反)

当exists关键字与其他查询条件一起使用时,需要使用and或者or来连接。

3.带any关键字和带all关键字的子查询

any关键字表示满足其中任意一个条件,就可以通过该条件来执行外层查询语句;all关键字表示满足所有条件才执行外层查询语句。一般与比较运算符一起使用。具体语法如下:

列名  比较运算符 any(或all) (子查询);

五、合并查询记录

合并查询结果就是将多个select语句的查询结果合并到一起显示。一般使用union 和 union all关键字。union关键字是合并,去除相同记录;而union all只是合并。具体语法如下:

select 列名 from 表名

union(或者 union all)

select 列名 from 表名;

六、定义表和字段的别名

在查询时,为了让表和字段的名称使用起来更加方便,可以设置别名来代替原本名称进行查询使用,具体语法如下:

列名 [as] 别名

例如:select bookid [as] id  from  testtable1 [as] t1 ;

  • 13
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值