W3C SQL

来源:http://www.cnblogs.com/rancrazy/archive/2016/09/17/5877745.html
-Advertisement-
Play Games

SQL 是用於訪問和處理資料庫的標準的電腦語言。 什麼是 SQL? SQL 指結構化查詢語言 SQL 使我們有能力訪問資料庫 SQL 是一種 ANSI 的標準電腦語言 編者註:ANSI,美國國家標準化組織 什麼是 SQL? SQL 指結構化查詢語言 SQL 使我們有能力訪問資料庫 SQL 是一種 ...


SQL 是用於訪問和處理資料庫的標準的電腦語言。

什麼是 SQL?

  • SQL 指結構化查詢語言
  • SQL 使我們有能力訪問資料庫
  • SQL 是一種 ANSI 的標準電腦語言

編者註:ANSI,美國國家標準化組織

SQL 能做什麼?

  • SQL 面向資料庫執行查詢
  • SQL 可從資料庫取回數據
  • SQL 可在資料庫中插入新的記錄
  • SQL 可更新資料庫中的數據
  • SQL 可從資料庫刪除記錄
  • SQL 可創建新資料庫
  • SQL 可在資料庫中創建新表
  • SQL 可在資料庫中創建存儲過程
  • SQL 可在資料庫中創建視圖
  • SQL 可以設置表、存儲過程和視圖的許可權

SQL 是一種標準 - 但是...

SQL 是一門 ANSI 的標準電腦語言,用來訪問和操作資料庫系統。SQL 語句用於取回和更新資料庫中的數據。SQL 可與資料庫程式協同工作,比如 MS Access、DB2、Informix、MS SQL Server、Oracle、Sybase 以及其他資料庫系統。

不幸地是,存在著很多不同版本的 SQL 語言,但是為了與 ANSI 標準相相容,它們必須以相似的方式共同地來支持一些主要的關鍵詞(比如 SELECT、UPDATE、DELETE、INSERT、WHERE 等等)。

註釋:除了 SQL 標準之外,大部分 SQL 資料庫程式都擁有它們自己的私有擴展!

在您的網站中使用 SQL

要創建發佈資料庫中數據的網站,您需要以下要素:

  • RDBMS 資料庫程式(比如 MS Access, SQL Server, MySQL)
  • 伺服器端腳本語言(比如 PHP 或 ASP)
  • SQL
  • HTML / CSS

RDBMS

RDBMS 指的是關係型資料庫管理系統。

RDBMS 是 SQL 的基礎,同樣也是所有現代資料庫系統的基礎,比如 MS SQL Server, IBM DB2, Oracle, MySQL 以及 Microsoft Access。

RDBMS 中的數據存儲在被稱為表(tables)的資料庫對象中。

表是相關的數據項的集合,它由列和行組成。

資料庫表

一個資料庫通常包含一個或多個表。每個表由一個名字標識(例如“客戶”或者“訂單”)。表包含帶有數據的記錄(行)。

下麵的例子是一個名為 "Persons" 的表:

IdLastNameFirstNameAddressCity
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York
3 Carter Thomas Changan Street Beijing

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

SQL 語句

您需要在資料庫上執行的大部分工作都由 SQL 語句完成。

下麵的語句從表中選取 LastName 列的數據:

SELECT LastName FROM Persons

結果集類似這樣:

LastName
Adams
Bush
Carter

在本教程中,我們將為您講解各種不同的 SQL 語句。

重要事項

一定要記住,SQL 對大小寫不敏感!

SQL 語句後面的分號?

某些資料庫系統要求在每條 SQL 命令的末端使用分號。在我們的教程中不使用分號。

分號是在資料庫系統中分隔每條 SQL 語句的標準方法,這樣就可以在對伺服器的相同請求中執行一條以上的語句。

如果您使用的是 MS Access 和 SQL Server 2000,則不必在每條 SQL 語句之後使用分號,不過某些資料庫軟體要求必須使用分號。

SQL DML 和 DDL

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

SQL (結構化查詢語言)是用於執行查詢的語法。但是 SQL 語言也包含用於更新、插入和刪除記錄的語法。

