SQL語句中的select高級用法


#轉載請聯系

為了更好的了解下面的知識點,我們先創建兩張表並插入數據。

# 學生表
+----+-----------+------+--------+--------+--------+-----------+
| id | name      | age  | height | gender | cls_id | is_delete |
+----+-----------+------+--------+--------+--------+-----------+
|  1 | 小明      |   18 | 180.00 ||      1 |           |
|  2 | 小月月    |   18 | 180.00 ||      2 |          |
|  3 | 彭於晏    |   29 | 185.00 ||      1 |           |
|  4 | 劉德華    |   59 | 175.00 ||      2 |          |
|  5 | 黃蓉      |   38 | 160.00 ||      1 |           |
|  6 | 鳳姐      |   28 | 150.00 | 保密   |      2 |          |
|  7 | 王祖賢    |   18 | 172.00 ||      1 |          |
|  8 | 周傑倫    |   36 |   NULL ||      1 |           |
|  9 | 程坤      |   27 | 181.00 ||      2 |           |
| 10 | 劉亦菲    |   25 | 166.00 ||      2 |           |
| 11 | 金星      |   33 | 162.00 | 中性   |      3 |          |
| 12 | 靜香      |   12 | 180.00 ||      4 |           |
| 13 | 郭靖      |   12 | 170.00 ||      4 |           |
| 14 | 周傑      |   34 | 176.00 ||      5 |           |
+----+-----------+------+--------+--------+--------+-----------+

#班級表
+----+------+
| id | name |
+----+------+
|  1 | 1班  |
|  2 | 2班  |
+----+------+

 

  • as關鍵字

as關鍵字可以給表和字段起別名,可以讓表更加易讀,或者寫sql語句時更加方便。

# as 關鍵字給字段起別名,讓查詢到的表更加直觀
mysql> select name as '名字',age as '年齡' from students;
+-----------+--------+
| 名字      | 年齡   |
+-----------+--------+
| 小明      |     18 |
| 小月月    |     18 |
| 彭於晏    |     29 |
| 劉德華    |     59 |
| 黃蓉      |     38 |
| 鳳姐      |     28 |
| 王祖賢    |     18 |
| 周傑倫    |     36 |
| 程坤      |     27 |
| 劉亦菲    |     25 |
| 金星      |     33 |
| 靜香      |     12 |
| 郭靖      |     12 |
| 周傑      |     34 |
+-----------+--------+
# as 關鍵詞給表起別名
mysql> select s.name,s.age from students as s;
+-----------+------+
| name      | age  |
+-----------+------+
| 小明      |   18 |
| 小月月    |   18 |
| 彭於晏    |   29 |
| 劉德華    |   59 |
| 黃蓉      |   38 |
| 鳳姐      |   28 |
| 王祖賢    |   18 |
| 周傑倫    |   36 |
| 程坤      |   27 |
| 劉亦菲    |   25 |
| 金星      |   33 |
| 靜香      |   12 |
| 郭靖      |   12 |
| 周傑      |   34 |
+-----------+------+
# 上面兩個例子的用法結合使用
mysql> select s.name as '名字',s.age as '年齡' from students as s;
+-----------+--------+
| 名字      | 年齡   |
+-----------+--------+
| 小明      |     18 |
| 小月月    |     18 |
| 彭於晏    |     29 |
| 劉德華    |     59 |
| 黃蓉      |     38 |
| 鳳姐      |     28 |
| 王祖賢    |     18 |
| 周傑倫    |     36 |
| 程坤      |     27 |
| 劉亦菲    |     25 |
| 金星      |     33 |
| 靜香      |     12 |
| 郭靖      |     12 |
| 周傑      |     34 |
+-----------+--------+

 

  • distinct關鍵詞

distinct關鍵詞可以消除重復行。

mysql> select distinct gender from students;
+--------+
| gender |
+--------+
||
||
| 保密   |
| 中性   |
+--------+

 

  • 比較運算符
  1. 等於: =
  2. 大於: >
  3. 大於等於: >=
  4. 小於: <
  5. 小於等於: <=
  6. 不等於: != 或 <>
