讀書筆記-《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) 字符查找函數,select instr(‘helloworld’,‘l’) from dual; --返回結果:3,默認第一次出現“l”的位置
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:
列出訂購物品RGA01的所有顧客。

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

舉例2:
顯示customers表中每個顧客的訂單總數。

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、若不提供聯結條件,則會出現笛卡爾積。

第15課:插入數據
插入有幾種方式:
1、插入完整的行;
2、插入行的一部分;
3、插入某些查詢的結果。

具體有以下幾種語法操作:
1、插入行數據:

insert into 表名(列名1,列名2...values(value1, value2, ...);
commit;

2、插入select語句:

insert into 表名(列名1,列名2...select * from;
commit;

3、複製表:

#方法1
create table1 as
(select * from2);
#方法2
select * into1 from2;
#存儲過程中可用如下方法
select 列名 into 變量 from;

(區別插入和更新:插入是插入新的行,更新是對原有行中數據進行更新)

第16課:更新和刪除數據
兩種使用update的方式:
1、更新表中的特定行;
2、更新表中的所有行。

update 表名 set(1,2,...)=()
where ...
#例子
update customers
set (cusft_contact,cust_email)=('Sam','[email protected]')
where cust_id='10000000006'

兩種使用delete的方式:
1、刪除表中特定的行;
2、刪除表中所有的行。
delete不需要列名或通配符,是刪除整行而不是刪除列,要刪除指定列,應使用update(更新爲NULL值)。

delete from 表名 where ...

要刪除所有的行,可使用truncate table語句(清空表),速度更快。

注意:
1、注意where子句的重要性;
2、在update或delete語句使用where子句前,應先用select進行測試,保證它過濾的是正確記錄。

第17課:創建和操縱表
一、創建表:

create table1
(列名1 定義1, 列名2 定義2, ...);

二、更新表:

#增加列
alter table1
add 列名1 定義1;
#刪除列
alter table1
drop column 列名1;

三、刪除表:
該語句將永久刪除該表。

drop table1;

表更名使用Rename關鍵字。

第19課:使用存儲過程

create or replace procedure MailingListCount(
ListCount OUT integer    #參數 參數行爲 參數類型
)
IS
v_rows integer;   #局部變量
begin    #主體代碼
	select count(*) into v_rows
	from customers
	where not cust_email is null;
	ListCount := v_rows;
end;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章