查詢和更新指令構成了 SQL 的 DML 部分:

  • SELECT - 從資料庫表中獲取數據
  • UPDATE - 更新資料庫表中的數據
  • DELETE - 從資料庫表中刪除數據
  • INSERT INTO - 向資料庫表中插入數據

SQL 的數據定義語言 (DDL) 部分使我們有能力創建或刪除表格。我們也可以定義索引(鍵),規定表之間的鏈接,以及施加表間的約束。

SQL 中最重要的 DDL 語句:

  • CREATE DATABASE - 創建新資料庫
  • ALTER DATABASE - 修改資料庫
  • CREATE TABLE - 創建新表
  • ALTER TABLE - 變更(改變)資料庫表
  • DROP TABLE - 刪除表
  • CREATE INDEX - 創建索引(搜索鍵)
  • DROP INDEX - 刪除索引

SQL SELECT 語句

SELECT 語句用於從表中選取數據。

結果被存儲在一個結果表中(稱為結果集)。

SQL SELECT 語法

SELECT 列名稱 FROM 表名稱

以及:

SELECT * FROM 表名稱

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

SQL SELECT 實例

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

SELECT LastName,FirstName FROM Persons

"Persons" 表:

IdLastNameFirstNameAddressCity
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York
3 Carter Thomas Changan Street Beijing

結果:

LastNameFirstName
Adams John
Bush George
Carter Thomas

SQL SELECT * 實例

現在我們希望從 "Persons" 表中選取所有的列。

請使用符號 * 取代列的名稱,就像這樣:

SELECT * FROM Persons

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

結果:

IdLastNameFirstNameAddressCity
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York
3 Carter Thomas Changan Street Beijing

在結果集(result-set)中導航

由 SQL 查詢程式獲得的結果被存放在一個結果集中。大多數資料庫軟體系統都允許使用編程函數在結果集中進行導航,比如:Move-To-First-Record、Get-Record-Content、Move-To-Next-Record 等等。

類似這些編程函數不在本教程講解之列。如需學習通過函數調用訪問數據的知識,請訪問我們的 ADO 教程 和 PHP 教程

SQL SELECT DISTINCT 語句

在表中,可能會包含重覆值。這並不成問題,不過,有時您也許希望僅僅列出不同(distinct)的值。

關鍵詞 DISTINCT 用於返回唯一不同的值。

語法:

SELECT DISTINCT 列名稱 FROM 表名稱

使用 DISTINCT 關鍵詞

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

SELECT Company FROM Orders

"Orders"表:

CompanyOrderNumber
IBM 3532
W3School 2356
Apple 4698
W3School 6953

結果:

Company
IBM
W3School
Apple
W3School

請註意,在結果集中,W3School 被列出了兩次。

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

SELECT DISTINCT Company FROM Orders 

結果:

Company
IBM
W3School
Apple

現在,在結果集中,"W3School" 僅被列出了一次。

 

 

 

WHERE 子句用於規定選擇的標準。

WHERE 子句

如需有條件地從表中選取數據,可將 WHERE 子句添加到 SELECT 語句。

語法

SELECT 列名稱 FROM 表名稱 WHERE 列 運算符 值

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

操作符描述
= 等於
<> 不等於
> 大於
< 小於
>= 大於等於
<= 小於等於
BETWEEN 在某個範圍內
LIKE 搜索某種模式

註釋:在某些版本的 SQL 中,操作符 <> 可以寫為 !=。

使用 WHERE 子句

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

SELECT * FROM Persons WHERE City='Beijing'

"Persons" 表

LastNameFirstNameAddressCityYear
Adams John Oxford Street London 1970
Bush George Fifth Avenue New York 1975
Carter Thomas Changan Street Beijing 1980
Gates Bill Xuanwumen 10 Beijing 1985

結果:

LastNameFirstNameAddressCityYear
Carter Thomas Changan Street Beijing 1980
Gates Bill Xuanwumen 10 Beijing 1985

引號的使用

請註意,我們在例子中的條件值周圍使用的是單引號。

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

文本值:

這是正確的:
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 distinct
 

Update 語句

Update 語句用於修改表中的數據。

語法:

UPDATE 表名稱 SET 列名稱 = 新值 WHERE 列名稱 = 某值

Person:

