作用:從2張或多張表中,取出有關聯的數據.
關聯查詢一共有幾種情況:
内連接:INNER JOIN 、CROSS JOIN
外連接:左外連接(LEFT OUTER JOIN)、右外連接(RIGHT OUTER JOIN)、全外連接(FULL OUTER JOIN)
自連接:當table1和table2本質上是同一張表,隻是用取别名的方式虛拟成兩張表以代表不同的意義
說明:
(1)連接 n個表,至少需要 n-1個連接條件。 例如:連接三個表,至少需要兩個連接條件。
(2)當兩個關聯查詢的表如果有字段名字相同,并且要查詢中涉及該關聯字段,那麼需要使用表名前綴加以區分
(3)當如果表名比較長時,可以給表取别名,簡化SQL語句
笛卡爾積
定義:将兩(或多)個表的所有行進行組合,連接後的行數為兩(或多)個表的乘積數.
在MySQL中如下情況會出現笛卡爾積,主要是因為缺少關聯條件或者關聯條件不準确
注:外連接必須寫關聯條件,否則報語法錯誤
#笛卡爾積#查詢員工姓名和所在部門名稱SELECT ename,dname FROM t_employee,t_department;SELECT ename,dname FROM t_employee INNER JOIN t_department;SELECT ename,dname FROM t_employee CROSS JOIN t_department;SELECT ename,dname FROM t_employee JOIN t_department;
關聯條件表連接的約束條件可以有三種方式:WHERE, ON, USING
WHERE:适用于所有關聯查詢
ON:隻能和JOIN一起使用,隻能寫關聯條件。雖然關聯條件可以并到WHERE中和其他條件一起寫,但分開寫可讀性更好。
USING:隻能和JOIN一起使用,而且要求兩個關聯字段在關聯表中名稱一緻,而且隻能表示關聯字段值相等
#關聯條件#把關聯條件寫在where後面SELECT ename,dname FROM t_employee,t_department WHERE t_employee.dept_id=t_department.did;#把關聯條件寫在on後面,隻能和JOIN一起使用SELECT ename,dname FROM t_employee INNER JOIN t_department ON t_employee.dept_id=t_department.did;SELECT ename,dname FROM t_employee CROSS JOIN t_department ON t_employee.dept_id=t_department.did;SELECT ename,dname FROM t_employee JOIN t_department ON t_employee.dept_id=t_department.did;#把關聯字段寫在using()中,隻能和JOIN一起使用#而且兩個表中的關聯字段必須名稱相同,而且隻能表示=#查詢員工姓名與基本工資SELECT ename,basic_salary FROM t_employee INNER JOIN t_salary USING(eid);#n張表關聯,需要n-1個關聯條件#查詢員工姓名,基本工資,部門名稱SELECT ename,basic_salary,dname FROM t_employee,t_department,t_salaryWHERE t_employee.dept_id=t_department.did AND t_employee.eid=t_salary.eid;SELECT ename,basic_salary,dname FROM t_employee INNER JOIN t_department INNER JOIN t_salaryON t_employee.dept_id=t_department.did AND t_employee.eid=t_salary.eid;
内連接(INNER JOIN)有兩種,顯式的和隐式的,返回連接表中符合連接條件和查詢條件的數據行
格式:
隐式:
SELECT [cols_list] from 表1,表2 where [condition]
顯式:
SELECT [cols_list] from 表1 INNER JOIN 表2 ON [關聯條件] where [其他篩選條件]
SELECT [cols_list] from 表1 CROSS JOIN 表2 ON [關聯條件] where [其他篩選條件]
SELECT [cols_list] from 表1 JOIN 表2 ON [關聯條件] where [其他篩選條件]
#内連接#查詢員工姓名和所在部門名稱SELECT ename,dname FROM t_employee,t_department WHERE t_employee.dept_id=t_department.did;SELECT ename,dname FROM t_employee INNER JOIN t_department ON t_employee.dept_id=t_department.did;SELECT ename,dname FROM t_employee CROSS JOIN t_department ON t_employee.dept_id=t_department.did;SELECT ename,dname FROM t_employee JOIN t_department ON t_employee.dept_id=t_department.did;#查詢員工姓名,基本工資,部門名稱SELECT ename,basic_salary,dname FROM t_employee,t_department,t_salaryWHERE t_employee.dept_id=t_department.did AND t_employee.eid=t_salary.eid;SELECT ename,basic_salary,dname FROM t_employee INNER JOIN t_department INNER JOIN t_salaryON t_employee.dept_id=t_department.did AND t_employee.eid=t_salary.eid;
外連接(OUTER JOIN)
外連接分為:
左外連接(LEFT OUTER JOIN),簡稱左連接(LEFT JOIN)
右外連接(RIGHT OUTER JOIN),簡稱右連接(RIGHT JOIN)
全外連接(FULL OUTER JOIN),簡稱全連接(FULL JOIN)。
左連接(LEFT JOIN)
返回左表中的所有行,如果左表中行在右表中沒有匹配行,則結果中右表中的列返回空值。 |
返回左邊中行在右表中沒有匹配行的記錄 |
#左連接 #查詢所有部門信息以及該部門員工信息 SELECT did,dname,eid,ename FROM t_department LEFT OUTER JOIN t_employee ON t_department.did = t_employee.dept_id; |
#查詢部門信息,僅保留沒有員工的部門信息 SELECT did,dname,eid,ename FROM t_department LEFT OUTER JOIN t_employee ON t_department.did = t_employee.dept_id WHERE t_employee.dept_id IS NULL; #“從表外鍵列”是NULL |
#查詢所有員工信息,以及員工的部門信息 SELECT eid,ename,did,dname FROM t_employee LEFT OUTER JOIN t_department ON t_employee.dept_id = t_department.did ; |
#查詢員工信息,僅保留沒有分配部門的員工 SELECT eid,ename,did,dname FROM t_employee LEFT OUTER JOIN t_department ON t_employee.dept_id = t_department.did WHERE t_employee.dept_id IS NULL; #“從表外鍵列”是NULL |
右外連接(RIGHT JOIN)
恰與左連接相反,返回右表中的所有行,如果右表中行在左表中沒有匹配行,則結果中左表中的列返回空值。 |
返回右表中在左表沒有匹配行的記錄 |
#查詢所有部門信息以及該部門員工信息 SELECT did,dname,eid,ename FROM t_employee RIGHT OUTER JOIN t_department ON t_department.did = t_employee.dept_id; |
#查詢部門信息,僅保留沒有員工的部門信息 SELECT did,dname,eid,ename FROM t_employee RIGHT OUTER JOIN t_department ON t_department.did = t_employee.dept_id WHERE t_employee.dept_id IS NULL; #“從表外鍵列”是NULL |
#查詢所有員工信息,以及員工的部門信息 SELECT eid,ename,did,dname FROM t_department RIGHT OUTER JOIN t_employee ON t_employee.dept_id = t_department.did ; |
#查詢員工信息,僅保留沒有分配部門的員工 SELECT eid,ename,did,dname FROM t_department RIGHT OUTER JOIN t_employee ON t_employee.dept_id = t_department.did WHERE t_employee.dept_id IS NULL; #“從表外鍵列”是NULL |
外連接(FULL JOIN)
mysql不支持FULL JOIN,但是可以用 left join union right join代替
#查詢所有部門信息和員工信息 SELECT did,dname,eid,ename FROM t_department LEFT OUTER JOIN t_employee ON t_department.did = t_employee.dept_id UNION SELECT did,dname,eid,ename FROM t_department RIGHT OUTER JOIN t_employee ON t_department.did = t_employee.dept_id; |
#查詢所有沒有員工的部門和沒有分配部門的員工 SELECT did,dname,eid,ename FROM t_department LEFT OUTER JOIN t_employee ON t_department.did = t_employee.dept_id WHERE t_employee.dept_id IS NULL UNION SELECT did,dname,eid,ename FROM t_employee LEFT OUTER JOIN t_department ON t_department.did = t_employee.dept_id WHERE t_employee.dept_id IS NULL; |
自連接
當table1和table2本質上是同一張表,隻是用取别名的方式虛拟成兩張表以代表不同的意義。然後兩個表再進行内連接,外連接等查詢
#自連接#查詢員工姓名以及領導姓名,僅顯示有領導的員工SELECT emp.ename,mgr.enameFROM t_employee AS emp, t_employee AS mgrWHERE emp.mid = mgr.eid;#查詢員工姓名以及領導姓名,僅顯示有領導的員工SELECT emp.ename,mgr.enameFROM t_employee AS emp INNER JOIN t_employee AS mgrON emp.mid = mgr.eid;#查詢所有員工姓名及其領導姓名SELECT emp.ename,mgr.enameFROM t_employee AS emp LEFT JOIN t_employee AS mgrON emp.mid = mgr.eid;
相關閱讀:
MySQL之MYCAT讀寫分離
MySQL的使用情況詳解
如何和MySQL進行通信
MySQL常見的運算符以及使用
Mysql的邏輯架構與存儲引擎
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!