MySQL复杂查询
一、分组查询:
1、关键字:GROUP BY
2、用法:GROUP BY 语句用于结合合计函数 (比如 SUM) ,根据一个或多个列对结果集进行分组,合计函数常常需要添加 GROUP BY 语句。
下面的给了两张表 一张是emp,一张是dept,下面的查询我们都对这两张表进行操作,如下图:
第一张:emp表
第二张:dept表
现在我们查询emp每个部门的工资总和,语句如下:
SELECT deptno,SUM(sal)FROM emp GROUP BY deptno;
结果如下:
注:这里我们查询每个部门的工资(sal)总和,所以应该按照部门标号(deptno)进行分组,求和所以用了sum();
3、having:
where 和 having 都是做条件判断,在介绍having前我们看下where 和 having的区别
where的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚合函数,使用where条件显示特定的行。
having的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚合函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。
例如:我们要查询emp表中工资总和大于10000的部门编号,语句如下:
SELECT deptno,SUM(sal)FROM emp GROUP BY deptno HAVING SUM(sal)>10000;
结果如下:
这样就查出了工资总和大于10000的部门编号为20,(为了理解也把工资总和显示出来了)。
二、连表查询:
根据两个或多个表中的列之间的关系,从这些表中查询数据.
1、inner join(内连接):
语法:select 字段名1,字段名2 from table1 [INNER] join table2 ON table1.字段名=table2.字段名;
注:内连接是从结果中删除其他被连接的表中没有匹配行的所有行,只能查询出连接的表中都拥有的信息,所以内连接可能会丢失信息,还有inner可以省略。
例如:我们连接emp 和 dept两张表,查询ename 和deptno,语句如下:
SELECT emp.ename,dept.deptno FROM emp INNER JOIN dept ON emp.deptno=dept.deptno;
还有种写法:SELECT emp.ename,dept.deptno from emp,dept where emp.deptno=dept.deptno;