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子查询嵌套,需要理解的是:

0529f2fadfaa8c71202fdadbbad91b3f.png

要真正理解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 存储过程?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值