最近有時間回顧了下mysql的join操作,特寫個總結(jié),以防自己下次還是遺忘或者是工作要用到時疏忽導(dǎo)致錯誤,廢話不多說,本文將通過具體例子介紹SQL中的各種常用Join的特性和使用場合:
1.測試中使用的mysql,且主要的示例表結(jié)構(gòu)及操作數(shù)據(jù)如下:
CREATE TABLE `tbl_dept`(
`id` INT(11) NOT NULL AUTO_INCREMENT,
`deptName` VARCHAR(30) DEFAULT NULL,
`locAdd` VARCHAR(40) DEFAULT NULL,
PRIMARY KEY (`id`)
)ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
CREATE TABLE `tbl_emp`(
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(30) DEFAULT NULL,
`deptId` INT(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fk_dept_id` (`deptId`)
#CONSTRAINT `fk_dept_id` FOREIGN KEY (`deptId`) REFERENCES `tbl_dept` (`id`)
)ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
insert into tbl_dept(deptName,locAdd) VALUES('RD',11);
insert into tbl_dept(deptName,locAdd) VALUES('HR',12);
insert into tbl_dept(deptName,locAdd) VALUES('MK',13);
insert into tbl_dept(deptName,locAdd) VALUES('MIS',14);
insert into tbl_dept(deptName,locAdd) VALUES('FD',15);
insert into tbl_emp(name,deptId) VALUES('Z3',1);
insert into tbl_emp(name,deptId) VALUES('Z4',1);
insert into tbl_emp(name,deptId) VALUES('Z5',1);
insert into tbl_emp(name,deptId) VALUES('w5',2);
insert into tbl_emp(name,deptId) VALUES('w6',2);
insert into tbl_emp(name,deptId) VALUES('s7',3);
insert into tbl_emp(name,deptId) VALUES('s8',4);
insert into tbl_emp(name,deptId) VALUES('s9',51);
以下是上述sql數(shù)據(jù)庫中tbl_dept和tbl_emp的數(shù)據(jù)情況:

tbl_dept.png

tbl_emp.png
下面我們通過觀察模型,基于上述的表結(jié)構(gòu)語句構(gòu)造join查詢:
- 內(nèi)連接

內(nèi)連接.png
而實(shí)際sql執(zhí)行情況如下:

內(nèi)連接sql.png
- 左鏈接

左鏈接.png
sql執(zhí)行情況:

左鏈接sql.png
- 右鏈接

右鏈接.png
sql執(zhí)行情況:

右鏈接sql.png
- 左外鏈接

左外鏈接.png
sql執(zhí)行情況:

左外鏈接sql.png
- 右外鏈接

右外鏈接.png
sql執(zhí)行情況:

右外鏈接sql.png
-
全鏈接
全鏈接.png
但遺憾的是mysql不支持這種固定格式的寫法,但oracle支持。但是,我們可以使用union關(guān)鍵字合并且去重實(shí)現(xiàn),具體sql如下:
全鏈接sql.png -
全外鏈接
全外鏈接.png
mysql同樣也不支持這種固定格式的寫法,但oracle支持。同樣我們只能使用union關(guān)鍵字實(shí)現(xiàn):
全外鏈接sql.png
以上內(nèi)容只是簡單展示了兩張表之間的主外鍵關(guān)聯(lián)join,涉及到多表的操作其實(shí)是大同小異的,嗯,所以僅提供一個借鑒!工作中還需靈活運(yùn)用。



