数据库的高级查询

295 阅读4分钟

聚合函数

在数据的查询分析中,应用十分广泛。聚合函数可以对数据求和、求最大值和最小值、求平均值等。

AVG函数用于获得非空值的平均值,非数字数据统计结果为0

SUN函数用于求和,只能用于数字类型,字符类型的统计结果为0,日期类型统计结果是毫秒数相加。

MAX函数用于获得非空值的最大值

统计字符个数 LENGTH()

MIN函数用于获得非空值的最小值

COUNT(*)用于获得包含空值的记录数,COUNT(列名)用于获得包含非空值的记录数

聚合函数不可以出现在WHERE子句中

分组查询

默认情况下聚合函数是对全表范围内的数据做统计

GROUP BY子句的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对每个小区域分别进行数据汇总处理

ROUND() 四舍五入

数据库支持多列分组条件,执行的时候逐级分组。

查询语句中如果含有GROUP BY子句,那么SELECT子句中的内容就必须要遵守规定:SELECT子句中可以包括聚合函数,或者GROUP BY子句的分组列,其余内容均不可以出现在SELECT子句中

SELECT deptno,COUNT(*),AVG(sal)

FROM t_emp

GROUP BY deptno;

对分组结果集再次做汇总计算

SELECT deptno,COUNT(*),AVG(sal),MAX(sal),MIN(sal)

FROM t_emp

GROUP BY deptno WITH ROLLUP;#对结果作二次计算

GROUP_CONCAT函数可以把分组查询中的某个字段拼接成一个字符串

SELECT deptno,GROUP_CONCAT(ename), COUNT(*)

FROM t_emp 

WHERE sal>=2000

GROUP BY deptno;

各种子句的执行顺序

FROM     WHERE    GROUP BY   SELECT   ORDER BY    LIMIT

HAVING子句不能单独存在,需依赖于GROUP BY

SELECT deptno

FROM t_emp

GROUP BY deptno HAVING AVG(sal)>=2000;类似的聚合函数不可以写在WHERE中,因为WHERE执行顺序优先于GROUP BY,所以聚合函数找不到执行的数据范围

HAVING子句可以使用聚合函数与常数作比较,但不能与字段作比较(可以用表连接解决)

按照数字1分组,MySQL会依据SELECT子句中的列进行分组,HAVING子句也可以正常使用

SELECT deptno,COUNT(*)

FROM t_emp

GROUP BY 1;

WHERE和HAVING功能上是一致的,都是数据筛选,普通的数据筛选条件可以写在HAVING中,不推荐这样写

SELECT deptno,COUNT(*)

FROM t_emp

GROUP BY 1 HAVING deptno IN(10,20);

从多张表中提取数据

从多张表中提取数据,必须指定关联的条件。如果不定义关联条件就会出现无条件连接,两张表的数据会交叉连接,产生笛卡尔积

SELECT e.empno, e.ename, d.dname

FROM t_emp e JOIN t_dept d#对两张表重命名

ON e.deptno=d.deptno;#连接条件

表连接分为两种:内连接和外连接

内连接是结果集中只保留符合连接条件的记录

外连接是不管符不符合连接条件,记录都要保留在结果集中

SELECT ......  FROM 表1

[INNER]  JOIN 表2 ON 条件

[INNER]  JOIN 表3 ON 条件

内连接的数据表不一定必须有同名字段,只要字段之间符合逻辑关系就可以

相同的数据表和查询结果集也可以做表连接

FLOOR() 小数点后强制舍位

CELL() 小数点后强制进位

左连接和右连接

左外连接就是保留左表所有的记录,与右表做连接。如果右表有符合条件的记录就与左表连接。如果右表没有符合条件的记录,就用NULL与左表连接。右外连接也是如此。

UNION关键字可以将多个查询语句的结果集进行合并

(查询语句)UNION(查询语句)UNION(查询语句).......

字段个数和名称必须相同,否则没法合并

外连接的注意事项

内连接只保留符合条件的记录,所以查询条件写在ON子句和WHERE子句中的效果是相同的。但是在外连接里,条件写在WHERE子句里,不符合条件的记录是会被过滤掉的,而不是保留下来。

子查询是一种查询中嵌套查询的语句,只推荐在FROM子句中使用,子查询只会执行一次,所以查询效率很高

WHERE子句中,可以使用IN ALL ANY EXISTS关键字来处理多行表达式结果集的条件判断

EXISTS关键字是把原来在子查询之外的条件判断,写到了子查询的里面。

SELECT ...... FROM 表名 WHERE [NOT] EXXISTS(子查询);