明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

PHP開發(fā)之程序員必掌握的 SQL 向?qū)?/h1>

[摘要]介紹SQL 已經(jīng)應(yīng)用到了我們周圍的各個(gè)角落,不管你信不信。操縱任何種類數(shù)據(jù)的每個(gè)應(yīng)用程序都需要將數(shù)據(jù)存放在某處。無論它是大數(shù)據(jù),還是只有簡(jiǎn)單數(shù)行的數(shù)據(jù)包;無論是政府、還是創(chuàng)業(yè)公司;無論是橫跨多臺(tái)服務(wù)器的大型數(shù)據(jù)庫、還是運(yùn)行著自己小型數(shù)據(jù)庫的手機(jī),SQL 無處不在。但是,SQL 是什么呢?SQL 代...

介紹

SQL 已經(jīng)應(yīng)用到了我們周圍的各個(gè)角落,不管你信不信。操縱任何種類數(shù)據(jù)的每個(gè)應(yīng)用程序都需要將數(shù)據(jù)存放在某處。無論它是大數(shù)據(jù),還是只有簡(jiǎn)單數(shù)行的數(shù)據(jù)包;無論是政府、還是創(chuàng)業(yè)公司;無論是橫跨多臺(tái)服務(wù)器的大型數(shù)據(jù)庫、還是運(yùn)行著自己小型數(shù)據(jù)庫的手機(jī),SQL 無處不在。

但是,SQL 是什么呢?SQL 代表結(jié)構(gòu)化查詢語言,通常,其發(fā)音為“ess-que-el”。SQL 是數(shù)據(jù)庫語言,專門為了和數(shù)據(jù)庫通信而建立的。SQL 是一門簡(jiǎn)單的語言,和英語語言類似,因?yàn)槊詈陀⒄Z句子有著類似的結(jié)構(gòu)。那些句子組織為聲明式的語句,這樣 SQL 也被叫做聲明式語言。

SQL 新手指南

在可視化地編寫 SQL 查詢語句方面,已經(jīng)有很多可用的工具了,為什么還要學(xué)習(xí)一個(gè)全新的語言呢?當(dāng)你用某些 SQL 工具時(shí),重要的是理解 SQL 語言、理解可視化工具正在做什么、以及為什么那樣做。有時(shí)候,需要手動(dòng)寫一些 SQL 語句,不僅因?yàn)檫@是最快的方法,而且這更強(qiáng)大、經(jīng)常是完成預(yù)定目標(biāo)的唯一方法。

數(shù)據(jù)庫的介紹

我們剛才提到了,SQL 是數(shù)據(jù)庫語言。那么,數(shù)據(jù)庫是什么?數(shù)據(jù)庫是一種存儲(chǔ)機(jī)制,被設(shè)計(jì)為用來訪問存儲(chǔ)的信息及其操作。數(shù)據(jù)庫里的信息被存儲(chǔ)在稱作表(table)的對(duì)象里。表的名字是其唯一身份,由列和行構(gòu)成。列包含列名、列的數(shù)據(jù)類型以及該列的其它屬性。行包含該列的記錄或數(shù)據(jù)。數(shù)據(jù)庫里的大部分表之間會(huì)有關(guān)系(relationship)或連接(link),一對(duì)一、或一對(duì)多的關(guān)系。這也是為什么這種數(shù)據(jù)庫被稱作關(guān)系模型數(shù)據(jù)庫。

關(guān)于描述數(shù)據(jù)庫結(jié)構(gòu),最容易的方法就是把它和 Excel 電子表格做比較,它們有著諸多相似。一個(gè)數(shù)據(jù)庫就是一份獨(dú)立的文件。電子表格里的 sheet 就是表(table),每個(gè) sheet 有一個(gè)名字。列和行,都和數(shù)據(jù)庫一樣。SQL 語言用來創(chuàng)建新表、更改現(xiàn)有表,用來獲取數(shù)據(jù)、更新數(shù)據(jù)或刪除數(shù)據(jù)。

