MySQL之表連接方式(內(nèi)連接與外連接)
1、表連接的核心概念
1.1 為什么需要表連接?
- 問題:兩個表的數(shù)據(jù)需要關聯(lián)查詢(如學生表和成績表)
- 笛卡爾積:未指定條件時,兩個表的所有記錄兩兩組合(效率低下,結(jié)果混亂)
- 解決方案:通過連接條件篩選有效組合
2、內(nèi)連接(INNER JOIN)
2.1 核心概念
- 定義:僅返回兩表中滿足連接條件的記錄
內(nèi)連接實際上就是利用where子句對兩種表形成的笛卡兒積進行篩選,我們前面學習的查詢都是內(nèi)連接,也是在開發(fā)過程中使用的最多的連接查詢。
- 語法:
select 字段 from 表1 inner join 表2 on 表1.id = 表2.id [and 其他篩選條件];
- 等價寫法:
WHERE子句隱式內(nèi)連接
SELECT 字段 FROM 表1, 表2 WHERE 表1.id = 表2.id [and 其他篩選條件];
2.2 案例
查詢員工及其部門名稱
兩者寫法不同但是效果一致
方法一:
---隱式內(nèi)連接寫法 select *from emp,dept where emp.deptno=dept.deptno;

方法二:
---標準內(nèi)連接寫法 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;
結(jié)果:

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;
結(jié)果:

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:用于過濾已連接后的結(jié)果,會過濾掉外連接中的
NULL值。 - where條件是在臨時表生成好后,再對臨時表進行過濾的條件。這時已經(jīng)沒有l(wèi)eft join的含義(必須返回左邊表的記錄)了,條件不為真的就全部過濾掉,on后的條件用來生成左右表關聯(lián)的臨時表,where后的條件對臨時表中的記錄進行過濾。

4.2 NULL值的處理
ifnull()函數(shù)

外連接結(jié)果中的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;

總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Mysql錯誤:Too many connections的解決方法
這篇文章主要給大家介紹了關于Mysql錯誤Too many connections的解決方法,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Mysql具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧2019-06-06
mysql?count()函數(shù)不計算null和空值問題
這篇文章主要介紹了mysql?count()函數(shù)不計算null和空值問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08
MySQL數(shù)據(jù)庫常用操作技巧總結(jié)
這篇文章主要介紹了MySQL數(shù)據(jù)庫常用操作技巧,結(jié)合實例形式總結(jié)分析了mysql查詢、存儲過程、字符串截取、時間、排序等常用操作技巧,需要的朋友可以參考下2018-03-03
mysql中全連接full join...on...的用法說明
這篇文章主要介紹了mysql中全連接full join...on...的用法說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03
MySQL修改表結(jié)構(gòu)操作命令總結(jié)
這篇文章主要介紹了MySQL修改表結(jié)構(gòu)操作命令總結(jié),包含如刪除列、添加列、修改列、添加主鍵、刪除主鍵、添加唯一索引、添加普通索引等內(nèi)容,需要的朋友可以參考下2014-12-12

