數據庫驅動著現代網絡。每個大的或動態的網站都以某種方式使用數據庫,當與結構化查詢語言(SQL)結合使用時,操縱數據的可能性真的是無窮無盡。如果您已經知道SQL,請確保您檢查了所有網站開發人員都應該知道的編程技能。
今天我將向您展示作為程序員需要了解的一些核心SQL命令。
從數據庫表返回的數據有許多名稱。數據通常被稱為行、記錄或元組。在本文中,我將交替使用這些術語。
今天所有的例子都基於四個虛構的表格。customer表包含客戶的姓名和年齡:
高度表包含任何人的姓名和身高:
staff表包含職員的姓名和年齡——與customer表完全相同:
最後一個名為people的表包含人員的姓名和年齡,就像customer和staff表一樣:
select語句是最簡單的,您必須理解它,因為它支持幾乎所有其他命令。以大寫形式編寫保留的SQL字被認為是一種最佳實踐,因為它使命令更易於閱讀和理解。
顧名思義,select用於從數據庫中選擇數據。以下是最簡單的用法:
SELECT * FROM table;這有兩個部分。第一部分(SELECT*)指定要選擇的列。星號表示您希望選擇表中的所有列。第二部分(來自表)告訴您的數據庫引擎要從何處檢索這些數據。將“table”替換為數據庫表的名稱。
這個select被稱為“select star”。使用星號是一個很好的方法來找出表中的數據,但是我不建議您在任何生產代碼中使用它。使用selectstar時,由數據庫引擎向您提供所需的數據。您無法控制數據返回的順序,因此如果有人向表中添加新列,您可能會發現編程語言中的變量不再表示正確的數據。幸運的是,有一個解決辦法。
可以顯式說明要檢索哪些列,如下所示:
SELECT age, name FROM people;此查詢從“people”表中檢索“age”和“name”列。如果您有大量數據,那麼這種顯式可能會有點乏味,但是這樣做會減少將來的問題,同時使您的SQL更容易被未來的程序員理解。
如果要選擇一個附加的數據段,但它沒有存儲在任何表中,可以這樣做:
SELECT age, '1234' FROM people;將返回單引號內的任何字符串,而不是與列名匹配的字符串。
select命令非常適合檢索數據,但是如果您想進一步過濾結果呢?那隻找藍眼睛的人怎麼樣?一月份出生的機械師呢?這就是命令的作用。這允許您將條件應用於select,只需將其附加到語句末尾:
SELECT age, name FROM people WHERE age > 10;此查詢現在僅限於10歲以上的人。可以使用AND運算符組合多個條件:
SELECT age, name FROM people WHERE age > 10 AND age < 20;AND命令的工作方式與英語中的完全相同:它對語句應用另一個條件。在本例中,返回的數據將是年齡在10到20之間的任何記錄。由於沒有匹配結果,因此不返回任何數據。
另一個可以與此結合使用的命令是或。舉個例子:
SELECT age, name FROM people WHERE age > 10 OR name = 'Joe';此查詢返回年齡大於10歲或名稱等於“Joe”的記錄。注意到只有一個等號嗎?大多數編程語言使用雙等於(=)來檢查等價性。對於絕大多數數據庫引擎來說,這是不需要的(但是對於每個環境來說,這是非常必要的,所以首先要仔細檢查)。
order命令用於對返回的結果進行排序。這是另一個容易使用的。只需將其附加到語句末尾:
SELECT name, age FROM people ORDER BY age DESC;您需要指定列和順序,升序可以是ASC,降序可以是DESC。您可以按以下方式按多個列排序:
SELECT name, age FROM people ORDER BY name ASC, age DESCORDER BY與其他命令結合使用時可能最有用。並不是所有的查詢都會以邏輯或有序的方式返回數據——這個命令允許您更改這一點。
join命令用於連接存儲在一個或多個表中的相關數據。將第二個表連接到第一個表,並指定數據的連接方式。下面是一個基本示例:
SELECT age, name, height FROM people LEFT JOIN heights USING (name);這裡發生了一些事情。必須從“LEFT JOIN”語法開始,該語法指定要使用LEFT類型的連接來連接表。接下來,指定要聯接的表(高度)。USING(name)語法聲明在兩個表中都可以找到“name”列,並且應該將其用作將表連接在一起的鍵。
如果您的列在每個表中有不同的名稱,請不要擔心。您可以使用“ON”而不是“USING”:
SELECT age, name, height FROM people LEFT JOIN heights ON (namea = nameb);on語句顯式聲明要在哪些列上設置鍵。連接有多種類型,每種類型的詳細信息都需要很長時間,下面簡要介紹一下它們的用法:
“內部”或“外部”語法是可選的。它可以使事情更容易理解,但你不必在絕大多數時間裡指定它。
現在您瞭解了基礎知識,讓我們看看alias命令。這用於臨時重命名一個表——更像是一個暱稱,因為這個新名稱只存在於正在運行的單個事務中。以下是使用方法:
SELECT A.age FROM people A;你可以用任何你喜歡的有效名字,但我喜歡用字母表中的字母。在每個列名之前,都會加上別名的前綴。此別名在聲明後立即分配給表。這與這樣做完全相同:
SELECT people.age FROM people;不必鍵入長表名,您可以鍵入一個簡單易記的字母——但這有什麼意義呢?如果您從多個表中進行選擇,很容易混淆哪些列屬於哪個表。如果兩個表恰好有同名的列,則在沒有顯式引用表名或別名的情況下,數據庫查詢甚至可能無法運行。下面是一個包含兩個表的示例:
SELECT staff.age, staff.name, customers.age, customers.name FROM staff, customers;下面是相同的查詢,帶有別名:
SELECT A.age, A.name, B.age, B.name FROM staff A, customers B;staff表的別名為“A”,customers表的別名為“B”。別名表確實有助於使代碼更易於理解,並減少了所需的鍵入量。
也可以使用“AS”命令重命名具有別名的列:
SELECT age AS person_age FROM people;運行此查詢時,該列現在將被稱為“person\u age”,而不是“age”。
團結是偉大的命令。它允許您將行相互附加。與附加匹配列的聯接不同,union可以附加不相關的行,前提是它們具有相同的列數和列名。以下是使用方法:
SELECT age, name FROM customersUNION SELECT age, name FROM staff;您可以將union看作是組合兩個查詢結果的一種方法。聯合將只返回兩個查詢之間存在唯一行的結果。可以使用“UNION ALL”語法返回所有數據,而不考慮重複數據:
SELECT age, name FROM customersUNION ALLSELECT age, name FROM staff;注意行的順序是如何變化的嗎?Union以最有效的方式運行,因此返回的數據可以按順序變化。
union的一個可能的用例是小計:您可以將sum total查詢合併到特定場景的單個總計查詢上。
現在您已經瞭解了從數據庫檢索數據的所有方法,但是如何**數據呢?這就是insert命令的作用。舉個例子:
INSERT INTO people(name, age) VALUES('Joe', 102);必須指定表名(people)和要使用的列(name和age)。然後使用“VALUES”語法提供要**的值。這些列的順序必須與先前指定的列的順序相同。
不能為insert指定where子句,需要確保遵循現有的任何必要的表約束。
在**一些數據之後,很自然地需要更改特定的行。更新命令語法如下:
UPDATE people SET name = 'Joe', age = 101;必須指定要更改的表,然後使用“SET”語法指定列及其新值。這個例子很好,但它會更新每一條記錄——這並不總是可取的!
為了更具體,您可以使用“WHERE”子句,就像在執行select時一樣:
UPDATE people SET name = 'Joe', age = 101 WHERE name = 'James';您甚至可以使用“AND”和“OR”指定多個條件:
UPDATE people SET name = 'Joe', age = 101 WHERE (name = 'James' AND age = 100) OR name = 'Ryan';請注意括號是如何用於約束條件的。
Upsert是一個聽起來很奇怪的詞,但卻是一個非常有用的命令。假設您的表上有一個約束,並且您指定只需要具有唯一名稱的記錄——例如,您不希望存儲具有相同名稱的兩行。如果您嘗試**多個'Joe'值,您的數據庫引擎將拋出一個錯誤並拒絕這樣做(非常正確)。UPSERT允許您更新已存在的記錄。這是非常有用的!如果沒有這個命令,您將不得不編寫大量的邏輯來首先檢查記錄是否存在,如果不存在則**,否則檢索正確的主鍵,然後更新。
不幸的是,upsert在不同的數據庫引擎中實現方式不同。PostgreSQL最近才獲得這種能力,而MySQL擁有這種能力已經有相當一段時間了。以下是MySQL語法供參考:
INSERT INTO people(name, age)VALUES('Joe', 101)ON DUPLICATE KEY UPDATE age = 101;請注意,這實際上是一個update和insert語句,可以概括為“insert失敗時更新”
Delete用於完全刪除記錄——如果被濫用,它可能會造成相當大的損害!基本語法非常容易使用:
DELETE FROM people;像大多數其他命令一樣,這將刪除所有內容!您需要使用where將其限制為稍微合理的行數,最好是:
DELETE FROM people WHERE name = 'Joe';如果您正在開發一個系統,實現“軟刪除”通常是明智的。您實際上從未運行delete命令,而是創建一個已刪除的列,然後在selects中檢查該列—如果您能夠快速輕鬆地檢索假定已刪除的記錄,則可以避免許多潛在的尷尬。然而,這並不能替代正確的備份。
create table命令用於創建表。這是另一個非常簡單的問題:
CREATE TABLE people ( name TEXT, age, INTEGER, PRIMARY KEY(name));請注意,列名和約束是如何放在方括號內的,並且這些列被賦予了適當的數據類型。主鍵是指定的,這在任何好的數據庫設計中都是必需的。
altertable命令用於修改表的結構。這是有點限制的,因為如果現有數據會導致衝突,數據庫將不允許您更改表——例如,將字符串更改為整數。在這些情況下,首先修復數據,然後修改表。舉個例子:
ALTER TABLE people ADD height integer;本例向people表中添加了一個integer類型的名為“height”的列。你能改變的東西其實沒有限制。
最後一個命令是drop table。可以將此視為刪除,但它不會刪除單個記錄,而是刪除表中的每個記錄!以下是使用方法:
DROP TABLE people;這是一個相當激烈的命令,沒有理由它需要被編程到您的系統。在絕大多數情況下,只能手動執行,而且破壞性很大。
今天就這些。我希望你學會一些有用的技巧!您可以學習如何創建一個網站,然後使用新發現的技能使其動態化--只需確保您不會犯這些錯誤或使其容易受到SQL注入的影響。如果您不確定是否需要學習SQL,是否考慮過靜態站點生成器?
為什麼不在下面留下你最喜歡的SQL技巧和技巧呢?
圖片來源:HYS\U NP/Shutterstock
...開源的關係資料庫管理系統。定義、構造和操作資料庫的程式稱為資料庫管理系統。程式設計師可以在MySQL上使用SQL查詢進行資料儲存和檢索。它提供資料管理、資料遷移和資料保護。 圖01:MySQL MySQL是一個快速且易於使用的工具...
... 一旦構建,軟體往往遠遠超過其預期壽命。因此,幾乎所有的程式設計師都必須在某個時候處理相容性問題。無論是確保一個網站在InternetExplorer8中看起來不錯,還是在一個古老的版本上測試他們的Android應用程式,程式設計師...
... 有一個地方來整理你所有關於新技術、最佳化、待辦事項列表等的筆記是很好的,但是如果你想記下一些程式碼呢?如果沒有正確的格式和語法高亮顯示,它可能會非常混亂。 ...
...的設計師在尋找不間斷的靈感和資訊的首選。但是,篩選所有與設計相關的頁面和組,以找到絕對最好的可能是一個噩夢任務。 ...
... JavaScript從一開始就是一種混亂的語言,因此您需要所有能得到的幫助。一個適當的、裝備精良的文字編輯器可以幫助您更快地編寫程式碼,編寫更乾淨的程式碼,儘早地捕獲bug,但最重要的是,它使程式設計變得有趣和愉...
...複雜的佈局是困難的,但是flexbox建立了一個新的標準,所有的開發人員都開始接受這個標準。 ...
...試著記住一些程式碼做了什麼。不管是什麼問題,避免犯所有這些錯誤,你應該發現你的程式碼在改進。 ...
...計。看看本文的演示,按鈕、選單、顏色、字型和導航。所有的東西都被程式設計來創造你看到的成品。 ...
...有侷限性,但他們一直在進步。不管你打算做什麼,幾乎所有的用途都有一個IDE。 ...