天天看點

MySQL查詢 8:自關聯查詢

  • 設計省資訊的表結構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='廣州市';