sql(三):多表查询、左右连接、组函数与分组统计
⼀、多表查询
之前查询都是在⼀张表上进⾏的查询,如果使⽤多张表进⾏查询,则称为多表查询。格式如下:
[sql]
1. select {DISTINCT}* | 具体列名别名
2. form 表名称1 别名1,表名称2 别名2
3. { where 条件(s) }
4. {order by 排序的字段1 ASC | DESC,排序的字段2 ASC | }
1. 使⽤多表查询,同时查询emp和dept表
[sql]
1. SELECT * FROM emp,dept ;
查询出来的结果条数是emp条数 * dept的条数。
说明在使⽤多表查询的时候会产⽣笛卡尔积。如果表的数据越多,笛卡尔积产⽣的结果就越多,想要去掉笛卡尔积,则必须使⽤字段进⾏关联的操作。
例如,使⽤dept字段来关联:
[sql]
1. SELECT * FROM emp,dept
2. WHERE emp.deptno=dept.deptno ;
2. 如果表名过长,可以为其取别名
[sql]
1. SELECT * FROM emp e,dept d
2. WHERE e.deptno=d.deptno ;
3.⾃关联
例:要求查询出每个雇员的姓名、⼯作、雇员的直接上级领导的姓名
[sql]
1. ame,e.ame
sql left join 多表连接
2. FROM emp e,emp m
3. =m.empno ;
⼆、左右连接
1. (+)在左边表⽰右连接
例如:
[sql]
1. ame,d.deptno,d.dname,d.loc
2. FROM emp e,dept d
3. WHERE e.deptno(+)=d.deptno ;
表⽰d表的deptno字段⼀定会出现,即使e表的deptno没有存在相匹配的⾏...
2. (+)在右边表⽰左连接
例如:
[sql]
1. ame,d.deptno,d.dname,d.loc
2. FROM emp e,dept d
3. WHERE e.deptno=d.deptno(+) ;
表⽰e表的deptno字段⼀定会出现,即使d表的deptno没有存在相匹配的⾏...
三、SQL:1999语法(了解)
格式:
[sql]
1. lumn,table
2. FROM table1 [CROSS JOIN table2]|
3. [NATURAL JOIN table2]|
4. [JOIN table2 USING(column_name)]|
5. [JOIN table2 lumn_lumn_name)]|
6. [LEFT|RIGHT|FULL OUTER JOIN table2 lumn_lumn_name)];
四、组函数与分组统计
分组:例如,把所有男⽣分为⼀组,⼥⽣分为⼀组。
如果想求出每⼀组的平均⾝⾼,平均年龄等,这就需要分组函数。
1. 组函数
常⽤的分组函数有以下⼏个:
COUNT() :求出全部的记录数
MAX() :求出该组的最⼤值
MIN(): 求出该组的最⼩值
AVG():求出平均值
SUM(): 求和
例:求出⼯资最低的员⼯的信息
[sql]
1. SELECT MIN(sal) FROM emp ;
求出部门编号为20的所有⼈的总⼯资
[sql]
1. SELECT SUM(sal) FROM emp WHERE deptno=20 ;
2.分组统计
使⽤GROUP BY进⾏分组
[sql]
1. select {DISTINCT}* | 具体列名别名
2. form 表名称1 别名1,表名称2 别名2
3. { where 条件(s) }
4. {GROUP BY  分组条件}
5. {order by 排序的字段1 ASC | DESC,排序的字段2 ASC | }
例:求出每个部门的雇员数量
[sql]
1. select deptno,COUNT(empno)
2. from emp
3. group by deptno;
注意点:观察以下代码
[sql]
1. SELECT deptno,COUNT(empno) FROM emp ;
执⾏时出现
以上代码不能正确执⾏,是因为:
(1).如果程序使⽤了分组函数,则只能在以下两种情况中使⽤:
sql中使⽤了GROUP BY,并指定了分组条件,这样可以将分组条件⼀起查询出来如果不使⽤分组,则只能单独的使⽤分组函数
(2).在使⽤分组的时候,不能出现分组函数和分组条件之外的字段
[sql]
1. SELECT deptno,empno,COUNT(empno)
2. FROM emp
3. GROUP BY deptno ;
例:按部门分组,并显⽰部门的名称,及每个部门的员⼯数
[sql]
1. SELECT d.dname,pno)
2. FROM dept d,emp e
3. WHERE d.deptno=e.deptno
4. GROUP BY d.dname ;
如果需要过滤分组,则必须使⽤HAVING 分组条件,格式:
[sql]
1. select {DISTINCT}* | 具体列名别名
2. form 表名称1 别名1,表名称2 别名2
3. { where 条件(s) }
4. {GROUP BY  分组条件 HAVING 分组条件}
5. {order by 排序的字段1 ASC | DESC,排序的字段2 ASC | }
范例:显⽰⾮销售⼈员⼯作名称以及从事同⼀⼯作雇员的⽉⼯资的总和,并且要满⾜从事同⼀⼯作的雇员的⽉⼯资合计⼤于5000,输出结果按⽉⼯资的合计升序排列:
[sql]
1. SELECT job,SUM(sal) su
2. FROM emp
3. WHERE job<>'SALESMAN'
4. GROUP BY job HAVING SUM(sal)>5000
5. ORDER BY su ;
分组的简单原则:
只有⼀列上出现重复的内容才可能⽤到分组

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。