多表查詢(xún)之左外連接查詢(xún)
## 多表: 一對(duì)多和多對(duì)多
## “一對(duì)一”建表原則
可以寫(xiě)在一個(gè)表中;
當(dāng)表中字段很少的時(shí)候烤芦;
拆成多張表举娩;
但是當(dāng)表中字段過(guò)多,可以把表拆成好幾個(gè)构罗;
這樣每個(gè)表中字段就少了铜涉;那么這個(gè)時(shí)候就得使用“外鍵”了,把表與表連接起來(lái)遂唧;
## 一對(duì)多建表原則
必須兩個(gè)表 一個(gè)“主表”
一個(gè)“從表”
在“從表”中必須有個(gè)字段芙代,
這個(gè)字段引用“主表”的主鍵;
“從表”中這個(gè)字段就是“從表”的外鍵盖彭;
舉例:省和市這兩個(gè)表:一個(gè)省對(duì)應(yīng)多個(gè)市纹烹;顯然是一對(duì)多的關(guān)系;
## 多對(duì)多建表原則
必須有三張表
其中必須有一張“中間表”
舉例:
假設(shè)有表A召边,是明星表铺呵;有表B,是角色表隧熙;
需要“中間表”C片挂,分別是“表A一條記錄”和“表B一條記錄”的任意組合;
顯然贞盯,一個(gè)演員可以對(duì)應(yīng)多個(gè)角色音念;一個(gè)角色也可以對(duì)應(yīng)多個(gè)演員;
舉例
“權(quán)限和角色”躏敢,“學(xué)生和課程表”
/////
<!--
一對(duì)多
用戶(hù)角度:
一個(gè)用戶(hù)可以有多個(gè)訂單是一對(duì)多的角度症昏;
一對(duì)一(業(yè)務(wù)邏輯上的一對(duì)一; 因?yàn)橐粋€(gè)訂單只能對(duì)應(yīng)一個(gè)用戶(hù)父丰。肝谭。):
左外連接 selct * from A left outer join B on 條件;
把訂單表當(dāng)成主表蛾扇;
select o.*,u.username,u.birthday,u.sex,u.address from mybatis.orders o left outer join mybatis.user u on o.user_id=u.id;
一對(duì)多(業(yè)務(wù)邏輯上的一對(duì)多攘烛;是業(yè)務(wù)邏輯;镀首;因?yàn)橐粋€(gè)用戶(hù)可以對(duì)用多個(gè)訂單):
左外連接 selct * from A left outer join B on 條件坟漱;
如果沒(méi)有訂單的人也要顯示出來(lái)的話(huà),就用user;把用戶(hù)當(dāng)成主表更哄;使用的左外連接芋齿;
使用左外連接得到的是個(gè)并集腥寇;主表記錄全部展示间影;
select * from mybatis.user u left outer join mybatis.orders o on o.user_id=u.id;
如果沒(méi)有訂單的人不要顯示出來(lái)的話(huà)仑扑,就用user;把用戶(hù)當(dāng)成主表;使用的內(nèi)連接妇汗;
顯示內(nèi)連接: select * from A inner join B on 條件栅炒;
內(nèi)連接得到的結(jié)果是個(gè)交集掂摔;; 把主表中無(wú)關(guān)的記錄都過(guò)濾掉了赢赊;
select * from mybatis.user u inner join mybatis.orders o on o.user_id=u.id;
除掉多余的類(lèi);;; 給o.id 取個(gè)別名 oid
select u.*, o.id oid, o.number,o.createtime, o.note
from mybatis.user u
inner join mybatis.orders o
on o.user_id=u.id;
-->
//////////////
/////////////
字典數(shù)據(jù)表乙漓;關(guān)聯(lián)查詢(xún);
crm.sql建表释移;
多表關(guān)聯(lián)查詢(xún)叭披, 就是。記錄 對(duì) 記錄玩讳;
主表上的一條記錄對(duì)應(yīng) 另外一張表上的一條或者多條記錄趋观;
但是 最后查詢(xún)出來(lái)的就是個(gè)組合排列;
而不是 大雜燴锋边, 主表的一條記錄上包含了另外一張表的多條記錄;這是錯(cuò)誤的编曼;
是平鋪的豆巨;
這是一對(duì)一的關(guān)系;
主表一條記錄結(jié)合另外一張表的一條記錄掐场, 合并成一條記錄往扔;
如果是一對(duì)多的關(guān)系;也是一樣的熊户;
主表一條記錄結(jié)合另外一張表的一條記錄萍膛, 合并成一條記錄;
/////////////////
進(jìn)階版嚷堡; 替換掉多余字段蝗罗;
關(guān)聯(lián)查詢(xún)
select
cust_id,
cust_name,
cust_user_id,
cust_create_id,
b1.dict_item_name cust_source,
b2.dict_item_name cust_industry,
b3.dict_item_name cust_level,
cust_linkman,
cust_phone,
cust_mobile,
cust_zipcode,
cust_address,
cust_createtime
from customer c
left outer join base_dict b1 on c.cust_source=b1.dict_id
left outer join base_dict b2 on c.cust_industry=b2.dict_id
left outer join base_dict b3 on c.cust_level=b3.dict_id
where c.cust_name like "%黑馬%"and cust_source='6' and cust_industry='1' and cust_level='22' limit 0,5 ;
左外連接 selct * from A left outer join B on 條件;
left 左邊的作為主表蝌戒;右邊的作為從表串塑;
查詢(xún)的主體是主表,然后從從表中取出指定的字段數(shù)據(jù)(滿(mǎn)足條件的一條記錄中的指定字段數(shù)據(jù))添加補(bǔ)充到主表中北苟;
從表查詢(xún)的過(guò)程是桩匪, 先找到滿(mǎn)足條件的一條記錄, 然后再?gòu)倪@條記錄中取出指定的字段友鼻, 添加到主表中對(duì)應(yīng)的記錄中傻昙, 作為最終查詢(xún)的結(jié)果闺骚;