天天看點

基礎SQL-DQL語句-條件查詢-排序-聚合函數-分組-limit語句

7. 基礎SQL-DQL語句-條件查詢-排序-聚合函數-分組-limit語句

1. 條件查詢

前面我們的查詢都是将所有資料都查詢出來,但是有時候我們隻想擷取到

滿足條件

的資料 文法格式:

SELECT 字段名 FROM 表名 WHERE 條件;

流程:取出表中的每條資料,滿足條件的記錄就傳回,不滿足條件的記錄不傳回

1.1 準備資料

CREATE TABLE stu3 (
 id INT,
 NAME VARCHAR(20),
 age INT,
 sex VARCHAR(5),
 address VARCHAR(100),
 math INT,
 english INT
);

-- 批量插入
INSERT INTO stu3 VALUES 
(1,'馬雲',55,'男','杭州',66,78),
(2,'馬化騰',45,'女','深圳',98,87),
(3,'馬景濤',55,'男','香港',56,77),
(4,'柳岩',20,'女','湖南',76,65),
(5,'柳青',20,'男','湖南',86,NULL),
(6,'劉德華',57,'男','香港',99,99),
(7,'馬德',22,'女','香港',99,99),
(8,'德瑪西亞',18,'男','南京',56,65);
           

1.2 比較運算符

 > 大于 
 < 小于 
 <= 小于等于   
 >= 大于等于   a=3,a>=1 true;  b = 4, b>=4, true
 = 等于 
 <>  != 不等于   
           

具體操作:

查詢math分數大于80分的學生

select * from stu3 where math > 80;
           

執行如下:

-- stu3表的資料
mysql> select * from stu3;
+------+--------------+------+------+---------+------+---------+
| id   | NAME         | age  | sex  | address | math | english |
+------+--------------+------+------+---------+------+---------+
|    1 | 馬雲         |   55 | 男   | 杭州    |   66 |      78 |
|    2 | 馬化騰       |   45 | 女   | 深圳    |   98 |      87 |
|    3 | 馬景濤       |   55 | 男   | 香港    |   56 |      77 |
|    4 | 柳岩         |   20 | 女   | 湖南    |   76 |      65 |
|    5 | 柳青         |   20 | 男   | 湖南    |   86 |    NULL |
|    6 | 劉德華       |   57 | 男   | 香港    |   99 |      99 |
|    7 | 馬德         |   22 | 女   | 香港    |   99 |      99 |
|    8 | 德瑪西亞     |   18 | 男   | 南京    |   56 |      65 |
+------+--------------+------+------+---------+------+---------+
8 rows in set (0.00 sec)

-- 查詢math分數大于80分的學生
mysql> select * from stu3 where math > 80;
+------+-----------+------+------+---------+------+---------+
| id   | NAME      | age  | sex  | address | math | english |
+------+-----------+------+------+---------+------+---------+
|    2 | 馬化騰    |   45 | 女   | 深圳    |   98 |      87 |
|    5 | 柳青      |   20 | 男   | 湖南    |   86 |    NULL |
|    6 | 劉德華    |   57 | 男   | 香港    |   99 |      99 |
|    7 | 馬德      |   22 | 女   | 香港    |   99 |      99 |
+------+-----------+------+------+---------+------+---------+
4 rows in set (0.00 sec)

mysql> 
           

查詢english分數小于或等于80分的學生

select * from stu3 where english<=80;
           
mysql> select * from stu3 where english<=80;
+------+--------------+------+------+---------+------+---------+
| id   | NAME         | age  | sex  | address | math | english |
+------+--------------+------+------+---------+------+---------+
|    1 | 馬雲         |   55 | 男   | 杭州    |   66 |      78 |
|    3 | 馬景濤       |   55 | 男   | 香港    |   56 |      77 |
|    4 | 柳岩         |   20 | 女   | 湖南    |   76 |      65 |
|    8 | 德瑪西亞     |   18 | 男   | 南京    |   56 |      65 |
+------+--------------+------+------+---------+------+---------+
4 rows in set (0.00 sec)

