[SQL] SQL學習筆記之基礎操作
1 SQL介紹
SQL 是用於訪問和處理資料庫的標準的計算機語言。關於SQL的具體介紹,我們通過回答如下三個問題來進行。
SQL 是什麼?
- SQL,指結構化查詢語言,全稱是 Structured Query Language。
- SQL 是一種 ANSI(American National Standards Institute 美國國家標準化組織)標準的計算機語言。
SQL 能做什麼?
- SQL 面向資料庫執行查詢
- SQL 可從資料庫取回資料
- SQL 可在資料庫中插入新的記錄
- SQL 可更新資料庫中的資料
- SQL 可從資料庫刪除記錄
- SQL 可建立新資料庫
- SQL 可在資料庫中建立新表
- SQL 可在資料庫中建立儲存過程
- SQL 可在資料庫中建立檢視
- SQL 可以設定表、儲存過程和檢視的許可權
雖然 SQL 是一門 ANSI(American National Standards Institute 美國國家標準化組織)標準的計算機語言,但是仍然存在著多種不同版本的 SQL 語言。然而,為了與 ANSI 標準相相容,它們必須以相似的方式共同地來支援一些主要的命令(比如 SELECT、UPDATE、DELETE、INSERT、WHERE 等等)。
註釋:除了 SQL 標準之外,大部分 SQL 資料庫程式都擁有它們自己的專有擴充套件! |
在網站上如何使用 SQL?
要建立一個顯示資料庫中資料的網站,需要:
- RDBMS 資料庫程式(比如 MS Access、SQL Server、MySQL)
- 使用伺服器端指令碼語言,比如 PHP 或 ASP
- 使用 SQL 來獲取您想要的資料
- 使用 HTML / CSS
註釋:RDBMS (Relational Database Management System)指關係型資料庫管理系統。RDBMS 是 SQL 的基礎,同樣也是所有現代資料庫系統的基礎,比如 MS SQL Server、IBM DB2、Oracle、MySQL 以及 Microsoft Access。 |
2 SQL語句
在資料庫上執行的大部分工作都由 SQL 語句完成。我們先介紹幾個有關SQL的注意事項,為我們接下來詳細介紹每一條SQL做一個基礎。
1)SQL語句的大小寫問題:
SQL 對大小寫不敏感:SELECT 與 select 是相同的。
2)SQL 語句後面的分號問題:
某些資料庫系統要求在每條 SQL 語句的末端使用分號。
分號是在資料庫系統中分隔每條 SQL 語句的標準方法,這樣就可以在對伺服器的相同請求中執行一條以上的 SQL 語句。
3)一些重要的 SQL 命令:
- SELECT - 從資料庫中提取資料
- UPDATE - 更新資料庫中的資料
- DELETE - 從資料庫中刪除資料
- INSERT INTO - 向資料庫中插入新資料
- CREATE DATABASE - 建立新資料庫
- ALTER DATABASE - 修改資料庫
- CREATE TABLE - 建立新表
- ALTER TABLE - 變更(改變)資料庫表
- DROP TABLE - 刪除表
- CREATE INDEX - 建立索引(搜尋鍵)
- DROP INDEX - 刪除索引
3 SQL SELECT語句
SELECT 語句用於從資料庫中選取資料,結果被儲存在一個結果表中,稱為結果集。
SQL SELECT 語法:
SELECT column_name,column_name FROM table_name;
與
SELECT * FROM table_name;
本文中,我們使用眾所周知的 Northwind 樣本資料庫進行舉例介紹。下面是選自 "Customers" 表的資料:
CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
---|---|---|---|---|---|---|
1 |
Alfreds Futterkiste | Maria Anders | Obere Str. 57 | Berlin | 12209 | Germany |
2 | Ana Trujillo Emparedados y helados | Ana Trujillo | Avda. de la Constitución 2222 | México D.F. | 05021 | Mexico |
3 | Antonio Moreno Taquería | Antonio Moreno | Mataderos 2312 | México D.F. | 05023 | Mexico |
4 | Around the Horn | Thomas Hardy | 120 Hanover Sq. | London | WA1 1DP | UK |
5 | Berglunds snabbköp | Christina Berglund | Berguvsvägen 8 | Luleå | S-958 22 | Sweden |
下面的 SQL 語句從 "Customers" 表中選取 "CustomerName" 和 "City" 列:
SELECT CustomerName,City FROM Customers;
下面的 SQL 語句從 "Customers" 表中選取所有列:
SELECT * FROM Customers;
在表中,一個列可能會包含多個重複值,有時也許希望僅僅列出不同(distinct)的值。DISTINCT 關鍵詞用於返回唯一不同的值。
SQL SELECT DISTINCT 語法:
SELECT DISTINCT column_name,column_name FROM table_name;
4 SQL WHERE語句
WHERE 子句用於提取那些滿足指定標準的記錄。
SQL WHERE語法:
SELECT column_name,column_name FROM table_name WHERE column_name operator value;
下面的 SQL 語句從 "Customers" 表中選取國家為 "Mexico" 的所有客戶:
SELECT * FROM Customers WHERE Country='Mexico';
SQL 使用單引號來環繞文字值(大部分資料庫系統也接受雙引號)。如果是數值欄位,請不要使用引號。
SELECT * FROM Customers WHERE CustomerID=1;
WHERE 子句中的運算子
下面的運算子可以在 WHERE 子句中使用:
運算子 | 描述 |
---|---|
= | 等於 |
<> |
不等於。 註釋:在 SQL 的一些版本中,該操作符可被寫成 != |
> | 大於 |
< | 小於 |
>= | 大於等於 |
<= | 小於等於 |
BETWEEN | 在某個範圍內 |
LIKE | 搜尋某種模式 |
IN | 指定針對某個列的多個可能值 |
5 SQL AND與OR關鍵字
AND & OR 運算子用於基於一個以上的條件對記錄進行過濾。
下面的 SQL 語句從 "Customers" 表中選取國家為 "Germany" 且城市為 "Berlin" 的所有客戶:
SELECT * FROM Customers WHERE Country='Germany' AND City='Berlin';
下面的 SQL 語句從 "Customers" 表中選取城市為 "Berlin" 或者 "München" 的所有客戶:
SELECT * FROM Customers WHERE City='Berlin' OR City='München';
下面的 SQL 語句從 "Customers" 表中選取國家為 "Germany" 且城市為 "Berlin" 或者 "München" 的所有客戶:
SELECT * FROM Customers WHERE Country='Germany' AND (City='Berlin' OR City='München');
6 SQL ORDER BY關鍵字
ORDER BY 關鍵字用於對結果集按照一個列或者多個列進行排序。ORDER BY 關鍵字預設按照升序對記錄進行排序。如果需要按照降序對記錄進行排序,您可以使用 DESC 關鍵字。
ORDER BY語法:
SELECT column_name,column_name FROM table_name ORDER BY column_name,column_name ASC|DESC;
下面的 SQL 語句從 "Customers" 表中選取所有客戶,並按照 "Country" 列升序排序:
SELECT * FROM Customers ORDER BY Country;
下面的 SQL 語句從 "Customers" 表中選取所有客戶,並按照 "Country" 列降序排序:
SELECT * FROM Customers ORDER BY Country DESC;
下面的 SQL 語句從 "Customers" 表中選取所有客戶,並按照 "Country" 和 "CustomerName" 列排序:
SELECT * FROM Customers ORDER BY Country,CustomerName;
7 SQL INSERT INTO語句
INSERT INTO 語句用於向表中插入新記錄。
INSERT INTO 語句可以有兩種編寫形式。第一種形式無需指定要插入資料的列名,只需提供被插入的值即可:
INSERT INTO table_name VALUES (value1,value2,value3,...);
第二種形式需要指定列名及被插入的值:
INSERT INTO table_name (column1,column2,column3,...) VALUES (value1,value2,value3,...);
假如插入操作前的表如下所示:
CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
---|---|---|---|---|---|---|
87 | Wartian Herkku | Pirkko Koskitalo | Torikatu 38 | Oulu | 90110 | Finland |
88 | Wellington Importadora | Paula Parente | Rua do Mercado, 12 | Resende | 08737-363 | Brazil |
89 | White Clover Markets | Karl Jablonski | 305 - 14th Ave. S. Suite 3B | Seattle | 98128 | USA |
90 | Wilman Kala | Matti Karttunen | Keskuskatu 45 | Helsinki | 21240 | Finland |
91 | Wolski | Zbyszek | ul. Filtrowa 68 | Walla | 01-012 | Poland |
我們要向 "Customers" 表中插入一個新行。我們可以使用下面的 SQL 語句:
INSERT INTO Customers (CustomerName, ContactName, Address, City, PostalCode, Country) VALUES ('Cardinal','Tom B. Erichsen','Skagen 21','Stavanger','4006','Norway');
執行插入操作以後的表如下所示:
CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
---|---|---|---|---|---|---|
87 | Wartian Herkku | Pirkko Koskitalo | Torikatu 38 | Oulu | 90110 | Finland |
88 | Wellington Importadora | Paula Parente | Rua do Mercado, 12 | Resende | 08737-363 | Brazil |
89 | White Clover Markets | Karl Jablonski | 305 - 14th Ave. S. Suite 3B | Seattle | 98128 | USA |
90 | Wilman Kala | Matti Karttunen | Keskuskatu 45 | Helsinki | 21240 | Finland |
91 | Wolski | Zbyszek | ul. Filtrowa 68 | Walla | 01-012 | Poland |
92 | Cardinal | Tom B. Erichsen | Skagen 21 | Stavanger | 4006 | Norway |
註釋:我們無需插入CustomerID列,它是自動更新的。 |
我們也可以在指定的列插入資料。
下面的 SQL 語句將插入一個新行,但是隻在 "CustomerName"、"City" 和 "Country" 列插入資料(CustomerID 欄位會自動更新):
INSERT INTO Customers (CustomerName, City, Country) VALUES ('Cardinal', 'Stavanger', 'Norway');
插入後的表如下所示:
CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
---|---|---|---|---|---|---|
87 | Wartian Herkku | Pirkko Koskitalo | Torikatu 38 | Oulu | 90110 | Finland |
88 | Wellington Importadora | Paula Parente | Rua do Mercado, 12 | Resende | 08737-363 | Brazil |
89 | White Clover Markets | Karl Jablonski | 305 - 14th Ave. S. Suite 3B | Seattle | 98128 | USA |
90 | Wilman Kala | Matti Karttunen | Keskuskatu 45 | Helsinki | 21240 | Finland |
91 | Wolski | Zbyszek | ul. Filtrowa 68 | Walla | 01-012 | Poland |
92 | Cardinal | null | null | Stavanger | null | Norway |
註釋:沒有複製的列被自動填充為null。 |
8 SQL DELETE語句
DELETE 語句用於刪除表中的行。
SQL DELETE 語法:
DELETE FROM table_name WHERE some_column=some_value;
請注意 SQL DELETE 語句中的 WHERE 子句! |
假設我們要從 "Customers" 表中刪除客戶 "Alfreds Futterkiste"。我們使用下面的 SQL 語句:
DELETE FROM Customers WHERE CustomerName='Alfreds Futterkiste' AND ContactName='Maria Anders';
您可以在不刪除表的情況下,刪除表中所有的行。這意味著表結構、屬性、索引將保持不變:
DELETE FROM table_name; or DELETE * FROM table_name;
註釋:在刪除記錄時要格外小心!因為不能重來! |
9 SQL UPDATE語句
UPDATE 語句用於更新表中已存在的記錄。
SQL UPDATE語法:
UPDATE table_name SET column1=value1,column2=value2,... WHERE some_column=some_value;
請注意 SQL UPDATE 語句中的 WHERE 子句! WHERE 子句規定哪條記錄或者哪些記錄需要更新。如果您省略了 WHERE 子句,所有的記錄都將被更新! |
假設我們要把客戶 "Alfreds Futterkiste" 更新為一個新的聯絡人和城市。
CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
---|---|---|---|---|---|---|
1 | Alfreds Futterkiste | Maria Anders | Obere Str. 57 | Berlin | 12209 | Germany |
我們使用下面的 SQL 語句:
UPDATE Customers SET ContactName='Alfred Schmidt', City='Hamburg' WHERE CustomerName='Alfreds Futterkiste';
更新後結果:
CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
---|---|---|---|---|---|---|
1 | Alfreds Futterkiste | Alfred Schmidt | Obere Str. 57 | Hamburg | 12209 | Germany |