比如說,我們有一份知名電影的臺(tái)詞大集合,存放在任意單獨(dú)的文本文件里。即使我們精心組織,用 Excel 電子表格存放,我們所面臨的問題仍然是存在。用這種方式存儲(chǔ)臺(tái)詞,我們無法快速地從一部電影里得到所有臺(tái)詞,或無法得到一個(gè)角色的所有臺(tái)詞。如果我們把文本文件或電子表格放入數(shù)據(jù)庫,并創(chuàng)建帶有關(guān)系的表,所有問題就迎刃而解了。關(guān)系型的真正涵義是什么?關(guān)系模型是描述數(shù)據(jù)、以及這些數(shù)據(jù)實(shí)體之間的關(guān)系的方法。在我們的例子中,關(guān)系就是每個(gè)臺(tái)詞和表之間的聯(lián)系,電影名稱存放在表里、或所有角色也存放在表里。

下面是一個(gè)簡(jiǎn)化處理的例子,只有一個(gè)表做示例,表名叫「Movie_quotes」。它有四列,一個(gè)列表示臺(tái)詞文本、一個(gè)列表示說臺(tái)詞的演員角色,一個(gè)表示電影,還有年份。我們收錄了八句電影臺(tái)詞,我們的示例表看起來像是這個(gè)樣子:

Movie_quotes
Q_TEXTQ_CHARACTERQ_MOVIEQ_YEAR
I’ll be backThe TerminatorThe Terminator1984
I find your lack of faith disturbing.Darth VaderStar Wars1977
It’s a trap!Admiral AckbarStar Wars1983
Never tell me the odds.Han SoloStar Wars1980
Do. Or do not. There is no try.YodaStar Wars1980
Stupid is as stupid does.Forrest GumpForrest Gump1994
My mama always said: Life was like a box of chocolates.You never know what you’re gonna get.Forrest GumpForrest Gump1994
Run, Forrest! Run!Jenny CurranForrest Gump1994

當(dāng)討論數(shù)據(jù)庫時(shí),值得一提的是,有一種全新的數(shù)據(jù)庫,在需要存儲(chǔ)數(shù)據(jù)的人們中間,產(chǎn)生了一種運(yùn)動(dòng),它就是 NoSQL。它們是基于文檔的系統(tǒng),雖然它們正在變得非常流行,直到今天仍然有大量的關(guān)系型數(shù)據(jù)庫在使用中。即使 NoSQL 數(shù)據(jù)庫有某種查詢語言,它們很大一部分(因?yàn)樗鼈儙缀醵际窃?SQL 之后才發(fā)明的)仍然和 SQL 有著某種相似性。

四種基本的 SQL 操作(CRUD)

有很多 SQL 命令,但是,有四種通常的 SQL 操作,可以對(duì)表及其數(shù)據(jù)做一些事情:

  • 創(chuàng)建 – 把數(shù)據(jù)填充到表里。

  • 讀取 – 從表中查詢數(shù)據(jù)。

  • 更新 – 修改表中已有數(shù)據(jù)。

  • 刪除 – 從表中移除數(shù)據(jù)。

這些基本 SQL 操作的首字母組成了縮寫「CRUD」,它們被視作每個(gè)數(shù)據(jù)庫必有的、四個(gè)基本功能或特色的基礎(chǔ)集。

通過介紹基本特色,我們將會(huì)介紹基本的、以及最重要的 SQL 命令:`CREATE`, `INSERT`, `SELECT`, `UPDATE`, `DELETE`, and `DROP`。

創(chuàng)建數(shù)據(jù)

首先,我們需要在數(shù)據(jù)庫里創(chuàng)建表。創(chuàng)建新表,就用到了 `CREATE TABLE`。`CREATE TABLE` 語句的簡(jiǎn)單語法格式如下:

CREATE TABLE table_name
(column_1 data_type,
column_2 data_type,
column_3 data_type);

首先,`CREATE TABLE`關(guān)鍵詞后面跟著表名。這是一個(gè)極好的例子,說明了 SQL 的簡(jiǎn)潔性、以及和英語的相似性。關(guān)鍵詞后面跟著一個(gè)左圓括號(hào),這里定義了額外的參數(shù):列名和列的數(shù)據(jù)類型,然后跟上右圓括號(hào)。必須要提的是,所有的 SQL 語句應(yīng)該以 `;` 結(jié)尾。