mysql> 
           

查詢age等于20歲的學生

select * from stu3 where age=20;
           
mysql> select * from stu3 where age=20;
+------+--------+------+------+---------+------+---------+
| id   | NAME   | age  | sex  | address | math | english |
+------+--------+------+------+---------+------+---------+
|    4 | 柳岩   |   20 | 女   | 湖南    |   76 |      65 |
|    5 | 柳青   |   20 | 男   | 湖南    |   86 |    NULL |
+------+--------+------+------+---------+------+---------+
2 rows in set (0.00 sec)

mysql> 
           

查詢age不等于20歲的學生

SELECT * FROM student3 WHERE age!=20;
SELECT * FROM student3 WHERE age<>20;
           
mysql> SELECT * FROM stu3 WHERE age!=20;
+------+--------------+------+------+---------+------+---------+
| id   | NAME         | age  | sex  | address | math | english |
+------+--------------+------+------+---------+------+---------+
|    1 | 馬雲         |   55 | 男   | 杭州    |   66 |      78 |
|    2 | 馬化騰       |   45 | 女   | 深圳    |   98 |      87 |
|    3 | 馬景濤       |   55 | 男   | 香港    |   56 |      77 |
|    6 | 劉德華       |   57 | 男   | 香港    |   99 |      99 |
|    7 | 馬德         |   22 | 女   | 香港    |   99 |      99 |
|    8 | 德瑪西亞     |   18 | 男   | 南京    |   56 |      65 |
+------+--------------+------+------+---------+------+---------+
6 rows in set (0.00 sec)

mysql> 
mysql> SELECT * FROM stu3 WHERE age<>20;
+------+--------------+------+------+---------+------+---------+
| id   | NAME         | age  | sex  | address | math | english |
+------+--------------+------+------+---------+------+---------+
|    1 | 馬雲         |   55 | 男   | 杭州    |   66 |      78 |
|    2 | 馬化騰       |   45 | 女   | 深圳    |   98 |      87 |
|    3 | 馬景濤       |   55 | 男   | 香港    |   56 |      77 |
|    6 | 劉德華       |   57 | 男   | 香港    |   99 |      99 |
|    7 | 馬德         |   22 | 女   | 香港    |   99 |      99 |
|    8 | 德瑪西亞     |   18 | 男   | 南京    |   56 |      65 |
+------+--------------+------+------+---------+------+---------+
6 rows in set (0.00 sec)

mysql> 
           

1.3 邏輯運算符

and(&&) 多個條件同時滿足 

or(||) 多個條件其中一個滿足 

not(!) 不滿足
           

查詢age大于35且性别為男的學生(兩個條件同時滿足)

mysql> SELECT * FROM stu3 WHERE age>35 and sex='男';
+------+-----------+------+------+---------+------+---------+
| id   | NAME      | age  | sex  | address | math | english |
+------+-----------+------+------+---------+------+---------+
|    1 | 馬雲      |   55 | 男   | 杭州    |   66 |      78 |
|    3 | 馬景濤    |   55 | 男   | 香港    |   56 |      77 |
|    6 | 劉德華    |   57 | 男   | 香港    |   99 |      99 |
+------+-----------+------+------+---------+------+---------+
3 rows in set (0.00 sec)

mysql> 
           

查詢age大于35或性别為男的學生(兩個條件其中一個滿足)

mysql> SELECT * FROM stu3 WHERE age>35 or sex='男';
+------+--------------+------+------+---------+------+---------+
| id   | NAME         | age  | sex  | address | math | english |
+------+--------------+------+------+---------+------+---------+
|    1 | 馬雲         |   55 | 男   | 杭州    |   66 |      78 |
|    2 | 馬化騰       |   45 | 女   | 深圳    |   98 |      87 |
|    3 | 馬景濤       |   55 | 男   | 香港    |   56 |      77 |
|    5 | 柳青         |   20 | 男   | 湖南    |   86 |    NULL |
|    6 | 劉德華       |   57 | 男   | 香港    |   99 |      99 |
|    8 | 德瑪西亞     |   18 | 男   | 南京    |   56 |      65 |
+------+--------------+------+------+---------+------+---------+
6 rows in set (0.00 sec)
           

