1. 程式人生 > >Mybatis學習之路之Oracle多表查詢

Mybatis學習之路之Oracle多表查詢

Oracle 的多表查詢 ,主要是結合各種查詢進行組合。從而構造出一個複雜的查詢。
所以首先得掌握一些常用的多表查詢的方法。再根據實際情況來進行組合。
首先介紹的是
Union:
將多個表的結果集去除重複取並集 (使用的表是自帶的學習表 emp dept salgrade) 注意 被取出的欄位資料型別得相同
例子

Select empno from emp 
    Union 
Select deptno from dept;
結果

這裡寫圖片描述

Union all 將多個表取並集(不會去除重複)
注意 被取出的欄位資料型別得相同
使用方法與union一致

子查詢
SELECT <欄位列表> from table_name where 欄位 運算子( SELECT 語句 );

示例:
select * from emp where sal=(select max(sal) from emp);

運算子
Any 資料集中的任一個資料(下限)

select * from emp where sal>ANY(select sal from emp where deptno=30) and deptno 30;
找出比deptno=30的員工最低工資高的其他部門的員工

ALL 資料集的所有的資料(上限)

select * from emp where sal>ALL(select sal from emp where deptno=30) and deptno=30;
找出比deptno=30的員工最高工資高的其他部門的員工

IN (條件) 所有滿足在條件列表中的記錄

例如
select * from emp where empno in(7788,7369,7499);
找出empno是7788或者7369或者7499的記錄

NOT IN (條件) 所有不滿足在條件列表中的記錄

select * from emp where empno not in(7788,7369,7499);
找出empno不是7788或者7369或者7499的記錄

EXIST(資料集),NOT EXIST和in ,not in的意思差不多

select * from table1 where exists ( select null from table2 where y = x )

執行的過程相當於:(重點理解)

for x in ( select * from table1 )
   loop
      if ( exists ( select null from table2 where y = x.x )
      then 
         OUTPUT THE RECORD
      end if
end loop

例子
這裡寫圖片描述
解釋
上圖的查詢就是每當在emp中取出一個數據 就去判斷是否滿足EXISTS中的要求
當emp取出 sal=3000 時 去 EXISTS中判斷 發現 hisal中有3000所以滿足於是就輸出了
和IN的方法差不多

連線查詢
SELECT <欄位列表> from table1,table2 WHERE table1.欄位=table2.欄位

示例
select empno,ename,dname from emp,dept where emp.deptno=dept.deptno;

查詢指定行數的資料
SELECT <欄位列表> from table_name WHERE ROWNUM<行數;

示例:
select * from emp where rownum<=10;--查詢前10行記錄
注意ROWNUM只能為1 因此不能寫 select * from emp where rownum between 20 and 30;

要查第幾行的資料可以使用以下方法:

select * from (select * from emp where rownum <=6) where rownum >= 3;
結果可以返回整個資料的3-6行;

表連線

Inner join
返回兩表相匹配的資料

Left join
左表為主表 返回所有的資料,右表只返回與左表相匹配的部分

Right join
右表為主表 返回所有的資料,左表只返回與右表相匹配的部分

Full join
左右表均返回所有資料但只有匹配的資料顯示在同一行

將emp表中的薪水大於1300依照salgrade表中的薪水等級來計算emp表中的薪水對應的等級

select e.ename,e.sal,s.grade from emp e (這裡分別改為inner join,left join,right join,full join 來對比結果) salgrade s on e.sal>=s.losal and e.sal<=s.hisal and e.sal >= 1300order by 3 asc;

結果
inner join

這裡寫圖片描述

left join

這裡寫圖片描述

right join

這裡寫圖片描述

full join
這裡寫圖片描述

關係圖

這裡寫圖片描述

總結
Oracle的基礎差不多到此結束。資料庫的使用主要還是依靠實際中的需求。
Oracle的增刪改查,看起來簡單,其實要想用好,還是需要大量的鍛鍊。
各種查詢的組合以及對效率的優化,這些不在真正的生產環境中是學不了的。
寫這博文的目的,一是為了鍛鍊自己的表達能力,二是讓自己對知識進行總結。

水平有限 若有錯誤 歡迎指正