SQL零基礎入門必知必會!

導讀:SQL語言有40多年的歷史,從它被應用至今幾乎無處不在。我們消費的每一筆支付記錄,收集的每一條使用者資訊,發出去的每一條訊息,都會使用資料庫或與其相關的產品來儲存,而操縱資料庫的語言正是 SQL !

SQL 對於現在的網際網路公司生產研發等崗位幾乎是一個必備技能,如果不會 SQL 的話,可能什麼都做不了。你可以把 SQL 當做是一種工具,利用它可以幫助你完成你的工作,創造價值。

01 SQL 介紹

1. 什麼是 SQL

SQL 是用於訪問和處理資料庫的標準的計算機語言。

﹣SQL 指結構化查詢語言
﹣SQL 使我們有能力訪問資料庫
﹣SQL 是一種 ANSI 的標準計算機語言

SQL 可與資料庫程式協同工作,比如 MS Access、DB2、Informix、MS SQL Server、Oracle、Sybase 以及其他資料庫系統。

但是由於各種各樣的資料庫出現,導致很多不同版本的 SQL 語言。

為了與 ANSI 標準相相容,它們必須以相似的方式共同地來支援一些主要的關鍵詞(比如 SELECT、UPDATE、DELETE、INSERT、WHERE 等等),這些就是我們要學習的SQL基礎。

2. SQL 的型別

可以把 SQL 分為兩個部分:資料操作語言 (DML) 和 資料定義語言 (DDL)。

﹣資料查詢語言(DQL: Data Query Language)
﹣資料操縱語言(DML:Data Manipulation Language)

3. 學習 SQL 的作用

SQL 是一門 ANSI 的標準計算機語言,用來訪問和操作資料庫系統。SQL 語句用於取回和更新資料庫中的資料。

﹣SQL 面向資料庫執行查詢
﹣SQL 可從資料庫取回資料
﹣SQL 可在資料庫中插入新的記錄
﹣SQL 可更新資料庫中的資料
﹣SQL 可從資料庫刪除記錄
﹣SQL 可建立新資料庫
﹣SQL 可在資料庫中建立新表
﹣SQL 可在資料庫中建立儲存過程
﹣SQL 可在資料庫中建立檢視
﹣SQL 可以設定表、儲存過程和檢視的許可權

4. 資料庫是什麼

顧名思義,你可以理解為資料庫是用來存放資料的一個容器。

打個比方,每個人家裡都會有冰箱,冰箱是用來幹什麼的?冰箱是用來存放食物的地方。

同樣的,資料庫是存放資料的地方。正是因為有了資料庫後,我們可以直接查詢資料。

例如你每天使用餘額寶檢視自己的賬戶收益,就是從資料庫讀取資料後給你的。

最常見的資料庫型別是關係型資料庫管理系統(RDBMS):

RDBMS 是 SQL 的基礎,同樣也是所有現代資料庫系統的基礎,比如:

﹣MS SQL Server
﹣IBM DB2
﹣Oracle
﹣MySQL
﹣Microsoft Access

RDBMS 中的資料儲存在被稱為表(tables)的資料庫物件中。表 是相關的資料項的集合,它由列和行組成。

由於本文主要講解 SQL 基礎,因此對資料庫不做過多解釋,只需要大概瞭解即可。

咱們直接開始學習SQL!

02 SQL 基礎語言學習

在瞭解 SQL 基礎語句使用之前,我們先講一下 表 是什麼?
一個數據庫通常包含一個或多個表。每個表由一個名字標識(例如“客戶”或者“訂單”)。表包含帶有資料的記錄(行)。

下面的例子是一個名為 “Persons” 的表:

上面的表包含三條記錄(每一條對應一個人)和五個列(Id、姓、名、地址和城市)。

有表才能查詢,那麼如何建立這樣一個表?

1. CREATE TABLE — 建立表

CREATE TABLE 語句用於建立資料庫中的表。

語法:

資料型別(data_type)規定了列可容納何種資料型別。下面的表格包含了SQL中最常用的資料型別:

例項:

本例演示如何建立名為 “Persons” 的表。

該表包含 5 個列,列名分別是:”Id_P”、”LastName”、”FirstName”、”Address” 以及 “City”:

Id_P 列的資料型別是 int,包含整數。其餘 4 列的資料型別是 varchar,最大長度為 255 個字元。

空的 “Persons” 表類似這樣:

可使用 INSERT INTO 語句向空表寫入資料。

2. INSERT — 插入資料

INSERT INTO 語句用於向表格中插入新的行。

語法:

例項:

本例演示 “Persons” 表插入記錄的兩種方式:

1)插入新的行

2)在指定的列中插入資料

插入成功後,資料如下:

這個資料插入之後,是透過 SELECT 語句進行查詢出來的,別急馬上講!

3. SELECT — 查詢資料

