多表查詢

概念

要查詢的數據分佈在多張表中(分佈咋一張表,數據太多會形成冗餘,並且分佈在多張表有利於增刪改查)。sql

語法

(1)若是這樣:from  表1,表2;——這樣會產生笛卡爾積

****s_dept——系統自帶的部門表spa

裏面有三項信息:ID  NAME REGION_ID3d

select * from s_dept;

 

****s_region——系統自帶的地區表blog

裏面有兩項信息:ID  NAMEio

select * from s_region;

演示:列出部門的id name  以及部門的地區信息(要名稱不要id)

select id, name, region_id from s_dept, s_region;

  

兩張表裏有同名的字段,會出現混淆class

再加上表名錶明信息來源於哪一個表,這樣就會出現笛卡爾積select

select s_dept, id, s_dept, name, region_id, s_region, name from s_dept, s_region

 

輸出了60條數據,原本不可能有這麼多數據的,這說明產生了笛卡爾積。語法

 

這時應該使用鏈接條件,避免笛卡爾積:im

select s_dept.id,s_dept.nam,region_id,s_region.name
from s_dept,s_region
where region_id=s_region.id/*鏈接條件*/ ;
col  name for  a15;(調整格式)

(2)因此用法應該是:

  • select  字段,表名.重名的字段,from  表1,表2
  • where  表的鏈接條件;(三張表至少須要兩個鏈接條件)

演示:列出每一個員工的id  first_name  和這個員工的所在部門名

  • s_emp:dept_id   部門編號
  • s_dept:id       部門編號
select s_emp.id, first_name, name from s_emp, s_dept where dept_id=s_dept.id;

表的別名  簡化查詢的書寫

select s_emp.id, first_name.name from s_emp e, s_dept d where dept_id=d.id;

起了別名後就只能用別名,否則會報錯!d3

 

select e.id, first_name.name from s_emp e, s_dept d where dept_id=d.id;

  

演示:列出員工first_name  和員工所在的部門名以及部門對應的地區名

 

select first_name, d.name, r.name from s_emp e, s_dept d, s_region where e.dept_id=d.id and d.region_id=r.id;

 

***salgrade  工資級別表

GRADE 工資級別(1~5個級別)

LOSAL  級別的低工資

HISAL  級別的高工資

 

select * from salgrade;

  

演示:列出每一個員工的id和salary,以及工資對應的級別  

select e.id, e.salary, s.grade from s_emp e, salgrade s where e.salary between s.losal and hisal;

  

 

或者:

select e.id, e.salary, s.grade from s_emp e, salgrade s where salary>=losal and salary<=hisal;

 

按id排個序:

select e.id, e.salary, s.grade from s_emp e.salgrade s where salary>=losal and salary<=hisal order by id;

自鏈接

  • 使用等號鏈接表叫等值鏈接
  • 不使用等號鏈接叫非等值鏈接
  • 特殊的鏈接:自鏈接

一張表中有兩層或兩層以上業務含義的數據,要找出其中一層數據就邏輯上把一張表當成兩張表使用。

例如:

s_emp員工表有兩層業務含義的數據:

領導是員工

有些員工是領導,有些員工是普通員工,但都在一張表裏

演示:要求從s_emp表中找出全部的領導(有人的manager_id是其id)

 

select m.id, m.first_name from s_emp e, s_emp m where e.manager_id=m.id;

 

把一張表當成兩張表用.

可是這樣會有重複的,由於一個領導可能管了幾我的.

因此要進行排重.

 

select distinct m.id, m.first_name from s_emp e, s_emp m where e.manager_id=m.id;

 

演示:要求從s_emp表中找出全部普通員工(應該有17個)

select distinct m.id, m.first_name from s_emp e, s_emp m where e.manager_id!=m.id;

  。。。。。。

  

這樣輸出了全部的,是不正確的,因此它的對立面不是這樣簡單的做法。因此要引入外鏈接。

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息