LastNameFirstNameAddressCity
Gates Bill Xuanwumen 10 Beijing
Wilson   Champs-Elysees  

更新某一行中的一個列

我們為 lastname 是 "Wilson" 的人添加 firstname:

UPDATE Person SET FirstName = 'Fred' WHERE LastName = 'Wilson' 

結果:

LastNameFirstNameAddressCity
Gates Bill Xuanwumen 10 Beijing
Wilson Fred Champs-Elysees  

更新某一行中的若幹列

我們會修改地址(address),並添加城市名稱(city):

UPDATE Person SET Address = 'Zhongshan 23', City = 'Nanjing'
WHERE LastName = 'Wilson'

結果:

LastNameFirstNameAddressCity
Gates Bill Xuanwumen 10 Beijing
Wilson Fred Zhongshan 23 Nanjing

DELETE 語句

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

語法

DELETE FROM 表名稱 WHERE 列名稱 = 值

Person:

LastNameFirstNameAddressCity
Gates Bill Xuanwumen 10 Beijing
Wilson Fred Zhongshan 23 Nanjing

刪除某行

"Fred Wilson" 會被刪除:

DELETE FROM Person WHERE LastName = 'Wilson' 

結果:

LastNameFirstNameAddressCity
Gates Bill Xuanwumen 10 Beijing

刪除所有行

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

DELETE FROM table_name

或者:

DELETE * FROM table_name

 

TOP 子句

TOP 子句用於規定要返回的記錄的數目。

對於擁有數千條記錄的大型表來說,TOP 子句是非常有用的。

註釋:並非所有的資料庫系統都支持 TOP 子句。

SQL Server 的語法:

SELECT TOP number|percent column_name(s)
FROM table_name

MySQL 和 Oracle 中的 SQL SELECT TOP 是等價的

MySQL 語法

SELECT column_name(s)
FROM table_name
LIMIT number

例子

SELECT *
FROM Persons
LIMIT 5

Oracle 語法

SELECT column_name(s)
FROM table_name
WHERE ROWNUM <= number

例子

SELECT *
FROM Persons
WHERE ROWNUM <= 5

原始的表 (用在例子中的):

Persons 表:

IdLastNameFirstNameAddressCity
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York
3 Carter Thomas Changan Street Beijing
4 Obama Barack Pennsylvania Avenue Washington

SQL TOP 實例

現在,我們希望從上面的 "Persons" 表中選取頭兩條記錄。

我們可以使用下麵的 SELECT 語句:

SELECT TOP 2 * FROM Persons

結果:

IdLastNameFirstNameAddressCity
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York

SQL TOP PERCENT 實例

現在,我們希望從上面的 "Persons" 表中選取 50% 的記錄。

我們可以使用下麵的 SELECT 語句:

SELECT TOP 50 PERCENT * FROM Persons

結果:

IdLastNameFirstNameAddressCity
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York

SQL LIKE 操作符

LIKE 操作符用於在 WHERE 子句中搜索列中的指定模式。

LIKE 操作符

LIKE 操作符用於在 WHERE 子句中搜索列中的指定模式。

SQL LIKE 操作符語法

SELECT column_name(s)
FROM table_name
WHERE column_name LIKE pattern

原始的表 (用在例子中的):

Persons 表:

IdLastNameFirstNameAddressCity
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York
3 Carter Thomas Changan Street Beijing

LIKE 操作符實例

例子 1

現在,我們希望從上面的 "Persons" 表中選取居住在以 "N" 開始的城市裡的人:

我們可以使用下麵的 SELECT 語句:

SELECT * FROM Persons
WHERE City LIKE 'N%'

提示:"%" 可用於定義通配符(模式中缺少的字母)。

結果集:

IdLastNameFirstNameAddressCity
2 Bush George Fifth Avenue New York

例子 2

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

我們可以使用下麵的 SELECT 語句:

SELECT * FROM Persons
WHERE City LIKE '%g'

結果集:

IdLastNameFirstNameAddressCity
3 Carter Thomas Changan Street Beijing

例子 3

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

我們可以使用下麵的 SELECT 語句:

SELECT * FROM Persons
WHERE City LIKE '%lon%'

結果集:

IdLastNameFirstNameAddressCity
1 Adams John Oxford Street London

例子 4

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

我們可以使用下麵的 SELECT 語句:

SELECT * FROM Persons
WHERE City NOT LIKE '%lon%'

結果集:

IdLastNameFirstNameAddressCity
2 Bush George Fifth Avenue New York
3 Carter Thomas Changan Street Beijing

SQL 通配符

在搜索資料庫中的數據時,SQL 通配符可以替代一個或多個字元。

SQL 通配符必須與 LIKE 運算符一起使用。

在 SQL 中,可使用以下通配符:

通配符描述
% 替代一個或多個字元
_ 僅替代一個字元
[charlist] 字元列中的任何單一字元

[^charlist]

或者

[!charlist]

不在字元列中的任何單一字元

原始的表 (用在例子中的):

Persons 表:

IdLastNameFirstNameAddressCity
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York
3 Carter Thomas Changan Street Beijing

使用 % 通配符

例子 1

現在,我們希望從上面的 "Persons" 表中選取居住在以 "Ne" 開始的城市裡的人:

我們可以使用下麵的 SELECT 語句:

SELECT * FROM Persons
WHERE City LIKE 'Ne%'

結果集:

IdLastNameFirstNameAddressCity
2 Bush George Fifth Avenue New York

例子 2

接下來,我們希望從 "Persons" 表中選取居住在包含 "lond" 的城市裡的人:

我們可以使用下麵的 SELECT 語句:

SELECT * FROM Persons
WHERE City LIKE '%lond%'

結果集:

IdLastNameFirstNameAddressCity
1 Adams John Oxford Street London

使用 _ 通配符

例子 1

現在,我們希望從上面的 "Persons" 表中選取名字的第一個字元之後是 "eorge" 的人:

我們可以使用下麵的 SELECT 語句:

SELECT * FROM Persons
WHERE FirstName LIKE '_eorge'

結果集:

IdLastNameFirstNameAddressCity
2 Bush George Fifth Avenue New York

例子 2

接下來,我們希望從 "Persons" 表中選取的這條記錄的姓氏以 "C" 開頭,然後是一個任意字元,然後是 "r",然後是任意字元,然後是 "er":

我們可以使用下麵的 SELECT 語句:

SELECT * FROM Persons
WHERE LastName LIKE 'C_r_er'

結果集:

IdLastNameFirstNameAddressCity
3 Carter Thomas Changan Street Beijing

使用 [charlist] 通配符

例子 1

現在,我們希望從上面的 "Persons" 表中選取居住的城市以 "A" 或 "L" 或 "N" 開頭的人:

我們可以使用下麵的 SELECT 語句:

SELECT * FROM Persons
WHERE City LIKE '[ALN]%'

結果集:

IdLastNameFirstNameAddressCity
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York

例子 2

現在,我們希望從上面的 "Persons" 表中選取居住的城市不以"A" 或 "L" 或 "N" 開頭的人:

我們可以使用下麵的 SELECT 語句:

SELECT * FROM Persons
WHERE City LIKE '[!ALN]%'

結果集:

IdLastNameFirstNameAddressCity
3 Carter Thomas Changan Street Beijing

BETWEEN 操作符在 WHERE 子句中使用,作用是選取介於兩個值之間的數據範圍。

BETWEEN 操作符

操作符 BETWEEN ... AND 會選取介於兩個值之間的數據範圍。這些值可以是數值、文本或者日期。

SQL BETWEEN 語法

SELECT column_name(s)
FROM table_name
WHERE column_name
BETWEEN value1 AND value2

原始的表 (在實例中使用:)

Persons 表:

IdLastNameFirstNameAddressCity
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York
3 Carter Thomas Changan Street Beijing
4 Gates Bill Xuanwumen 10 Beijing

BETWEEN 操作符實例

如需以字母順序顯示介於 "Adams"(包括)和 "Carter"(不包括)之間的人,請使用下麵的 SQL:

SELECT * FROM Persons
WHERE LastName
BETWEEN 'Adams' AND 'Carter'

結果集:

IdLastNameFirstNameAddressCity
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York

