生活随笔
收集整理的這篇文章主要介紹了
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關鍵字可以給表和字段起別名,可以讓表更加易讀,或者寫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關鍵詞可以消除重復行。
mysql
> select distinct gender
from students;
+ -- ------+
| gender
|
+ -- ------+
| 女
|
| 男
|
| 保密
|
| 中性
|
+ -- ------+ ?
等于: = 大于: > 大于等于: >= 小于: < 小于等于: <= 不等于: != 或 <> 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 | |
+ -- --+-----------+------+--------+--------+--------+-----------+ ?
and or 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 | |
+ -- --+-----------+------+--------+--------+--------+-----------+ ?
like %表示任意多個任意字符 _表示一個任意字符 # 查找姓周的全部同學
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 | |
+ -- --+-----------+------+--------+--------+--------+-----------+ ?
in用在一個非連續的范圍內 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 | |
+ -- --+-----------+------+--------+--------+--------+-----------+ ?
判空 is null 判非空 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 的值相同時,則按照 列2 排序,以此類推 asc從小到大排列,即升序 desc從大到小排序,即降序 默認按照列值從小到大排列(即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
= 可省略
從start開始,獲取count條數據 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后不可以直接加公式 ?
聚合函數,aggregation function,又稱為組函數。默認情況下 聚合函數會對當前所在表當做一個組進行統計。 count(*) 計算總行數 max(列) 表示求此列的最大值 min(列)表示求此列的最小值 sum(列)表示求此列的和 avg(列)表示求此列的平均值 # 計算出全班同學的平均年齡
mysql > select avg (age)
as ' 平均年齡 ' from students;
+ -- ------------+
| 平均年齡
|
+ -- ------------+
| 27.6429 |
+ -- ------------+ ?
所謂的分組就是將一個“數據集”劃分成若干個“小區域”,然后針對若干個“小區域”進行更精細化的處理。? group by的含義:將查詢結果按照1個或多個字段進行分組,字段值相同的為一組 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 |
+ -- ------+-------------------+----------------------+ ?
group by + group concat():group_concat(字段名)根據分組結果,使用group_concat()來放置每一個分組中某字段的集合 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語句則稱為主查詢。
標量子查詢: 子查詢返回的結果是一個數據(一行一列) 列子查詢: 子查詢返回的結果是一列(一列多行) 行子查詢: 子查詢返回的結果是一行(一行多列) 表子查詢: 子查詢返回的結果是一個臨時表(多行多列) # 標量子查詢,子查詢返回的結果是一個數據 # 查找大于班級平均年齡的同學的信息
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關鍵詞起個別名 ?
連接與自連接(參考我的另一篇博文:https://www.cnblogs.com/chichung/p/9588187.html) 附錄 SQL的完整格式 ?
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~~~
?
轉載于:https://www.cnblogs.com/chichung/p/9585127.html
總結
以上是生活随笔 為你收集整理的SQL语句中的select高级用法 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。