子查询:
思路是将查询的范围一步一步地缩小,通过多张表之间的关联字段去确定范围,
类似于:
select * from table1 where value=any
(select value from table2 where value2=any
(select ...........))
注意:报错:[Err] 1242 - Subquery returns more than 1 row
解决方法:在=号后面加any
但是,当遇到多张表关联,有的时候并不一定都用子查询,而是用到连接查询,要将多张表中的数据匹配到一起进行比较和筛选。
例如:查询出工资比其所在部门平均工资高的所有职工信息。
select * from work x inner join
(select did,avg(salary) s from work group by did) as y on x.did=y.did where
salary>s
注意,这里如果通过子查询,是查不到对应每个部门高于平均工资的职工,所以将各个部门的平均工资匹配到对应的每个职工记录中,再利用where查询各个部门出高于平均工资的职工。
嵌套函数:
错误写法:select max(count(score));
正确写法:select max(count) from (select count(score)as count from table)as x;
分组查询:
group by语句:group by一般和聚合函数一块使用。
where 和group by 连用时,group by 必须写在where之后,
group by之后加having。
注意:having、where、聚合函数、group by所有的操作都是针对from 后面的表里的数据,