重要事項:不同的資料庫對 BETWEEN...AND 操作符的處理方式是有差異的。某些資料庫會列出介於 "Adams" 和 "Carter" 之間的人,但不包括 "Adams" 和 "Carter" ;某些資料庫會列出介於 "Adams" 和 "Carter" 之間並包括 "Adams" 和 "Carter" 的人;而另一些資料庫會列出介於 "Adams" 和 "Carter" 之間的人,包括 "Adams" ,但不包括 "Carter" 。

所以,請檢查你的資料庫是如何處理 BETWEEN....AND 操作符的!

實例 2

如需使用上面的例子顯示範圍之外的人,請使用 NOT 操作符:

SELECT * FROM Persons
WHERE LastName
NOT BETWEEN 'Adams' AND 'Carter'

結果集:

IdLastNameFirstNameAddressCity
3 Carter Thomas Changan Street Beijing
4 Gates Bill Xuanwumen 10 Beijing

 

SQL join 用於根據兩個或多個表中的列之間的關係,從這些表中查詢數據。

Join 和 Key

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

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

請看 "Persons" 表:

Id_PLastNameFirstNameAddressCity
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York
3 Carter Thomas Changan Street Beijing

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

接下來請看 "Orders" 表:

Id_OOrderNoId_P
1 77895 3
2 44678 3
3 22456 1
4 24562 1
5 34764 65

請註意,"Id_O" 列是 Orders 表中的的主鍵,同時,"Orders" 表中的 "Id_P" 列用於引用 "Persons" 表中的人,而無需使用他們的確切姓名。

請留意,"Id_P" 列把上面的兩個表聯繫了起來。

引用兩個表

我們可以通過引用兩個表的方式,從兩個表中獲取數據:

誰訂購了產品,並且他們訂購了什麼產品?

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons, Orders
WHERE Persons.Id_P = Orders.Id_P 

結果集:

LastNameFirstNameOrderNo
Adams John 22456
Adams John 24562
Carter Thomas 77895
Carter Thomas 44678

SQL JOIN - 使用 Join

除了上面的方法,我們也可以使用關鍵詞 JOIN 來從兩個表中獲取數據。

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

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders
ON Persons.Id_P = Orders.Id_P
ORDER BY Persons.LastName

結果集:

LastNameFirstNameOrderNo
Adams John 22456
Adams John 24562
Carter Thomas 77895
Carter Thomas 44678

不同的 SQL JOIN

除了我們在上面的例子中使用的 INNER JOIN(內連接),我們還可以使用其他幾種連接。

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

  • JOIN: 如果表中有至少一個匹配,則返回行
  • LEFT JOIN: 即使右表中沒有匹配,也從左表返回所有的行
  • RIGHT JOIN: 即使左表中沒有匹配,也從右表返回所有的行
    • SQL UNION 操作符

      UNION 操作符用於合併兩個或多個 SELECT 語句的結果集。

      請註意,UNION 內部的 SELECT 語句必須擁有相同數量的列。列也必須擁有相似的數據類型。同時,每條 SELECT 語句中的列的順序必須相同。

      SQL UNION 語法

      SELECT column_name(s) FROM table_name1
      UNION
      SELECT column_name(s) FROM table_name2
      

      註釋:預設地,UNION 操作符選取不同的值。如果允許重覆的值,請使用 UNION ALL。

      SQL UNION ALL 語法

      SELECT column_name(s) FROM table_name1
      UNION ALL
      SELECT column_name(s) FROM table_name2
      

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

      下麵的例子中使用的原始表:

      Employees_China:

      E_IDE_Name
      01 Zhang, Hua
      02 Wang, Wei
      03 Carter, Thomas
      04 Yang, Ming

      Employees_USA:

      E_IDE_Name
      01 Adams, John
      02 Bush, George
      03 Carter, Thomas
      04 Gates, Bill

      使用 UNION 命令

      實例

      列出所有在中國和美國的不同的雇員名:

      SELECT E_Name FROM Employees_China
      UNION
      SELECT E_Name FROM Employees_USA
      

      結果

      E_Name
      Zhang, Hua
      Wang, Wei
      Carter, Thomas
      Yang, Ming
      Adams, John
      Bush, George
      Gates, Bill

      註釋:這個命令無法列出在中國和美國的所有雇員。在上面的例子中,我們有兩個名字相同的雇員,他們當中只有一個人被列出來了。UNION 命令只會選取不同的值。

      UNION ALL

      UNION ALL 命令和 UNION 命令幾乎是等效的,不過 UNION ALL 命令會列出所有的值。

      SQL Statement 1
      UNION ALL
      SQL Statement 2
      

      使用 UNION ALL 命令

      實例:

      列出在中國和美國的所有的雇員:

      SELECT E_Name FROM Employees_China
      UNION ALL
      SELECT E_Name FROM Employees_USA
      

      結果

      E_Name
      Zhang, Hua
      Wang, Wei
      Carter, Thomas
      Yang, Ming
      Adams, John
      Bush, George
      Carter, Thomas
      Gates, Bill
  • FULL JOIN: 只要其中一個表中存在匹配,就返回行

