MySQL進階6:連接查詢(sql92標準)

# 進階6:連接查詢
/*
含義:又稱多表查詢,當我們查詢的字段來自於多個表時,就會用到

笛卡爾乘積現象: 表1有m行,表2有n行,結果爲m*n行

發生原因,沒有有效的連接條件
如何避免,添加有效的連接條件

分類:
	按年代分類:
	sql92標準:僅僅支持內連接
	sql99標準【推薦】:支持內連接、外連接(左外和右外)、交叉連接
	
	按功能分類:
		內連接:
			等值連接
			非等值連接
			自連接
		外連接:
			左外連接
			右外連接
			全外連接
		交叉連接
*/

USE girls;
SELECT * FROM beauty;

SELECT * FROM boys;

SELECT NAME,boyname FROM beauty,boys
# 如上所示,會出現笛卡爾乘積現象
WHERE beauty.boyfriend_id=boys.id;

# 一、sql92標準
# 1.等值連接
/*

①多表等值連接的結果爲多表的交集部分
②n表連接,至少需要n-1個連接條件
③多表的順序沒有要求
④一般需要爲表取別名(提高可讀性)
⑤可以搭配前面介紹的所有子句使用,比如排序,分組,篩選

*/
# 案例1:查詢女神名和對應的男生名
SELECT NAME,boyname FROM beauty,boys
WHERE beauty.boyfriend_id=boys.id;

# 案例2:查詢員工名和對應的部門名
USE myemployees;

SELECT last_name,department_name
FROM employees,departments
WHERE employees.`department_id`=departments.`department_id`;

# 案例3:查詢員工名、工種號、工種名

SELECT last_name,employees.job_id,job_title
FROM employees,jobs # 如果經常限定,故要給表名取別名
WHERE employees.`job_id`=jobs.`job_id`; 
/*
爲表起別名(FROM後)讀入表的順序不影響

①高語句的簡潔度
②區分多個重名的字段

注意,如果爲表起了別名,則查詢的字段就不能使用原來的表名去限定
*/

# 案例4:查詢有獎金的員工名、部門名
# 知識點:可以加篩選
SELECT last_name,department_name,commission_pct
FROM employees AS e,departments AS d
WHERE e.`department_id`=d.`department_id`
AND e.`commission_pct` IS NOT NULL;

# 案例5:查詢城市名中第二個字符爲o的部門名和城市名

SELECT department_name,city
FROM departments AS d,locations AS l
WHERE d.`location_id`=l.`location_id`
AND city LIKE '_o%';

# 案例6: 查詢每個城市的部門個數
# 知識點:可以加分組
SELECT COUNT(*) AS 個數,city
FROM departments AS d,locations AS l
WHERE d.`location_id`=l.`location_id`
GROUP BY city

# 案例7: 查詢有獎金的每個部門的部門名和部門的領導編號和該部門的最低工資
# 知識點:可以加分組
SELECT department_name,d.manager_id,MIN(salary)
FROM departments AS d,employees AS e
WHERE d.`department_id`=e.`department_id`
AND commission_pct IS NOT NULL
GROUP BY department_name,manager_id;

# 案例8: 查詢每個工種名和員工的個數,並且按員工個數降序
# 知識點:可以加排序
SELECT job_title,COUNT(*)
FROM employees AS e,jobs AS j
WHERE e.`job_id`=j.`job_id`
GROUP BY job_title
ORDER BY COUNT(*) DESC;

# 案例9:查詢員工名、部門名和所在的城市
# 多表連接
SELECT last_name,department_name,city
FROM employees AS e,departments AS d,locations AS l
WHERE e.`department_id`=d.`department_id`
AND d.`location_id`=l.`location_id`;

# 1.非等值連接

# 案例1:查詢員工的工資和工資級別

# 創建等級表
CREATE TABLE job_grades
(grade_level VARCHAR(3),
 lowest_sal  INT,
 highest_sal INT);

INSERT INTO job_grades
VALUES ('A', 1000, 2999);

INSERT INTO job_grades
VALUES ('B', 3000, 5999);

INSERT INTO job_grades
VALUES('C', 6000, 9999);

INSERT INTO job_grades
VALUES('D', 10000, 14999);

INSERT INTO job_grades
VALUES('E', 15000, 24999);

INSERT INTO job_grades
VALUES('F', 25000, 40000);


SELECT salary,grade_level
FROM employees AS e,job_grades AS g
WHERE salary BETWEEN g.`lowest_sal` AND g.`highest_sal`
AND g.`grade_level`='A';


# 3、自連接

# 案例:查詢員工名和上級名稱
# 將一張表既看作員工表,又看作領導表
SELECT e.employee_id,e.last_name,m.employee_id,m.last_name
FROM employees AS e,employees AS m
WHERE e.manager_id=m.employee_id;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章