多表連線查詢

2021-07-07 08:39:28 字數 4832 閱讀 4210

--1、內連線 inner join:

--只返回兩個表中所有滿足連線條件的行

--2、外連線outer join:

--除了返回兩個表中所有滿足連線條件的行之外,還返回

--某個表中不滿足連線條件的行

--3、交叉連線

--產生笛卡爾積的連線

--如果連線條件使用等號=,就可以叫做相等連線

--1、使用natural join關鍵字進行內連線

--這種語法會自動地從兩個表中挑選所有同名同型別的列作為連線列

--進行相等連線

--查詢每個部門的部門編號、名稱、所在位置編號以及所在城市

--名稱

select department_id,department_name,

location_id,city

from departments

natural join locations;

--缺點:

--1、不能自己挑選連線列

--2、**不直觀,不能看出連線條件是什麼

--2、為了改進以上缺陷,可以使用using子句來做連線

--語法:using(列名),含義:使用指定的兩個表中的同名列作為

--連線列進行相等連線

--查詢每個部門的部門編號、名稱、所在位置編號以及所在城市

--名稱

select department_id,department_name,

location_id,city

from departments

join locations

using(location_id);

--使用using做連線,也有乙個語法限制:

--using用到的連線列,在select語句的任何地方(包括using自己),

--都不允許加表別名來限定它

--ora-01748: 此處只允許簡單的列名

select department_id,department_name,

location_id,city

from departments d

join locations l

using(d.location_id);

--ora-25154: using 子句的列部分不能有限定詞

select department_id,department_name,

location_id,city

from departments d

join locations l

using(location_id)

where l.location_id > 1700;

--如果定義了表別名,那麼一般都在列名前面加表別名進行限定

select d.department_id,d.department_name,

location_id,l.city

from departments d

join locations l

using(location_id);

--3、使用on子句指定連線條件,比using更加靈活、方便

--查詢雇員的編號、姓名、所在部門號、以及部門的位置編號

selecte.employee_id,e.last_name,e.department_id,

d.department_id,d.location_id

from employees e

join departments d

on (e.department_id =d.department_id )

where  d.location_id =1700;

--實際中寫連線查詢,老式的寫法還是最多的。

--它是將所有做連線的表名都寫在from子句中,然後在

--where中寫連線條件

selecte.employee_id,e.last_name,e.department_id,

d.department_id,d.location_id

from employees e, departments d

where e.department_id =d.department_id

and d.location_id = 1700;

--老式的寫法乙個弊病就是:它把連線條件和過濾條件

--混寫在了一起,**可讀性較差。on子句就解決了這個問題

--3表連線查詢

--寫多個join on子句

--查詢雇員的編號、所在部門號、以及部門所在城市名稱

selecte.employee_id,d.department_id,l.city

from employees e

join departments d

on(e.department_id = d.department_id)

join locations l

on(l.location_id = d.location_id);

--自連線查詢self join:

--一張表連線到它自己做連線查詢。

--技巧:給一張表分別取兩個不同的別名,看成是兩張表,

--然後進行連線

--查詢每個雇員的姓名及其對應的經理的名字

select worker.last_name,manager.last_name

from employees worker

join employees manager

on (worker.manager_id =manager.employee_id);

--使用不等連線:連線條件不使用等號。很少見

create table job_grades(

grade_level varchar2(1),

lowest_sal number,

highest_sal number

);insert into job_grades 

values('a',1000,2999);

insert into job_grades 

values('b',3000,5999);

insert into job_grades 

values('c',6000,7999);

--查詢雇員的姓名、薪水以及工資級別

select e.last_name,e.salary,j.grade_level

from employees e

join job_grades j

on (e.salary between j.lowest_sal andj.highest_sal);

--外連線查詢

--3種:

--left join:左外連線

--right join :右外連線

--full join:全外連線

--1)left join:左外連線

--除了返回兩個表中所有滿足連線條件的行之外,還返回左表中

--所有不滿足連線條件的行。所謂左表,就是寫在left關鍵字

--左邊的表

--查詢雇員的姓名、部門編號以及部門名稱,要求沒有部門的雇員

--也要顯示

select e.last_name,e.department_id,

d.department_name

from employees e

left join departments d

on (e.department_id =d.department_id);

--2)right join:右外連線

--除了返回兩個表中所有滿足連線條件的行之外,還返回右表中

--所有不滿足連線條件的行。所謂右表,就是寫在rightjoin關鍵字

--右邊的表

--查詢雇員的姓名、部門編號以及部門名稱,要求沒有雇員的部門

--也要顯示

select e.last_name,e.department_id,

d.department_name

from employees e

right join departments d

on (e.department_id =d.department_id);

--3)full join:全外連線

--除了返回兩個表中所有滿足連線條件的行之外,還返回兩個表中

--所有不滿足連線條件的行。

--查詢雇員的姓名、部門編號以及部門名稱,要求沒有雇員的部門

--以及沒有部門的雇員也要顯示

select e.last_name,e.department_id,

d.department_name

from employees e

full join departments d

on (e.department_id =d.department_id);

--連線查詢時,應該避免產生笛卡爾積:

--當乙個連線查詢沒有寫連線條件或者連線條件非法時,其產生的結果集的行數

--就等於第乙個表的總行數乘上第二個表的總行數,這個

--結果集叫做笛卡爾積。

select last_name,department_name

from employees, departments ;

--連線條件非法  

select last_name,department_name

from employees 

join departments

on (1=1);  

--如果想專門產生笛卡爾積,可以使用cross join

select last_name,department_name

from employees

cross join departments ;

多表查詢(連線查詢)

多表查詢 資料 是多個表,這時注意一定要書寫連線條件。當n個表連線,至少需要n 1個連線條件。注意 1 如何判斷兩個表之間有公共列?型別一致 寬度一致。列名不能作為判斷標準,列名不同也能是公共列 如 emp的empno和emp的mgr 2 如何避免二義性問題?給每個屬性加歸屬。3 注意使用表別名。表...

多表連線查詢

1.如果乙個查詢需要多個表進行操作,就成為連線查詢。2.連線查詢實際上是通過各個表之間共同列的關聯性來查詢資料的,資料表之間的聯絡是通過表的字段值來體現的。查詢 劉偉 老師所教授的課程,要求列出教師號,教師姓名和課程號 1.方法一 select t.no,tn,cno from t,tc where...

多表連線查詢

多表連線查詢 本文主要列舉兩張和三張表來講述多表連線查詢。新建兩張表 表1 student 截圖如下 表2 course 截圖如下 此時這樣建表只是為了演示連線sql語句,當然實際開發中我們不會這樣建表,實際開發中這兩個表會有自己不同的主鍵。一 外連線 外連線可分為 左連線 右連線 完全外連線。1 ...