多表連接查詢 內連接(inner join) 目的:將多張表中能通過鏈接謂詞或者鏈接運算符連接起來的數據查詢出來。 等值連接(join...on(...=...)) --選出雇員的名字和雇員所在的部門名字 --(1)必須明確的指出重覆欄位屬於哪個表 select ename,dname dept.d... ...
多表連接查詢
內連接(inner join)
目的:將多張表中能通過鏈接謂詞或者鏈接運算符連接起來的數據查詢出來。
等值連接(join...on(...=...))
--選出雇員的名字和雇員所在的部門名字
--(1)必須明確的指出重覆欄位屬於哪個表
select ename,dname dept.deptno from emp,dept where emp.deptno = dept.deptno;
--(2)新語法:join...on(...=...)
select ename, dname from emp join dept on ( emp.deptno = dept.deptno);
非等值連接(join...on(...>...))
--求每個人的薪水值,名字和他的薪水處於第幾個級別
--(1)不使用連接查詢
select ename, sal, grade from emp, salgrade where sal between losal and hisal;
--或者
select ename, sal, grade from emp, salgrade where sal >= losal and sal <= hisal;
--(2)新語法:join...on(...between...and...)
select ename, grade from emp e join salgrade s on (e.sal between s.losal and s.hisal);
--(3)三表連接:取出雇員名字,他的部門名稱,和薪水等級其中名字第二個字母包含A的不要取出
select ename, dname, 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 ename not like '_A%';
從上面的例子也可以看出,比較的對象不僅可以是具體的數據,欄位名也可以作為比較的對象;一個join...on(...xxx...)只能連接兩張表,要連接兩張表以上,寫多個join...on(...xxx...)即可,之間用空格隔開。
自然鏈接(natural join...)
自然連接是在兩張表中尋找那些數據類型和列名都相同的欄位,然後自動地將他們連接起來,並返回所有符合條件按的結果。
--自動將emp表中的deptno和dept表中的deptno做了連接
select emp.ename,dept.dname from emp natural join dept;
交叉鏈接(cross join...)
交叉連接,交叉連接即返回這兩個表的笛卡爾積。
select * from emp cross join dept;
外連接(outer join)
目的:將兩張表中不能產生連接的數據也查詢出來。註意和內連接的區別:內連接只查詢符合連接條件的記錄,外連接則把不能產生連接的數據也查詢出來。
右外連接(right join... on(...=...))
概念:right join關鍵字右邊的表有一條(多條)不能產生連接的數據沒有在連接查詢中顯示出來,要想把他顯示出來,就要用到右連接。
--求每個雇員的名字,他所在部門的名稱,全部選出來,並且把多餘的部門也選出來(有一個部門沒有員工)
select ename, dname from emp e right join dept d on (e.deptno = d.deptno);
左外連接(left join...on(...=...)...)
概念:left join關鍵字左邊的表有一條(多條)不能產生連接的數據沒有在連接查詢中顯示出來,要想把他顯示出來,就要用到左連接。
--求這個人的名字,他經理人的名字,並且把沒有經理的員工也選出來
select e1.ename, e2.ename from emp e1 left join emp e2 on (e1.mgr = e2.empno);
全外連接(full join...on(...=...)...)
概念:把full join關鍵字左邊右邊沒有連接的記錄都查詢出來。
select ename, dname from emp e full join dept d on (e.deptno = d.deptno);
自連接
概念:為同一張表起不同的別名,然後當成兩張表來用。
--求這個人的名字,他經理人的名字(經理也是員工,經理編號就是員工編號)
select e1.ename,e2.ename from emp e1 join emp e2 on (e1.mgr = e2.empno)
小結
join後跟要連接的表,on後跟連接條件,將連接條件和過濾條件分開。
--SQL1992舊寫法
select ename,dname from emp e,dept d where e.deptno = d.deptno and e.ename not like '%A%';
--SQL1999新寫法
select ename,dname from emp e join dept d on(e.deptno = d.deptno) where e.ename not like '%A%';
子查詢
子查詢是一個 SELECT 語句,它嵌套在一個 SELECT語句、DELETE 語句、UPDATE 語句或嵌套在另一子查詢中。