需要遵守的規(guī)則并不多。表名和列名必須以字母打頭,后面可以跟上字母、數(shù)字、或下劃線。它們的字符長(zhǎng)度不能超過 30 個(gè)。用 SQL 保留字做為表名或列名(比如 `select`, `create`, `insert` 等)是被禁止的。

在例子中,最簡(jiǎn)單的列名可能是 `TEXT`, `CHARACTER`, `MOVIE`,和 `YEAR`。但是,問題在于這些列名都是保留字。為了避免任何可能的沖突,我們將創(chuàng)建以 `Q_` 做為前綴的列名。

數(shù)據(jù)類型因不同的數(shù)據(jù)庫而不同,不過這里使用了最常見的類型:

  • `char(size)` – 固定長(zhǎng)度字符串,用括號(hào)中的參數(shù)標(biāo)明。

  • `varchar(size)` – 可變長(zhǎng)度字符串,用括號(hào)中的參數(shù)標(biāo)明。

  • `number(size)` – 數(shù)字值,括號(hào)中的參數(shù)標(biāo)明了總長(zhǎng)度。

  • `date` – 日期值。

  • `number(size, d)` – 數(shù)字值,總長(zhǎng)度為 `size`,小數(shù)位用 `d` 表示。

數(shù)據(jù)類型規(guī)定了哪種類型的數(shù)據(jù)可以存儲(chǔ)在指定的列里。如果 `Q_CHARACTER` 的列用于存儲(chǔ)電影名字,那么這個(gè)指定的列就應(yīng)該有一個(gè) `varchar` (可變長(zhǎng)度字符)的數(shù)據(jù)類型。存放電影年份的列的類型是 `number`,我們的例子中相應(yīng)的列是 `Q_YEAR`。

對(duì)于期望的表結(jié)構(gòu),創(chuàng)建表的最終 SQL 命令如下:

CREATE TABLE Movie_quotes
(‘Q_TEXT’ varchar(200),
‘Q_CHARACTER’ varchar(20),
‘Q_MOVIE’ varchar(20),
‘Q_YEAR’ number(4));

這個(gè) SQL 命令的結(jié)果將創(chuàng)建一個(gè)空表,各列情況如下:

  • `Q_TEXT` 可以接受 200 個(gè)字符長(zhǎng)度的字符串。

  • `Q_CHARACTER` 可以接受 20 個(gè)字符長(zhǎng)度的字符串。

  • `Q_MOVIE` 可以接受 20 個(gè)字符長(zhǎng)度的字符串。

  • `Q_YEAR` 可以接受一個(gè)年份的四個(gè)數(shù)字。

SQL 新手指南

接下來,用我們的電影臺(tái)詞數(shù)據(jù)填充這張表。有很多可用的 GUI 工具,來管理數(shù)據(jù)庫中的表和數(shù)據(jù)。不過,寫一個(gè) SQL 腳本常常更快,該腳本基本上是 SQL 命令的集合,將被順序執(zhí)行。當(dāng)你需要用大量數(shù)據(jù)填充表時(shí),這種方式尤為方便。

向表插入或添加一行數(shù)據(jù)的 SQL 命令是 `INSERT`。格式如下:

INSERT INTO table_name
(column_1, column_2, ... column_n)
VALUES (value_1, value_2, ... value_n);

為了向表插入一行數(shù)據(jù), `INSERT` 關(guān)鍵字跟著 `INTO` 關(guān)鍵字和表名。然后是列名,放在圓括號(hào)里,用逗號(hào)隔開,這是可選的,但是,指明要插入的列,以確保正確的數(shù)據(jù)插入相應(yīng)的列,這是一種良好實(shí)踐。最后一部分,用 `VALUES` 關(guān)鍵字定義了要插入的那些數(shù)據(jù),數(shù)據(jù)列表以圓括號(hào)結(jié)束。請(qǐng)注意,字符串應(yīng)該放在單引號(hào)里,數(shù)字不應(yīng)如此。

用來填充例子中 `Movie_quotes` 表的 SQL 腳本,如下:

