--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 ...