查詢id是1或3或5的學生

mysql> SELECT * FROM stu3 WHERE id=1 OR id=3 OR id=5;
+------+-----------+------+------+---------+------+---------+
| id   | NAME      | age  | sex  | address | math | english |
+------+-----------+------+------+---------+------+---------+
|    1 | 馬雲      |   55 | 男   | 杭州    |   66 |      78 |
|    3 | 馬景濤    |   55 | 男   | 香港    |   56 |      77 |
|    5 | 柳青      |   20 | 男   | 湖南    |   86 |    NULL |
+------+-----------+------+------+---------+------+---------+
3 rows in set (0.00 sec)

mysql> 
           

1.4 in關鍵字

文法格式:SELECT 字段名 FROM 表名 WHERE 字段 in (資料1, 資料2...);

in裡面的每個資料都會作為一次條件,隻要滿足條件的就會顯示

mysql> SELECT * FROM stu3 WHERE id in (1,3,5);
+------+-----------+------+------+---------+------+---------+
| id   | NAME      | age  | sex  | address | math | english |
+------+-----------+------+------+---------+------+---------+
|    1 | 馬雲      |   55 | 男   | 杭州    |   66 |      78 |
|    3 | 馬景濤    |   55 | 男   | 香港    |   56 |      77 |
|    5 | 柳青      |   20 | 男   | 湖南    |   86 |    NULL |
+------+-----------+------+------+---------+------+---------+
3 rows in set (0.01 sec)

mysql> 
           

查詢id不是1或3或5的學生

mysql> SELECT * FROM stu3 WHERE id not in (1,3,5);
+------+--------------+------+------+---------+------+---------+
| id   | NAME         | age  | sex  | address | math | english |
+------+--------------+------+------+---------+------+---------+
|    2 | 馬化騰       |   45 | 女   | 深圳    |   98 |      87 |
|    4 | 柳岩         |   20 | 女   | 湖南    |   76 |      65 |
|    6 | 劉德華       |   57 | 男   | 香港    |   99 |      99 |
|    7 | 馬德         |   22 | 女   | 香港    |   99 |      99 |
|    8 | 德瑪西亞     |   18 | 男   | 南京    |   56 |      65 |
+------+--------------+------+------+---------+------+---------+
5 rows in set (0.00 sec)

mysql> 
           

1.5 範圍

文法格式:SELECT * FROM 表名 WHERE 字段名 BETWEEN 值1 AND 值2

between 值1 and 值2
值1一定要小于值2
比如: age BETWEEN 80 AND 100
相當于: age>=80 && age<=100
           

查詢english成績大于等于75,且小于等于90的學生

-- 查詢 [75,90]
mysql> SELECT * FROM stu3 WHERE english >= 75 and english <= 90;
+------+-----------+------+------+---------+------+---------+
| id   | NAME      | age  | sex  | address | math | english |
+------+-----------+------+------+---------+------+---------+
|    1 | 馬雲      |   55 | 男   | 杭州    |   66 |      78 |
|    2 | 馬化騰    |   45 | 女   | 深圳    |   98 |      87 |
|    3 | 馬景濤    |   55 | 男   | 香港    |   56 |      77 |
+------+-----------+------+------+---------+------+---------+
3 rows in set (0.00 sec)

-- 查詢 [75,90]
mysql> SELECT * FROM stu3 WHERE english BETWEEN 75 AND 90;
+------+-----------+------+------+---------+------+---------+
| id   | NAME      | age  | sex  | address | math | english |
+------+-----------+------+------+---------+------+---------+
|    1 | 馬雲      |   55 | 男   | 杭州    |   66 |      78 |
|    2 | 馬化騰    |   45 | 女   | 深圳    |   98 |      87 |
|    3 | 馬景濤    |   55 | 男   | 香港    |   56 |      77 |
+------+-----------+------+------+---------+------+---------+
3 rows in set (0.00 sec)

