要查詢的數據分佈在多張表中(分佈咋一張表,數據太多會形成冗餘,並且分佈在多張表有利於增刪改查)。sql
****s_dept——系統自帶的部門表spa
裏面有三項信息:ID NAME REGION_ID3d
select * from s_dept;
****s_region——系統自帶的地區表blog
裏面有兩項信息:ID NAMEio
select * from s_region;
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;(調整格式)
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;
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;
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員工表有兩層業務含義的數據:
領導是員工
有些員工是領導,有些員工是普通員工,但都在一張表裏
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;
select distinct m.id, m.first_name from s_emp e, s_emp m where e.manager_id!=m.id;
。。。。。。
這樣輸出了全部的,是不正確的,因此它的對立面不是這樣簡單的做法。因此要引入外鏈接。