mysql> select * from students where age>18;
+----+-----------+------+--------+--------+--------+-----------+
| id | name      | age  | height | gender | cls_id | is_delete |
+----+-----------+------+--------+--------+--------+-----------+
|  3 | 彭於晏    |   29 | 185.00 ||      1 |           |
|  4 | 劉德華    |   59 | 175.00 ||      2 |          |
|  5 | 黃蓉      |   38 | 160.00 ||      1 |           |
|  6 | 鳳姐      |   28 | 150.00 | 保密   |      2 |          |
|  8 | 周傑倫    |   36 |   NULL ||      1 |           |
|  9 | 程坤      |   27 | 181.00 ||      2 |           |
| 10 | 劉亦菲    |   25 | 166.00 ||      2 |           |
| 11 | 金星      |   33 | 162.00 | 中性   |      3 |          |
| 14 | 周傑      |   34 | 176.00 ||      5 |           |
+----+-----------+------+--------+--------+--------+-----------+

 

  • 邏輯運算符
  1. and
  2. or
  3. not

優先級:小括號 > 算術運算符 > 比較運算符 > not > and > or

 

# 找出除了18歲以上女性的全部人信息
mysql> select * from students where not (age>18 and gender='');
+----+-----------+------+--------+--------+--------+-----------+
| id | name      | age  | height | gender | cls_id | is_delete |
+----+-----------+------+--------+--------+--------+-----------+
|  1 | 小明      |   18 | 180.00 ||      1 |           |
|  2 | 小月月    |   18 | 180.00 ||      2 |          |
|  3 | 彭於晏    |   29 | 185.00 ||      1 |           |
|  4 | 劉德華    |   59 | 175.00 ||      2 |          |
|  6 | 鳳姐      |   28 | 150.00 | 保密   |      2 |          |
|  7 | 王祖賢    |   18 | 172.00 ||      1 |          |
|  8 | 周傑倫    |   36 |   NULL ||      1 |           |
|  9 | 程坤      |   27 | 181.00 ||      2 |           |
| 11 | 金星      |   33 | 162.00 | 中性   |      3 |          |
| 12 | 靜香      |   12 | 180.00 ||      4 |           |
| 13 | 郭靖      |   12 | 170.00 ||      4 |           |
+----+-----------+------+--------+--------+--------+-----------+

 

  • 模糊查詢
  1. like
  2. %表示任意多個任意字符
  3. _表示一個任意字符
# 查找姓周的全部同學
mysql> select * from students where name like '周%';
+----+-----------+------+--------+--------+--------+-----------+
| id | name      | age  | height | gender | cls_id | is_delete |
+----+-----------+------+--------+--------+--------+-----------+
|  8 | 周傑倫    |   36 |   NULL ||      1 |           |
| 14 | 周傑      |   34 | 176.00 ||      5 |           |
+----+-----------+------+--------+--------+--------+-----------+
# 查找姓周,且名字只有一個字的同學
mysql> select * from students where name like '周_';
+----+--------+------+--------+--------+--------+-----------+
| id | name   | age  | height | gender | cls_id | is_delete |
+----+--------+------+--------+--------+--------+-----------+
| 14 | 周傑   |   34 | 176.00 ||      5 |           |
+----+--------+------+--------+--------+--------+-----------+
# 查找姓名中 包含 "傑" 字的所有名字
mysql> select * from students where name like '%傑%';
+----+-----------+------+--------+--------+--------+-----------+
| id | name      | age  | height | gender | cls_id | is_delete |
+----+-----------+------+--------+--------+--------+-----------+
|  8 | 周傑倫    |   36 |   NULL ||      1 |           |
| 14 | 周傑      |   34 | 176.00 ||      5 |           |
+----+-----------+------+--------+--------+--------+-----------+

 

  • 范圍查詢
  1. in用在一個非連續的范圍內
  2. between ... and ...表示在一個連續的范圍內
