1. 程式人生 > 實用技巧 >lyt經典版MySQL基礎——進階6:連線查詢

lyt經典版MySQL基礎——進階6:連線查詢

  1 #進階6:連線查詢
  2 /*
  3 含義:又稱多表查詢,當查詢的欄位來自於多個表時,就會用到連線查詢
  4 
  5 笛卡爾乘積現象:表1 有m行,表2有n行,結果=m*n行
  6 
  7 發生原因:沒有有效的連線條件
  8 如何避免:新增有效的連線條件
  9 
 10 分類:
 11     按年代分類:
 12     sql92標準:僅僅支援內連線
 13     sql99標準【推薦】:支援內連線+外連線(左外和右外)+交叉連線
 14     
 15     按功能分類:
 16         內連線:
 17             等值連線
 18             非等值連線
19 自連線 20 外連線: 21 左外連線 22 右外連線 23 全外連線 24 交叉連線 25 */ 26 27 SELECT * FROM beauty; 28 SELECT * FROM boys; 29 30 SELECT NAME,boyName FROM boys,beauty 31 WHERE beauty.boyfriend_id=boys.id; 32 33 #一、sql92標準 34 #1.等值連線 35 /* 36
(1)多表等值連線的結果為多表的交集部分 37 (2)n表連線,至少需要n-1個連結條件 38 (3)多表的順序沒有要求 39 (4)一般需要為表起別名 40 (5)可以搭配前面介紹的所有子句使用,比如排序、分組、篩選 41 */ 42 43 #案例1:查詢女神名和對應的男神名 44 SELECT NAME,boyName FROM boys,beauty 45 WHERE beauty.boyfriend_id=boys.id; 46 #案例2:查詢員工名和對應的部門名 47 SELECT last_name,department_name 48 FROM employees,departments
49 WHERE departments.department_id=employees.department_id; 50 51 #2.為表起別名 52 /* 53 (1)提高語句的簡潔度 54 (2)區分多個重名的欄位 55 56 注意:如果為表起了別名,則查詢的欄位就不能使用原來的表名去限定 57 因為執行順序是 from --> where --> select 58 */ 59 #查詢員工名、工種號、工種名 60 SELECT last_name,e.job_id,job_title 61 FROM employees AS e,jobs 62 WHERE e.job_id=jobs.job_id; 63 64 #3.兩個表的順序可以調換 65 #查詢員工名、工種號、工種名 66 SELECT last_name,e.job_id,job_title 67 FROM jobs,employees AS e 68 WHERE e.job_id=jobs.job_id; 69 70 #4.可以加篩選 71 #案例:查詢有獎金的員工名、部門名 72 SELECT last_name,department_name 73 FROM departments,employees AS e 74 WHERE departments.department_id=e.department_id 75 AND e.commission_pct IS NOT NULL; 76 #案例2:查詢城市名中第二個字元為o的部門名和城市名 77 SELECT department_name,city 78 FROM departments,locations l 79 WHERE departments.location_id=l.location_id 80 AND city LIKE '_o%'; 81 82 #5.可以加分組 83 #案例1:查詢每個城市的部門個數 84 SELECT city,COUNT(department_name) 個數 85 FROM locations l,departments d 86 WHERE l.location_id=d.location_id 87 GROUP BY city; 88 #案例2:查詢有獎金的每個部門的部門名和部門的領導編號和該部門的最低工資 89 SELECT department_name,d.manager_id,MIN(salary) 90 FROM departments d, employees e 91 WHERE d.department_id=e.department_id 92 AND e.commission_pct IS NOT NULL 93 GROUP BY d.department_id; 94 95 #6.可以加排序 96 #案例:查詢每個工種的工種名和員工的個數,並且按員工個數降序 97 SELECT j.job_title,COUNT(*) FROM employees e,jobs j 98 WHERE j.job_id=e.job_id 99 GROUP BY j.job_title 100 ORDER BY COUNT(*) DESC; 101 102 #7.可以實現三表連線 103 #案例:查詢員工名、部門名和所在的城市 104 SELECT last_name,department_name,city 105 FROM employees e,departments d,locations l 106 WHERE d.department_id=e.department_id 107 AND d.location_id=l.location_id; 108 109 110 #2.非等值連線 111 #案例1:查詢員工的工資和工資級別 112 SELECT salary,grade_level 113 FROM employees e,job_grades g 114 WHERE salary BETWEEN lowest_sal AND highest_sal; 115 116 #3.自連線 117 #案例:查詢員工名和上級的名稱 118 SELECT e.employee_id '員工id',e.last_name '員工名', 119 m.employee_id '上級id',m.last_name '上級名' 120 FROM employees e,employees m 121 WHERE e.manager_id=m.employee_id;