数据库SQL语言从入门到精通--Part 6--单表查询(快来PICK)
數據庫從入門到精通合集(超詳細,學習數據庫必看)
查詢操作是SQL語言中很重要的操作,我們今天就來詳細的學習一下。
一、數據查詢的語句格式
SELECT [ALL|DISTINCT] <目標列表達式>[,<目標列表達式> ....] --可以選擇多個列 FROM <表名或視圖名>[, <表名或視圖名> ....]--可以選擇多個表或視圖 [ WHERE <條件表達式> ] --查詢什么條件的數據 [ GROUP BY <列名1> [ HAVING <條件表達式> ] ] --按什么條件分組 [ ORDER BY <列名2> [ ASC|DESC ] ];--按什么條件排序- SELECT子句:指定要顯示的屬性列
- FROM子句:指定查詢對象(基本表或視圖)
- WHERE子句:指定查詢條件
- GROUP BY子句:
細化聚集函數的作用對象- 未對查詢結果分組,聚集函數將作用于整個查詢結果
- 對查詢結果分組后,聚集函數將分別作用于每個組
- 作用對象是查詢的中間結果表
- 按指定的一列或多列值分組,值相等的為一組
合計函數 (比如 SUM) 常常需要添加 GROUP BY 語句。
例子:
BILL表
| 張三 | 10 | 2020-3-19 |
| 李四 | 29 | 2020-3-19 |
| 王五 | 9 | 2020-3-19 |
| 張三 | 21 | 2020-3-19 |
| 王五 | 19 | 2020-3-20 |
執行SELECT Customer ,SUM(Quantity) FROM BILL GROUP BY Customer
我們會得到如下表
| 張三 | 31 |
| 李四 | 29 |
| 王五 | 28 |
如果我們不加GROUP BY 會得到這樣一個表
| 張三 | 88 |
| 李四 | 88 |
| 王五 | 88 |
| 張三 | 88 |
| 王五 | 88 |
當然GROUP BY也可以按多個列分組,即兩個都想同時才會被分到一個組
還是對BILL表操作 SELECT Customer ,SUM(Quantity) FROM BILL GROUP BY Customer,Date
我們會得到如下表
| 張三 | 31 |
| 李四 | 29 |
| 王五 | 9 |
| 王五 | 19 |
-
HAVING短語:
篩選出只有滿足指定條件的組
例子:
BILL表CustomerQuantityDate 張三 10 2020-3-19 李四 29 2020-3-19 王五 9 2020-3-19 張三 21 2020-3-19 王五 19 2020-3-20 我們查詢購買總量小于30的Customer
SELECT Customer,SUM(Quantity) From BILL GROUP BY Customer HAVING SUM(Quantity)>30我們會得到如下:
CustomerQuantity 張三 31 -
ORDER BY子句:對查詢結果表按指定列值的升序或降序排序
還是對BILL表操作CustomerQuantityDate 張三 10 2020-3-19 李四 29 2020-3-19 王五 9 2020-3-19 張三 21 2020-3-19 王五 19 2020-3-20 我們想按照購買總數量排列查詢結果
SELECT Customer ,SUM(Quantity) FROM BILL GROUP BY Customer ORDER BY SUM(Quantity) ASC我們會得到如下表
CustomerQuantity 王五 28 李四 29 張三 31
ORDER BY子句
- 可以按一個或多個屬性列排序
- 升序:ASC;降序:DESC;缺省值為升序
- 當排序列含空值時
- ASC:排序列為空值的元組最后顯示
- DESC:排序列為空值的元組最先顯示
二、單表查詢
剛才在介紹那幾個保留字的時候,我們簡單的舉了幾個查詢的例子,現在我們詳細系統的介紹一下,有點重復,但是比較基礎,加深印象。
1.選擇表中的若干列查詢
選擇某幾列查詢:
SELECT <列1>,<列2>...... FROM <數據表>;選擇全部列查詢:
當然我們可以,把所有的列一一列舉,我們也可以使用SELECT *
舉例:
還是BILL表
| 張三 | 10 | 2020-3-19 |
| 李四 | 29 | 2020-3-19 |
| 王五 | 9 | 2020-3-19 |
| 張三 | 21 | 2020-3-19 |
| 王五 | 19 | 2020-3-20 |
得到如下表
| 張三 |
| 李四 |
| 王五 |
| 張三 |
| 王五 |
執行:
SELECT Customer ,Quantity,Date FROM BILL --或者 SELECT * FROM BILL得到如下結果
| 張三 | 10 | 2020-3-19 |
| 李四 | 29 | 2020-3-19 |
| 王五 | 9 | 2020-3-19 |
| 張三 | 21 | 2020-3-19 |
| 王五 | 19 | 2020-3-20 |
2.查詢經過計算的值
之前我們給出了SELECT標準格式:
SELECT [ALL|DISTINCT] <目標列表達式>[,<目標列表達式> ....] --可以選擇多個列 FROM <表名或視圖名>[, <表名或視圖名> ....]--可以選擇多個表或視圖 [ WHERE <條件表達式> ] --查詢什么條件的數據 [ GROUP BY <列名1> [ HAVING <條件表達式> ] ] --按什么條件分組 [ ORDER BY <列名2> [ ASC|DESC ] ];--按什么條件排序其中目標表達式可以為:
- 算術表達式
- 字符串常量
- 函數
- 列別名
例子:
Students表
| 李勇 | 1999 |
| 劉晨 | 1997 |
| 王敏 | 1996 |
| 張立 | 1998 |
我們查詢每個人的年齡:
SELECT NAME,2020-Birth FROM Student;得道如下的查詢結果:
| 李勇 | 21 |
| 劉晨 | 23 |
| 王敏 | 24 |
| 張立 | 22 |
在查詢中添加新的字符串列
例子
| 李勇 | 1999 |
| 劉晨 | 1997 |
| 王敏 | 1996 |
| 張立 | 1998 |
結果:
| 李勇 | Birth is: | 1999 |
| 劉晨 | Birth is: | 1997 |
| 王敏 | Birth is: | 1996 |
| 張立 | Birth is: | 1998 |
查詢中顯示列別名
例子
Students表
| 李勇 | 1999 |
| 劉晨 | 1997 |
| 王敏 | 1996 |
| 張立 | 1998 |
結果
| 李勇 | 1999 |
| 劉晨 | 1997 |
| 王敏 | 1996 |
| 張立 | 1998 |
3.選擇表中的若干元組(行)
元組(tuple)是關系數據庫中的基本概念,關系是一張表,表中的每行(即數據庫中的每條記錄)就是一個元組,每列就是一個屬性。 在二維表里,元組也稱為行。
DISTINCT 語句:
指定DISTINCT關鍵詞,去掉表中重復的行
例子:
BILL表
| 張三 | 10 | 2020-3-19 |
| 李四 | 29 | 2020-3-19 |
| 王五 | 9 | 2020-3-19 |
| 張三 | 21 | 2020-3-19 |
| 王五 | 19 | 2020-3-20 |
我們執行以下語句查看區別:
SELECT DISTINCT Customer FROM BILL| 張三 |
| 李四 |
| 王五 |
如果不加DISTINCT,結果如下:
| 張三 |
| 李四 |
| 王五 |
| 張三 |
| 王五 |
作用顯而易見
查詢滿足條件的元組:
| 比 較 | =,>,<,>=,<=,!=,<>,!>,!<;NOT+上述比較運算符 |
| 確定范圍 | BETWEEN AND,NOT BETWEEN AND |
| 確定集合 | IN,NOT IN |
| 字符匹配 | LIKE,NOT LIKE |
| 空 值 | IS NULL,IS NOT NULL |
| 多重條件(邏輯運算) | AND,OR,NOT |
這次我們多舉幾個例子:
Student表
| 張三 | 18 | C.S | 80 | 1 |
| 李四 | 18 | C.S | 72 | 0 |
| 王五 | 17 | I.C.S | 63 | 0 |
| 韓六 | 18 | C.S | 98 | 1 |
| 周七 | 19 | I.C.S | 34 | 0 |
| 趙八 | 20 | C.S | 60 | 1 |
以下所有查詢的基本表都默認為Student表
例一: 查詢計算機科學系全體學生的名單
SELECT SnameFROM StudentWHERE Sdept='C.S.';結果:
| 張三 |
| 李四 |
| 韓六 |
| 趙八 |
例二: 查詢所有年齡在18歲以上的學生姓名及其年齡。
SELECT Sname,Sage FROM Student WHERE Sage>18;結果
| 周七 | 19 |
| 趙八 | 20 |
BETWEEN…AND…語句
例三: 查詢年齡在18~20歲(包括18歲和20歲)之間的學生的姓名、系別和年齡
結果
| 張三 | 18 | C.S |
| 李四 | 18 | C.S |
| 韓六 | 18 | C.S |
| 周七 | 19 | I.C.S |
| 趙八 | 20 | C.S |
例四: 查詢年齡不在18~20歲(包括18歲和20歲)之間的學生的姓名、系別和年齡
SELECT Sname,Sage,Sdept FROM Student WHERE Sage NOT BETWEEN 18 AND 20;結果
| 王五 | 17 | I.C.S |
IN/NOT IN語句
例四: 查詢年齡為17 和 20歲的學生姓名,年齡及專業
結果
| 王五 | 17 | I.C.S |
| 趙八 | 20 | C.S |
例五: 查詢年齡不為17 和 20歲的學生姓名,年齡及專業
SELECT Sname,Sage,Sdept FROM Student WHERE Sage NOT IN (17,20);| 張三 | 18 | C.S |
| 李四 | 18 | C.S |
| 韓六 | 18 | C.S |
| 周七 | 19 | I.C.S |
字符串匹配:
語法格式:
謂詞:
[NOT] LIKE ‘<匹配串>’ [ESCAPE ‘ <換碼字符>’]
<匹配串>:指定匹配模板
匹配模板:固定字符串或含通配符的字符串
當匹配模板為固定字符串時,
可以用 = 運算符取代 LIKE 謂詞
用 != 或 < >運算符取代 NOT LIKE 謂詞
通配符:
| % | 代表任意長度(長度可以為0)的字符串 |
| _ | 僅替代一個字符 |
| [charlist] | 字符列中的任何單一字符 |
| [^charlist]或者[!charlist] | 不在字符列中的任何單一字符 |
例:
a%b表示以a開頭,以b結尾的任意長度的字符串。如acb,addgb,ab 等都滿足該匹配串
a_b表示以a開頭,以b結尾的長度為3的任意字符串。如acb,afb等都滿足該匹配串
ESCAPE 短語:
當用戶要查詢的字符串本身就含有 % 或 _ 時,要使用ESCAPE ‘<換碼字符>’ 短語對通配符進行轉義。
類型1: 匹配串為固定字符串
查詢學號為200215121的學生的詳細情況。
等價于:
SELECT * FROM Student WHERE Sno = ' 200215121 ';類型2: 匹配串為含通配符的字符串
查詢所有姓劉學生的姓名、學號和性別。
SELECT Sname,Sno,SsexFROM StudentWHERE Sname LIKE ‘劉%’;查詢姓"歐陽"且全名為三個漢字的學生的姓名。
SELECT SnameFROM StudentWHERE Sname LIKE '歐陽__';查詢名字中第2個字為"陽"字的學生的姓名和學號。
SELECT Sname,SnoFROM StudentWHERE Sname LIKE ‘__陽%’;查詢所有不姓劉的學生姓名。
SELECT Sname,Sno,SsexFROM StudentWHERE Sname NOT LIKE '劉%';類型3: 使用換碼字符將通配符轉義為普通字符
查詢DB_Design課程的課程號和學分。
SELECT Cno,CcreditFROM CourseWHERE Cname LIKE 'DB\_Design' ESCAPE '\‘;查詢以"DB_"開頭,且倒數第3個字符為 i的課程的詳細情況。
SELECT *FROM CourseWHERE Cname LIKE 'DB\_%i_ _' ESCAPE ' \ ‘;ESCAPE ‘\’ 表示“ \” 為換碼字符
學過C++的大家都知道\n代表換行,\為轉義字符。這里是說,我們通過ESCAPE語句將\定義為換碼字符(可以理解為轉義字符)
類型4: 涉及空值的查詢
謂詞:IS NULL 或 IS NOT NULL 而且 “IS” 不能用 “=” 代替。
如果某些同學的信息不完整,比如在某個表中手機號未填寫,那這位同學的元組中的手機號這一屬性為NULL;
要想查出這類同學的姓名我們可以執行以下操作
Student表
| 張三 | 18 | C.S | 80 | 1 | 12345678 |
| 李四 | 18 | C.S | 72 | 0 | 12345679 |
| 王五 | 17 | I.C.S | 63 | 0 | 12345680 |
| 韓六 | 18 | C.S | 98 | 1 | NULL |
| 周七 | 19 | I.C.S | 34 | 0 | 234234234 |
| 趙八 | 20 | C.S | 60 | 1 | NULL |
| 韓六 | NULL |
| 趙八 | NULL |
類型5: 多重條件查詢
邏輯運算符:
AND:且 連接前后兩個條件都成立時表達式為真
OR:或 連接前后表達式有一個為真時表達式為真
AND優先級大于OR,可以加括號進行復合運算,進而改變優先級。
| 比 較 | =,>,<,>=,<=,!=,<>,!>,!<;NOT+上述比較運算符 |
| 確定范圍 | BETWEEN AND,NOT BETWEEN AND |
| 確定集合 | IN,NOT IN |
| 字符匹配 | LIKE,NOT LIKE |
| 空 值 | IS NULL,IS NOT NULL |
| 多重條件(邏輯運算) | AND,OR,NOT |
可以連接上面表中的所有運算符,只要保證最后得到表達可以分辨真假有意義即可。
這個比較簡單我們舉一個例子:
查詢18歲的學生且屬于計算機科學專業的姓名,年齡,專業
| 張三 | 18 | C.S | 80 | 1 | 12345678 |
| 李四 | 18 | C.S | 72 | 0 | 12345679 |
| 王五 | 17 | I.C.S | 63 | 0 | 12345680 |
| 韓六 | 18 | C.S | 98 | 1 | NULL |
| 周七 | 19 | I.C.S | 34 | 0 | 234234234 |
| 趙八 | 20 | C.S | 60 | 1 | NULL |
| 張三 | 18 | C.S |
| 李四 | 18 | C.S |
| 韓六 | 18 | C.S |
4.聚集函數
計數
SQL COUNT(column_name) 語法
COUNT(column_name) 函數返回指定列的值的數目(NULL 不計入):
SQL COUNT(*) 語法
COUNT(*) 函數返回表中的記錄數:
SQL COUNT(DISTINCT column_name) 語法
COUNT(DISTINCT column_name) 函數返回指定列的不同值的數目:
例:
查詢學生總人數。
查詢選修了課程的學生人數。
SELECT COUNT(DISTINCT Sno)FROM SC計算總和
SQL SUM() 語法
SELECT SUM(column_name) FROM table_name開頭舉過例子,這里就不再重復贅述。
計算平均值
AVG 函數返回數值列的平均值。NULL 值不包括在計算中。
SQL AVG() 語法
SELECT AVG(column_name) FROM table_name例
計算1號課程的學生平均成績。
最大最小值
MAX() 函數和MIN()函數
MAX 函數返回一列中的最大值,MIN 函數返回一列中的最小值。NULL 值不包括在計算中。
SQL中的語法
SELECT MAX(column_name) FROM table_name SELECT MIN(column_name) FROM table_nameMIN 和 MAX 也可用于文本列,以獲得按字母順序排列的最高或最低值。
例:
查詢選修1號課程的學生最高分數。
寫在最后:
我叫風骨散人,名字的意思是我多想可以不低頭的自由生活,可現實卻不是這樣。家境貧寒,總得向這個世界低頭,所以我一直在奮斗,想改變我的命運給親人好的生活,希望同樣被生活綁架的你可以通過自己的努力改變現狀,深知成年人的世界里沒有容易二字。目前是一名在校大學生,預計考研,熱愛編程,熱愛技術,喜歡分享,知識無界,希望我的分享可以幫到你!
如果有什么想看的,可以私信我,如果在能力范圍內,我會發布相應的博文!
謝謝大家的閱讀!😘
總結
以上是生活随笔為你收集整理的数据库SQL语言从入门到精通--Part 6--单表查询(快来PICK)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学数据库还不会Select,SQL Se
- 下一篇: 全网最简单明了的MySQL连接Eclip