mysql> 
           

1.6 like 模糊查詢:% 與 _  占位符的使用

select * from 表名 where 字段 like 條件;
   %   : 模糊所有
 _   : 模糊一位
例如:
 "馬%"  比對以"馬"字開頭
 "%馬"  比對以"馬"字結尾
 "_馬"  比對第二個字是"馬"字的 
 "__馬%"  比對第三個字是"馬"字的
 "%馬%" 比對包含"馬"字的
           

查詢姓馬的學生

mysql> SELECT * FROM stu3 WHERE name LIKE '馬%';
+------+-----------+------+------+---------+------+---------+
| id   | NAME      | age  | sex  | address | math | english |
+------+-----------+------+------+---------+------+---------+
|    1 | 馬雲      |   55 | 男   | 杭州    |   66 |      78 |
|    2 | 馬化騰    |   45 | 女   | 深圳    |   98 |      87 |
|    3 | 馬景濤    |   55 | 男   | 香港    |   56 |      77 |
|    7 | 馬德      |   22 | 女   | 香港    |   99 |      99 |
+------+-----------+------+------+---------+------+---------+
4 rows in set (0.00 sec)

mysql> 
           

查詢姓名中包含'德'字的學生

mysql> SELECT * FROM stu3 WHERE name LIKE '%德%';
+------+--------------+------+------+---------+------+---------+
| id   | NAME         | age  | sex  | address | math | english |
+------+--------------+------+------+---------+------+---------+
|    6 | 劉德華       |   57 | 男   | 香港    |   99 |      99 |
|    7 | 馬德         |   22 | 女   | 香港    |   99 |      99 |
|    8 | 德瑪西亞     |   18 | 男   | 南京    |   56 |      65 |
+------+--------------+------+------+---------+------+---------+
3 rows in set (0.01 sec)

mysql> 
           
基礎SQL-DQL語句-條件查詢-排序-聚合函數-分組-limit語句

查詢姓馬,且姓名有三個字的學生

mysql> SELECT * FROM stu3 WHERE name LIKE '馬__';
+------+-----------+------+------+---------+------+---------+
| id   | NAME      | age  | sex  | address | math | english |
+------+-----------+------+------+---------+------+---------+
|    2 | 馬化騰    |   45 | 女   | 深圳    |   98 |      87 |
|    3 | 馬景濤    |   55 | 男   | 香港    |   56 |      77 |
+------+-----------+------+------+---------+------+---------+
2 rows in set (0.01 sec)

mysql> 
           
基礎SQL-DQL語句-條件查詢-排序-聚合函數-分組-limit語句

2. 排序

通過 ORDER BY 子句,可以将查詢出的結果進行排序(排序隻是顯示方式,不會影響資料庫中資料的順序)

文法: select * from 表名 where 條件  order by 字段名稱1 [desc | asc] , 字段名2 [desc | asc]... ;

asc(預設) : 升序   
desc : 降序
先根據字段1排序,若有第二排序字段,在第一排序字段的基礎上進行第二次排序
           

2.1 單列排序

單列排序就是使用一個字段排序

查詢所有資料,使用年齡降序排序

mysql> SELECT * FROM stu3 ORDER BY age DESC;
+------+--------------+------+------+---------+------+---------+
| id   | NAME         | age  | sex  | address | math | english |
+------+--------------+------+------+---------+------+---------+
|    6 | 劉德華       |   57 | 男   | 香港    |   99 |      99 |
|    1 | 馬雲         |   55 | 男   | 杭州    |   66 |      78 |
|    3 | 馬景濤       |   55 | 男   | 香港    |   56 |      77 |
|    2 | 馬化騰       |   45 | 女   | 深圳    |   98 |      87 |
|    7 | 馬德         |   22 | 女   | 香港    |   99 |      99 |
|    4 | 柳岩         |   20 | 女   | 湖南    |   76 |      65 |
|    5 | 柳青         |   20 | 男   | 湖南    |   86 |    NULL |
|    8 | 德瑪西亞     |   18 | 男   | 南京    |   56 |      65 |
+------+--------------+------+------+---------+------+---------+
8 rows in set (0.00 sec)

