一個程序員的成長過程 2017-12-15 14:08:06
在本教程中,您將學到如何使用 SQL 訪問和處理數據系統(tǒng)中的數據,這類數據庫包括:Oracle, Sybase, SQL Server, DB2, Access 等等。 SQL 簡介什么是 SQL?
編者注:ANSI,美國國家標準化組織 SQL 能做什么?
SQL 是一種標準 - 但是... SQL 是一門 ANSI 的標準計算機語言,用來訪問和操作數據庫系統(tǒng)。SQL 語句用于取回和更新數據庫中的數據。SQL 可與數據庫程序協同工作,比如 MS Access、DB2、Informix、MS SQL Server、Oracle、Sybase 以及其他數據庫系統(tǒng)。 不幸地是,存在著很多不同版本的 SQL 語言,但是為了與 ANSI 標準相兼容,它們必須以相似的方式共同地來支持一些主要的關鍵詞(比如 SELECT、UPDATE、DELETE、INSERT、WHERE 等等)。 注釋:除了 SQL 標準之外,大部分 SQL 數據庫程序都擁有它們自己的私有擴展! 在您的網站中使用 SQL 要創(chuàng)建發(fā)布數據庫中數據的網站,您需要以下要素:
RDBMS RDBMS 指的是關系型數據庫管理系統(tǒng)。 RDBMS 是 SQL 的基礎,同樣也是所有現代數據庫系統(tǒng)的基礎,比如 MS SQL Server, IBM DB2, Oracle, MySQL 以及 Microsoft Access。 RDBMS 中的數據存儲在被稱為表(tables)的數據庫對象中。 表是相關的數據項的集合,它由列和行組成。 SQL 語法數據庫表 一個數據庫通常包含一個或多個表。每個表由一個名字標識(例如“客戶”或者“訂單”)。表包含帶有數據的記錄(行)。 下面的例子是一個名為 "Persons" 的表:
上面的表包含三條記錄(每一條對應一個人)和五個列(Id、姓、名、地址和城市)。 SQL 語句 您需要在數據庫上執(zhí)行的大部分工作都由 SQL 語句完成。 下面的語句從表中選取 LastName 列的數據: SELECT LastName FROM Persons 結果集類似這樣:
在本教程中,我們將為您講解各種不同的 SQL 語句。 重要事項 一定要記住,SQL 對大小寫不敏感! SQL 語句后面的分號? 某些數據庫系統(tǒng)要求在每條 SQL 命令的末端使用分號。在我們的教程中不使用分號。 分號是在數據庫系統(tǒng)中分隔每條 SQL 語句的標準方法,這樣就可以在對服務器的相同請求中執(zhí)行一條以上的語句。 如果您使用的是 MS Access 和 SQL Server 2000,則不必在每條 SQL 語句之后使用分號,不過某些數據庫軟件要求必須使用分號。 SQL DML 和 DDL 可以把 SQL 分為兩個部分:數據操作語言 (DML) 和 數據定義語言 (DDL)。 SQL (結構化查詢語言)是用于執(zhí)行查詢的語法。但是 SQL 語言也包含用于更新、插入和刪除記錄的語法。 查詢和更新指令構成了 SQL 的 DML 部分:
SQL 的數據定義語言 (DDL) 部分使我們有能力創(chuàng)建或刪除表格。我們也可以定義索引(鍵),規(guī)定表之間的鏈接,以及施加表間的約束。 SQL 中最重要的 DDL 語句:
SQL SELECT 語句本章講解 SELECT 和 SELECT * 語句。 SQL SELECT 語句 SELECT 語句用于從表中選取數據。 結果被存儲在一個結果表中(稱為結果集)。 SQL SELECT 語法 SELECT 列名稱 FROM 表名稱 以及: SELECT * FROM 表名稱 注釋:SQL 語句對大小寫不敏感。SELECT 等效于 select。 SQL SELECT 實例 如需獲取名為 "LastName" 和 "FirstName" 的列的內容(從名為 "Persons" 的數據庫表),請使用類似這樣的 SELECT 語句: SELECT LastName,FirstName FROM Persons "Persons" 表:
結果:
SQL SELECT * 實例 現在我們希望從 "Persons" 表中選取所有的列。 請使用符號 * 取代列的名稱,就像這樣: SELECT * FROM Persons 提示:星號(*)是選取所有列的快捷方式。 結果:
在結果集(result-set)中導航 由 SQL 查詢程序獲得的結果被存放在一個結果集中。大多數數據庫軟件系統(tǒng)都允許使用編程函數在結果集中進行導航,比如:Move-To-First-Record、Get-Record-Content、Move-To-Next-Record 等等。 SQL SELECT DISTINCT 語句本章講解 SELECT DISTINCT 語句。 SQL SELECT DISTINCT 語句 在表中,可能會包含重復值。這并不成問題,不過,有時您也許希望僅僅列出不同(distinct)的值。 關鍵詞 DISTINCT 用于返回唯一不同的值。 語法: SELECT DISTINCT 列名稱 FROM 表名稱 使用 DISTINCT 關鍵詞 如果要從 "Company" 列中選取所有的值,我們需要使用 SELECT 語句: SELECT Company FROM Orders "Orders"表:
結果:
請注意,在結果集中,W3School 被列出了兩次。 如需從 Company" 列中僅選取唯一不同的值,我們需要使用 SELECT DISTINCT 語句: SELECT DISTINCT Company FROM Orders 結果:
現在,在結果集中,"W3School" 僅被列出了一次。 SQL WHERE 子句WHERE 子句用于規(guī)定選擇的標準。 WHERE 子句 如需有條件地從表中選取數據,可將 WHERE 子句添加到 SELECT 語句。 語法 SELECT 列名稱 FROM 表名稱 WHERE 列 運算符 值 下面的運算符可在 WHERE 子句中使用:
注釋:在某些版本的 SQL 中,操作符 <> 可以寫為 !=。 使用 WHERE 子句 如果只希望選取居住在城市 "Beijing" 中的人,我們需要向 SELECT 語句添加 WHERE 子句: SELECT * FROM Persons WHERE City='Beijing' "Persons" 表
結果:
引號的使用 請注意,我們在例子中的條件值周圍使用的是單引號。 SQL 使用單引號來環(huán)繞文本值(大部分數據庫系統(tǒng)也接受雙引號)。如果是數值,請不要使用引號。 文本值: 這是正確的:SELECT * FROM Persons WHERE FirstName='Bush'這是錯誤的:SELECT * FROM Persons WHERE FirstName=Bush 數值: 這是正確的:SELECT * FROM Persons WHERE Year>1965這是錯誤的:SELECT * FROM Persons WHERE Year>'1965' SQL AND & OR 運算符AND 和 OR 運算符用于基于一個以上的條件對記錄進行過濾。 AND 和 OR 運算符 AND 和 OR 可在 WHERE 子語句中把兩個或多個條件結合起來。 如果第一個條件和第二個條件都成立,則 AND 運算符顯示一條記錄。 如果第一個條件和第二個條件中只要有一個成立,則 OR 運算符顯示一條記錄。 原始的表 (用在例子中的):
AND 運算符實例 使用 AND 來顯示所有姓為 "Carter" 并且名為 "Thomas" 的人: SELECT * FROM Persons WHERE FirstName='Thomas' AND LastName='Carter' 結果:
OR 運算符實例 使用 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' 結果:
SQL ORDER BY 子句ORDER BY 語句用于對結果集進行排序。 ORDER BY 語句 ORDER BY 語句用于根據指定的列對結果集進行排序。 ORDER BY 語句默認按照升序對記錄進行排序。 如果您希望按照降序對記錄進行排序,可以使用 DESC 關鍵字。 原始的表 (用在例子中的): Orders 表:
實例 1 以字母順序顯示公司名稱: SELECT Company, OrderNumber FROM Orders ORDER BY Company 結果:
實例 2 以字母順序顯示公司名稱(Company),并以數字順序顯示順序號(OrderNumber): SELECT Company, OrderNumber FROM Orders ORDER BY Company, OrderNumber 結果:
實例 3 以逆字母順序顯示公司名稱: SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC 結果:
實例 4 以逆字母順序顯示公司名稱,并以數字順序顯示順序號: SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC 結果:
注意:在以上的結果中有兩個相等的公司名稱 (W3School)。只有這一次,在第一列中有相同的值時,第二列是以升序排列的。如果第一列中有些值為 nulls 時,情況也是這樣的。 SQL INSERT INTO 語句INSERT INTO 語句 INSERT INTO 語句用于向表格中插入新的行。 語法 INSERT INTO 表名稱 VALUES (值1, 值2,....) 我們也可以指定所要插入數據的列: INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....) 插入新的行 "Persons" 表:
SQL 語句: INSERT INTO Persons VALUES ('Gates', 'Bill', 'Xuanwumen 10', 'Beijing') 結果:
在指定的列中插入數據 "Persons" 表:
SQL 語句: INSERT INTO Persons (LastName, Address) VALUES ('Wilson', 'Champs-Elysees') 結果:
SQL UPDATE 語句Update 語句 Update 語句用于修改表中的數據。 語法: UPDATE 表名稱 SET 列名稱 = 新值 WHERE 列名稱 = 某值 Person:
更新某一行中的一個列 我們?yōu)?lastname 是 "Wilson" 的人添加 firstname: UPDATE Person SET FirstName = 'Fred' WHERE LastName = 'Wilson' 結果:
更新某一行中的若干列 我們會修改地址(address),并添加城市名稱(city): UPDATE Person SET Address = 'Zhongshan 23', City = 'Nanjing'WHERE LastName = 'Wilson' 結果:
SQL DELETE 語句DELETE 語句 DELETE 語句用于刪除表中的行。 語法 DELETE FROM 表名稱 WHERE 列名稱 = 值 Person:
刪除某行 "Fred Wilson" 會被刪除: DELETE FROM Person WHERE LastName = 'Wilson' 結果:
刪除所有行 可以在不刪除表的情況下刪除所有的行。這意味著表的結構、屬性和索引都是完整的: DELETE FROM table_name 或者: DELETE * FROM table_name |
|