Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1654388
  • 博文数量: 82
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 0
  • 用 户 组: 普通用户
  • 注册时间: 2017-12-09 12:58
文章分类

全部博文(82)

文章存档

2011年(7)

2010年(3)

2009年(11)

2008年(4)

2007年(57)

我的朋友

分类: 数据库开发技术

2009-08-10 15:32:22


多表查询
SELECT * FROM emp ; SELECT * FROM dept; (结果14和4)
SElECT * FROM emp , dept; (结果56,出现笛卡尔积,交错相乘)这样对查询不方便,查询模糊,一般开发不推荐使用,必须利用字段关联方式去掉笛卡尔积数。
SELECT * FROM emp e,dept d WHERE e.deptno=d.deptno ;(其中deptno为两表的关联字段)
SELECT e.ename,e.empno,e.sal FROM emp e,dept d WHERE e.deptno=d.deptno ;
自身关联 ,把员工编号和所在上司的编号关联
SELECT e.ename,e.job,m.ename,e.mgr, e.empno FROM emp e,emp m WHERE e.empno=m.mgr;
SELECT e.ename,e.job,m.ename,d.dname FROM emp e,emp m,dept d WHERE e.mgr=m.empno AND e.deptno=d.deptno ;
SELECT e.ename,e.job,d.dname,s.grade FROM emp e,dept d,salgrade s WHERE e.deptno=d.deptno AND sal BETWEEN LOSAL AND HISAL;
 
SELECT e.ename,e.job,d.dname,s.grade,m.ename,ms.grade FROM emp m,salgrade ms,emp e,dept d,salgrade s WHERE e.mgr=m.empno and m.sal between ms.losal and ms.hisal and
e.deptno=d.deptno AND e.sal BETWEEN s.losal AND s.hisal ;
 
SELECT e.ename,e.job,d.dname,s.grade,m.ename,ms.grade
 FROM emp e,dept d,salgrade s,emp,emp m,salgrade ms WHERE
 e.deptno=d.deptno AND e.sal BETWEEN s.losal AND s.hisal
 AND e.mgr=m.empno AND m.sal BETWEEN ms.losal AND ms.hisal ;
 
思考题:
SELECT e.ename,e.mgr,e.job,e.sal,DECODE(s.grade,5,'第一等级工资',4,' 第二等级工资',3,'第三等级工资',2,'第四等级工资',1,'第五等级工资') 员工工资等级, d.dname,m.ename,e.mgr,m.sal,DECODE(sm.grade,5,'第一等级工资',4,'第二等级工资',3,'第三等级工资',2,'第四等级工资',1,'第五等级工资') 领导工资
FROM emp e,salgrade s,dept d,emp m,salgrade sm
WHERE e.sal BETWEEN s.losal AND s.hisal AND e.deptno=d.deptno AND e.mgr=m.empno AND m.sal BETWEEN sm.losal ANd sm.hisal ;

左右连接的使用。开发中经常使用
SELECT e.ename,e.empno,m.ename,m.empno
FROM emp e,emp m
WHERE e.mgr=m.empno ; 结果为13行信息,缺失一行
SELECT e.ename,e.empno,m.ename,m.empno
FROM emp e,emp m
WHERE e.mgr=m.empno(+) ; 结果为14行信息,(+)表示左连接,以左面数据为显示标准,
同理WHERE e.mgr=m.empno 默认为右连接,等同于WHERE e.mgr(+)=m.empno

SELECT MAX(sal) FROM emp ;
SELECT deptno,AVG(sal) FROM emp GROUP BY deptno;
显示部门中平均工资、
SELECT deptno,COUNT(empno) FROM emp GROUP BY deptno;
显示各个部门的员工数
SELECT d.dname,d.deptno,COUNT(e.ename)
FROM emp e,dept d
WHERE e.deptno=d.deptno GROUP BY d.deptno GROUP BY d.dname;
alter user test account unlock ;  给用户解锁,
alter user scott identified by 19860409 ; 修改拥护密码(这里的密码不能与SYS密码相同)
SELECT
FROM emp WHERE sal>2000

SELECT job,SUM(sal) ss
FROM emp
WHERE job<>'SALESMAN' GROUP BY job HAVING SUM(sal)>5000 ORDER BY ss asc;
显示职位不是salesman的工资总和,并且按照升幂排列;
分组原则******************:只要一列上的存在重复的内容才有可能考虑到分组
分组函数可以嵌套使用,但分组条件只能使用一次,

****************求出平均工资最高的部门工资***************
SELECT deptno,MAX(AVG(SAL))
FROM emp
gROUP BY deptno;
结果是错误的,无法显示,(不是单组分组函数)
SELECT MAX(AVG(sal)) FROM emp GROUP BY deptno;
此时deptno 就不应该出现,而直接求去数值。(嵌套的缺点)
阅读(1544) | 评论(0) | 转发(0) |
0

上一篇:sql学习笔记1

下一篇:sql学习3

给主人留下些什么吧!~~