關聯查詢/ 多表查詢
當查詢的結果來自多張表的時候,使用關聯查詢。
SELECT * FROM EMP ;
SELECT * FROM DEPT;
SELECT E.*,D.*
FROM EMP E,DEPT D
WHERE E.DEPTNO = D.DEPTNO;
內關聯
取2個表的交集部門,通過關聯字段比較,如果匹配不到的,就不取值。
- oracle 內關聯寫法
這些寫法,區別不大,既是關聯條件也是過濾條件。只是執行順序不同而已
--
SELECT *
FROM EMP E, DEPT D -- 如果不寫下面的關聯條件,那麼直接查詢2張表,會產生笛卡爾積
WHERE E.deptno = D.deptno; -- 關聯字段
/* WHERE 條件1
AND 條件2
SELECT *
FROM EMP E, DEPT D -- 如果不寫下面的關聯條件,那麼直接查詢2張表,會產生笛卡爾積
--WHERE E.deptno = D.deptno; -- 關聯字段
2. MYSQL 寫法
SELECT *
FROM EMP E INNER JOIN DEPT D
ON E.deptno = d.deptno ;
INNER JOIN
ON 條件1
WHERE 條件2
這種寫法 ON 後面跟的是關聯條件, WHERE 後面纔是過濾條件。
外關聯
左外/右外
1.ORACLE 寫法
SELECT *
FROM EMP E , DEPT D
WHERE E.deptno = D.deptno(+) ; --左外
SELECT *
FROM EMP E , DEPT D
WHERE E.deptno(+) = D.deptno ; --右外
2.MYSQL寫法
SELECT *
FROM EMP E LEFT /*OUTER*/ JOIN DEPT D --左外關聯
ON E.deptno = d.deptno ;
SELECT *
FROM EMP E RIGHT /*OUTER*/ JOIN DEPT D --右外關聯
ON E.deptno = d.deptno ;
全外關聯
ORACLE 和 SQL 寫法一樣
SELECT *
FROM EMP E FULL /*OUTER*/ JOIN DEPT D
ON E.deptno = d.deptno ;
CREATE TABLE TESTA(C1 NUMBER);
CREATE TABLE TESTB(C2 NUMBER);
SELECT *
FROM TESTA FULL JOIN TESTB
ON C1 = C2
等值關聯
SELECT *
FROM EMP E ,DEPT D
WHERE E.deptno = D.deptno ;
不等值關聯
假設dept表示球隊信息表,通過SQL查出各個球隊可能的比賽組合
- 不考慮主客場的比賽組合
SELECT A.deptno , B.deptno
FROM DEPT A ,DEPT B
WHERE A.deptno > B.deptno ;
2. 主客場的比賽組合
SELECT A.deptno , B.deptno
FROM DEPT A ,DEPT B
WHERE A.deptno != B.deptno ;
3.查出領導的姓名 ,員工的姓名
SELECT E.ENAME ,--領導姓名
F.ename -- 員工姓名
FROM EMP E ,EMP F
WHERE E.empno = F.mgr;--一張表當兩張表用,關聯條件
4.查出員工的工資等級
SELECT E.ENAME ,
E.SAL ,
S.*
FROM EMP E, salgrade S --員工等級表
WHERE E.SAL BETWEEN S.losal AND S.hisal;