MySQL之表連接方式(內連接與外連接)
更新時間:2025年04月09日 09:04:16 作者:貓咪-9527
這篇文章主要介紹了MySQL之表連接方式(內連接與外連接),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
1、表連接的核心概念
1.1 為什么需要表連接?
- 問題:兩個表的數(shù)據(jù)需要關聯(lián)查詢(如學生表和成績表)
- 笛卡爾積:未指定條件時,兩個表的所有記錄兩兩組合(效率低下,結果混亂)
- 解決方案:通過連接條件篩選有效組合
2、內連接(INNER JOIN)
2.1 核心概念
- 定義:僅返回兩表中滿足連接條件的記錄
內連接實際上就是利用where子句對兩種表形成的笛卡兒積進行篩選,我們前面學習的查詢都是內連接,也是在開發(fā)過程中使用的最多的連接查詢。
- 語法:
select 字段 from 表1 inner join 表2 on 表1.id = 表2.id [and 其他篩選條件];
- 等價寫法:
WHERE
子句隱式內連接
SELECT 字段 FROM 表1, 表2 WHERE 表1.id = 表2.id [and 其他篩選條件];
2.2 案例
查詢員工及其部門名稱
兩者寫法不同但是效果一致
方法一:
---隱式內連接寫法 select *from emp,dept where emp.deptno=dept.deptno;
方法二:
---標準內連接寫法 select *from dept inner join emp on emp.deptno=dept.deptno;
3、外連接(OUTER JOIN)
外連接分為左外連接和右外連接
3.1 左外連接(LEFT JOIN)
核心概念
- 保留規(guī)則:左表(第一個表)的所有記錄,右表無匹配時用
NULL
填充 - 語法:
select 字段 from 表1 left join 表2 on 鏈接條件 [and 其他篩選條件];
案例:查詢所有雇員及工資
-- 創(chuàng)建表 CREATE TABLE employees (emp_id INT, emp_name VARCHAR(30)); INSERT INTO employees VALUES (1, 'Alice'), (2, 'Bob'), (3, 'Charlie'), (4, 'David'); CREATE TABLE salaries (emp_id INT, salary INT); INSERT INTO salaries VALUES (1, 5000), (2, 6000), (5, 7000); -- 左外連接查詢 select *from employees s1 left join salaries s2 on s1.emp_id=s2.emp_id;
結果:
3.2 右外連接(RIGHT JOIN)
核心概念
- 保留規(guī)則:右表(第二個表)的所有記錄,左表無匹配時用
NULL
填充 - 語法:
select 字段 from 左表 right join 右表 on 鏈接條件 [and 其他篩選條件];
案例:查詢所有工資,即使無對應雇員
select *from employees s1 right join salaries s2 on s1.emp_id=s2.emp_id;
結果:
3.3 左外與右外的等價性
-- 左外連接(保留左表) SELECT * FROM A LEFT JOIN B ON A.id = B.id; -- 等價于右外連接(保留右表) SELECT * FROM B RIGHT JOIN A ON A.id = B.id;
建議:優(yōu)先使用左外連接,邏輯更直觀。
4、注意事項
4.1 ON與WHERE子句的區(qū)別
- ON:用于指定連接條件,影響匹配邏輯。
- on條件是在生成臨時表時使用的條件,它不管on中的條件是否為真,都會返回左邊表中的記錄。
- WHERE:用于過濾已連接后的結果,會過濾掉外連接中的
NULL
值。 - where條件是在臨時表生成好后,再對臨時表進行過濾的條件。這時已經(jīng)沒有l(wèi)eft join的含義(必須返回左邊表的記錄)了,條件不為真的就全部過濾掉,on后的條件用來生成左右表關聯(lián)的臨時表,where后的條件對臨時表中的記錄進行過濾。
4.2 NULL值的處理
ifnull()函數(shù)
外連接結果中的NULL
表示無匹配記錄,需在業(yè)務邏輯中處理(如顯示“無成績”)。
select s1.emp_id,emp_name,ifnull(salary,'無成績')salary from employees s1 left join salaries s2 on s1.emp_id=s2.emp_id;
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Mysql錯誤:Too many connections的解決方法
這篇文章主要給大家介紹了關于Mysql錯誤Too many connections的解決方法,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Mysql具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧2019-06-06mysql?count()函數(shù)不計算null和空值問題
這篇文章主要介紹了mysql?count()函數(shù)不計算null和空值問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08mysql中全連接full join...on...的用法說明
這篇文章主要介紹了mysql中全連接full join...on...的用法說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03