分组查询(GROUP BY)
语法:
SELECT column, group_function(column)
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[ORDER BY column];
注意:它的查询列表比较特殊,要求是分组函数和GROUP BY后出现的字段
特点:
1.分组查询中的筛选条件分为两类
数据源 位置 关键字
分组前筛选 原始表 GROUP BY子句的前面 WHERE
分组后筛选 分组后的结果集 GROUP BY子句的后面 HAVING
分组函数(SUM,MAX,MIN,AVG,COUNT)做条件肯定是放在HAVING子句中
能用分组前筛选的尽量使用分组前筛选
2.GROUP BY子句支持单个字段分组,多个字段分组(多字段之间用逗号隔开,没有顺序要求)
但是也支持表达式和函数
3.也可以添加排序,但是排序一定要放在最后面
HAVING()
功能:对已经分组后的数据再进行条件分组
语法:
SELECT column, group_function(column)
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[ORDER BY column]
HAVING condition;
连接查询
又叫多表查询,当查询的字段来自多个表时,就会用到连接查询
语法一:
SELECT field_in_table1,field_in_table_2 FROM table_1,table_2;
笛卡尔乘积现象:表1有m行,表2有n行,结果=m*n行
发生原因:没有有效的连接条件
如何避免:添加有效的连接条件
例子:
SELECT `name`,boyname FROM boys,girls
WHERE girls.boyfriend_id=boys.id
分类:
按照年代分类:
1.sql92标准(仅仅支持内连接)
2.sql99标准[推荐](支持内连接+外连接(左外和右外))+交叉连接
1.sql92标准(仅仅支持内连接)
按照功能分类(sql92):
1.内连接:
等值连接:连接条件用=连接
非等值连接:连接条件用非=连接
自连接:同一个表中的连接查询
2.sql99标准[推荐](支持内连接+外连接(左外和右外))+交叉连接
语法:
SELECT 查询列表
FROM 表名1 别名
[连接类型]
JOIN 表名2 别名
ON 连接条件
[WHERE 筛选条件]
[GROUP BY 分组]
[HAVING 筛选条件]
[ORDER BY 排序列表];
按照功能分类(sql99):
1.内连接:(INNER)
等值连接:连接条件用=连接
非等值连接:连接条件用非=连接
自连接:同一个表中的连接查询
2.外链接:
左外连接(LEFT [OUTER])
右外连接(RIGHT [OUTER])
全外连接(FULL [OUTER])
应用场景:用于查询一个表中有,另一个表中没有的记录
特点:
1.外连接的查询结果为主表中的所有记录
如果从表中有和它匹配的,则显示匹配的值
如果从表中没有和它匹配的,则显示null
外连接查询结果=内连接结果+主表中有而从表中没有的记录
2.左外连接,LEFT JOIN左边是主表
右外连接,RIGHT JOIN右边是主表
3.左外和右外交换两个表的顺序,可以实现同样的效果
4.全外连接=内连接结果+表1中有但表2中没有+表2中有但表1中没有的
3.交叉连接(CROSS JOIN)
sql99语法实现的笛卡尔乘积,用CROSS JOIN连接
子查询
含义:出现在其他语句中的select语句,称为子查询或内查询
出现在外部的语句称为外查询或主查询
分类:
1.按照查询出现的位置:
SELECT 后面
仅仅支持标量子查询
FROM 后面
支持表子查询
WHERE或HAVING后面
标量子查询(单行)
列子查询(多行)
行子查询(多列多行)
特点:
1.子查询放在小括号内
2.子查询一般放在条件的右侧
3.标量子查询,一般搭配单行操作符(>,<,>=,<=,<>)使用
4.列子查询,一般搭配着多行操作符(IN,ANY/SOME,ALL)使用
操作符 含义
IN/NOT IN 等于列表中的一个
ANY/SOME 和子查询返回的某一个值比较
ALL 和子查询返回的所有值比较
EXISTS后面(相关子查询)
表子查询
语法:
EXISTS(完整的查询语句)
结果:0或1
2.按结果集的行列数不同:
标量子查询(结果集只有一行一列)
列子查询(结果集只有一列或多行)
行子查询(结果集有一行或多列)
表子查询(结果集,一般为多行多列)
分页查询
应用场景:当要显示的数据,一页显示不全,需要分页提交sql请求
语法:
SELECT 查询列表
FROM 表
[连接类型 JOIN 表2
ON 连接条件
WHERE 筛选条件
GROUP BY 分组字段
HAVING 分组后的筛选
ORDER BY 排序的字段]
LIMIT offset size;
offset:要显示条目的起始索引(起始索引从0开始)
size:要显示的条目个数
特点:
1.LIMIT语句放在查询语句的最后
2.公式:
要显示的页数page,每页的条目数size
SELECT 查询列表
FROM 表
LIMIT (page-1)*size,size;
union联合查询
效果:将多条查询语句的结果合并成一个结果
应用场景:要查询的结果来自多个表,且多个表没有直接的关系,但查询的信息一致
特点:
1.要求多条查询语句的查询列数是一致的
2.要求多条查询语句的查询的类型和顺序最好一致
3.查询结果默认是去重的,使用UNION ALL可以包含去重项
4.查询结果的字段名与第一个查询项一致
例子:
SELECT * FROM test WHERE field1 LIKE '%t%' OR field2>100;
可用UNION组合为:
SELECT * FROM test WHERE field1 LIKE '%t%'
UNION
SELECT * FROM test WHERE field2>100;