任何select出来后都是一个临时的表格,可以当作表格来使用

(示例表emp,及debt附在末尾)

对查询结果进行分组


语法 :select [coll],[col2],....from 表名 where group by 【column】


例子:SELECT deptno,avg(sal) from emp GROUP BY deptno(查询deptno值相同时sal的平均值)


注意:该分组是以相同的为一组,对查询结果分组时,要注意逻辑,比如:一个部门的员工为一组,工资相同为一组,而员工姓名相同为一组则行不通


(逻辑不通语句:我们一个月前来到了JAVA实训项目部,我们一个班叫王懵)


group by 后的字段相同时为同一组




链表语句     


1.select e.emp,e.ename,e.sal,e.deptno,d.dname,d.loc from emp as e inner join dept as d on e.deptno=d.debtno


(给表emp取别名e,表dept取别名d,(e.emp,e.ename,e.sal,e.depton,d.dname,d.loc)此语句表示显示两个表中的哪些内容,inner join左右两边表示需要关联的两个表,on后面表示两个表中相同的字段关联起来)


注意:链表是把两个表的信息显示在一个表中,左边表有右边没有需要用left join,反之则用right join   inner join只能查两边都有的


 


2.select e.*,d.*from emp e ,dept d where e.deptno= d.deptno


(以deptno为连接点显示表emp 和表dept中的deptno相同的内容)


相对于1要简单,没有左右链接,相对而言多了一个条件




3。分组后链表


   

select emp.deptno 部门编号,sum(emp.sal) 总工资, count(emp.empno) 部门人数 from emp INNER JOIN dept on emp.deptno = dept.deptno  GROUP BY emp.deptno


(要标注那个字段是那个表的。如:表emp中的sal用emp.sal表示。分组也要表示是那个表的)


SELECT a.*,dept.dname FROM(SELECT deptno,SUM(sal),avg(sal) FROM emp GROUP BY deptno) a INNER JOIN dept on a.deptno=dept.deptno GROUP BY a.deptno




SELECT xin.deptno 部门编号,d.dname 部门名称,xin.a 平均工资, xin.s 工资总和, xin.c 人数  


FROM (SELECT deptno,SUM(sal) s,avg(sal) a,COUNT(sal) c FROM emp GROUP BY deptno) xin INNER JOIN dept d on xin.deptno=d.deptno GROUP BY xin.deptno






子查询


1.把使用分组函数的查询语句作为where后的条件


2.把使用分组函数的查询语句作为from后的表






过滤


having


SELECT deptno,avg(sal) from emp GROUP BY deptno HAVING AVG(sal) BETWEEN 2175 and 3000


注意:having写在语句末尾 处于两者(如A和B)之间最好用 between A and B,取值时要取到A和B




分页






1.mysql:利用关键字limit(例如:select*from emp limit 4,5(因为是从0开始,因此这里表示从第五行开始,显示后面5行))


2.sqlserver :利用关键字top


3.oracle:利用关键字rownum




格式:select*from (select rownum r,a.*from(?)a)where r between ? and ?


第一个问号:指的是要查询的sql语句(包含排序)


第二个问号:指的是分页查询的其实行号


第三个问号:指的是分页查询的结束行号


表emp



mysql联表查_分组函数

表dept

mysql联表查_分组函数_02