- 1、本文档共61页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
李兴华Oracle学习笔记
图表 1
多表查询的基本语法
查一张以上的表,就叫做多表查询
例子:查询出雇员名称,部门名称和部门所在地的(一般多表查询要用别名)
统计记录数:
查询emp有多少条纪录
左右连接(重点)
select e.empno,e.ename,d.deptno,d.dname,d.loc
from
emp e,dept d where e.deptno=d.deptno;
部门一共四个,这里只查询出三个,因为在雇员表中没有指定40部门的雇员,所以在消除笛卡尔乘机的时候没有条件符合40,如果喜欢40部门显示出来,就要用左右连接了。
select e.empno,e.ename,d.deptno,d.dname,d.loc
from
emp e,dept d where e.deptno(+)=d.deptno;
(+)在左边,表示以右边的表为准,表示右链接。
40部门出来了,所以此时就用到了有连接,证明以下规律
(+)在左表示右连接
(+)在右表示左连接
.SQL:1999对SQL的支持(了解)
范例:交叉连接(cross join)产生笛卡尔积
select * from empt CROSS JOIN dept;
查询结果 产生笛卡尔积
CREATE TABLE EMP10 AS SELECT * FROM EMP WHERE DEPTNO=10;
select * from emp NATURAL JOIN dept; 自动进行匹配
范例:USING子句,直接关联的操作列
select * from emp e JOIN dept d USING (deptno) where deptno=30;
把两张表的详细信息进行打印输出
范例:ON子句 自己编写连接条件
select * from emp e JOIN dept d ON (e.deptno=d.deptno) where e.deptno=30;
范例:左连接(左外连接)右连接(右外连接)LEFT JOIN RIGHT JOIN
组函数和分组统计(重点)
组函数
在SQL常用组函数有如下几个:
COUNT()求全部记录数
MAX()求最大记录数
MIN()求最小记录数
AVG()平均
SUM()求和
分组统计
Group by
select deptno,COUNT(empno) from emp GROUP BY deptno;
算出部门表的平均工资:
select AVG(sal) from emp ;
算出每个部门的平均工资:
Select deptno,AVG(sal) from emp ;
?之所以会出现这个错误是因为数据库不知道怎样在结果集中处理列。考虑一下:这个查询既试图使用AVG聚合函数对多 行记录进行操作,却又试图从每行中获得列的值;这两个操作是不可能同时完成的。此时必须提供一个GROUP BY子句告诉数据库将列相同的行分组在一起,然后数据库就可以将这些组中的行传递给AVG函数。
警告:
如果查询中包含聚合函数,而所选择的列并不在聚合函数中,那么这些列就必须在GROUP BY子句中。
select d.dname,count(e.empno) from dept d,emp e
where d.deptno=e.deptno
GROUP BY d.dname;
要求查出平均工资大于2000的部门编号和平均工资
select deptno,AVG(sal) from emp WHERE AVG(sal) 2000 GROUP BY deptno;
?之所以会出现这个错误是因为WHERE子句只能用来对单行而不是行组进行过滤。要过滤行组,可以使用HAVING子句。’SALESMAN’
select * from emp where jobsalesman;
2.按工作分组同时求出工资的总和
Select job,SUM(sal) from emp WHERE job’SALESMAN’ GROUP BY job;
3.对分组条件进行限制
Select job,SUM(sal) from emp WHERE job’SALESMAN’ GROUP BY job HAVING SUM(sal)5000;
4.使用排序,按升序排列
Select job,SUM(sal) su from emp WHERE job’SALESMAN’ GROUP BY job HAVING SUM(sal)5000 order by su;
分组的简单原则:
只要一列上存在重复的内容才考虑用分组
注意:分组函数可以嵌套使用,但是在组函数嵌套的时候不能再出现分组条件的查询语句
范例:求出平均工资最高的部门
错误代码:
Select deptno,MAX(AV
文档评论(0)