SELECT 語句用於從表中選取資料,結果被儲存在一個結果表中(稱為結果集)。

語法:

我們也可以指定所要查詢資料的列:

注意:

SQL 語句對大小寫不敏感,SELECT 等效於 select。

例項:

SQL SELECT * 例項:

注意:

星號(*)是選取所有列的快捷方式。

如需獲取名為 “LastName” 和 “FirstName” 的列的內容(從名為 “Persons” 的資料庫表),請使用類似這樣的 SELECT 語句:

4. DISTINCT — 去除重複值

如果一張表中有多行重複資料,如何去重顯示呢?可以瞭解下 DISTINCT 。

語法:

例項:

如果要從 “LASTNAME” 列中選取所有的值,我們需要使用 SELECT 語句:

可以發現,在結果集中,Wilson 被列出了多次。

如需從 “LASTNAME” 列中僅選取唯一不同的值,我們需要使用 SELECT DISTINCT 語句:

透過上述查詢,結果集中只顯示了一列 Wilson,顯然已經去除了重複列。

5. WHERE — 條件過濾

如果需要從表中選取指定的資料,可將 WHERE 子句新增到 SELECT 語句。

語法:

下面的運算子可在 WHERE 子句中使用:

注意:

在某些版本的 SQL 中,運算子 <> 可以寫為 !=。

例項:

如果只希望選取居住在城市 “Beijing” 中的人,我們需要向 SELECT 語句新增 WHERE 子句:

注意:

SQL 使用單引號來環繞文字值(大部分資料庫系統也接受雙引號)。如果是數值,請不要使用引號。

6. AND & OR — 運算子

AND 和 OR 可在 WHERE 子語句中把兩個或多個條件結合起來。

如果第一個條件和第二個條件都成立,則 AND 運算子顯示一條記錄。
如果第一個條件和第二個條件中只要有一個成立,則 OR 運算子顯示一條記錄。

語法:

AND 運算子例項:

OR 運算子例項:

例項:

由於 Persons 表資料太少,因此增加幾條記錄:

AND 運算子例項:

使用 AND 來顯示所有姓為 “Carter” 並且名為 “Thomas” 的人:

OR 運算子例項:

使用 OR 來顯示所有姓為 “Carter” 或者名為 “Thomas” 的人:

結合 AND 和 OR 運算子:

我們也可以把 AND 和 OR 結合起來(使用圓括號來組成複雜的表示式):

7. ORDER BY — 排序

ORDER BY 語句用於根據指定的列對結果集進行排序,預設按照升序對記錄進行排序,如果您希望按照降序對記錄進行排序,可以使用 DESC 關鍵字。

語法:

預設排序為 ASC 升序,DESC 代表降序。

例項:

以字母順序顯示 LASTNAME 名稱:

空值(NULL)預設排序在有值行之後。

以數字順序顯示ID_P,並以字母順序顯示 LASTNAME 名稱:

以數字降序顯示ID_P:

注意:

在第一列中有相同的值時,第二列是以升序排列的。如果第一列中有些值為 null 時,情況也是這樣的。

8. UPDATE — 更新資料

Update 語句用於修改表中的資料。

語法:

例項:

更新某一行中的一個列:

目前 Persons 表有很多欄位為 null 的資料,可以透過 UPDATE 為 LASTNAME 是 “Wilson” 的人新增FIRSTNAME:

更新某一行中的若干列:

9. DELETE — 刪除資料

DELETE 語句用於刪除表中的行。

語法:

例項:

刪除某行:

刪除 Persons 表中 LastName 為 “Fred Wilson” 的行:

刪除所有行:

可以在不刪除表的情況下刪除所有的行。這意味著表的結構、屬性和索引都是完整的:

10. TRUNCATE TABLE — 清除表資料

如果我們僅僅需要除去表內的資料,但並不刪除表本身,那麼我們該如何做呢?

可以使用 TRUNCATE TABLE 命令(僅僅刪除表格中的資料):

語法:

例項:

本例演示如何刪除名為 “Persons” 的表。

11. DROP TABLE — 刪除表

DROP TABLE 語句用於刪除表(表的結構、屬性以及索引也會被刪除)。

語法:

例項:

本例演示如何刪除名為 “Persons” 的表。

從上圖可以看出,第一次執行刪除時,成功刪除了表 persons,第二次執行刪除時,報錯找不到表 persons,說明表已經被刪除了。

03 SQL 高階言語學習

1. LIKE — 查詢類似值

LIKE 運算子用於在 WHERE 子句中搜索列中的指定模式。

語法:

例項:

Persons 表插入資料:

1)現在,我們希望從上面的 “Persons” 表中選取居住在以 “N” 開頭的城市裡的人:

2)接下來,我們希望從 “Persons” 表中選取居住在以 “g” 結尾的城市裡的人:

3)接下來,我們希望從 “Persons” 表中選取居住在包含 “lon” 的城市裡的人:

4)透過使用 NOT 關鍵字,我們可以從 “Persons” 表中選取居住在不包含 “lon” 的城市裡的人:

注意:

“%” 可用於定義萬用字元(模式中缺少的字母)。

2. IN — 鎖定多個值

IN 運算子允許我們在 WHERE 子句中規定多個值。

語法:

例項:

現在,我們希望從 Persons 表中選取姓氏為 Adams 和 Carter 的人:

3. BETWEEN — 選取區間資料

運算子 BETWEEN … AND 會選取介於兩個值之間的資料範圍。這些值可以是數值、文字或者日期。

語法:

例項:

1)查詢以字母順序顯示介於 “Adams”(包括)和 “Carter”(不包括)之間的人:

2)查詢上述結果相反的結果,可以使用 NOT:

注意:

不同的資料庫對 BETWEEN…AND 運算子的處理方式是有差異的。

某些資料庫會列出介於 “Adams” 和 “Carter” 之間的人,但不包括 “Adams” 和 “Carter” ;某些資料庫會列出介於 “Adams” 和 “Carter” 之間幷包括 “Adams” 和 “Carter” 的人;而另一些資料庫會列出介於 “Adams” 和 “Carter” 之間的人,包括 “Adams” ,但不包括 “Carter” 。

所以,請檢查你的資料庫是如何處理 BETWEEN….AND 運算子的!

4. AS — 別名

透過使用 SQL,可以為列名稱和表名稱指定別名(Alias),別名使查詢程式更易閱讀和書寫。

語法:

表別名:

列别名:

例項:

使用表名稱別名:

使用列名别名:

注意:

實際應用時,這個 AS 可以省略,但是列別名需要加上 “ “。

5. JOIN — 多表關聯

JOIN 用於根據兩個或多個表中的列之間的關係,從這些表中查詢資料。

有時為了得到完整的結果,我們需要從兩個或更多的表中獲取結果。我們就需要執行 join。

資料庫中的表可透過鍵將彼此聯絡起來。主鍵(Primary Key)是一個列,在這個列中的每一行的值都是唯一的。在表中,每個主鍵的值都是唯一的。這樣做的目的是在不重複每個表中的所有資料的情況下,把表間的資料交叉捆綁在一起。

如圖,”Id_P” 列是 Persons 表中的的主鍵。這意味著沒有兩行能夠擁有相同的 Id_P。即使兩個人的姓名完全相同,Id_P 也可以區分他們。

為了下面實驗的繼續,我們需要再建立一個表:Orders。

如圖,”Id_O” 列是 Orders 表中的的主鍵,同時,”Orders” 表中的 “Id_P” 列用於引用 “Persons” 表中的人,而無需使用他們的確切姓名。

可以看到,”Id_P” 列把上面的兩個表聯絡了起來。

語法:

不同的 SQL JOIN:

下面列出了您可以使用的 JOIN 型別,以及它們之間的差異。

﹣JOIN: 如果表中有至少一個匹配,則返回行
﹣INNER JOIN: 內部連線,返回兩表中匹配的行
﹣LEFT JOIN: 即使右表中沒有匹配,也從左表返回所有的行
﹣RIGHT JOIN: 即使左表中沒有匹配,也從右表返回所有的行
﹣FULL JOIN: 只要其中一個表中存在匹配,就返回行

例項:

如果我們希望列出所有人的定購,可以使用下面的 SELECT 語句:

6. UNION — 合併結果集

UNION 運算子用於合併兩個或多個 SELECT 語句的結果集。

UNION 語法:

注意:

UNION 運算子預設為選取不同的值。如果查詢結果需要顯示重複的值,請使用 UNION ALL。

UNION ALL 語法:

另外,UNION 結果集中的列名總是等於 UNION 中第一個 SELECT 語句中的列名。

為了實驗所需,建立 Person_b 表:

例項:

使用 UNION 命令:

列出 persons 和 persons_b 中不同的人:

注意:

UNION 內部的 SELECT 語句必須擁有相同數量的列。列也必須擁有相似的資料型別。同時,每條 SELECT 語句中的列的順序必須相同。

7. NOT NULL — 非空

NOT NULL 約束強制列不接受 NULL 值。

NOT NULL 約束強制欄位始終包含值。這意味著,如果不向欄位新增值,就無法插入新記錄或者更新記錄。

語法:

如上,建立一個表,設定列值不能為空。

例項:

注意:

如果插入 NULL 值,則會報錯 ORA-01400 提示無法插入!

拓展小知識:

NOT NULL 也可以用於查詢條件:

同理,NULL 也可:

感興趣的朋友,可以自己嘗試一下!

8. VIEW — 檢視

在 SQL 中,檢視是基於 SQL 語句的結果集的視覺化的表。

