SQL基礎總結-02
阿新 • • 發佈:2020-07-31
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)