一、聚合函数查询
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 ;