# 查找id是1.3.5.7的同學
mysql> select * from students where id in (1,3,5,7);
+----+-----------+------+--------+--------+--------+-----------+
| id | name      | age  | height | gender | cls_id | is_delete |
+----+-----------+------+--------+--------+--------+-----------+
|  1 | 小明      |   18 | 180.00 ||      1 |           |
|  3 | 彭於晏    |   29 | 185.00 ||      1 |           |
|  5 | 黃蓉      |   38 | 160.00 ||      1 |           |
|  7 | 王祖賢    |   18 | 172.00 ||      1 |          |
+----+-----------+------+--------+--------+--------+-----------+
# 查找id為1-8的同學
mysql> select * from students where id between 1 and 8;
+----+-----------+------+--------+--------+--------+-----------+
| id | name      | age  | height | gender | cls_id | is_delete |
+----+-----------+------+--------+--------+--------+-----------+
|  1 | 小明      |   18 | 180.00 ||      1 |           |
|  2 | 小月月    |   18 | 180.00 ||      2 |          |
|  3 | 彭於晏    |   29 | 185.00 ||      1 |           |
|  4 | 劉德華    |   59 | 175.00 ||      2 |          |
|  5 | 黃蓉      |   38 | 160.00 ||      1 |           |
|  6 | 鳳姐      |   28 | 150.00 | 保密   |      2 |          |
|  7 | 王祖賢    |   18 | 172.00 ||      1 |          |
|  8 | 周傑倫    |   36 |   NULL ||      1 |           |
+----+-----------+------+--------+--------+--------+-----------+

 

  • 空判斷
  1. 判空 is null
  2. 判非空 is not null
# 查找身高為空的同學
mysql> select * from students where height is null;
+----+-----------+------+--------+--------+--------+-----------+
| id | name      | age  | height | gender | cls_id | is_delete |
+----+-----------+------+--------+--------+--------+-----------+
|  8 | 周傑倫    |   36 |   NULL ||      1 |           |
+----+-----------+------+--------+--------+--------+-----------+
# 查找填了身高信息的女性
mysql> select * from students where height is not null and gender=2;
+----+-----------+------+--------+--------+--------+-----------+
| id | name      | age  | height | gender | cls_id | is_delete |
+----+-----------+------+--------+--------+--------+-----------+
|  1 | 小明      |   18 | 180.00 ||      1 |           |
|  2 | 小月月    |   18 | 180.00 ||      2 |          |
|  5 | 黃蓉      |   38 | 160.00 ||      1 |           |
|  7 | 王祖賢    |   18 | 172.00 ||      1 |          |
| 10 | 劉亦菲    |   25 | 166.00 ||      2 |           |
| 12 | 靜香      |   12 | 180.00 ||      4 |           |
| 14 | 周傑      |   34 | 176.00 ||      5 |           |
+----+-----------+------+--------+--------+--------+-----------+

 

  • 排序
  1. 將行數據按照列1進行排序,如果某些行 列1 的值相同時,則按照 列2 排序,以此類推
  2. asc從小到大排列,即升序
  3. desc從大到小排序,即降序
  4. 默認按照列值從小到大排列(即asc關鍵字)
# 所有學生信息先按照年齡從大到小排序,當年齡相同時 按照身高從高到矮排序
mysql> select * from students order by age desc,height desc;
+----+-----------+------+--------+--------+--------+-----------+
| id | name      | age  | height | gender | cls_id | is_delete |
+----+-----------+------+--------+--------+--------+-----------+
|  4 | 劉德華    |   59 | 175.00 ||      2 |          |
|  5 | 黃蓉      |   38 | 160.00 ||      1 |           |
|  8 | 周傑倫    |   36 |   NULL ||      1 |           |
| 14 | 周傑      |   34 | 176.00 ||      5 |           |
| 11 | 金星      |   33 | 162.00 | 中性   |      3 |          |
|  3 | 彭於晏    |   29 | 185.00 ||      1 |           |
|  6 | 鳳姐      |   28 | 150.00 | 保密   |      2 |          |
|  9 | 程坤      |   27 | 181.00 ||      2 |           |
| 10 | 劉亦菲    |   25 | 166.00 ||      2 |           |
|  1 | 小明      |   18 | 180.00 ||      1 |           |
|  2 | 小月月    |   18 | 180.00 ||      2 |          |
|  7 | 王祖賢    |   18 | 172.00 ||      1 |          |
| 12 | 靜香      |   12 | 180.00 ||      4 |           |
| 13 | 郭靖      |   12 | 170.00 ||      4 |           |
+----+-----------+------+--------+--------+--------+-----------+

 

  • 分頁
