- 設計省資訊的表結構provinces
- id
- title
- proid
- 設計市資訊的表結構citys
- id
- title
- proid
- 設計區縣資訊表結構areas
- id
- title
- proid
- title表示名稱,proid表示所屬上一級的id值,比如citys.proid 是對應所屬省份的id,areas.proid對應的是所屬城市的id值
問題:
能不能将三個表合成一張表呢?
思考:
觀察三張表發現,表的結構都是一樣的,存儲的都是地區資訊,而且每種資訊的資料量有限
意義:
假如合成一張表,即可減少建立表的開銷,也用不着多個表關聯查詢
答案:
- id
- atitle
- pid
- 因為省沒有所屬的省份,是以可以填寫為null
- 城市所屬的省份pid,填寫省所對應的編号id
- 區縣所屬的城市pid,填寫城市所對應的編号id
- 這就是自關聯,表中的某一列,關聯了這個表中的另外一列,但是它們的業務邏輯含義是不一樣的,城市資訊的pid引用的是省資訊的id
create table areas(
aid int primary key,
atitle varchar(20),
pid int
);
- 從sql檔案中導入資料
source areas.sql;
- 查詢一共有多少個省
select count(*) from areas where pid is null;
- 例1:查詢省的名稱為“山西省”的所有城市
select city.* from areas as city
inner join areas as province on city.pid=province.aid
where province.atitle='山西省';
- 例2:查詢市的名稱為“廣州市”的所有區縣
select dis.* from areas as dis
inner join areas as city on city.aid=dis.pid
where city.atitle='廣州市';