數據庫的多表查詢及左右連接


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);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM