MySQL高級之自關聯

設計省信息的表結構provincessql

  • id
  • ptitle

設計市信息的表結構citysspa

  • id
  • ctitle
  • proid

citys表的proid表示城市所屬的省,對應着provinces表的id值設計

問題:能不能將兩個表合成一張表呢?code

思考:觀察兩張表發現,citys表比provinces表多一個列proid,其它列的類型都是同樣的blog

意義:存儲的都是地區信息,並且每種信息的數據量有限,不必增長一個新表,或者未來還要存儲區、鄉鎮信息,都增長新表的開銷太大ci

答案:定義表areas,結構以下it

  • id
  • atitle
  • pid

由於省沒有所屬的省份,因此能夠填寫爲null社區

城市所屬的省份pid,填寫省所對應的編號idtable

這就是自關聯,表中的某一列,關聯了這個表中的另一列,可是它們的業務邏輯含義是不同的,城市信息的pid引用的是省信息的idclass

在這個表中,結構不變,能夠添加區縣、鄉鎮街道、村社區等信息

建立areas表的語句以下:

create table areas(
    id int primary key,
    atitle varchar(20),
    pid int,
    foreign key(pid) references areas(id)
);

從sql文件中導入數據

source areas.sql;

查詢一共有多少個省

查詢省的名稱爲「山西省」的全部城市

select city.* from areas as city
inner join areas as province on city.pid=province.id
where province.atitle='山西省';

 

查詢市的名稱爲「廣州市」的全部區縣

select dis.*,dis2.* from areas as dis
inner join areas as city on city.id=dis.pid
left join areas as dis2 on dis.id=dis2.pid
where city.atitle='廣州市';
相關文章
相關標籤/搜索