檢視包含行和列,就像一個真實的表。檢視中的欄位就是來自一個或多個數據庫中的真實的表中的欄位。我們可以向檢視新增 SQL 函式、WHERE 以及 JOIN 語句,我們也可以提交資料,就像這些來自於某個單一的表。

語法:

注意:

檢視總是顯示最近的資料。每當使用者查詢檢視時,資料庫引擎透過使用 SQL 語句來重建資料。

例項:

下面,我們將 Persons 表中住在 Beijing 的人篩選出來建立檢視:

查詢上面這個檢視:

如果需要更新檢視中的列或者其他資訊,無需刪除,使用 CREATE OR REPLACE VIEW 選項:

例項:

現在需要篩選出,LASTNAME 為 Gates 的記錄:

刪除檢視就比較簡單,跟表差不多,使用 DROP 即可:

本章要講的高階語言就先到此為止,不宜一次性介紹太多~

04 SQL 常用函式學習

SQL 擁有很多可用於計數和計算的內建函式。

函式的使用語法:

下面就來看看有哪些常用的函式!

1. AVG — 平均值

AVG 函式返回數值列的平均值。NULL 值不包括在計算中。

語法:

例項:

計算 “orderno” 欄位的平均值。

當然,也可以用在查詢條件中,例如查詢低於平均值的記錄:

2. COUNT — 彙總行數

COUNT() 函式返回匹配指定條件的行數。

語法:

count() 中可以有不同的語法:

﹣COUNT(*) :返回表中的記錄數。
﹣COUNT(DISTINCT 列名) :返回指定列的不同值的數目。
﹣COUNT(列名) :返回指定列的值的數目(NULL 不計入)。

例項:

COUNT(*) :

COUNT(DISTINCT 列名) :

COUNT(列名) :

3. MAX — 最大值

MAX 函式返回一列中的最大值。NULL 值不包括在計算中。

語法:

MIN 和 MAX 也可用於文字列,以獲得按字母順序排列的最高或最低值。

例項:

4. MIN — 最小值

MIN 函式返回一列中的最小值。NULL 值不包括在計算中。

語法:

例項:

5. SUM — 求和

SUM 函式返回數值列的總數(總額)。

語法:

例項:

6. GROUP BY — 分組

GROUP BY 語句用於結合合計函式,根據一個或多個列對結果集進行分組。

語法:

例項:

獲取 Persons 表中住在北京的總人數,根據 LASTNAME 分組:

如果不加 GROUP BY 則會報錯:

也就是常見的 ORA-00937 不是單組分組函式的錯誤。

7. HAVING — 句尾連線

在 SQL 中增加 HAVING 子句原因是,WHERE 關鍵字無法與合計函式一起使用。

語法:

例項:

獲取 Persons 表中住在北京的總人數大於1的 LASTNAME,根據 LASTNAME 分組:

8. UCASE/UPPER — 大寫

UCASE/UPPER 函式把欄位的值轉換為大寫。

語法:

例項:

選取 “LastName” 和 “FirstName” 列的內容,然後把 “LastName” 列轉換為大寫:

9. LCASE/LOWER — 小寫

LCASE/LOWER 函式把欄位的值轉換為小寫。

語法:

例項:

選取 “LastName” 和 “FirstName” 列的內容,然後把 “LastName” 列轉換為小寫:

10. LEN/LENGTH — 獲取長度

LEN/LENGTH 函式返回文字欄位中值的長度。

語法:

例項:

獲取 LASTNAME 的值字元長度:

11. ROUND — 數值取捨

ROUND 函式用於把數值欄位舍入為指定的小數位數。

語法:

例項:

保留2位:

注意:ROUND 取捨是 「四捨五入」 的!

取整:

12. NOW/SYSDATE — 當前時間

NOW/SYSDATE 函式返回當前的日期和時間。

語法:

例項:

獲取當前時間:

注意:

如果您在使用 Sql Server 資料庫,請使用 getdate() 函式來獲得當前的日期時間。

※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※

我是「數據分析那些事」。常年分享數據分析乾貨,不定期分享好用的職場技能工具。各位也可以關注我的Facebook,按讚我的臉書並私訊「10」,送你十週入門數據分析電子書唷!期待你與我互動起來~

文章推薦

如何系統地學習資料探勘?

萬字入門推薦系統!

學會這4個表達「萬能公式」,下次向領導彙報時不再語無倫次

這是一個專注於數據分析職場的內容部落格,聚焦一批數據分析愛好者,在這裡,我會分享數據分析相關知識點推送、(工具/書籍)等推薦、職場心得、熱點資訊剖析以及資源大盤點,希望同樣熱愛數據的我們一同進步! 臉書會有更多互動喔:https://www.facebook.com/shujvfenxi/

Love podcasts or audiobooks? Learn on the go with our new app.