#進階6: 連接查詢 (多表連接) : 等值連接/非等值連接 /左右全連接/內連接 /* 含義: 當查詢的字段來自於多個表時, 就會用到連接查詢 一: sql 92標准 :等值連接 ,(#內連接) 1.可以為表區別名,區分多個重名的字段 2.為表使用別名后,只能使用別名去"select"! 二:非等值連接 1.where 列名 BETWEEN ... AND ... 三:自連接 :自己連接自己 四:左 / 右 外連接 1.應用場景: 用於查詢一個表有內容,另一個表沒有內容 如果從表中有和它匹配的,則顯示匹配的值 如果從表中沒有和它匹配的,則顯示null 2.左外連接, left OUTER join (左邊的是主表) on 連接關系 where 篩選條件 3.右外連接,right OUTER join (右邊的是主表) on 連接關系 where 篩選條件 五:#全外連接 = 內連接的結果 + 表1中有但表2中沒有的 + 表2中有的但表1中沒有的 #MYSQL不支持!! Oracle數據庫 六:#交叉連接 實現笛卡爾成績,實現兩個表的任意兩項進行連接! 七:sql 92 和 sql 99 */ #查詢對偶姓名匹配 SELECT beauty.`name`,boys.`boyName` FROM beauty,boys WHERE beauty.`boyfriend_id`=boys.`id`; #案例2: 查詢員工名和對應的部門名 SELECT last_name,department_name FROM employees,departments WHERE employees.`department_id`=departments.department_id; #3.查詢員工名/工種號/工種名 #使用別名 SELECT e.`last_name` ,e.`job_id`,j.`job_title` FROM employees e,jobs j WHERE e.`job_id`=j.`job_id`; #4.查詢有獎金的員工名和部門名 SELECT e.`last_name`,e.`department_id` FROM employees e,departments d WHERE e.`department_id`=d.`department_id`; #5.查詢每個工種的工種名和員工的個數, 並且按員工個數排序 SELECT j.`job_title`,COUNT(*) FROM jobs j,employees e WHERE j.`job_id`=e.`job_id` GROUP BY j.`job_title` ORDER BY COUNT(*) DESC; #2 / 非等值連接 #案例1:查詢員工的工資和工資級別 SELECT salary,grade_level FROM employees e,job_grades g WHERE e.salary BETWEEN g.`lowest_sal` AND g.`highest_sal`; #3 / 左 . 右 外連接 #案例1:查詢女生的男朋友不在boys 表中的 女生 -- [左外連接] SELECT b.name,bo.* FROM beauty b LEFT OUTER JOIN boys bo ON b.`boyfriend_id`=bo.`id` WHERE bo.`id` IS NULL ; #案例2: 查詢哪個部門沒有員工 SELECT d.*,e.employee_id FROM departments d LEFT OUTER JOIN employees e ON d.`department_id`=e.`department_id` WHERE e.employee_id IS NULL; #全外連接 = 內連接的結果 + 表1中有但表2中沒有的 + 表2中有的但表1中沒有的 #MYSQL不支持!! #交叉連接 SELECT b.*,bo.* FROM beauty b CROSS JOIN boys bo; #內連接 SELECT * FROM beauty b INNER JOIN boys ON b.`boyfriend_id`=boys.`id`;