mysql aesc_MySQL学习笔记-2
錯解1: 子查詢所構建的表不識別,失效
SELECTd.*, davg.a
FROM
departments AS d
RIGHT JOIN ( SELECT department_id, avg( salary ) a FROM employees WHERE department_id IS NOT NULL GROUP BY department_id ) AS davg ON davg.department_id = d.department_id
WHERE
davg.a = ( SELECT MIN( davg.a ) FROM davg );
現象:在上述寫法中,除去where 語句,運行正常。添加后顯示:
Table 'my_employees.davg' doesn't exist。
① 通過將where 子查詢語句直接更改為‘TRUE’,發現雖然結果為空,但并沒有報錯。說明錯誤之處一定是where子查詢語句,即where子查詢中的davg不能識別
② 猜想:子查詢中所調用的只能是當前系統已顯式create并存儲的當前數據庫中的"全局表",各個子查詢之間是獨立的,所以在right join 語句中所建的表davg不能在where 子查詢語句中被識別。
正解2: 可以使用 order by + limit 的結合語句來實現查詢效果
SELECT d.*, davg.a
FROM
departments AS d
RIGHT JOIN ( SELECT department_id, avg( salary ) a FROM employees WHERE department_id IS NOT NULL GROUP BY department_id ) AS davg ON davg.department_id = d.department_id #內連接更簡?
ORDER BY
davg.a ASC
LIMIT 1;# 可修改行數確定是否最低值只有一個。
該策略同樣適用于: 其他有關 '最低,最高 '類字眼的查詢 (在此不考慮效率問題)
正解3:復雜嵌套1
SELECT d.*
FROM departments d
WHERE department_id = ( #此處 '=' 換用 'in' 更好
SELECT davg.department_id
FROM ( SELECT department_id, avg(salary) a
FROM employees
GROUP BY department_id
) AS davg
WHERE a = ( SELECT MIN(該部平均工資)
FROM (SELECT avg(salary) AS 該部平均工資
FROM employees
GROUP BY department_id
) AS davg
# 'AS davg' 必須有,語法要求。盡管前面select min(arg)不加davg也OK
)
)
# 兩個子查詢字段中的別名‘davg’互不影響,當然若寫成不一樣更易理解。
此類嵌套查詢解題思路:
①明確各個層次,清晰定義。② 從最內層,最小解題單元開始,逐步完善。③ 耐心,耐心。
疑問:對于mysql中重復出現的語句有沒有類似命名定義方法。
正解4:復雜嵌套2
SELECT d.*
FROM departments d
WHERE department_id = ( #此處 '=' 換用 'in' 更好
SELECT department_id
FROM employees e
GROUP BY department_id
HAVING AVG(salary) = (
SELECT MIN( a )
FROM ( SELECT AVG(salary) a
FROM employees
GROUP BY department_id
) AS davg
)
)
該解不同與正解3的地方在于Having 子句的使用替代了where子查詢嵌套,需要理解的是:
要真正理解group by 子句的所帶來的效果/意義,以及各子句之間的執行順序:
① group by 子句的使用必然與' 需使用聚合類函數的需求'有關(想不出沒有使用聚合類函數的需求仍然使用group by 子句的),但: 并不意味著聚合類函數一定[顯式]出現在select 語句的字段中,它也可以出現在 having ,where 等子句中(執行順序在它之后的就OK)
② 執行順序:from 子句,join ta_name on cond類 子句 , group by 子句 , having 子句 , where 子句,select 子句 ,order by 子句,limit 子句。
解5 存儲過程?
總結
以上是生活随笔為你收集整理的mysql aesc_MySQL学习笔记-2的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux的mysql主主_Linux下
- 下一篇: mysql自动提交 dcl语句_MySQ