mysql> 
           
基礎SQL-DQL語句-條件查詢-排序-聚合函數-分組-limit語句

2.2 組合排序

組合排序就是先按第一個字段進行排序,如果第一個字段相同,才按第二個字段進行排序,依次類推。上面的例子中,年齡是有相同的。當年齡相同再使用math進行排序

SELECT 字段名 FROM 表名 WHERE 字段=值 ORDER BY 字段名1 [ASC|DESC], 字段名2 [ASC|DESC];

查詢所有資料,在年齡降序排序的基礎上,如果年齡相同再以數學成績降序排序

mysql> SELECT * FROM stu3 ORDER BY age DESC, math DESC;
+------+--------------+------+------+---------+------+---------+
| id   | NAME         | age  | sex  | address | math | english |
+------+--------------+------+------+---------+------+---------+
|    6 | 劉德華       |   57 | 男   | 香港    |   99 |      99 |
|    1 | 馬雲         |   55 | 男   | 杭州    |   66 |      78 |
|    3 | 馬景濤       |   55 | 男   | 香港    |   56 |      77 |
|    2 | 馬化騰       |   45 | 女   | 深圳    |   98 |      87 |
|    7 | 馬德         |   22 | 女   | 香港    |   99 |      99 |
|    5 | 柳青         |   20 | 男   | 湖南    |   86 |    NULL |
|    4 | 柳岩         |   20 | 女   | 湖南    |   76 |      65 |
|    8 | 德瑪西亞     |   18 | 男   | 南京    |   56 |      65 |
+------+--------------+------+------+---------+------+---------+
8 rows in set (0.00 sec)

mysql> 
           
基礎SQL-DQL語句-條件查詢-排序-聚合函數-分組-limit語句

3. 聚合函數

之前我們做的查詢都是橫向查詢,它們都是根據條件一行一行的進行判斷,而使用聚合函數查詢是縱向查詢,它是對一列的值進行計算,然後傳回一個結果值。另外聚合函數會忽略空值

五個聚合函數:

count() : 計數
 IFNULL(字段名,0) : 如果指定字段的值為null,則使用0表示
sum() : 求和
max() : 求最大值
min() : 求最小值
avg() : 求平均值
 擴充-保留小數位
 cast(avg(字段名稱) as decimal(5,2))
-------------------
聚合函數的使用:寫在 SQL語句SELECT後查詢結果的位置
SELECT 字段名... FROM 表名;
SELECT COUNT(age) FROM 表名;
           

使用 count(字段) 查詢學生總數,不會統計 null 值

mysql> SELECT count(english) FROM stu3;
+----------------+
| count(english) |
+----------------+
|              7 |
+----------------+
1 row in set (0.00 sec)

mysql> 
           
基礎SQL-DQL語句-條件查詢-排序-聚合函數-分組-limit語句

我們發現對于NULL的記錄不會統計

IFNULL(expr1, expr2)的用法:

假如expr1 不為 NULL,則 IFNULL() 的傳回值為 expr1; 否則其傳回值為expr2, 我們可以利用IFNULL()函數,如果記錄為NULL,給個預設值,這樣統計的資料就不會遺漏

mysql> SELECT COUNT(IFNULL(english,0)) FROM stu3;
+--------------------------+
| COUNT(IFNULL(english,0)) |
+--------------------------+
|                        8 |
+--------------------------+
1 row in set (0.00 sec)

mysql> 
           
基礎SQL-DQL語句-條件查詢-排序-聚合函數-分組-limit語句

使用 count(*) 可以統計所有條數

mysql> SELECT COUNT(*) FROM stu3;
+----------+
| COUNT(*) |
+----------+
|        8 |
+----------+
1 row in set (0.00 sec)

mysql> 
           

使用 count(*) 查詢年齡大于40的總數

