1. 程式人生 > 實用技巧 >SQL基礎總結-02

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)