《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 * from 表
where ##
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 table 表1 as
(select * from 表2);
#方法2
select * into 表1 from 表2;
#存儲過程中可用如下方法
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 table 表1
(列名1 定義1, 列名2 定義2, ...);
二、更新表:
#增加列
alter table 表1
add 列名1 定義1;
#刪除列
alter table 表1
drop column 列名1;
三、刪除表:
該語句將永久刪除該表。
drop table 表1;
表更名使用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;