mysql> SELECT COUNT(*) FROM stu3 WHERE age>40;
+----------+
| COUNT(*) |
+----------+
|        4 |
+----------+
1 row in set (0.00 sec)

mysql> 
           

使用 sum(字段) 查詢數學成績總分

mysql> SELECT SUM(math) FROM stu3;
+-----------+
| SUM(math) |
+-----------+
|       636 |
+-----------+
1 row in set (0.00 sec)

mysql> 
           
基礎SQL-DQL語句-條件查詢-排序-聚合函數-分組-limit語句

使用 avg(字段) 查詢數學成績平均分

mysql> SELECT AVG(math) FROM stu3;
+-----------+
| AVG(math) |
+-----------+
|   79.5000 |
+-----------+
1 row in set (0.00 sec)

mysql> 
           
基礎SQL-DQL語句-條件查詢-排序-聚合函數-分組-limit語句

使用 max(字段) 查詢數學成績最高分

mysql> SELECT MAX(math) FROM stu3;
+-----------+
| MAX(math) |
+-----------+
|        99 |
+-----------+
1 row in set (0.00 sec)

mysql> 
           
基礎SQL-DQL語句-條件查詢-排序-聚合函數-分組-limit語句

使用 min(字段) 查詢數學成績最低分

mysql> SELECT MIN(math) FROM stu3;
+-----------+
| MIN(math) |
+-----------+
|        56 |
+-----------+
1 row in set (0.00 sec)

mysql> 
           
基礎SQL-DQL語句-條件查詢-排序-聚合函數-分組-limit語句

4. GROUP BY 分組 以及 HAVING 條件的使用

分組查詢是指使用 GROUP BY語句對查詢資訊進行分組,相同資料作為一組

SELECT 字段1,字段2... FROM 表名 GROUP BY 分組字段 [HAVING 條件];

GROUP BY怎麼分組的?将分組字段結果中相同内容作為一組

SELECT * FROM stu3 GROUP BY sex;

mysql> select * from stu3 group by sex;
+------+-----------+------+------+---------+------+---------+
| id   | NAME      | age  | sex  | address | math | english |
+------+-----------+------+------+---------+------+---------+
|    2 | 馬化騰    |   45 | 女   | 深圳    |   98 |      87 |
|    1 | 馬雲      |   55 | 男   | 杭州    |   66 |      78 |
+------+-----------+------+------+---------+------+---------+
2 rows in set (0.00 sec)

mysql> 
           

這句話會将sex相同的資料作為一組

基礎SQL-DQL語句-條件查詢-排序-聚合函數-分組-limit語句

GROUP BY

将分組字段結果中相同内容作為一組,并且傳回每組的第一條資料,是以單獨分組沒什麼用處。分組的目的就是為了統計,一般分組會跟聚合函數一起使用。

分組後聚合函數的作用?不是操作所有資料,而是操作一組資料。SELECT SUM(math), sex FROM stu3 GROUP BY sex;效果如下:

mysql> select sum(math),sex from stu3 group by sex;
+-----------+------+
| sum(math) | sex  |
+-----------+------+
|       273 | 女   |
|       363 | 男   |
+-----------+------+
2 rows in set (0.00 sec)

mysql> 
           

實際上是将每組的math進行求和,傳回每組統計的結果

基礎SQL-DQL語句-條件查詢-排序-聚合函數-分組-limit語句

注意事項:當我們使用某個字段分組,在查詢的時候也需要将這個字段查詢出來,否則看不到資料屬于哪組的

  • 查詢的時候沒有查詢出分組字段
    基礎SQL-DQL語句-條件查詢-排序-聚合函數-分組-limit語句
  • 查詢的時候查詢出分組字段
    基礎SQL-DQL語句-條件查詢-排序-聚合函數-分組-limit語句

按性别分組

mysql> select sex from stu3 group by sex;
+------+
| sex  |
+------+
| 女   |
| 男   |
+------+
2 rows in set (0.00 sec)

mysql> 
           
基礎SQL-DQL語句-條件查詢-排序-聚合函數-分組-limit語句

查詢男女各多少人

