一、交叉连接
标准语法:select * from 表1 cross join 表2 where 表1.公共列 = 表2.公共列;
简单语法:select * from 表1 , 表2 where 表1.公共列 = 表2.公共列;
公共列:两张表具有相同含义的列,不是列名一样。
二、内连接
语法:select * from 表1 inner join 表2 on 表1.公共列 = 表2.公共列;
on子句:用来设置内连接的连接条件,进行数据的过滤的。
说明:inner关键字可以省略。
注意:
①内连接和交叉连接查询的结果是等价的;
②对于内连接和交叉连接推荐使用内连接,因为内连接的查询效率高(即查询速度快)。
三、外连接
外链接分为左外连接(简称左连接)和右外连接(简称右连接)。
1、左外连接(左连接)
语法:select * from 表1 left join 表2 on 表1.公共列 = 表2.公共列;
左连接的查询结果:以左表为主表,查询到两张表交集的部分,并且会把左表独有的数据也查询出来。
- 左表:指的是写在left join左边的表就是左表;
- 右表:指的是写在left join右边的表就是右表。
2、右外连接(右连接)
语法:select * from 表1 right join 表2 on 表1.公共列 = 表2.公共列;
右连接的查询结果:以右表为主表,查询到两张表交集的部分,并且会把右表独有的数据也查询出来。
- 左表:指的是写在right join左边的表就是左表;
- 右表:指的是写在right join右边的表就是右表。
3、左连接和右连接有什么区别?
①查询结果不同
- 左连接查询的是两张表交集的数据以及左表独有的数据。
- 右连接查询的是两张表交集的数据以及右表独有的数据。
②语法不同
③如果把两个语法中的表的位置互换一下,两者查询的结果就是一样的。
四、嵌套查询(子查询)
1、子查询一个值
语法:select * from 表名 where 列名 比较运算符 (select 列名 from 表名 where 条件);
注意事项:子查询语句中select后面一定不能跟 * ,只能跟列名。
2、子查询多个值
语法:select * from 表名 where 列名 in (select 列名 from 表名 where 条件);
五、分组查询
分组要使用group by来实现,需要在group by后面加上分组字段。
MySQL中常用的聚合函数:
- max() 求最大值
- min() 求最小值
- avg() 求平均值
- sum() 求和
- count(*) 用来统计数量,即有多少个。会统计空值(null值)。
- count(列名) 用来统计数量,即有多少个。不会统计空值(null值)。
在分组之后不能使用where进行数据过滤,需要使用having。
六、having
where和having有什么区别?
1、having需要用在分组之后(即需要写在group by的后面),where要用在分组之前的数据过滤(即需要写在group by的前面)。
2、where查询条件中不能使用聚合函数,having查询条件中可以使用聚合函数。
3、where查询条件中不可以使用字段别名,而having查询条件中可以使用字段别名。
七、临时表
这张表不是实际存在的,把通过某条SQL语句查询的结果看作是一张表,这张表就称之为临时表。