#轉載請聯系
為了更好的了解下面的知識點,我們先創建兩張表並插入數據。
# 學生表 +----+-----------+------+--------+--------+--------+-----------+ | 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 | +--------+ | 女 | | 男 | | 保密 | | 中性 | +--------+
- 比較運算符
- 等於: =
- 大於: >
- 大於等於: >=
- 小於: <
- 小於等於: <=
- 不等於: != 或 <>
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 | +--------------+
- 分組 (第一part)
- 所謂的分組就是將一個“數據集”划分成若干個“小區域”,然后針對若干個“小區域”進行更精細化的處理。
- 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 | +--------+-------------------+----------------------+
- 分組 (第二part)
- 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~~~