MYSQL数据库实验三多表查询_数据库之 MySQL --- 数据处理 之多表查询 (三)
一、多表查詢
【1】什么是多表查詢?
即,從多個表中獲取數(shù)據(jù)。
注意: 在多表查詢是,如果列明在兩個表中都有,那么列名前需要加上表名
sql優(yōu)化:列名前最好加上表名,尤其在多表查詢時
SELECT employees.`first_name`,employees.`department_id`
departments.`department_id`,departments.`department_name`
FROM employees,departments? -- 錯誤,缺少連接條件
-- 發(fā)生了笛卡爾集錯誤
-- 愿因: 缺少多表之間的連接條件,或者連接條件錯誤
SELECT e.first_name,e.department_id,-- 可以使用表的別名
d.department_id,d.department_name
FROM employees e, departments d -- 錯誤,缺少連接條件
【2】關(guān)于笛卡爾集 :
笛卡爾集會在下面條件下產(chǎn)生:
省略連接條件
連接條件無效
所有表中的所有行互相連接
為了避免笛卡爾集, 可以在 WHERE 加入有效的連接條件。
【3】使用笛卡爾集與不使用的對比
①查出所有數(shù)據(jù)
SELECT? * FROM employees
SELECT * FROM departments
②不使用笛卡爾集的普通子查詢(MySQL連接)
在 WHERE 子句中寫入連接條件。
在表中有相同列時,在列名之前加上表名前綴
-- 需求: 查詢每個員工所在部門的名稱
SELECT employees.`first_name`,employees.`department_id`,
departments.`department_id`,departments.`department_name`
FROM employees,departments
WHERE employees.`department_id`= departments.`department_id`
③使用JOIN ON 實現(xiàn)多表查詢,解決笛卡爾集的問題
-- sq199規(guī)定了多表查詢的規(guī)則
-- 使用 join on
-- 注意: 如果有n個表需要連表查詢,那么至少得有n-12個連接條件
SELECT e.first_name,d.department_id,l.city
FROM employees e JOIN departments d
ON e.department_id = d.department_id
JOIN locations l
ON d.location_id = l.location_id
MySQL 連接
【1】自連接,非自鏈接
-- 自連接需求: 查找員工和員工的領(lǐng)導(dǎo)
SELECT e.first_name,m.first_name
FROM employees e JOIN employees m
ON e.`manager_id` = m.`employee_id`
-- 非自連接:兩張不同的表進(jìn)行連接查詢
-- 等值連接,非等值連接
-- 等值連接案例
SELECT e.first_name,d.department_name
FROM employees e JOIN departments d
ON e.department_id = d.department_id
-- 非等值連接需求: 查看所有員工薪水的等級
SELECT e.first_name,e.`salary`,j.grade
FROM employees e JOIN job_grades j
ON e.`salary`>= j.lowest_sal AND e.`salary` <=j.highest_sal
【2】 內(nèi)連接,外連接
-- 內(nèi)連接:
合并具有同一列的兩個以上的表的行,結(jié)果集中不包含一個表與另一個表不匹配的行
-- 外連接: 左外連接 VS 右外連接
-- 左外連接: 兩個表在連接過程中除了返回滿足連接條件的行以外還返回左表中不滿足條件的行
-- 這種連接成為左外連接
SELECT? e.`first_name`,e.`department_id`,d.department_name
FROM employees e LEFT OUTER JOIN departments d
ON e.`department_id` = d.department_id
-- 右外連接:兩個表在連接過程中除了返回滿足連接條件的行意外還返回右表中不滿足條件的行
-- 這種連接成為右外連接
SELECT e.`first_name`,e.`department_id`,d.department_id,d.department_name
FROM employees e RIGHT OUTER JOIN departments d
ON e.`department_id` = d.department_id
-- 滿外連接 full join (mysql不支持)
總結(jié)
以上是生活随笔為你收集整理的MYSQL数据库实验三多表查询_数据库之 MySQL --- 数据处理 之多表查询 (三)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux cmake 编译项目,使用C
- 下一篇: oracle hang analyze,