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的增刪改查,看起來簡單,其實要想用好,還是需要大量的鍛鍊。
各種查詢的組合以及對效率的優化,這些不在真正的生產環境中是學不了的。
寫這博文的目的,一是為了鍛鍊自己的表達能力,二是讓自己對知識進行總結。
水平有限 若有錯誤 歡迎指正