《SQL 必知必會》-讀書筆記

《SQL 必知必會》是學習數據庫的入門級經典書籍,裏面知識點雖然都比較基礎,不過講解的清晰簡介,也比較全面。通過全面的學習SQL,可以在工作面臨問題時想到更高效的辦法。
接下來主要記錄經典章節中知識點的用法(主要針對Oracle語法):
第6課:用通配符進行過濾
第7課:創建計算字段
第8課:使用函數處理數據
第9課:彙總數據
第10課:分組數據
第11課:使用子查詢
第12課:聯結表
第13課:創建高級聯結
第15課:插入數據
第16課:更新和刪除數據
第17課:創建和操縱表
第19課:使用存儲過程
此外,還有一些章節介紹了視圖、索引、事務處理等知識,先不納入筆記中啦。

第6課:用通配符進行過濾
LIKE操作符+通配符:對數據進行復雜過濾,創建特定數據的搜索模式。
%:代表搜索模式中給定位置的0個、1個或多個字符,不會匹配NULL的行。
_:匹配單個字符。
[]:用來指定一個字符集,來匹配指定位置(通配符的位置)的一個字符,如LIKE ‘[JM]%’ :即匹配開頭是J或M的所有信息。此通配符可以用前綴字符 ^ (脫字號)來否定,如LIKE ‘[ ^ JM]%’ 。

第7課:創建計算字段
SQL算術操作符

操作符 說明
+ 加,對字符型數據操作時,類似於’兩豎槓’
-
*
/

去除空格:RTRIM()、LTRIM()、TRIM(去字符串左右兩邊的空格)。

第8課:使用函數處理數據
常用的文本處理函數:

函數 說明
LEFT()、RIGHT() 返回字符串左邊(右邊)的字符
SUBSTR(str, n1, n2) 返回字符串str中自第n1個字符起n2個字符的值,如substr(‘HelloWorld’,0,3) 返回ell
INSTR(str1,str2) 若str2在str1中則返回1,否則返回0
LOWER()、UPPER() 將字符串轉換爲小寫(大寫)
LENGTH() 返回字符串的長度
LTRIM()、RTRIM()、TRIM() 去除字符串左邊or右邊空格
SOUNDEX(str) 返回字符串的SOUNDEX值,即返回發音類似於str的值

時間和日期處理函數:
‘yyyy-mm-dd hh24:mi:ss’

常用數值處理函數:

函數 說明
ABS() 返回一個數的絕對值
EXP() 返回一個數的指數值
SQRT() 返回一個數的平方根
SIN()、COS()、TAN() 返回一個數的正弦、餘弦、正切

第9課:彙總數據
聚集函數

函數 說明
AVG() 返回某列的平均值
SUM() 返回某列值的和
COUNT() 返回某列的行數
MAX()、MIN() 返回某列的最大值、最小值

注意:COUNT(*)是對錶中行的數目進行計數,不管表列中包含的是空值(NULL)還是非空值,COUNT(column)對特定列中具有值的行進行計數,忽略NULL值。

第10課:分組數據
GROUP BY子句
1、GROUP BY子句中列出的每一列都必須時檢索列或有效的表達式,如果在SELECT中使用表達式,則在group by子句中制定相同的表達式,不能使用別名;
2、如果分組列中包含NULL值的行,則NULL將作爲一個分組返回。

HAVING子句
where過濾行,在數據分組前進行過濾;
having過濾分組,在數據分組後進行過濾。

SELECT子句順序

select * fromwhere ##
group by  ##
having ##
order by ##

第11課:使用子查詢(嵌套查詢)
1、作爲子查詢(subquery)的SELECT語句只能查詢單個列,否則將返回錯誤;
2、在SELECT語句中,子查詢總是從內向外處理;
3、子查詢中的where子句使用了完全限定列名(指定表名和列名);
4、常用於where子句的In操作符中,以及用來填充計算列

舉例1:

select cust_id from orders
where order_num in(
select order_num from orderitems where prod_id='RGAN01')

舉例2:

select cust_name,cust_state,
(select count(*) from orders where orders.cust_id=customers.cust_id) orders
from customers
order by cust_name

第12課:聯結表
創建聯結:指定要聯結的所有表以及關聯它們的方式即可,具體有例一、例二兩種形式如:

#例1
select vend_name,prod_name,pro_price
from vendors,products
where vendors.vend_id=products.vend_id

在聯結兩個表時,實際要做的是將第一個表中的每一行與第二個表中的每一行配對。where子句作爲過濾條件,只包含那些匹配給定條件(即聯結條件)的行。
(由沒有聯結條件的表關係返回的結果是笛卡爾積)

內連接(inner join)即等值聯結(equijoin),基於兩個表的相等測試,如:

#例2:例2與例1效果相同
select vend_name,prod_name,pro_price
from vendors inner join products
on vendors.vend_id=products.vend_id

子查詢並非總是執行復雜SELECT操作的最有效方法,有時利用聯結查詢更簡潔,許多DBMS處理聯結比處理子查詢更快,所以有時需測試哪種方法更好。

第13課:創建高級聯結
在各種聯結中,注意表別名的使用。
自聯結(self-join):在一條select語句中不止一次引用相同的表。
自然聯結(natural join):每個內聯結均爲自然聯結。
外聯結(outer join):許多聯結將表中行與另外一個表中的行相關聯,但有時需包含沒有關聯行的那些行,具體可分爲left join、right join、full join。

自聯結(self-join)舉例:
Jim Jones需要給同一公司所有顧客發送一封信件

#子查詢
select cust_id,cust_name,cust_contact
from customers
where cust_name=(select cust_name 
				 from customers
				 where cust_contact='Jim Jones')
#自聯結
select c1.cust_id,c1.cust_name,c1.cust_contact
from customers c1,customers c2
where c1.cust_name=c2.cust_name
and c2.cust_contact='Jim Jones'

使用帶聚集函數的聯結舉例:
檢索所有顧客及每個顧客所下訂單數

select customer.cust_id,
count(order.order_num) num_ord 
from customers left join orders
on customers.cust_id=orders.cust_id
group by customers.cust_id

注意:
1、注意所使用聯結的類型;
2、若不提供聯結條件,則會出現笛卡爾積。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章