mysql基礎_連接查詢
一、 分類
1. 按年代分類:
- sql92標準:僅僅支持內連接
- sql99標準【推薦】:支持內連接+外連接(左外和右外)+交叉連接
2. 按功能分類:
- 內連接:
- 等值連接
- 非等值連接
- 自連接
- 外連接:
- 左外連接
- 右外連接
- 全外連接
- 交叉連接
二、 SQL 92
1. 等值連接
案例:查詢員工名和對應的部門名
SELECT
last_name,department_name
FROM
employees,departments
WHERE
employees.`department_id` = departments.`department_id`;
2. 爲表起別名
- 提高語句的簡潔度
- 區分多個重名的字段
- 注意:如果爲表起了別名,則查詢的字段就不能使用原來的表名去限定(虛擬視圖)
3. 非等值連接
根據WHERE條件中的條件去連接,滿足條件則連接
SELECT
salary,grade_level
FROM
employees e,job_grades g
WHERE
salary BETWEEN g.`lowest_sal` AND g.`highest_sal`
AND g.`grade_level`='A';
4. 自連接
案例:查詢 員工名和上級的名稱
SELECT e.employee_id,e.last_name,m.employee_id,m.last_name
FROM employees e,employees m
WHERE e.`manager_id`=m.`employee_id`;
三、 SQL 99
語法:
select 查詢列表
from 表1 別名 [ 連接類型 ]
join 表2 別名
on 連接條件
[where 篩選條件]
[group by 分組]
[having 組篩選條件]
[order by 排序列表]
分類:
- 內連接:inner
- 外連接
- 左外(★):left 【outer】
- 右外(★):right 【outer】
- 全外:full【outer】 (mysql 不支持)
- 交叉連接:cross
1. 內連接
語法:
select 查詢列表
from 表1 別名
inner join 表2 別名 #inner 可以省略
on 連接條件;
分類:
- 等值
- 非等值
- 自連接
2. 外鏈接
分類:
- 左外連接 LEFT [ OTER ] JOIN
- 右外連接 RIGHT [ OTER ] JOIN
- 全外連接 FULL [ OTER ] JOIN (mysql 不支持)
特點:
- 外連接的查詢結果爲主表中的所有記錄
- 如果從表中有和它匹配的,則顯示匹配的值
- 如果從表中沒有和它匹配的,則顯示null
- 外連接查詢結果 = 內連接結果 + 主表有 而 從表沒有 的記錄
2.1 左外連接
LEFT JOIN 左邊 爲 主表
2.2 右外連接
RIGHT JOIN 右邊 爲 主表
2.3 全外連接(mysql 不支持)
全外連接 = 內連接的結果 + 表1中有但表2沒有的 + 表2中有但表1沒有的
3. 交叉連接
相當於一個笛卡爾乘積