1. 程式人生 > >自關聯

自關聯

自關聯

  • 設計省資訊的表結構provinces

    id
    ptitle

  • 設計市資訊的表結構citys

    id
    ctitle
    proid

  • citys表的proid表示城市所屬的省,對應著provinces表的id值
  • 問題:能不能將兩個表合成一張表呢?
  • 思考:觀察兩張表發現,citys表比provinces表多一個列proid,其它列的型別都是一樣的
  • 意義:儲存的都是地區資訊,而且每種資訊的資料量有限,沒必要增加一個新表,或者將來還要儲存區、鄉鎮資訊,都增加新表的開銷太大
  • 答案:定義表areas,結構如下

    id
    atitle
    pid

  • 因為省沒有所屬的省份,所以可以填寫為null
  • 城市所屬的省份pid,填寫省所對應的編號id
  • 這就是自關聯,表中的某一列,關聯了這個表中的另外一列,但是它們的業務邏輯含義是不一樣的,城市資訊的pid引用的是省資訊的id
  • 在這個表中,結構不變,可以新增區縣、鄉鎮街道、村社群等資訊
  • 建立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='廣州市';