SQL語句02(連表查詢)


---恢復內容開始---

sql1992
sql分類
    1.笛卡爾積 (表乘表)

  例:select * from emp,dept;
    2.等值連接 表的連接條件使用“=”

  例:select * from emp,dept where emp.deptno = dept.deptno;
    3.非等值連接 表的連接條件使用“>、>=、 <、<=、!=、any等”

  例:select e.ename,sg.grade from emp e,salgrade sg where e.sal between sg.losal and sg.hisal;
    4.自連接 自己連接自己

  例:select e1.ename || ' 的上司是 '|| e2.ename from emp e1,emp e2 where e1.mgr = e2.empno;
    5.外連接:在等值基礎上,確保一張表(主表)的記錄都存在 從表滿足則匹配,不滿足補充null
        1.左外連接,“(+)”在等號右邊

  例:select * from emp e,dept d where d.deptno = e.deptno(+);
        2.右外連接,“(+)”在等號左邊

  例:select * from emp e,dept d where d.deptno(+) = e.deptno;
        3.“(+)”在哪一邊的列,該表就補充null

sql1999
sql分類
    1.cross join  交叉連接 (笛卡爾積) ,不需要on關鍵字

  例: select * from emp cross join dept
    2.natural join  自然連接 (找兩個表中相同的列,進行等值匹配),不需要on關鍵字

  例: select * from emp natural join dept
    3.inner join 內連接
        1)必須有on關鍵字,on表示連接條件
        2)inner關鍵字可以省略

  --等值連接
        select e.ename,d.dname from emp e  INNER JOIN  dept d on e.deptno = d.deptno where e.sal > 2000
        --非等值連接
        select e.ename,s.grade from emp e INNER JOIN salgrade s on e.sal between s.losal and s.hisal
        --自連接
        select e1.ename || '的上司是' || e2.ename from emp e1 INNER JOIN emp e2 on e1.mgr = e2.empno


    4.outer join 外連接,outer關鍵字可以省略
        1) left outer join

  例:select * from emp e LEFT OUTER JOIN dept d on e.deptno = d.deptno
        2) right outer join

  例:select * from emp e RIGHT OUTER JOIN dept d on e.deptno = d.deptno
        3) full outer join
  例:select * from emp e FULL OUTER JOIN dept d on e.deptno = d.deptno

 

--如何進行多表連接

--查詢員工的姓名、薪水、部門名稱及工資等級
select e.ename, e.sal, d.dname, s.grade
  from emp e, dept d, salgrade s
 where e.deptno = d.deptno
   and e.sal between s.losal and s.hisal

select e.ename, e.sal, d.dname, s.grade
  from emp e
  join dept d
    on e.deptno = d.deptno
  join salgrade s
    on e.sal between s.losal and s.hisal
    
--子查詢
--在where中使用的子查詢

例:
--查詢部門名稱為RESEARCH、SALES
select *
  from emp
 where deptno in
       (select deptno from dept where dname in ('RESEARCH', 'SALES'))
--查詢有哪些人的薪水是在整個雇員的平均薪水之上的
select ename,empno, sal, sal+nvl(comm,0)
from emp
where sal+nvl(comm,0)>(select avg(sal+nvl(comm,0)) from emp);
--查在雇員中有哪些人是經理人
select empno, ename
from emp
where empno in (
select distinct mgr from emp
);
--找出部門編號為20的所有員工中收入最高的職員
select * from emp
where sal >= all(
select sal
from emp
where deptno = 20)
and
deptno = 20
      

--在from后面使用子查詢

例:
--我們要求每個部門平均薪水的等級
select t1.deptno, t1.savg, s.grade
  from (select deptno, avg(sal) savg from emp group by deptno) t1
  join salgrade s
    on t1.savg between s.losal and s.hisal

--求每個部門薪水的平均等級
select t1.deptno, avg(t1.grade)
  from (select e.deptno, s.grade
          from emp e, salgrade s
         where e.sal between s.losal and s.hisal) t1
 group by t1.deptno

---恢復內容結束---


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM