06、MySQL分頁查詢、子查詢經典案例、聯合查詢
阿新 • • 發佈:2020-07-24
目錄
分頁查詢
#進階九、分頁查詢 /* 應用場景:當要顯示的資料一頁顯示不全時,需要分頁提交sql請求。 語法: select 查詢列表 from 表名 [連線型別] join 表2 on 連線條件 where 篩選條件 group by 分組條件 having 分組後的篩選 order by 排序 limit 起始索引offset,顯示的條目數size; 注意:在學習字串的substring函式時,字串的索引從1開始,但是在這裡,起始索引offset從0開始 1、特點:limit子句在查詢語句的最後, 2、要顯示頁數是page,每一頁的條目數是size,limit (page-1)*size,size */ #查詢前5條員工的資訊 SELECT * FROM employees LIMIT 0,5; SELECT * FROM employees LIMIT 5; #查詢第11條到第25條 SELECT * FROM employees LIMIT 10,15 #有獎金的員工資訊,工資較高的前10名 SELECT * FROM employees WHERE commission_pct IS NOT NULL ORDER BY salary DESC LIMIT 10;
子查詢經典案例
#1、查詢工資最低的員工資訊 SELECT * FROM employees WHERE salary = ( SELECT MIN(salary) FROM employees ); #2、查詢平均工資最低的部門資訊 ※ SELECT d.* FROM ( SELECT AVG(salary) 平均工資, department_id FROM employees GROUP BY department_id ) temp INNER JOIN departments d ON temp.department_id = d.`department_id` ORDER BY 平均工資 ASC LIMIT 1; #3、查詢平均工資最低的部門資訊和該部門的平均工資 SELECT 平均工資, d.* FROM ( SELECT AVG(salary) 平均工資, department_id FROM employees GROUP BY department_id ) temp INNER JOIN departments d ON temp.department_id = d.`department_id` ORDER BY 平均工資 ASC LIMIT 1; #4、查詢平均工資最高的job資訊 SELECT temp.平均工資, j.* FROM ( SELECT AVG(salary) 平均工資, job_id FROM employees GROUP BY job_id ORDER BY 平均工資 DESC LIMIT 1 ) temp INNER JOIN jobs j ON temp.job_id = j.`job_id`; #5、查詢平均工資高於公司平均工資的部門有哪些? SELECT department_id, AVG(salary) 平均工資 FROM employees GROUP BY department_id HAVING 平均工資 > ( SELECT AVG(salary) 公司平均工資 FROM employees ); #6、查詢公司中所有manager的詳細資訊 SELECT * FROM employees WHERE employee_id IN ( SELECT manager_id FROM employees GROUP BY manager_id ); #7、各個部門的最高工資中,最低的那個是多少? SELECT MIN(temp.最高工資) 最低工資 FROM ( SELECT MAX(salary) 最高工資 FROM employees GROUP BY department_id ) temp; #並且查詢是那個部門 SELECT department_id, MAX(salary) FROM employees GROUP BY department_id HAVING MAX(salary) = ( SELECT MAX(salary) maxSalary FROM employees GROUP BY department_id ORDER BY maxSalary ASC LIMIT 1 ); #8、查詢平均工資最高的部門 的manager的詳細資訊,last_name,department_id,email,salary SELECT last_name, e.department_id, email, salary FROM employees e WHERE employee_id = ( SELECT d.`manager_id` FROM ( SELECT AVG(salary) maxSalary, department_id FROM employees GROUP BY department_id ORDER BY maxSalary DESC LIMIT 1 ) temp JOIN departments d ON temp.department_id = d.`department_id` );
聯合查詢
#進階十、聯合查詢 /* union:將多條查詢語句的結果合併為一個結果, 語法: 查詢語句1 union 查詢語句2 */ #查詢部門編號>90或者是郵箱中包含a的員工資訊 SELECT * FROM employees WHERE department_id > 90 OR email LIKE '%a%'; 或者 SELECT * FROM employees WHERE department_id > 90 UNION SELECT * FROM employees WHERE email LIKE '%a%'; /* 當我們要查詢的結果來自多張表,而且多張表之間沒有連線關係,查詢的資訊(欄位)一致時,可以使用聯合查詢 */ /* 聯合查詢的特點: 1、要求多條查詢語句的查詢列數一致; 2、要求多條查詢語句的每一列的型別和順序最好一致; 3、union關鍵字預設是去重的,使用union all可以包含重複項 */