select * from students limit start=0,count  # start=可省略
  1. 從start開始,獲取count條數據
  2. start默認值為0
# 年齡從小到大,前6個作為第一頁
mysql> select * from students order by age asc limit 0,6;
+----+-----------+------+--------+--------+--------+-----------+
| id | name      | age  | height | gender | cls_id | is_delete |
+----+-----------+------+--------+--------+--------+-----------+
| 12 | 靜香      |   12 | 180.00 ||      4 |           |
| 13 | 郭靖      |   12 | 170.00 ||      4 |           |
|  1 | 小明      |   18 | 180.00 ||      1 |           |
|  2 | 小月月    |   18 | 180.00 ||      2 |          |
|  7 | 王祖賢    |   18 | 172.00 ||      1 |          |
| 10 | 劉亦菲    |   25 | 166.00 ||      2 |           |
+----+-----------+------+--------+--------+--------+-----------+
# 注意:在sql語句中limit后不可以直接加公式

 

  • 聚合函數
  1. 聚合函數,aggregation function,又稱為組函數。默認情況下 聚合函數會對當前所在表當做一個組進行統計。
  2. count(*) 計算總行數
  3. max(列) 表示求此列的最大值
  4. min(列)表示求此列的最小值
  5. sum(列)表示求此列的和
  6. avg(列)表示求此列的平均值
# 計算出全班同學的平均年齡
mysql> select avg(age) as '平均年齡' from students;
+--------------+
| 平均年齡     |
+--------------+
|      27.6429 |
+--------------+

 

  • 分組 (第一part)
  1. 所謂的分組就是將一個“數據集”划分成若干個“小區域”,然后針對若干個“小區域”進行更精細化的處理。 
  2. group by的含義:將查詢結果按照1個或多個字段進行分組,字段值相同的為一組
  3. group by可用於單個字段分組,也可用於多個字段分組
# 性別分組
mysql> select gender from students group by gender;
+--------+
| gender |
+--------+
||
||
| 中性   |
| 保密   |
+--------+
# 查詢各個性別的平均年齡和平均身高,並保持兩位小數。
mysql> select gender,round(avg(age),2),round(avg(height),2) from students group by gender;
+--------+-------------------+----------------------+
| gender | round(avg(age),2) | round(avg(height),2) |
+--------+-------------------+----------------------+
||             32.60 |               177.75 |
||             23.29 |               173.43 |
| 中性   |             33.00 |               162.00 |
| 保密   |             28.00 |               150.00 |
+--------+-------------------+----------------------+

 

  • 分組 (第二part)
  1. group by + group concat():group_concat(字段名)根據分組結果,使用group_concat()來放置每一個分組中某字段的集合
  2. group by + having:having 條件表達式用來過濾分組結果。having作用和where類似,但having只能用於group by,而where是用來過濾表數據的。
# 查找各個性別分組里有哪些同學
mysql> select gender,group_concat(name) from students group by gender;
+--------+-----------------------------------------------------------+
| gender | group_concat(name)                                        |
+--------+-----------------------------------------------------------+
|| 彭於晏,劉德華,周傑倫,程坤,郭靖                            |
|| 小明,小月月,黃蓉,王祖賢,劉亦菲,靜香,周傑                  |
| 中性   | 金星                                                      |
| 保密   | 鳳姐                                                      |
+--------+-----------------------------------------------------------+
# 按性別分組,分別統計出平均年齡超過30歲的組的性別以及姓名
mysql> select gender,avg(age),group_concat(name) from students group by gender having avg(age)>30;
+--------+----------+---------------------------------------------+
| gender | avg(age) | group_concat(name)                          |
+--------+----------+---------------------------------------------+
||  32.6000 | 彭於晏,劉德華,周傑倫,程坤,郭靖              |
| 中性   |  33.0000 | 金星                                        |
+--------+----------+---------------------------------------------+

 

  • 子查詢

