MySQL分组查询与连接查询
一,分组查询
使用ORDER BY子句将表中的数据分成若干组(还是按行显示)
语法:
SELECT 字段名[,聚集函数] FROM 表名 [WHERE子句] GROUP BY 要分组的字段名 [ORDER BY子句]
需要注意的是:在GROUP BY子句后出现的字段名必须在SELECT后的查询的字段中
1.分组查询中筛选条件分为两种:
类别 | 筛选数据源 | 在语句中的位置 | 使用的关键字 |
---|---|---|---|
分组前筛选 | 原始数据表 | GROUP BY子句前 | WHERE |
分组后筛选 | 分组后的结果集 | GROUP BY子句后 | HAVING |
注意:
(1)能用分组前筛选(WHERE子句)完成查询优先使用分组前筛选
(2)如果聚集函数做筛选条件,则条件一定是放在HAVING子句中
2.GROUP BY子句中同时按多个字段分组
此时,GROUP BY子句后的多个字段的各个值都相同的会合并成为一行记录,就算两行记录前n-1个字段的值相同,而第n个字段的值不同也不会合并成一行而是两个不同的行。
3.添加排序
直接在GROUP BY子句后添加排序子句ORDER BY
二,连接查询
连接查询又称为多表查询。
语法:
SELECT 查询字段 FROM 表a [别名] [连接类型关键字] JOIN 表b [别名] ON 连接条件
[WHERE 筛选条件] [GROUP BY子句] [HAVING 筛选条件] [ORDER BY 排序字段]
1.按功能分类:
内连接:包括 等值连接、非等值连接、自连接
外连接:包括 左外连接、右外连接、全外连接
交叉连接:实际上就是多个表的笛卡儿积
等值连接:
在连接条件中使用符号 =
非等值连接:
在连接条件中使用除 = 外其他符号,如>,<,between...and...等
自连接:inner
表自身的连接查询,一半这种情况下,很可能对表起两次不同的别名
需要注意的是:为表起别名后,要对查询字段进行表限定,则要使用别名去限定二不能再使用原表名了,这个和MySQL中解析SQL语句的顺序有关。
左外连接:left [outer]
以左边的表作为主表
右外连接:right [outer]
以右边的表作为主表
全外连接full [outer]
其实在MySQL中不支持圈外连接。
交叉连接:cross
左右表的笛卡儿积
2.按SQL标准分
在SQL92标准中:仅仅支持内连接
在SQL99标准中:支持内连接+外连接(左外,右外)+交叉连接
3.总结
以上总共有七种连接查询,我们用一张图来形象区分: