-
設(shè)計(jì)省信息的表結(jié)構(gòu)provinces
- id
- ptitle
-
設(shè)計(jì)市信息的表結(jié)構(gòu)citys
- id
- ctitle
- proid
citys表的proid表示城市所屬的省栅干,對應(yīng)著provinces表的id值
問題:
能不能將兩個(gè)表合成一張表呢毫蚓?
思考:
觀察兩張表發(fā)現(xiàn),citys表比provinces表多一個(gè)列proid悴侵,其它列的類型都是一樣的
意義:
存儲的都是地區(qū)信息,而且每種信息的數(shù)據(jù)量有限豌习,沒必要增加一個(gè)新表步责,或者將來還要存儲區(qū)、鄉(xiāng)鎮(zhèn)信息鹅搪,都增加新表的開銷太大
答案:
定義表areas站绪,結(jié)構(gòu)如下
- id
- atitle
- pid
說明:
- 因?yàn)槭]有所屬的省份,所以可以填寫為null
- 城市所屬的省份pid涩嚣,填寫省所對應(yīng)的編號id
- 這就是自關(guān)聯(lián)崇众,表中的某一列掂僵,關(guān)聯(lián)了這個(gè)表中的另外一列航厚,但是它們的業(yè)務(wù)邏輯含義是不一樣的,城市信息的pid引用的是省信息的id
- 在這個(gè)表中锰蓬,結(jié)構(gòu)不變幔睬,可以添加區(qū)縣、鄉(xiāng)鎮(zhèn)街道芹扭、村社區(qū)等信息
創(chuàng)建areas表的語句如下:
create table areas(
aid int primary key,
atitle varchar(20),
pid int
);
- 從sql文件中導(dǎo)入數(shù)據(jù)
source areas.sql;
示例:
-- 自關(guān)聯(lián)
-- 查詢所有省份
select * from areas where pid = 1;
-- 查詢山東省有哪些市
select id from areas where name = "山東省"; -- 查詢id
select * from areas where pid = 17;
-- 查詢山東省有哪些市 一步查詢
-- 一個(gè)表可以通過 as 重命名為兩個(gè)表
select province.name,city.name from areas as province inner join areas as city on province.id = city.pid having province.name="山東省";