-- 1.查詢所有資料,按性别分組。2.統計每組人數
mysql> select sex,count(*) from stu3 group by sex;
+------+----------+
| sex  | count(*) |
+------+----------+
| 女   |        3 |
| 男   |        5 |
+------+----------+
2 rows in set (0.00 sec)

mysql> 
           
基礎SQL-DQL語句-條件查詢-排序-聚合函數-分組-limit語句

查詢年齡大于25歲的人,按性别分組,統計每組的人數

1.先過濾掉年齡小于25歲的人。2.再分組。3.最後統計每組的人數
mysql> select sex,count(*) from stu3 where age > 25 group by sex;
+------+----------+
| sex  | count(*) |
+------+----------+
| 女   |        1 |
| 男   |        3 |
+------+----------+
2 rows in set (0.00 sec)
           
基礎SQL-DQL語句-條件查詢-排序-聚合函數-分組-limit語句

查詢年齡大于25歲的人,按性别分組,統計每組的人數,并隻顯示性别人數大于2的資料

有很多同學可能會将SQL語句寫出這樣:

SELECT sex, COUNT(*) FROM stu3 WHERE age > 25 GROUP BY sex WHERE COUNT(*) >2;

注意: 并隻顯示性别人數>2的資料屬于分組後的條件,對于分組後的條件需要使用

having

子句

mysql> SELECT sex, COUNT(*) FROM stu3 WHERE age > 25 GROUP BY sex HAVING COUNT(*) >2;
+------+----------+
| sex  | COUNT(*) |
+------+----------+
| 男   |        3 |
+------+----------+
1 row in set (0.00 sec)
           

隻有分組後人數大于2的男這組資料顯示出來

基礎SQL-DQL語句-條件查詢-排序-聚合函數-分組-limit語句
having與where的差別
  • having是在分組後對資料進行過濾.
  • where是在分組前對資料進行過濾
  • having後面可以使用聚合函數
  • where後面不可以使用聚合函數

5. limit語句

LIMIT

限制

的意思,是以

LIMIT

的作用就是限制查詢記錄的條數。SELECT *|字段清單 [as 别名] FROM 表名 [WHERE子句]  [GROUP BY子句]\ [HAVING子句] [ORDER BY子句] [LIMIT子句];

思考:limit子句為什麼排在最後?因為前面所有的限制條件都處理完了,隻剩下顯示多少條記錄的問題了!

LIMIT文法格式:LIMIT offset,length;   或者limit length;

offset

是指偏移量,可以認為是跳過的記錄數量,預設為0

length

是指需要顯示的總記錄數

查詢學生表中資料,從第三條開始顯示,顯示6條

-- 我們可以認為跳過前面2條,取6條資料, LIMIT offset,length
mysql> SELECT * FROM stu3 LIMIT 2,6;
+------+--------------+------+------+---------+------+---------+
| id   | NAME         | age  | sex  | address | math | english |
+------+--------------+------+------+---------+------+---------+
|    3 | 馬景濤       |   55 | 男   | 香港    |   56 |      77 |
|    4 | 柳岩         |   20 | 女   | 湖南    |   76 |      65 |
|    5 | 柳青         |   20 | 男   | 湖南    |   86 |    NULL |
|    6 | 劉德華       |   57 | 男   | 香港    |   99 |      99 |
|    7 | 馬德         |   22 | 女   | 香港    |   99 |      99 |
|    8 | 德瑪西亞     |   18 | 男   | 南京    |   56 |      65 |
+------+--------------+------+------+---------+------+---------+
6 rows in set (0.00 sec)

mysql> 
           
基礎SQL-DQL語句-條件查詢-排序-聚合函數-分組-limit語句

LIMIT的使用場景:分頁

比如我們登入京東,淘寶,傳回的商品資訊可能有幾萬條,不是一次全部顯示出來。是一頁顯示固定的條數。假設我們一每頁顯示5條記錄的方式來分頁,SQL語句如下:

