任何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
表dept