@TOC
写在最前,本篇文章大部分来源于动力节点MySQL入门基础的提炼,并附带自己的理解。主要是为了复习此前学了又忘的数据库。如果同时还能对其他人有所裨益,那就更好不过了。如果有谬误的地方,还请不吝指出。
子查询
什么是子查询?
select语句中嵌套select语句,被嵌套的语句称为子查询
在select,from,where后面皆可以出现子查询
where子句中的子查询
案例:比最低工资高的员工姓名和工资?
select sal from emp where sal > min(sal);
由于分组函数不能放在where后面,这句语句肯定是错的,那么怎样达到相同的效果呢?
select sal from emp where sal > (select min(sal) from emp);
from子句中的子查询
案例:每个岗位的平均工资的薪资等级。
第一步:找出平均工资
mysql> select job, avg(sal) from emp group by job;
+-----------+-------------+
| job | avg(sal) |
+-----------+-------------+
| CLERK | 1037.500000 |
| SALESMAN | 1400.000000 |
| MANAGER | 2758.333333 |
| ANALYST | 3000.000000 |
| PRESIDENT | 5000.000000 |
+-----------+-------------+
第二步:将上步结果当成临时表t
mysql> select t.*, s.grade from t join salgrade s on t.avg(sal) between s.losal and s.hisal;
将之前的语句放入t前
mysql> select t.*, s.grade from (select job, avg(sal) as tavg from emp group by job) t join salgrade s on t.tavg between s.losal and s.hisal;
将计算出来的临时结果当成一张表,也就是from子句的子查询。
union
mysql> select ename, job from emp where job='manager'
-> union
-> select ename, job from emp where job='salesman';
+--------+----------+
| ename | job |
+--------+----------+
| JONES | MANAGER |
| BLAKE | MANAGER |
| CLARK | MANAGER |
| ALLEN | SALESMAN |
| WARD | SALESMAN |
| MARTIN | SALESMAN |
| TURNER | SALESMAN |
+--------+----------+
相当于or,但效率更高一些,可以减小匹配的次数,把乘法变为了加法。
但union进行合并时要求:结果集的列数相同;在Mysql中数据类型可以不一致,但oracle要求一致。
limit
将查询结果集的一部分取出来,通常使用在分页查询中。
完整用法 limit + start, len
缺省用法 limit + len, 默认起始下标为0
注意:limit在order by 之后执行
select sal from emp order by asc sal;