天天看點

oracle(14)_SQL_多表聯合查詢_基本查詢

SQL

多表查詢

多表連接配接基本查詢
  • 使用一張以上的表做查詢就是多表查詢。
  • 文法:
SELECT {DISTINCT} * | 列名 ..
     FROM 表名 别名,表名1 别名 {WHERE 限制條件
    ORDER BY 排序字段 ASC | DESC .. .}      

​範例:查詢員工表和部門表​

  • 員工表
    oracle(14)_SQL_多表聯合查詢_基本查詢
  • 部門表
    oracle(14)_SQL_多表聯合查詢_基本查詢
  • 查詢員工表和部門表
    oracle(14)_SQL_多表聯合查詢_基本查詢
  • 我們發現産生的記錄數是 48 條,我們還會發現 emp 表是12條,dept 表是 4 條,48 正是 emp 表和dept 表的記錄數的乘積,我們稱其為笛卡爾積。
  • 如果多張表進行一起查詢而且每張表的資料很大的話笛卡爾積就會變得非常大,對性能造成影響,想要去掉笛卡爾積我們需要關聯查詢。
  • 在兩張表中我們發現有一個共同的字段是 depno,depno 就是兩張表的關聯的字段,我們可以使用這個字段來做限制條件,兩張表的關聯查詢字段一般是其中一張表的主鍵,另一張表的外鍵。
  • 示例圖:
    oracle(14)_SQL_多表聯合查詢_基本查詢
    關聯之後我們發現資料條數是12 條,不再是 48 條。
  • 多表查詢我們可以為每一張表起一個别名。
  • 示例圖:
    oracle(14)_SQL_多表聯合查詢_基本查詢

​範例:查詢出雇員的編号,姓名,部門的編号和名稱,位址​

  • 示例圖:
    oracle(14)_SQL_多表聯合查詢_基本查詢

​範例:查詢出每個員工的上級上司​

  • 分析:emp 表中的 mgr 字段是目前雇員的上級上司的編号,是以該字段對 emp 表産生了自身關聯,可以使用 mgr 字段和 empno 來關聯。
  • 示例圖:
    oracle(14)_SQL_多表聯合查詢_基本查詢

​範例:在上一個例子的基礎上查詢該員工的部門名稱​

  • 分析:隻要在上一個例子基礎上再加一張表的關聯,使用 deptno 來做關聯字段即可
  • 示例圖:
    oracle(14)_SQL_多表聯合查詢_基本查詢

​範例:查詢出每個員工編号,姓名,部門名稱,工資等級和他的上級上司的姓名,工資等級​

  • 示例圖:
    oracle(14)_SQL_多表聯合查詢_基本查詢

​以上操作完整源碼:​

--查詢員工表和部門表
select * from emp, dept;

--關聯查詢員工表和部門表
select * from emp, dept  where emp.deptno = dept.deptno;

select * from emp e, dept d where e.deptno = d.deptno;

--查詢出雇員的編号,姓名,部門的編号和名稱,位址
select e.empno, e.ename, d.deptno, d.dname, d.loc
  from emp e, dept d
 where e.deptno = d.deptno;
 
 ---查詢出每一個員工的上級上司
 select e.empno, e.ename, e1.empno, e1.ename
   from emp e, emp e1
  where e.mgr = e1.empno;
  
  --查詢每一個員工的上級上司和部門名稱
  select e.empno, e.ename, e1.empno, e1.ename, d.dname
    from emp e, emp e1, dept d
   where e.mgr = e1.empno
     and e.deptno = d.deptno;   
    
--查詢出每個員工編号,姓名,部門名稱,工資等級和他的上級上司的姓名,工資等級
select e.empno,
       e.ename,
       d.dname,
       decode(s.grade,
              1,
              '一級',
              2,
              '二級',
              3,
              '三級',
              4,
              '四級',
              5,
              '五級',
              '無級') egrade,
       e1.ename,
       decode(s1.grade,
              1,
              '一級',
              2,
              '二級',
              3,
              '三級',
              4,
              '四級',
              5,
              '五級',
              '無級') e1grade
  from emp e, dept d, salgrade s, emp e1, salgrade s1
 where e.deptno = d.deptno
   and e.sal between s.losal and s.hisal
   and e.mgr = e1.empno
   and e1.sal between s1.losal and s1.hisal