Fork me on 5号黯区

SQL基础总结-02

1、having

select … from … where … group by … having … order by … limit …;
              过滤(条件) 分组      过滤(条件)  排序       限定个数
-- 上述语句执行顺序,先 from -> where -> group by -> select -> having -> order by -> limit
id Name clid
1 A 1
2 B 1
3 C 2
4 D 2
5 E 1

having:过滤作用, group by之后的过滤

select * from stu where 1=1 group by clid; -- where 1=1,因为1=1为真,且这只是个表达式,更没写一样,正常执行

结果显示:

id Name clid
1 A 1
3 C 2

如果还想对这张表进行过滤,就用having;

以第一张表为例:要查询每个班中人数大于2个的班级号是什么?

先看下面这句话:

select count(1),Name,clid as n from stu group by clid;

结果:

n Name clid
3 A 1
2 C 2
select count(1),Name,clid as n from stu group by clid having n>2; -- 因为having的执行在select之后,所以这句话相当于是从上面的表筛选n>2的;

结果:

n Name clid
3 A 1

这样就能解答提出的问题了:

-- 一般题目里包含每个班级,就要用到group by; as:取别名;人数及每条语句出现的次数可用count(1)计算
select count(1),clid as n from stu group by clid having n>2;

结果:

n clid
3 1

班级号为1

这条语句还能优化:

select clid as n from stu where count(1)>2 group by clid; -- 注意where count(1)>2 不符合本题题意,因为我们要判断哪个班级的人数多少,所以先要区分出哪些班级,where比group by先执行,还没分组就用count(1),等价于给整张表计算有多少条记录,结果就是5,5>2恒成立,where还不如不写。

完美答案:

select clid from stu group by clid having count(1)>2; -- having执行顺序在group by后面;最终结果表示:班级号为1的人数大于2
clid
1

2、order by

去看上一个笔记有详解

3、limlit

1. limit 用来获取一张表中的某些数据
2. limit 只有 在Mysql 数据库中存在 不通用 , 如其他类型的数据库要使用此功能请自行百度
3. limit 出现在sql语句的最后一个

3.案例:找出前五条记录
// 两条查询语句结果一样,开始标0 可以省略
mysql> select ename from emp limit 0,5;
mysql> select ename from emp limit 5;
+--------+
| ename  |
+--------+
| SIMITH |
| ALLEN  |
| WARD   |
| JONES  |
| MARTIN |
+--------+
5 rows in set (0.00 sec)

4.案例:按照工资降序排列,只取前五个
mysql> select ename, sal from emp order by sal desc limit 5;
+-------+------+
| ename | sal  |
+-------+------+
| KING  | 5000 |
| FORD  | 3000 |
| SCOTT | 3000 |
| JONES | 2975 |
| BLAKE | 2850 |
+-------+------+
5. 工资按照降序 查询出3到9的工资   索引是0开始的
mysql> select ename, sal from emp order by sal desc limit 2,7;
+--------+------+
| ename  | sal  |
+--------+------+
| SCOTT  | 3000 |
| JONES  | 2975 |
| BLAKE  | 2850 |
| CLARK  | 2450 |
| ALLEN  | 1600 |
| TURNER | 1500 |
| MILLER | 1300 |
+--------+------+
7 rows in set (0.00 sec)
posted @ 2020-07-31 16:19  小萝卜特·唐尼  阅读(97)  评论(0编辑  收藏  举报