前言
SQL語言有40多年的曆史,從它被應用至今幾乎無處不在。我們消費的每一筆支付記錄,收集的每一條使用者資訊,發出去的每一條消息,都會使用資料庫或與其相關的産品來存儲,而操縱資料庫的語言正是 SQL !
SQL 對于現在的網際網路公司生産研發等崗位幾乎是一個必備技能,如果不會 SQL 的話,可能什麼都做不了。你可以把 SQL 當做是一種工具,利用它可以幫助你完成你的工作,創造價值。
🌴 SQL 介紹
🌼 什麼是 SQL
SQL 是用于通路和處理資料庫的标準的計算機語言。
- SQL 指結構化查詢語言
- SQL 使我們有能力通路資料庫
- SQL 是一種 ANSI 的标準計算機語言
SQL 可與資料庫程式協同工作,比如 MS Access、DB2、Informix、MS SQL Server、Oracle、Sybase 以及其他資料庫系統。但是由于各種各樣的資料庫出現,導緻很多不同版本的 SQL 語言,為了與 ANSI 标準相相容,它們必須以相似的方式共同地來支援一些主要的關鍵詞(比如 SELECT、UPDATE、DELETE、INSERT、WHERE 等等),這些就是我們要學習的SQL基礎。
🌀 SQL 的類型
可以把 SQL 分為兩個部分:資料操作語言 (DML) 和 資料定義語言 (DDL)。
- 資料查詢語言(DQL: Data Query Language)
- 資料操縱語言(DML:Data Manipulation Language)
🌵 學習 SQL 的作用
SQL 是一門 ANSI 的标準計算機語言,用來通路和操作資料庫系統。SQL 語句用于取回和更新資料庫中的資料。
- SQL 面向資料庫執行查詢
- SQL 可從資料庫取回資料
- SQL 可在資料庫中插入新的記錄
- SQL 可更新資料庫中的資料
- SQL 可從資料庫删除記錄
- SQL 可建立新資料庫
- SQL 可在資料庫中建立新表
- SQL 可在資料庫中建立存儲過程
- SQL 可在資料庫中建立視圖
- SQL 可以設定表、存儲過程和視圖的權限
🍄 資料庫是什麼
顧名思義,你可以了解為資料庫是用來存放資料的一個容器。
打個比方,每個人家裡都會有冰箱,冰箱是用來幹什麼的?冰箱是用來存放食物的地方。
同樣的,資料庫是存放資料的地方。正是因為有了資料庫後,我們可以直接查找資料。例如你每天使用餘額寶檢視自己的賬戶收益,就是從資料庫讀取資料後給你的。
最常見的資料庫類型是關系型資料庫管理系統(RDBMS):
RDBMS 是 SQL 的基礎,同樣也是所有現代資料庫系統的基礎,比如 MS SQL Server, IBM DB2, Oracle, MySQL 以及 Microsoft Access等等。
RDBMS 中的資料存儲在被稱為表(tables)的資料庫對象中。表 是相關的資料項的集合,它由列和行組成。
由于本文主要講解 SQL 基礎,是以對資料庫不做過多解釋,隻需要大概了解即可。咱們直接開始學習SQL!
🐥 SQL 基礎語言學習
在了解 SQL 基礎語句使用之前,我們先講一下 表 是什麼?
一個資料庫通常包含一個或多個表。每個表由一個名字辨別(例如“客戶”或者“訂單”)。表包含帶有資料的記錄(行)。
下面的例子是一個名為 “Persons” 的表:
上面的表包含三條記錄(每一條對應一個人)和五個列(Id、姓、名、位址和城市)。
有表才能查詢,那麼如何建立這樣一個表?
🐤 CREATE TABLE – 建立表
CREATE TABLE 語句用于建立資料庫中的表。
文法:
CREATE TABLE 表名稱
(
列名稱1 資料類型,
列名稱2 資料類型,
列名稱3 資料類型,
....
);
資料類型(data_type)規定了列可容納何種資料類型。下面的表格包含了SQL中最常用的資料類型:
執行個體:
本例示範如何建立名為 “Persons” 的表。
該表包含 5 個列,列名分别是:“Id_P”、“LastName”、“FirstName”、“Address” 以及 “City”:
CREATE TABLE Persons
(
Id_P int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);
Id_P 列的資料類型是 int,包含整數。其餘 4 列的資料類型是 varchar,最大長度為 255 個字元。
空的 “Persons” 表類似這樣:
可使用 INSERT INTO 語句向空表寫入資料。
🐑 INSERT – 插入資料
INSERT INTO 語句用于向表格中插入新的行。
INSERT INTO 表名稱 VALUES (值1, 值2,....);
我們也可以指定所要插入資料的列:
INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....);
本例示範 “Persons” 表插入記錄的兩種方式:
1、插入新的行
INSERT INTO Persons VALUES (1, 'Gates', 'Bill', 'Xuanwumen 10', 'Beijing');
2、在指定的列中插入資料
INSERT INTO Persons (LastName, Address) VALUES ('Wilson', 'Champs-Elysees');
插入成功後,資料如下:
這個資料插入之後,是通過 SELECT 語句進行查詢出來的,别急馬上講!
🐼 SELECT – 查詢資料
SELECT 語句用于從表中選取資料,結果被存儲在一個結果表中(稱為結果集)。
SELECT * FROM 表名稱;
我們也可以指定所要查詢資料的列:
SELECT 列名稱 FROM 表名稱;
📢 注意: SQL 語句對大小寫不敏感,SELECT 等效于 select。
SQL SELECT * 執行個體:
SELECT * FROM Persons;
📢 注意: 星号(*)是選取所有列的快捷方式。
如需擷取名為 “LastName” 和 “FirstName” 的列的内容(從名為 “Persons” 的資料庫表),請使用類似這樣的 SELECT 語句:
SELECT LastName,FirstName FROM Persons;
🐫 DISTINCT – 去除重複值
如果一張表中有多行重複資料,如何去重顯示呢?可以了解下 DISTINCT 。
SELECT DISTINCT 列名稱 FROM 表名稱;
如果要從 “LASTNAME” 列中選取所有的值,我們需要使用 SELECT 語句:
SELECT LASTNAME FROM Persons;
可以發現,在結果集中,Wilson 被列出了多次。
如需從 “LASTNAME” 列中僅選取唯一不同的值,我們需要使用 SELECT DISTINCT 語句:
SELECT DISTINCT LASTNAME FROM Persons;
通過上述查詢,結果集中隻顯示了一列 Wilson,顯然已經去除了重複列。
🐸 WHERE – 條件過濾
如果需要從表中選取指定的資料,可将 WHERE 子句添加到 SELECT 語句。
SELECT 列名稱 FROM 表名稱 WHERE 列 運算符 值;
下面的運算符可在 WHERE 子句中使用:
📢 注意: 在某些版本的 SQL 中,操作符 <> 可以寫為 !=。
如果隻希望選取居住在城市 “Beijing” 中的人,我們需要向 SELECT 語句添加 WHERE 子句:
SELECT * FROM Persons WHERE City='Beijing';
📢 注意: SQL 使用單引号來環繞文本值(大部分資料庫系統也接受雙引号)。如果是數值,請不要使用引号。
🐹 AND & OR – 運算符
AND 和 OR 可在 WHERE 子語句中把兩個或多個條件結合起來。
- 如果第一個條件和第二個條件都成立,則 AND 運算符顯示一條記錄。
- 如果第一個條件和第二個條件中隻要有一個成立,則 OR 運算符顯示一條記錄。
AND 運算符執行個體:
SELECT * FROM 表名稱 WHERE 列 運算符 值 AND 列 運算符 值;
OR 運算符執行個體:
SELECT * FROM 表名稱 WHERE 列 運算符 值 OR 列 運算符 值;
由于 Persons 表資料太少,是以增加幾條記錄:
INSERT INTO Persons VALUES (2, 'Adams', 'John', 'Oxford Street', 'London');
INSERT INTO Persons VALUES (3, 'Bush', 'George', 'Fifth Avenue', 'New York');
INSERT INTO Persons VALUES (4, 'Carter', 'Thomas', 'Changan Street', 'Beijing');
INSERT INTO Persons VALUES (5, 'Carter', 'William', 'Xuanwumen 10', 'Beijing');
SELECT * FROM Persons;
使用 AND 來顯示所有姓為 “Carter” 并且名為 “Thomas” 的人:
SELECT * FROM Persons WHERE FirstName='Thomas' AND LastName='Carter';
使用 OR 來顯示所有姓為 “Carter” 或者名為 “Thomas” 的人:
SELECT * FROM Persons WHERE firstname='Thomas' OR lastname='Carter';
結合 AND 和 OR 運算符:
我們也可以把 AND 和 OR 結合起來(使用圓括号來組成複雜的表達式):
SELECT * FROM Persons WHERE (FirstName='Thomas' OR FirstName='William') AND LastName='Carter';
🐰 ORDER BY – 排序
ORDER BY 語句用于根據指定的列對結果集進行排序,預設按照升序對記錄進行排序,如果您希望按照降序對記錄進行排序,可以使用 DESC 關鍵字。
SELECT * FROM 表名稱 ORDER BY 列1,列2 DESC;
預設排序為 ASC 升序,DESC 代表降序。
SELECT * FROM Persons ORDER BY LASTNAME;
以字母順序顯示 LASTNAME 名稱:
空值(NULL)預設排序在有值行之後。
以數字順序顯示ID_P,并以字母順序顯示 LASTNAME 名稱:
SELECT * FROM Persons ORDER BY ID_P,LASTNAME;
以數字降序顯示ID_P:
SELECT * FROM Persons ORDER BY ID_P DESC;
📢 注意: 在第一列中有相同的值時,第二列是以升序排列的。如果第一列中有些值為 null 時,情況也是這樣的。
🐱 UPDATE – 更新資料
Update 語句用于修改表中的資料。
UPDATE 表名稱 SET 列名稱 = 新值 WHERE 列名稱 = 某值;
更新某一行中的一個列:
UPDATE Persons SET FirstName = 'Fred' WHERE LastName = 'Wilson';
目前 Persons 表有很多字段為 null 的資料,可以通過 UPDATE 為 LASTNAME 是 “Wilson” 的人添加FIRSTNAME:
更新某一行中的若幹列:
UPDATE Persons SET ID_P = 6,city= 'London' WHERE LastName = 'Wilson';
🐨 DELETE – 删除資料
DELETE 語句用于删除表中的行。
DELETE FROM 表名稱 WHERE 列名稱 = 值;
删除某行:
删除 Persons 表中 LastName 為 “Fred Wilson” 的行:
DELETE FROM Persons WHERE LastName = 'Wilson';
删除所有行:
可以在不删除表的情況下删除所有的行。這意味着表的結構、屬性和索引都是完整的:
DELETE FROM table_name;
🐵 TRUNCATE TABLE – 清除表資料
如果我們僅僅需要除去表内的資料,但并不删除表本身,那麼我們該如何做呢?
可以使用 TRUNCATE TABLE 指令(僅僅删除表格中的資料):
TRUNCATE TABLE 表名稱;
本例示範如何删除名為 “Persons” 的表。
TRUNCATE TABLE persons;
🐯 DROP TABLE – 删除表
DROP TABLE 語句用于删除表(表的結構、屬性以及索引也會被删除)。
DROP TABLE 表名稱;
drop table persons;
從上圖可以看出,第一次執行删除時,成功删除了表 persons,第二次執行删除時,報錯找不到表 persons,說明表已經被删除了。