-- 每頁顯示5條
-- 第一頁:LIMIT 0,5; 跳過0條,顯示5條
mysql> SELECT * FROM stu3 LIMIT 0,5;
+------+-----------+------+------+---------+------+---------+
| id   | NAME      | age  | sex  | address | math | english |
+------+-----------+------+------+---------+------+---------+
|    1 | 馬雲      |   55 | 男   | 杭州    |   66 |      78 |
|    2 | 馬化騰    |   45 | 女   | 深圳    |   98 |      87 |
|    3 | 馬景濤    |   55 | 男   | 香港    |   56 |      77 |
|    4 | 柳岩      |   20 | 女   | 湖南    |   76 |      65 |
|    5 | 柳青      |   20 | 男   | 湖南    |   86 |    NULL |
+------+-----------+------+------+---------+------+---------+
5 rows in set (0.00 sec)

mysql> 


-- 第二頁:LIMIT 5,5;  跳過5條,顯示5條
mysql> SELECT * FROM stu3 LIMIT 5,5;
+------+--------------+------+------+---------+------+---------+
| id   | NAME         | age  | sex  | address | math | english |
+------+--------------+------+------+---------+------+---------+
|    6 | 劉德華       |   57 | 男   | 香港    |   99 |      99 |
|    7 | 馬德         |   22 | 女   | 香港    |   99 |      99 |
|    8 | 德瑪西亞     |   18 | 男   | 南京    |   56 |      65 |
+------+--------------+------+------+---------+------+---------+
3 rows in set (0.00 sec)

mysql> 

-- 第三頁:LIMIT 10,5; 跳過10條,顯示5條
mysql> SELECT * FROM stu3 LIMIT 10,5;
Empty set (0.00 sec)

mysql> 
           
基礎SQL-DQL語句-條件查詢-排序-聚合函數-分組-limit語句
  • 如果第一個參數是0可以簡寫:

    SELECT * FROM student3 LIMIT 0,5;

    SELECT * FROM student3 LIMIT 5;

  • LIMIT 10,5; -- 不夠5條,有多少顯示多少

6. select 查詢條件的執行順序

# DQL查詢語言書寫順序
select 字段
 from 表名   
  where 條件1
   group by 分組字段
    having 條件2(一般是分組條件)
     order by 排序字段 (desc/asc)
                     limit 索引,最大查詢數量;
                     
# DQL查詢語言執行順序   
from ... where ... group by ... having...  select ... order by... limit ...


# from 後續内容
    1. 表名可以取别名 as (可以省略)

# where 後續内容
    1. 比較運算符: >  <  >=  <=   = <> != (都是不等于)
    2. 邏輯運算符: and or not
        a. in關鍵字:  id = 1 or id =2  -> id in(1,2)
        b. between關鍵字: age between 5 and 10; ->  age>=5 and age <=10
        c. like關鍵字(模糊查詢) :  name like '%馬%'
            1). _ 表示一個
            2). % 表示0或多個
    3. 注意: 不能跟聚合函數

# group by 後續内容
 1. 聚合函數
     a. 如果不在分組查詢中,所有資料分為一組
     b. 如果在分組查詢中, 分組之後執行聚合函數
     c. 常見聚合函數
      1). sum 求和
            2). avg 平均
            3). count 統計
            4). max/min 最大/最小
        d. 注意: null不參與聚合運算的
    2. select 後面隻能跟 '被分組的列' 和 聚合函數
   3. having 可以用來過濾聚合函數的判斷條件  
   
# select 後續内容
 1. 跟被查詢的字段
 2. * 代表該表所有字段
 3. distinct 濾重: 隻儲存這個字段不同的值
 4. 字段可以取别名 as(也可以省略)

# order by 
 1. order by 字段 desc : 根據字段值降序排序(asc是升序,可以省略)
 2. order by 字段1 desc, 字段2 asc : 先根據字段1降序,如果字段1相等,根據字段2升序

# limit 索引,最大查詢數量
 -- 規律: 使用者 查詢第x頁,每頁count條
 -- 目前頁的sql如何編寫
  -- index = (x-1) * count
  select * from student limit index,count;
           

繼續閱讀