INSERT INTO Movie_quotes
(Q_TEXT, Q_CHARACTER, Q_MOVIE, Q_YEAR)
VALUES ('I’ll be back', 'The Terminator', 'The Terminator', 1984);
INSERT INTO Movie_quotes
(Q_TEXT, Q_CHARACTER, Q_MOVIE, Q_YEAR)
VALUES ('I find your lack of faith disturbing.', 'Darth Vader', 'Star Wars', 1977);
INSERT INTO Movie_quotes
(Q_TEXT, Q_CHARACTER, Q_MOVIE, Q_YEAR)
VALUES ('It’s a trap!', 'Admiral Ackbar', 'Star Wars', 1983);
INSERT INTO Movie_quotes
(Q_TEXT, Q_CHARACTER, Q_MOVIE, Q_YEAR)
VALUES ('Never tell me the odds.', 'Han Solo', 'Star Wars', 1980);
INSERT INTO Movie_quotes
(Q_TEXT, Q_CHARACTER, Q_MOVIE, Q_YEAR)
VALUES ('Do. Or do not. There is no try.', 'Yoda', 'Star Wars', 1980);
INSERT INTO Movie_quotes
(Q_TEXT, Q_CHARACTER, Q_MOVIE, Q_YEAR)
VALUES ('Stupid is as stupid does.', 'Forrest Gump', 'Forrest Gump', 1994);
INSERT INTO Movie_quotes
(Q_TEXT, Q_CHARACTER, Q_MOVIE, Q_YEAR)
VALUES ('My mama always said: Life was like a box of chocolates. You never know what you’re gonna get.', 'Forrest Gump', 'Forrest Gump', 1994);
INSERT INTO Movie_quotes
(Q_TEXT, Q_CHARACTER, Q_MOVIE, Q_YEAR)
VALUES ('Run, Forrest! Run!', 'Jenny Curran', 'Forrest Gump', 1994);

讀取數(shù)據(jù)

數(shù)據(jù)庫中有了存好的數(shù)據(jù),現(xiàn)在我們可以查詢數(shù)據(jù),看看我們的表里存儲(chǔ)了什么,我們還能用不同的方式過濾和分類數(shù)據(jù)。

`SELECT` 語句用于查詢、或選擇我們想從數(shù)據(jù)庫中返回的數(shù)據(jù)。我們從非常簡(jiǎn)單的查詢開始,但是 `SELECT` 有很多不同的選項(xiàng)和擴(kuò)展,這為我們最終的需要提供了很大的靈活性;镜 `SELECT` 語句的語法如下:

SELECT column_1, column_1, ... column_n
FROM table_name;

指出列名,決定了哪一列將被返回到結(jié)果里,以及按什么順序。如果我們想選擇所有的列,或我們不知道表中的確切列名,我們可以使用通配符 `*`,它將從數(shù)據(jù)庫中選擇所有列:

SELECT * FROM table_name;

對(duì)于本例,顯示所有數(shù)據(jù)的查詢,如下:

SELECT * FROM Movie_quotes;

SQL 新手指南

僅僅顯示電影臺(tái)詞、年份的查詢,如下:

SELECT Q_TEXT, Q_YEAR FROM Movie_quotes;

有時(shí)候我們不想從表中返回所有數(shù)據(jù)。當(dāng)表中有大量數(shù)據(jù)、或我們?cè)谒阉髌ヅ淠承?biāo)準(zhǔn)的特定數(shù)據(jù)時(shí),就屬于這種情況。對(duì)此,我們可以使用 `WHERE` 語句。`WHERE` 語句將過濾記錄,限制從數(shù)據(jù)庫中獲取哪些記錄、以滿足具體定義的標(biāo)準(zhǔn):

SELECT column_1, column_1, ... column_n
FROM table_name
WHERE column_name operator value;

注意,`WHERE` 語句是可選的,但是如果我們決定用到它,下面的操作符是可用的:

  • `=` – 等于。

  • `>` – 大于。

  • `<` – 小于。

  • `>=` – 大于或等于。

  • `<=` – 小于或等于。

  • `<>` – 不等于。

  • `BETWEEN` – 在兩個(gè)值之間。

  • `LIKE` – 搜索一種模式。

  • `IN` – 針對(duì)一個(gè)列的多種可能值。

