1. 程式人生 > 實用技巧 >lyt經典版MySQL基礎——進階6:連線查詢-sql99語法-內連線、外連線、交叉連線

lyt經典版MySQL基礎——進階6:連線查詢-sql99語法-內連線、外連線、交叉連線

  1 #二、sql99語法
  2 /*
  3 語法:
  4     select 查詢列表
  5     from 表1 別名 【連線型別】
  6     join 表2 別名
  7     on 連線條件
  8     【where 篩選條件】
  9     【group by分組】
 10     【having 篩選條件】
 11     【order by 排序列表】
 12     
 13     
 14 內連線(√):inner
 15 外連線
 16     左外(√):left 【outer】
 17     右外(√):right【outer】
18 全外:full【outer】 19 交叉連線:cross 20 */ 21 22 #(一)內連線 23 /* 24 語法: 25 26 select 查詢列表 27 from 表1 別名 28 inner join 表2 別名 29 on 連線條件; 30 31 分類: 32 等值 33 非等值 34 自連線 35 36 特點: 37 (1)新增排序、分組、篩選 38 (2)inner可以省略 39 (3)篩選條件放在where後面,連線條件放在on後面,提高分離性,便於閱讀 40 (4)inner join連線和sql92語法中的等值連線效果是一樣的,都是查詢多表的交集
41 */ 42 43 #1.等值連線 44 #案例1:查詢員工名、部門名 45 SELECT last_name,department_name 46 FROM employees e 47 INNER JOIN departments d 48 ON e.department_id=d.department_id; 49 #案例2:查詢名字中包含e的員工名和工種名(新增篩選) 50 SELECT last_name,job_title 51 FROM employees e 52 INNER JOIN jobs j 53 ON e.job_id=j.job_id
54 WHERE last_name LIKE '%e%'; 55 #案例3:查詢部門個數>3的城市名和部門個數(分組+篩選) 56 #(1)查詢每個城市的部門個數 57 #(2)在(1)結果上篩選滿足條件的 58 SELECT city,COUNT(*) '部門個數' 59 FROM locations l 60 INNER JOIN departments d 61 ON l.location_id=d.location_id 62 GROUP BY city 63 HAVING 部門個數>3; 64 #案例4:查詢哪個部門的部門員工個數>3的部門名和員工個數, 65 #並按個數降序(新增排序) 66 SELECT department_name,COUNT(*) '員工個數' 67 FROM departments d 68 INNER JOIN employees e 69 ON d.department_id=e.department_id 70 GROUP BY e.department_id 71 HAVING 員工個數>3 72 ORDER BY 員工個數 DESC; 73 #案例5:查詢員工名、部門名、工種名,並按部門名降序 74 SELECT last_name,department_name,job_title 75 FROM employees e 76 INNER JOIN departments d ON e.department_id=d.department_id 77 INNER JOIN jobs j ON e.job_id=j.job_id 78 ORDER BY job_title DESC; 79 80 #2.非等值連線 81 #查詢員工的工資級別 82 SELECT salary,grade_level 83 FROM employees 84 JOIN job_grades 85 ON salary BETWEEN lowest_sal AND highest_sal; 86 #查詢工資級別的個數>2的個數,並且按工資級別降序 87 SELECT grade_level,COUNT(*) '個數' 88 FROM employees 89 JOIN job_grades 90 ON salary BETWEEN lowest_sal AND highest_sal 91 GROUP BY grade_level 92 HAVING 個數>2 93 ORDER BY grade_level DESC; 94 95 #3.自連線 96 #查詢員工的名字、上級的名字 97 SELECT e.last_name,m.last_name 98 FROM employees e 99 JOIN employees m ON e.manager_id=m.employee_id; 100 #查詢姓名中包含字元k的員工的名字、上級的名字 101 SELECT e.last_name,m.last_name 102 FROM employees e 103 JOIN employees m ON e.manager_id=m.employee_id 104 WHERE e.last_name LIKE '%k%'; 105 106 #(二)外連線 107 /* 108 應用場景:用於查詢一個表中有,另一個表沒有的記錄 109 110 特點: 111 1、外連線的查詢結果為主表中的所有記錄 112 如果從表中有和它匹配的,則顯示匹配的值 113 如果從表中沒有和它匹配的,則顯示null 114 外連線查詢結果=內連線結果+主表中有二從表沒有的記錄 115 2、左外連線,left join左邊的是主表 116 右外連線,right join右邊的是主表 117 3、左外和右外交換兩個表的順序,可以實現同樣的效果 118 4、全外連線=內連線的結果+表1中有但表2沒有的+表2中有但表1沒有的 119 */ 120 #引入:查詢男朋友不在男神表的女神名 121 SELECT * FROM beauty; 122 SELECT * FROM boys; 123 #左外連線 124 SELECT b.name,bo.* 125 FROM beauty b 126 LEFT OUTER JOIN boys bo 127 ON b.boyfriend_id=bo.id 128 WHERE bo.id IS NULL; 129 #右外連線 130 SELECT b.name,bo.* 131 FROM boys bo 132 RIGHT OUTER JOIN beauty b 133 ON b.boyfriend_id=bo.id 134 WHERE bo.id IS NULL; 135 136 #案例1:查詢哪個部門沒有員工 137 #左外 138 SELECT d.*,e.employee_id 139 FROM departments d 140 LEFT OUTER JOIN employees e 141 ON d.department_id=e.department_id 142 WHERE employee_id IS NULL; 143 #右外 144 SELECT d.*,e.employee_id 145 FROM employees e 146 RIGHT OUTER JOIN departments d 147 ON d.department_id=e.department_id 148 WHERE employee_id IS NULL; 149 150 #全外 151 USE girls; 152 SELECT b.*,bo.* 153 FROM bauty b 154 FULL OUTER JOIN boys bo 155 ON b.boyfriend_id=bo.id; 156 157 #交叉連線 158 SELECT b.*,bo.* 159 FROM beauty b 160 CROSS JOIN boys bo; 161 162 #sql92 和 sql99 PK 163 /* 164 功能:sql99支援的較多 165 可讀性:sql99實現連線條件和篩選條件的分離,可讀性較高 166 */