前言
數據的作業不僅僅是存放數據,它的更重要的作用是根據用戶的需求(也就是條件)來顯示用戶所需要的數據。
本章詳細介紹select語句、DMT語句、事物控制等等知識。
一。SQL語言概述
SQL(Structured Query Language,結構化查詢語言),用來實現關系運算中的查詢、選擇等操作,是一個綜合的、功能極強同時也是一種簡單易學的語音。
1.1 SQL 語言的特點
- SQL語言采用集合操作方式,對數據的處理是成組進行的
- 執行SQL語句時,每次只能發送並處理一條語句
- 執行SQL語句時,用戶只需要知道邏輯含義,無需關心SQL的具體執行
1.2 SQL語言分類
①查詢語言
比如select
②數據操縱語言(Data Manipulation Lanuage,DMT)
- Insert
- Update
- Delete
- Merge(合並 插入 修改)
③數據定義語言(Data Definition Language,DDL)
- Create
- Drop
- Rename
- Truncate(刪除表的全部內容)
④事物控制(Transaction Control ,TC)語句
- Commit 永久性的保存對行所做的修改
- Rollback 取消對行所做的修改
- Savepoint 設置一個“保存點”,可以將對行的修改回滾到此處
⑤數據控制語言(Data Control Language,DCL)
- Grant 授予其他用戶對數據庫結構的訪問權限
- Revoke 收回用戶數據庫結構的權限
1.3 SQL語句的編寫規則
- SQL關鍵字不區分大小寫,也就是大小寫不敏感
- 對象名和列名不區分大小寫
- 字符值和日期值區分大小寫
具體一些 看后記中的參考文獻
二。數據查詢語法
Select [All|Distinct] <列名> [,<列名> ]...
from <表名或試圖名>
[where <條件表達式>]
[Group by <列名1> [Having <條件表達式>]]
[Order by <列名2> [ASC|DESC]]
OK,上面就是查詢語句的語法。這個怎么看呢?很簡單。。貌似以前也說過。就是方括號([])中的內容是可選的,尖括號(<>)是一定要選擇的。
測試數據
我新建了3個表,如下
學生表:Student(Sno,Sname,Ssex,Sage,Ddept)
課程表:Course(Cno,Cname,Cpno(先行課),Ccredit(學分))
這里需要解釋一下,什么叫先行課:就是比如你要學C#,那么你需要一定的計算機基礎的知識,那么這個計算機知識就是先行課。
學生選課表:SC(Sno,Cno,Grade)
三。數據查詢-----單表查詢
顧名思義就是在一個表中查詢。這個是最簡單的查詢咯!
3.1選擇表中的若干列
①查詢指定列
【例子1】從student表中查出所有學生姓名和學號
②查詢所有的列值
【例子2】從course表中查出所有的課程信息
③查詢經過計算的值
【例子3】從student表中查出學生的姓名和生日日期
<列名>不僅可以是算數表達式,還可以是字符串常量、函數等。
【例子4】我現在要找出全體學生的姓名、出生年份以及院系,但要求院系都要小寫!如下:
用戶可以通過指定別名來改變查詢結果的列標題,例子如下:
3.2選擇表中的若干元組
①消除取值重復的行
需要記住的關鍵字是:distinct
【例子5】使用distinct
②查詢滿足條件的元組
我們都知道查詢滿足指定條件是可以通過Where字句來實現的,where字句常用的查詢條件如下:
查詢條件 | 謂詞 |
比較大小 | =,<,>>=,<=,!=,<>.... |
確定范圍 | between and,not between and |
確定集合 | In,not in |
字符匹配 | Like,not like |
空值 | is null, is not null |
多重條件(邏輯運算) | and ,or ,not |
(1)比較大小
【例子6】查詢計算機系全體學生的名單
【例子7】查詢年齡在20歲以下的學生
(2)確定范圍
【例子8】查詢年齡在20~25(包括20 和25)歲之間的學生名字、系別和年齡。
同理,如果不在這個范圍,則使用not between關鍵字。
(3)確定集合
謂詞in可以用來查找屬性屬於指定集合的元組
【例子9】查找計算機系(CS)、數學系(MA)的學生姓名和性別。
與in相對應的謂詞是not in,用於查找不在這個范圍的值。
(4)字符匹配
用like可以進行字符串的匹配,語法如下:
[not] like '<匹配串>' [escape '<換碼字符>']
其含義是找出指定的屬性列值與匹配串的結果。匹配串可以是字符串,也可以是通配符%和_,含義如下:
%(百分號):代表任意長度。比如a%b,則表示aeweb,或者ab
_(下划線):代表任意個字符。比如a_b則代表,a開頭,b結尾的3個字符串。
【例子10】找出名字中以 Hong結尾的名字
很明顯,找出不在字符串中的匹配是not like。
【例子11】找出學生名字xiao后面只有2個字符的名字:
得到的結果是XiaoLi,因為上面圖的緣故,所以只能看到一條下划線,其實有2個。
NOTE:如果用戶要查詢的字符串本身就包含通配符%或_中,那怎么辦呢?在上面的語法中,我們提到。這個時候,我們就需要使用escape ‘換碼字符’ 這個知識了,對通配符進行轉義了。
啥意思呢?就是在escape ‘換碼字符’后面的字符串是正常的字符串。
【例子12】找出課程名DB_開頭,並且倒數第三個字符為i的課程的詳細信息。
這個怎么看呢?escape '\' 表示 '\'為換碼字符。這樣匹配串中緊跟在“\”后面的字符串“_”不在具有匹配符的含義,和普通字符一樣。所以,第一個“_”被轉義為普通字符,第二和第三個的前面沒有換嗎碼字符,所以依然是匹配符。
(5)涉及空值的查詢
【例子13】查詢缺少成績的學生號和課程號,因為有些學生沒有參加課也很正常。
OK,可能有些園子的朋友會覺得 這里的is 用“=”代替,可以嗎?結果如下:
得出的結果是不可以的,所以在判斷為空的時候用is,而不是“=”
(6)多重條件查詢
邏輯運算符 and和or可以用來連接多個查詢條件。and的優先級高於or的哦。親。
【例子14】查詢年齡在20歲以下且是計算機系的學生
【例子15】在例子9中,我們使用了in,其實,我們也可以用or來代替找出在學生的系在CS和MA的學生。
啊
3.3Order by 字句
用戶可以使用order by語句來進行對查詢結構的列進行升序(ASC)或者降序(DESC)
【例子16】從course表中,查找出課程號2及其的學生成績,結果按分數降序 排列。
對於空值,若按升序排列,含空值的元組會最后顯示。若降序排列,空值的元組會最先顯示。
3.4 集合函數(Aggregate function)
SQL 提供了許多的集合函數,主要有:
Count([Distinct|All]*) 統計元組個數
Count([Distinct|All]* <列名>) 統計一列中值的個數
Sum([Distinct|All]* <列名>)計算一列值的綜合
Avg([Distinct|All]* <列名>) 計算一列值的平均值
Max([Distinct|All]* <列名>) 求一列值中最大值
Min([Distinct|All]* <列名>) 求一列值最小值
【例子17】求student表中的學生數
【例子18】計算選擇1號課程的平均成績
在聚集函數遇到空值的時候,除了count(*),都跳過空值而只是處理非空值。注意where字句中是不能聚集函數作為條件表達式的。
【例子19】求學號為4選修課的總學分數:
3.5 Group by
group by字句將查詢結果按某一列或多列的值分組,值相等的為一組。對查詢結果分組是為了細化聚集函數的作用。
【例子20】求每個課程號及相應的的選課人數
該語句對查詢結果按Cno的值分組,所以具有相同Cno值的元組都為一組,然后對每一組進行統計個數。
如果分組后還需要按照一定的條件對這些組進行刷選,則可以使用having短語指定刷選條件。
【例子21】
這里選用group by字句按照sno進行分組,在用聚合函數count對每一組進行統計,having給出了條件,只有滿足條件的組才會顯示出來。因為Sno=3的課程人數只有1人,所以沒有顯示出來。
where和having的區別是:where字句作用於基本表或視圖;而having作於元組中(就像我們這里一樣)。
3.6 Order By 排序
Order By主要是對一列或多列進行排序。
語法格式如下:
Order by 列名1 [,列名2 。。] [ASC | DESC]
ASC:升序排列(默認方式)
DESC:降序排列
【例22】找出sc表中的所有成績按照降序排列
當然,你的排列不緊可以是一列,也可以是多列。比如上面,我們先按grade降序排列,然后 接着在按sno降序排列,如下:
OK.