1、SQL> select ename,deptno,sal from emp where sal=(select max(sal) from emp group by deptno);
select ename,deptno,sal from emp where sal=(select max(sal) from emp group by deptno)
查詢每個薪水最多的人的姓名,因爲(select max(sal) from emp group by deptno)返回多個值,而sal只能接受一值所以不正確
第 1 行出現錯誤:
ORA-01427: 單行子查詢返回多個值
SQL> select ename,deptno,sal from emp where sal in (select max(sal) from emp group by deptno);
使用關鍵字in可以,但是上面的語法是取出in裏面的三個值之一,邏輯依然不正確但語法正確
ENAME DEPTNO SAL
---------- ---------- ----------
BLAKE 30 2850
SCOTT 20 3000
KING 10 5000
FORD 20 3000
select ename,sal from emp join(select max(sal) max_sal,depton from emp group by
deptno) t on(emp.sal=t.max_sal and emp.depton=t.depton);
正確寫法如上!運用了join on表連接和子查詢
2、SQL> select ename,dname,grade from emp e,dept d,salgrade s
2 where e.deptno=d.deptno and e.sal between s.losal and s.hisal and //連接條件
3 job <>'CLERK';//過濾條件
所以造成閱讀不方便,因此1999年有了新的語法規則
ENAME DNAME GRADE
---------- -------------- ----------
KING ACCOUNTING 5
FORD RESEARCH 4
SCOTT RESEARCH 4
JONES RESEARCH 4
BLAKE SALES 4
CLARK ACCOUNTING 4
ALLEN SALES 3
TURNER SALES 3
MARTIN SALES 2
WARD SALES 2
SQL>select ename,dname from emp,dept;//92年語法
SQL>select ename,dname from emp corss join dept;//99年語法
SQL>select ename,dname from emp,dept where emp.deptno=dept.depton;//92年語法
SQL>select ename,dname from emp join dept on (emp.deptno=dept.depton)//99年語法
SQL>select ename,dname from emp join dept using(depton) ;//不推薦
SQL>select ename,dname,grade from
emp e join dept d on(e.depton =d.depton)
join salgrade s on (e.sal between s.losal and s.hisal)
where ename not like '_A%';
SQL> select e1.ename,e2.ename from emp e1 join emp e2 on (e1.mgr=e2.empno);
SQL> select e1.ename,e2.ename from emp e1 left join emp e2 on (e1.mgr=e2.empno);左外連接
SQL> select e1.ename,e2.ename from emp e1 join emp e2 on (e1.mgr=e2.empno);//全外連接
SQL> select deptno,avg_sal from
2 (select avg(sal) avg_sal,deptno from emp group by deptno)
3 where avg_sal=
4 (select max(avg_sal) from (select avg(sal) avg_sal,deptno from emp group by deptno));
A.求部門平均薪水的等級。
select deptno,avg_sal,grade from
(select deptno,avg(sal) avg_sal from emp group by deptno)t
join salgrade s on(t.avg_sal between s.losal and s.hisal)
B.求部門平均的薪水等級
select deptno,avg(grade) from
(select deptno,ename, grade from emp join salgrade s on(emp.sal between s.losal and
s.hisal)) t
group by deptno
C.那些人是經理
select ename from emp where empno in(select mgr from emp);
select ename from emp where empno in(select distinct mgr from emp);
D.不準用組函數,求薪水的最高值(面試題)
select distinct sal from emp where sal not in(
select distinct e1.sal from emp e1 join emp e2 on (e1.sal<e2.sal));
E.平均薪水最高的部門編號
select deptno,avg_sal from
(select avg(sal)avg_sal,deptno from emp group by deptno)
where avg_sal=
(select max(avg_sal)from
(select avg(sal) avg_sal,deptno from emp group by deptno)
)
F.平均薪水最高的部門名稱
select dname from dept where deptno=
(
select deptno from
(select avg(sal)avg_sal,deptno from emp group by deptno)
where avg_sal=
(select max(avg_sal)from
(select avg(sal) avg_sal,deptno from emp group by deptno)
)
)
G.求平均薪水的等級最低的部門的部門名稱
組函數嵌套
如:平均薪水最高的部門編號,可以E.更簡單的方法如下:
select deptno,avg_sal from
(select avg(sal) avg_sal,deptno from emp group by deptno)
where avg_sal =
(select max(avg(sal)) from emp group by deptno)
組函數最多嵌套兩層
分析:
首先求
1.平均薪水: select avg(sal) from group by deptno;
2.平均薪水等級: 把平均薪水當做一張表,需要和另外一張表連接salgrade
select deptno,grade avg_sal from
( select deptno,avg(sal) avg_sal from emp group by deptno) t
join salgrade s on(t.avg_sal between s.losal and s.hisal)
上面結果又可當成一張表。
DEPTNO GRADE AVG_SAL
-------- ------- ----------
30 3 1566.66667
20 4 2175
10 4 2916.66667
3.求上表平均等級最低值
select min(grade) from
(
select deptno,grade,avg_sal from
(select deptno,avg(sal) avg_sal from emp group by deptno)t
join salgrade s on(t.avg_sal between s.losal and s.hisa)
)
4.把最低值對應的2結果的那張表的對應那張表的deptno, 然後把2對應的表和另外一張表做連接。
select dname ,deptno,grade,avg_sal from
(
select deptno,grade,avg_sal from
(select deptno,avg(sal) avg_sal from emp group by deptno)t
join salgrade s on(t.avg_sal between s.losal and s.hisal)
) t1
join dept on (t1.deptno = dept.deptno)
where t1.grade =
(
select deptno,grade,avg_sal from
(select deptno,avg(sal) avg_sal from emp group by deptno) t
join salgrade s on(t.avg_sal between s.losal and s.hisal)
)
)
結果如下:
DNAME DEPTNO GRADE AVG_SAL
-------- ------- -------- --------
SALES 30 3 1566.6667
H: 視圖(視圖就是一張表,一個字查詢)
G中語句有重複,可以用視圖來簡化。
conn sys/bjsxt as sysdba;
grant create table,create view to scott;
conn scott/tiger
創建視圖:
create view v$_dept_avg-sal_info as
select deptno,grade,avg_sal from
( select deptno,avg(sal) avg_sal from emp group by deptno)t
join salgrade s on 9t.avg_sal between s.losal and s.hisal)
然後
select * from v$_dept_avg-sal_info
結果如下:
DEPTNO GRADE AVG_SAL
-------- ------- ----------
30 3 1566.66667
20 4 2175
10 4 2916.66667
然後G中查詢可以簡化成:
select dname,t1.deptno,grade,avg_sal from
v$_dept_avg-sal_info t1
join dept on(t1.deptno =dept.deptno)
where t1.grade=
(
select min(grade) from v$_dept_avg-sal_info t1
)
3
SQL> select deptno,avg_sal from
2 (select avg(sal) avg_sal,deptno from emp group by deptno)
3 where avg_sal=
4 (select max(avg_sal) from (select avg(sal) avg_sal,deptno from emp group by deptno));
初學Oracle_多條selcet語句
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.