數(shù)學(xué)操作符無需解釋了。`BETWEEN` 操作符搜索兩個(gè)聲明值的、中間的值,包括等于兩端的情況。`LIKE` 模式匹配操作符是非常強(qiáng)大的操作符,支持選擇和我們的規(guī)定類似的行。百分號(hào) `%` 被用做通配符,以匹配任何可能字符,它可出現(xiàn)在具體字符串的前面或后面。

例如,為了得到來自電影《Stars Wars》中的臺(tái)詞,我們可以這樣寫:

SELECT * FROM Movie_quotes
WHERE Q_MOVIE = ‘Star Wars’;

SQL 新手指南

請(qǐng)注意,`WHERE` 語句是大小寫敏感的,下面的 SQL 語句將不會(huì)返回結(jié)果:

SELECT * FROM Movie_quotes
WHERE Q_MOVIE = ‘STAR WARS’;

除了 `WHERE` 子句,還可組合邏輯運(yùn)算符 `AND` 和 `OR`。如果我們對(duì)相同列使用多個(gè) `AND` 邏輯操作符,那么我們應(yīng)該考慮使用 `IN` 子句替代。

做為示例,我們返回來自電影《Star Wars》和《The Terminator》中的所有電影臺(tái)詞:

SELECT * FROM Movie_quotes
WHERE Q_MOVIE = ‘Star Wars’ AND Q_MOVIE = ‘The Terminator’;

SQL 新手指南

就上面的例子,更好的寫法就是使用 `IN` 語句替代:

SELECT * FROM Movie_quotes
WHERE Q_MOVIE IN (‘Star Wars’, ‘The Terminator’);

至此,我們一直在討論如何從數(shù)據(jù)庫中過濾數(shù)據(jù)。返回的行將按照它們進(jìn)入(提交到)數(shù)據(jù)庫的順序進(jìn)行排序。為了控制數(shù)據(jù)顯示的順序,我們可以通過包含 `ORDER BY` 子句來過濾輸出數(shù)據(jù)。`ORDER BY` 子句包含了指定分類順序的一個(gè)、或多個(gè)列名:

SELECT column_1, column_1, ... column_n
FROM table_name
WHERE column_name operator value
ORDER BY column_name;

為了擴(kuò)展我們剛才《Star Wars》電影臺(tái)詞的例子,現(xiàn)在按照年份排序:

SELECT * FROM Movie_quotes
WHERE Q_MOVIE = ‘Star Wars’
ORDER BY Q_YEAR;

SQL 新手指南

一個(gè)列的排序,默認(rèn)是按照從最低值到最高值升序排列。為了把列的排序改為降序,我們可以在列名后面加上 `DESC` 關(guān)鍵字:

SELECT * FROM Movie_quotes
WHERE Q_MOVIE = ‘Star Wars’
ORDER BY Q_YEAR DESC;

SQL 新手指南

`ORDER BY` 語句不限于單個(gè)列。你可以包含逗號(hào)分隔的、列的清單來排序。返回的行將根據(jù)第一個(gè)指定列,然后按順序根據(jù)接下來指定的列排序。切記,用來排序的列不必包含在被選擇列的清單里。我們可以像這樣來寫查詢:

SELECT Q_TEXT, Q_CHARACTER, Q_MOVIE FROM Movie_quotes
WHERE Q_MOVIE = ‘Star Wars’
ORDER BY Q_YEAR DESC;

更新數(shù)據(jù)

在我們開始插入數(shù)據(jù)之后,并沒有被限制為只能讀取數(shù)據(jù)。我們能夠?qū)θ魏涡欣锏、任何列下的、任何?shù)據(jù)進(jìn)行修改。`UPDATE` 語句用于更新或修改記錄。

`UPDATE` 的語法如下:

UPDATE table_name
SET column_name = new_value
WHERE column_name operator value;

當(dāng)我們使用 `UPDATE` 時(shí),慎重地構(gòu)造一個(gè) `WHERE` 子句是十分重要的。`WHERE` 子句指定了哪一條記錄或哪些記錄應(yīng)該被更新。如果我們?cè)趫?zhí)行 `UPDATE` 語句時(shí)、而沒有使用 `WHERE` 子句,我們將更新指定列的所有數(shù)據(jù)。