SQL SELECT INTO 語句可用於創建表的備份復件。

SELECT INTO 語句

SELECT INTO 語句從一個表中選取數據,然後把數據插入另一個表中。

SELECT INTO 語句常用於創建表的備份復件或者用於對記錄進行存檔。

SQL SELECT INTO 語法

您可以把所有的列插入新表:

SELECT *
INTO new_table_name [IN externaldatabase] 
FROM old_tablename

或者只把希望的列插入新表:

SELECT column_name(s)
INTO new_table_name [IN externaldatabase] 
FROM old_tablename

SQL SELECT INTO 實例 - 製作備份復件

下麵的例子會製作 "Persons" 表的備份復件:

SELECT *
INTO Persons_backup
FROM Persons

IN 子句可用於向另一個資料庫中拷貝表:

SELECT *
INTO Persons IN 'Backup.mdb'
FROM Persons

如果我們希望拷貝某些域,可以在 SELECT 語句後列出這些域:

SELECT LastName,FirstName
INTO Persons_backup
FROM Persons

SQL SELECT INTO 實例 - 帶有 WHERE 子句

我們也可以添加 WHERE 子句。

下麵的例子通過從 "Persons" 表中提取居住在 "Beijing" 的人的信息,創建了一個帶有兩個列的名為 "Persons_backup" 的表:

SELECT LastName,Firstname
INTO Persons_backup
FROM Persons
WHERE City='Beijing'

SQL SELECT INTO 實例 - 被連接的表

從一個以上的表中選取數據也是可以做到的。

下麵的例子會創建一個名為 "Persons_Order_Backup" 的新表,其中包含了從 Persons 和 Orders 兩個表中取得的信息:

SELECT Persons.LastName,Orders.OrderNo
INTO Persons_Order_Backup
FROM Persons
INNER JOIN Orders
ON Persons.Id_P=Orders.Id_P

 

SQL CREATE DATABASE 語句

CREATE DATABASE 語句

CREATE DATABASE 用於創建資料庫。

SQL CREATE DATABASE 語法

CREATE DATABASE database_name

SQL CREATE DATABASE 實例

現在我們希望創建一個名為 "my_db" 的資料庫。

我們使用下麵的 CREATE DATABASE 語句:

CREATE DATABASE my_db

可以通過 CREATE TABLE 來添加資料庫表。

 

SQL CREATE TABLE 語句

CREATE TABLE 語句

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

SQL CREATE TABLE 語法

CREATE TABLE 表名稱
(
列名稱1 數據類型,
列名稱2 數據類型,
列名稱3 數據類型,
....
)

數據類型(data_type)規定了列可容納何種數據類型。下麵的表格包含了SQL中最常用的數據類型:

數據類型描述
  • integer(size)
  • int(size)
  • smallint(size)
  • tinyint(size)
僅容納整數。在括弧內規定數字的最大位數。
  • decimal(size,d)
  • numeric(size,d)

容納帶有小數的數字。

"size" 規定數字的最大位數。"d" 規定小數點右側的最大位數。

char(size)

容納固定長度的字元串(可容納字母、數字以及特殊字元)。

在括弧中規定字元串的長度。

varchar(size)

容納可變長度的字元串(可容納字母、數字以及特殊的字元)。

在括弧中規定字元串的最大長度。

date(yyyymmdd) 容納日期。