在一個 select 語句中,嵌入了另外一個 select 語句,那么被嵌入的 select 語句稱之為子查詢語句,外部那個select語句則稱為主查詢。

  1. 標量子查詢: 子查詢返回的結果是一個數據(一行一列)
  2. 列子查詢: 子查詢返回的結果是一列(一列多行)
  3. 行子查詢: 子查詢返回的結果是一行(一行多列)
  4. 表子查詢: 子查詢返回的結果是一個臨時表(多行多列)
# 標量子查詢,子查詢返回的結果是一個數據
# 查找大於班級平均年齡的同學的信息 mysql
> select * from students where age>(select avg(age) from students); +----+-----------+------+--------+--------+--------+-----------+ | id | name | age | height | gender | cls_id | is_delete | +----+-----------+------+--------+--------+--------+-----------+ | 3 | 彭於晏 | 29 | 185.00 || 1 | | | 4 | 劉德華 | 59 | 175.00 || 2 |  | | 5 | 黃蓉 | 38 | 160.00 || 1 | | | 6 | 鳳姐 | 28 | 150.00 | 保密 | 2 |  | | 8 | 周傑倫 | 36 | NULL || 1 | | | 11 | 金星 | 33 | 162.00 | 中性 | 3 |  | | 14 | 周傑 | 34 | 176.00 || 5 | | +----+-----------+------+--------+--------+--------+-----------+
# 列子查詢 子查詢返回的結果是一列
# 查找有對應班級的學生的全部信息
mysql> select * from students where cls_id in (select id from classes);
+----+-----------+------+--------+--------+--------+-----------+
| id | name      | age  | height | gender | cls_id | is_delete |
+----+-----------+------+--------+--------+--------+-----------+
|  1 | 小明      |   18 | 180.00 ||      1 |           |
|  2 | 小月月    |   18 | 180.00 ||      2 |          |
|  3 | 彭於晏    |   29 | 185.00 ||      1 |           |
|  4 | 劉德華    |   59 | 175.00 ||      2 |          |
|  5 | 黃蓉      |   38 | 160.00 ||      1 |           |
|  6 | 鳳姐      |   28 | 150.00 | 保密   |      2 |          |
|  7 | 王祖賢    |   18 | 172.00 ||      1 |          |
|  8 | 周傑倫    |   36 |   NULL ||      1 |           |
|  9 | 程坤      |   27 | 181.00 ||      2 |           |
| 10 | 劉亦菲    |   25 | 166.00 ||      2 |           |
+----+-----------+------+--------+--------+--------+-----------+
# 行子查詢 子查詢返回的結果是一行
# 查找出年齡最大,而且身高最高的那個人。 mysql
> select * from students where (age,height)=(select max(age),max(height) from students); Empty set (0.00 sec)
# 表子查詢 子查詢返回的是一個表
# 查找學號小於6的男同學
mysql> select * from (select * from students where id<6) as a where a.gender=1;
+----+-----------+------+--------+--------+--------+-----------+
| id | name      | age  | height | gender | cls_id | is_delete |
+----+-----------+------+--------+--------+--------+-----------+
|  3 | 彭於晏    |   29 | 185.00 ||      1 |           |
|  4 | 劉德華    |   59 | 175.00 ||      2 |          |
+----+-----------+------+--------+--------+--------+-----------+

# 注意:子查詢返回的表是一個臨時表,所以一定要用as關鍵詞起個別名

 

 

SELECT select_expr [,select_expr,...] [ FROM tb_name [JOIN 表名]
      [ON 連接條件] 
      [WHERE 條件判斷]
      [GROUP BY {col_name | postion} [ASC | DESC], ...] [HAVING WHERE 條件判斷]
      [ORDER BY {col_name|expr|postion} [ASC | DESC], ...] [ LIMIT {[offset,]rowcount | row_count OFFSET offset}] ] # 精簡版 select distinct *
from 表名 where .... group by ... having ... order by ... limit start,count #執行順序 from 表名 where .... group by ... select distinct *
having ... order by ... limit start,count

 

end~~~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM