1、關於多表查詢的解決思路
--思考題:要求查詢出每個雇員的編號,姓名,工資,部門名稱,工資所在公司的工資等級 --第一步確定所需要的表,以及表中字段 --emp,dept,salgrade --emp:雇員編號,姓名,工資 --dept: 部門名稱 --salgrade: 工資等級 --第二步確定表的關聯字段 --emp.deptno=dept.deptno --emp.sal between salgrade.losal and salgrade.hisal --第三步:查詢每個雇員的信息 select e.empno,e.ename,e.sal from emp e --第四步:為查詢引入部門信息,並添加消除笛卡爾積的條件 select e.empno,e.ename,e.sal,d.dname from emp e,dept d where e.deptno=d.deptno --第五步:為查詢引入工資等級信息,並添加消除笛卡爾積德條件 select e.empno,e.ename,e.sal,d.dname,s.grade from emp e,dept d,salgrade s where e.deptno=d.deptno and e.sal between s.losal and s.hisal
2、左右連接
關於左右連接指的是查詢判斷條件的參考方向,例如:下面有如下查詢:
select * from emp e,dept d where e.deptno = d.deptno;
部門一共有四個,但是現在只返回了三個部門的信息,缺少40部門,因為在雇員表之中沒有一條記錄是屬於40部門的,所以現在不會顯示40部門的信息,即:現在的查詢以emp表為參考,那么如果說現在非要顯示40部門呢?就必須改變這種參考的方向,就要使用左右連接。
因為SQL1999語法適用於多種數據庫所以這里直接學習該語法,一下是屬於多個語法的聯合
select table1.column,table2.column from table1 [cross join table2]| [natural join table2]| [join table2 using(column_name)]| [join table2 on(table1.column_name = table2.column_name)]| [left|right|full outer join table2 on(table1.column_name = table2.column_name];
接下來分塊說明語法的使用
a、交叉連接(cross join):用於產生笛卡爾積(笛卡爾積本身並不是屬於無用的內容,在某些情況下還是需要使用的)
select * from emp cross join dept;
b、自然連接(natural join):自動找到匹配的關聯字段,消除掉笛卡爾積
select * from emp natural join detp
但是並不是所有的字段都是關聯字段,設置關聯字段需要通過約束指定;
c、join using子句:用戶自己指定一個消除笛卡爾積的關聯字段
select * from emp join dept using(deptno);
d、join ... on子句:用戶自己指定一個可以消除笛卡爾積德關聯條件
select * from emp join dept on(emp.deptno=dept.deptno);
e、連接方向的改變:
左(外)連接: left outer join ...on;
右(外)連接: right outer join ...on;
全(外)連接: full outer join ...on;
select * from emp right outer join dept on(emp.deptno=dept.deptno);
注:在Oracle之外的數據庫都是使用的以上的sql:1999語法操作,所以這個語法一定要會。
工作中使用的語句
場景1: 兩個表查詢A and B 其中從 B表中查詢出的值做為A表的查詢條件進行查詢
SELECT t.name,t.* FROM A t WHERE t.id=(SELECT c.area_id FROM B c WHERE c.id=193084); SELECT c.* FROM A c JOIN B t ON c.id=t.area_id WHERE t.`id`=193084 SELECT * FROM A si LEFT JOIN B st ON si.id = st.f_si WHERE si.id IN(85656,85689,85701,85704,85644,85692,85632,85620);