SQL CREATE TABLE 實例

本例演示如何創建名為 "Person" 的表。

該表包含 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" 表類似這樣:

Id_PLastNameFirstNameAddressCity
         

可使用 INSERT INTO 語句向空表寫入數據。

SQL 約束

約束用於限制加入表的數據的類型。

可以在創建表時規定約束(通過 CREATE TABLE 語句),或者在表創建之後也可以(通過 ALTER TABLE 語句)。

我們將主要探討以下幾種約束:

  • NOT NULL
  • UNIQUE
  • PRIMARY KEY
  • FOREIGN KEY
  • CHECK
  • DEFAULT

註釋:在下麵的章節,我們會詳細講解每一種約束。

SQL NOT NULL 約束

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

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

下麵的 SQL 語句強制 "Id_P" 列和 "LastName" 列不接受 NULL 值:

CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)

SQL UNIQUE 約束

UNIQUE 約束唯一標識資料庫表中的每條記錄。

UNIQUE 和 PRIMARY KEY 約束均為列或列集合提供了唯一性的保證。

PRIMARY KEY 擁有自動定義的 UNIQUE 約束。

請註意,每個表可以有多個 UNIQUE 約束,但是每個表只能有一個 PRIMARY KEY 約束。

SQL UNIQUE Constraint on CREATE TABLE

下麵的 SQL 在 "Persons" 表創建時在 "Id_P" 列創建 UNIQUE 約束:

MySQL:

CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
UNIQUE (Id_P)
)

SQL Server / Oracle / MS Access:

CREATE TABLE Persons
(
Id_P int NOT NULL UNIQUE,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)

如果需要命名 UNIQUE 約束,以及為多個列定義 UNIQUE 約束,請使用下麵的 SQL 語法:

MySQL / SQL Server / Oracle / MS Access:

CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName)
)

SQL UNIQUE Constraint on ALTER TABLE

當表已被創建時,如需在 "Id_P" 列創建 UNIQUE 約束,請使用下列 SQL:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Persons
ADD UNIQUE (Id_P)

如需命名 UNIQUE 約束,並定義多個列的 UNIQUE 約束,請使用下麵的 SQL 語法:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Persons
ADD CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName)

撤銷 UNIQUE 約束

如需撤銷 UNIQUE 約束,請使用下麵的 SQL:

MySQL:

ALTER TABLE Persons
DROP INDEX uc_PersonID

SQL Server / Oracle / MS Access:

ALTER TABLE Persons
DROP CONSTRAINT uc_PersonID

SQL PRIMARY KEY 約束

PRIMARY KEY 約束唯一標識資料庫表中的每條記錄。

主鍵必須包含唯一的值。

主鍵列不能包含 NULL 值。

每個表都應該有一個主鍵,並且每個表只能有一個主鍵。

SQL PRIMARY KEY Constraint on CREATE TABLE

下麵的 SQL 在 "Persons" 表創建時在 "Id_P" 列創建 PRIMARY KEY 約束:

MySQL:

CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (Id_P)
)

SQL Server / Oracle / MS Access:

CREATE TABLE Persons
(
Id_P int NOT NULL PRIMARY KEY,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)

如果需要命名 PRIMARY KEY 約束,以及為多個列定義 PRIMARY KEY 約束,請使用下麵的 SQL 語法:

MySQL / SQL Server / Oracle / MS Access:

CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName)
)

SQL PRIMARY KEY Constraint on ALTER TABLE

如果在表已存在的情況下為 "Id_P" 列創建 PRIMARY KEY 約束,請使用下麵的 SQL:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Persons
ADD PRIMARY KEY (Id_P)

如果需要命名 PRIMARY KEY 約束,以及為多個列定義 PRIMARY KEY 約束,請使用下麵的 SQL 語法:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Persons
ADD CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName)

註釋:如果您使用 ALTER TABLE 語句添加主鍵,必須把主鍵列聲明為不包含 NULL 值(在表首次創建時)。

撤銷 PRIMARY KEY 約束

如需撤銷 PRIMARY KEY 約束,請使用下麵的 SQL:

MySQL:

ALTER TABLE Persons
DROP PRIMARY KEY

SQL Server / Oracle / MS Access:

ALTER TABLE Persons
DROP CONSTRAINT pk_PersonID
 

SQL CHECK 約束

CHECK 約束用於限制列中的值的範圍。

如果對單個列定義 CHECK 約束,那麼該列只允許特定的值。

如果對一個表定義 CHECK 約束,那麼此約束會在特定的列中對值進行限制。

SQL CHECK Constraint on CREATE TABLE

下麵的 SQL 在 "Persons" 表創建時為 "Id_P" 列創建 CHECK 約束。CHECK 約束規定 "Id_P" 列必須只包含大於 0 的整數。

My SQL:

CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CHECK (Id_P>0)
)

SQL Server / Oracle / MS Access:

CREATE TABLE Persons
(
Id_P int NOT NULL CHECK (Id_P>0),
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)

如果需要命名 CHECK 約束,以及為多個列定義 CHECK 約束,請使用下麵的 SQL 語法:

MySQL / SQL Server / Oracle / MS Access:

CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')
)

SQL CHECK Constraint on ALTER TABLE

如果在表已存在的情況下為 "Id_P" 列創建 CHECK 約束,請使用下麵的 SQL:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Persons
ADD CHECK (Id_P>0)

如果需要命名 CHECK 約束,以及為多個列定義 CHECK 約束,請使用下麵的 SQL 語法:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Persons
ADD CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')

撤銷 CHECK 約束

如需撤銷 CHECK 約束,請使用下麵的 SQL:

SQL Server / Oracle / MS Access:

ALTER TABLE Persons
DROP CONSTRAINT chk_Person

MySQL:

ALTER TABLE Persons
DROP CHECK chk_Person
 
 

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Android Weekly Issue #222, 中文筆記. 本期文章包括: Okio中的三個方法, 檢測測試覆蓋率對build時間的影響, Android Support Annotations, Espresso測試相關, 一個新的MVP庫ThirtyInch的介紹, Android學習資... ...
  • 一、萬事開頭的序 網上看見大牛們的博客寫的那樣精彩,各種羡慕之情溢於言表。幾次衝動均想效仿牛人寫些博客來記錄下自己的心得體會,但均無感亦或是感覺容易被噴,相信很多菜鳥和我一樣都有過這樣的擔憂。萬事開頭難,不逼一下自己怎麼知道自己能不能飛起來。由於本人處於初學階段,寫此博客僅是對前輩總結的review ...
  • reserved state進入reserved state以後,sqlite可以修改資料庫中的內容,不過把修改以後的內容寫到pager的緩存里,大小由page cache指定。進入這個狀態以後,pager開始初始化日誌文件,用戶回滾和異常恢復。(其實就是把日誌中的文件內容拷貝到資料庫文件中去)這... ...
  • MySQL 開發團隊於 12 日宣佈 MySQL 8.0.0 開發里程碑版本(DMR)發佈! 可能有人會驚奇 MySQL 為何從 5.x 一下跳躍到了 8.0。事實上,MySQL 5.x 系列已經延續了很多年,從被 Oracle 收購之前就是 5.1,而收購之後一直維持在 5.x,比如 5.5,5. ...
  • 【等待事件】等待事件系列(3+4)--System IO(控制文件)+日誌類等待 1 BLOG文檔結構圖 2 前言部分 2.1 導讀和註意事項 各位技術愛好者,看完本文後,你可以掌握如下的技能,也可以學到一些其它你所不知道的知識,~O(∩_∩)O~: ① 控制文件類等待 ② 日誌類等待 2.2 相關... ...
  • 每一個資料庫連接可以包括多個資料庫文件,一個主資料庫文件和attached的幾個資料庫文件。每一個資料庫文件都有自己的B-tree和pager。資料庫連接(connection)和事務(transaction)的關係1. 每一個資料庫連接都必須在事務下進行操作2. 每一個資料庫連接不同同時打開多個... ...
  • https://blueprints.launchpad.net/myconnpy/+spec/sp-multi-resultsets Calling a stored procedure can produce multiple result sets. They should be retrie ...
  • 12down votefavorite 8 8 http://stackoverflow.com/questions/31748278/how-do-you-install-mysql-connector-python-development-version-through-pip/34027037 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...