數據庫基礎回顧(一)html
數據庫的一些基本概念這裏就不寫了,數據模型有不少,最經常使用的是關係模型。數據庫
關係模型:ide
1)關係:一個關係對應一張二維表,每一個關係都有一個關係名;函數
2)元組:表中的一行爲一個元組;spa
3)屬性:表中的一列爲一個屬性,每一個屬性都有一個屬性名;3d
4)碼:也稱爲碼鍵,表中的某個屬性或屬性組,它能夠惟一肯定關係中的一個元組;code
5)域:屬性的取值範圍; htm
6)份量:元組中的一個屬性值;blog
SQL:結構化查詢語言是關係數據庫的標準語言。其特色有綜合統1、高度非過程化、面向集合操做等。使用SQL語言能夠對基本表、視圖、查詢表進行操做。排序
經常使用四大操做:增刪查改.
SQL查詢:基本結構包含三個子句:SELECT、FROM、WHERE。
1)查詢指定列
SELECT 屬性名 FROM 表
2)消除重複元組
SQL默認不消除重複元組,若是須要,可使用DISTINCT關鍵字
SELECT DISTINCT xxx FROM 表
3)查詢全部列
方法一是將列名一一列出,方法二是使用*符號,*表示全部屬性。
4)給屬性列區別名
SELECT 屬性名 (AS) 別名 FROM 表
1)比較運算(>,>=,=,<,<=,<>,!=)
SELECT 屬性名 FROM 表 WHERE 比較運算
2)範圍查詢(BETWEEN AND)
SELECT 屬性名 FROM 表 WHERE BETWEEN AND
3)集合查詢(IN)
SELECT 屬性名 FROM 表 WHERE 屬性 (NOT) IN(集合)
4)空值查詢(null)
SELECT 屬性名 FROM 表 WHERE 屬性 IS (NOT) null
5)字符匹配查詢(LIKE)
SELECT 屬性名 FROM 表 WHERE 屬性 (NOT) LIKE 「xxx」
6)邏輯查詢(AND、OR、NOT)
SELECT 屬性名 FROM 表 WHERE 表達式 AND 表達式
ORDERD BY <表達式1> [ASC|DESC] , <表達式2> [ASC|DESC],......
等值與非等值鏈接運算是在WHERE子句中加入鏈接多個關係的鏈接條件,格式爲:
WHERE[表1.]<屬性名1><比較運算符>[表2.]<屬性名2>[<邏輯運算符>[表3.]<屬性名3><比較運算符>[表4.]<屬性名4>...]
鏈接屬性必須具備可比性
現有三張表:
學生表Student
學號 | 姓名 | 性別 |
studentNo | studentName | sex |
char(7) | varchar(20) | char(2) |
課程表Course
課程號 | 課程名 |
courseNo | courseName |
char(3) | varchar(30) |
成績表Score
學號 | 課程號 | 成績 |
studentNo | courseNo | score |
char(7) | char(3) | numeric |
1)等值鏈接(比較運算符爲=)
查詢選修了課程名稱爲「計算機原理」的同窗學號和姓名。
SELECT studentNo,studentName
FROM Student a, Course b, Score c
WHERE b.courseName="計算機原理" AND b.courseNo=c.courseNo AND c.studentNo=a.studentNo
分析:查詢的結果要在SELECT子句中,涉及到的表包含學生表,課程表,成績表。
courseNo既是課程表主碼,也是成績表的外碼,因此這兩張表的鏈接條件是課程號相同,studentNo既是學生表的主碼,也是成績表的外碼,這兩張表的鏈接條件是學號相同。
選擇條件要選出courseName爲‘計算機原理’的信息。
2)天然鏈接
SQL不直接支持天然鏈接,完成天然鏈接的方法是在等值鏈接的基礎上,去掉重複列。
3)非等值鏈接(使用比較少)
某個表與本身進行鏈接。
示例好比上面的表裏,同時選修了‘001’課程號和‘002’課程號的學生的信息時,就會用到自錶鏈接。
假設成績表a查詢選修‘001’課程的同窗,成績表b查詢選修‘002’課程的同窗,那麼則須要將成績表a與成績表b在學號上作等值鏈接,也是自錶鏈接,鏈接成功表示學生同時選修了‘001’和‘002’課程。
通常的連接中,只有知足鏈接條件的元組纔會被檢索出來,若是要將不知足鏈接條件的元組也顯示出來,在相應的位置用空值替代,則這種查詢稱爲外鏈接查詢。
外鏈接查詢包括:
左外鏈接:鏈接結果中包含左關係所有元組,對於左關係中沒有鏈接的元組,在其右關係相應的屬性用空值替代。
右外鏈接:與左外鏈接相反。
全外鏈接:包含左右關係中的所有元組。
子查詢分爲兩類:
在主查詢中,每查詢一條記錄,須要從新作一次子查詢,這種稱爲相關子查詢。
在主查詢中,子查詢只須要執行一次,子查詢結果再也不變化,供主查詢使用,這種查詢方式稱爲非相關子查詢。
1)使用IN的子查詢。
示例1:查詢選修過課程名包含「系統」的課程的同窗的學號。(非相關子查詢)
SELECT studentNo FROM Student WHERE studentNo IN (SELECT studentNo FROM Score WHERE courseNo IN (SELECT courseNo FROM Course WHERE courseName LIKE '%系統%') )
示例2:查詢選修過編號爲「002」的課程且成績大於60分的同窗學號。(相關子查詢)
SELECT studentNo FROM Student t WHERE 60<= (SELECT score FROM Score s WHERE courseNo='002' AND s.studentNo=t.studentNo)
該示例中主查詢每次取出一條記錄到子查詢中,子查詢完成後,主查詢須要繼續取下一條記錄到子查詢中,因此爲相關子查詢。
2)使用比較運算符的子查詢
比較運算中,經常使用到謂詞ANY和ALL,其中ANY表示子查詢結果中的某個值,謂詞ALL表示子查詢結果中的全部值。
3)使用存在量詞EXISTS的子查詢
SQL查詢提供量詞運算,有存在量詞和全程量詞,其中全稱量詞能夠用存在量詞代替,經過NOT EXISTS實現。
示例1:查詢選修了「數據庫」課程的同窗姓名。
SELECT studentName FROM Student a WHERE EXISTS (SELECT * FROM Score b, Course c WHERE b.studentNo=a.studentNo AND b.courseNo=c.courseNo AND c.courseName='數據庫')
1.首先取Student表第一個元組,並取其學號x.studentNo.
2.執行子查詢,對錶Score和Course進行鏈接。
3.若是子查詢中獲得結果,即存在符合的元組,則將Student表中元組x的學號組成新元組存放在結果集合中,不然,直接丟棄該元組。
4.重複上述操做直至Student表中無新元組。
示例2:查詢選修了全部課程的學生姓名。
本查詢使用了全程兩次,須要轉換成存在量詞,查詢選修全部課程的學生能夠理解爲查詢這樣的學生,不存在沒有選修的課程。
數據庫每一個學生選修課程狀況以下:
代碼見下:
SELECT studentName FROM Student a WHERE NOT EXISTS (SELECT * FROM Course c WHERE NOT EXISTS (SELECT * FROM Score WHERE studentNo=a.studentNo AND courseNo=c.courseNo) )
咱們這麼分析,最裏層的子查詢中,是判斷學生a.studentNo是否選修了課程c.courseNo
而NOT EXISTS獲得的結果集則是存在沒選修的課程的學生。
最外層的NOT EXISTS獲得的結果則是與上面子查詢結果相反,即不存在沒有選修課程的學生,也就是選修了所有課程的學生。
SQL提供了豐富的數據分類、統計和計算的功能,其統計功能是經過聚合函數來實現,分類功能是經過分組子句來實現。
1)聚合函數:
1.若是指定了DISTINCT謂詞,則在計算時首先消除<列名>中取值重複的元組,而後在統計。
2.聚合函數遇到空值時,除count(*)之外全部的函數都會跳過空值,只處理非空值。
2)分組聚合
查詢過程對數據進行分組運算,使用GROUP BY和HAVING子句來實現
GROUP BY子句對查詢結果按某一列或某幾列進行分組,值相等的分爲一組;
HAVING子句對分組的結果進行選擇,符合條件的組纔會輸出,該子句必須和GROUP BY子句配合使用。
示例:查詢每一個同窗的選課門數,平均分和最高分。
轉載註明出處:http://www.cnblogs.com/lg-wszz/p/7420934.html