讓我們看看 `Movie_quotes` 表里的電影臺(tái)詞。我們讓所有的臺(tái)詞以標(biāo)點(diǎn)符號(hào)結(jié)束,《The Terminator》除外。對(duì)于如何使用 `UPDATE` 語句,這是一個(gè)極好的例子:

UPDATE Movie_quotes
SET Q_TEXT = ‘I’ll be back!’
WHERE Q_MOVIE = ‘The Terminator’;

之前解釋了,如果我們不小心遺漏了 `WHERE` 子句,或我們故意把所有的臺(tái)詞行更新為「I’ll be back!」。通過單單選中電影《The terminator》所在行,我們就可以更新指定行的一列數(shù)據(jù)。

刪除數(shù)據(jù)

當(dāng)數(shù)據(jù)庫被大量使用時(shí),從數(shù)據(jù)庫中移除陳舊的數(shù)據(jù),遲早會(huì)變得有必要。我們能夠只刪除表中的一些行、或刪除整個(gè)表。

`DELETE` 語句用于刪除表中的行。該命令的語法如下:

DELETE FROM table_name
WHERE column_name operator value;

重申,和 `UPDATE` 語句一樣,`WHERE` 子句指定了哪一條記錄或哪些記錄應(yīng)該被刪除。如果沒有指定 `WHERE` 子句,所有的行和列將被刪除:

DELETE FROM Movie_quotes;

假設(shè)我們不再喜歡電影《Forrest Gump》了,想從電影中刪除其臺(tái)詞。為了從電影中刪除所有臺(tái)詞,我們可以編寫如下 SQL 命令:

DELETE FROM Movie_quotes
WHERE Q_MOVIE = ‘Forrest Gump’;

最終,我們有了足夠多的電影。我們對(duì)電影臺(tái)詞不再感興趣了,我們想把興趣移到音樂上。我們開始收集歌詞。根據(jù)我們目前所學(xué)到的 SQL 知識(shí),修改數(shù)據(jù)庫是非常簡(jiǎn)單的。

首先,我們需要清空數(shù)據(jù)庫里、不再感興趣的數(shù)據(jù)。為了刪除包含所有行的表,我們可以使用 `DROP TABLE` 語句。切記 `DROP TABLE` 語句不同于使用 `DELETE` 語句,和刪除表里的所有記錄也不同。刪除表里的所有記錄,會(huì)留給我們表本身及其定義的所有表結(jié)構(gòu);包括列的數(shù)據(jù)類型定義和該表的其它相關(guān)的數(shù)據(jù)庫信息。`DROP TABLE` 移除了表、移除表的定義,還有所有的行。

`DROP TABLE` 語句的語法如下:

DROP TABLE table_name;

為了從數(shù)據(jù)庫中刪除 `Movie_quotes`,我們可以這樣寫:

DROP TABLE Movie_quotes;

現(xiàn)在我們的數(shù)據(jù)庫是空的,準(zhǔn)備接受新數(shù)據(jù)。我們從所有的 CRUD 過程開始,創(chuàng)建名為 `Song_Lyrics` 的新表,根據(jù)我們新收藏的歌曲,建立一個(gè)歌詞數(shù)據(jù)庫。

結(jié)論

本文我們?yōu)g覽了涵蓋 CRUD 四個(gè)基本的數(shù)據(jù)庫功能:如何創(chuàng)建新數(shù)據(jù)、讀取數(shù)據(jù)、更新我們想要修改的數(shù)據(jù)、以及最后的如何刪除不想要的數(shù)據(jù)。這包含了基本的、但是最重要的 SQL 命令,比如:`CREATE TABLE`, `INSERT INTO`, `SELECT`, `UPDATE`, `DELETE` 和 `DROP`。

這些基本的 SQL 命令支持大量的數(shù)據(jù)管理,但是每個(gè)介紹到的命令都有很多選項(xiàng)和額外的功能,有些是本文沒有介紹的,要注意這一點(diǎn)?傊(dāng) SQL 開發(fā)人員新手在開始數(shù)據(jù)庫工作、以及使用一門新語言 SQL 時(shí),本文中的基本知識(shí)應(yīng)該能為他們開個(gè)好頭。

以上就是PHP開發(fā)之程序員必掌握的 SQL 指南的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!


學(xué)習(xí)教程快速掌握從入門到精通的SQL知識(shí)。