/*SQL-進階7-子查詢
含義:出現在其他語句中的select 語句,稱為子查詢或內查詢 外部的查詢語句,稱為主查詢 或者 外查詢 分類1:按子查詢出現的位置———— select 后面:僅僅支持標量子查詢(僅能支持一行一列,下面有栗子) from 后面:支持表 子查詢 將子查詢的結果充當成一張表,要求必須起別名,不然會引起沖突! where 或 having 后面: [重點] 標量子查詢 √ 列子查詢 √ [還一般搭配着多行操作符使用,in/ any/some/ all ] [ in(not in):等於列表中的任意一個 棄用 #### any/some : (和子查詢返回的某一個值比較) 棄用 ##### all : 和子查詢返回的所有值比較 ] 行子查詢 {共同特點: ①子查詢放在小括號里 ②子查詢放在條件的右側 ③標量子查詢,一般搭配着單行操作符使用 } exists后面(相關子查詢) exists后面的子查詢 #結果返回1或者0;先執行主查詢,再執行子查詢 分類2:按結果集的行列數不同:(用的很少) 標量子查詢(結果集) ....... */ #聯系: 多表查詢 ,查詢部門名為SAL 或IT的員工的所有信息 SELECT e.*,d.`department_name` FROM employees e,departments d WHERE e.`department_id`=d.`department_id` AND d.department_name IN ('SAL','IT'); #where 或 having 后面: [重點] #1.單行子查詢(標量子查詢) #案例1:誰的工資比ABel的高 SELECT e.* FROM employees e WHERE e.`salary` >( SELECT salary FROM employees WHERE last_name ='Abel' ); #案例2:返回job_id 與 141號員工 相同,salary 比143號員工多的員工姓名, 顯示 job_id和工資 SELECT last_name,job_id,salary FROM employees WHERE `job_id` =( SELECT job_id FROM employees WHERE employee_id =141 AND salary >( SELECT salary FROM employees WHERE employee_id =143 ) ); #案例3: 返回公司工資最低的員工的last_name ,job_id 和 salary SELECT * FROM employees WHERE salary =( SELECT MIN(salary) FROM employees ); #二: select 后面的子查詢 #案例:查詢每個部門的員工個數 SELECT d.*,( SELECT COUNT(*) FROM employees e WHERE d.department_id=e.department_id ) 個數 FROM departments d; ##也可以用連接查詢???? :employees 右外連接 departments SELECT d.*,COUNT(*) FROM employees e RIGHT OUTER JOIN departments d ON e.department_id=d.department_id GROUP BY department_id; #查詢員工號=102的部門號 SELECT ( SELECT d.department_name FROM departments d,employees e WHERE d.department_id = e.department_id AND e.employee_id = 102 ) 部門名; #三: from后面 #案例:查詢每個部門的平均工資的工資等級 #1.查詢每個部門的平均工資 SELECT AVG(salary),department_id FROM employees GROUP BY department_id; #2.查詢工資等級 SELECT * FROM job_grades; #3.進行組合 , 連接1的兩個結果集和job_grades表,篩選條件平均工資 between low and high SELECT ag_dep.* ,g.grade_level FROM ( SELECT AVG(salary) ag,department_id #查詢后生成的表 FROM employees GROUP BY department_id ) ag_dep INNER JOIN job_grades g ON ag_dep.ag BETWEEN g.lowest_sal AND g.highest_sal; #四: exists后面的(相關子查詢) #結果返回1或者0;先執行主查詢,再執行子查詢 #案例1:查詢有員工名的部門名 SELECT department_name FROM departments d WHERE EXISTS( SELECT * FROM employees e WHERE d.department_id = e.`department_id` ); #----------------栗子練習-------------- #一:查詢各部門中工資比本部門平均工資高的員工的員工號,姓名和工資 #①本部門平均工資 SELECT AVG(e.`salary`) ag,department_id FROM employees e GROUP BY e.`department_id`; #(2) 與1進行連接 SELECT e.`department_id`,e.`employee_id`,e.`last_name`,e.`salary`,ag 平均工資 FROM employees e INNER JOIN( SELECT AVG(e.`salary`) ag,department_id FROM employees e GROUP BY e.`department_id` )ag_dep ON e.`department_id`=ag_dep.department_id ##內連接的連接條件! WHERE salary > ag_dep.ag; ###加上篩選條件