編者注:ANSI,美國國家標準化組織數據庫
能夠把 SQL 分爲兩個部分:數據操做語言 (DML) 和 數據定義語言 (DDL)。spa
SQL (結構化查詢語言)是用於執行查詢的語法。可是 SQL 語言也包含用於更新、插入和刪除記錄的語法。code
查詢和更新指令構成了 SQL 的 DML 部分:排序
SQL 的數據定義語言 (DDL) 部分使咱們有能力建立或刪除表格。咱們也能夠定義索引(鍵),規定表之間的連接,以及施加表間的約束。索引
SQL 中最重要的 DDL 語句:ci
必定要記住,SQL 對大小寫不敏感!rem
SELECT 列名稱 FROM 表名稱 (能夠選取多個列,用‘,’隔開) select id,usernname,psaaword from gaoxiangyu.userinfo
以及:字符串
SELECT * FROM 表名稱
在表中,可能會包含重複值。這並不成問題,不過,有時您也許但願僅僅列出不一樣(distinct)的值。get
關鍵詞 DISTINCT 用於返回惟一不一樣的值。產品
SELECT DISTINCT 列名稱 FROM 表名稱
select distinct password from gaoxiangyu.userinfo
WHERE 子句用於規定選擇的標準。
如需有條件地從表中選取數據,可將 WHERE 子句添加到 SELECT 語句。
SELECT 列名稱 FROM 表名稱 WHERE 列 運算符 值
下面的運算符可在 WHERE 子句中使用:
操做符 | 描述 |
---|---|
= | 等於 |
<> | 不等於 |
> | 大於 |
< | 小於 |
>= | 大於等於 |
<= | 小於等於 |
BETWEEN | 在某個範圍內 |
LIKE | 搜索某種模式 |
註釋:在某些版本的 SQL 中,操做符 <> 能夠寫爲 !=。
若是隻但願選取居住在城市 "Beijing" 中的人,咱們須要向 SELECT 語句添加 WHERE 子句:
SELECT * FROM Persons WHERE City='Beijing'
select *from userinfo where username = "gaoxiangyu"
select *from userinfo where id > 10
select *from userinfo where id > 1 && username = "gaoxiangyu"
AND 和 OR 運算符用於基於一個以上的條件對記錄進行過濾。
AND 和 OR 可在 WHERE 子語句中把兩個或多個條件結合起來。
若是第一個條件和第二個條件都成立,則 AND 運算符顯示一條記錄。
若是第一個條件和第二個條件中只要有一個成立,則 OR 運算符顯示一條記錄。
select *from userinfo where id > 1 AND username = "gaoxiangyu"
select *from userinfo where id > 1 or username = "gaoxiangyu"
ORDER BY 語句用於對結果集進行排序。
ORDER BY 語句用於根據指定的列對結果集進行排序。
ORDER BY 語句默認按照升序對記錄進行排序。
若是您但願按照降序對記錄進行排序,可使用 DESC 關鍵字。
select id,username from userinfo order by id
SELECT Company, OrderNumber FROM Orders 十、逆序DESCORDER BY Company, OrderNumber
SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC
INSERT INTO 語句用於向表格中插入新的行。
INSERT INTO 表名稱 VALUES (值1, 值2,....)
咱們也能夠指定所要插入數據的列:
INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)
列屬性沒必要加‘’,values值數字能夠不加‘’,但字符必須加
insert into gaoxiangyu.userinfo(id,username,password)values(193,'g','l')
Update 語句用於修改表中的數據。
UPDATE 表名稱 SET 列名稱 = 新值 WHERE 列名稱 = 某值
咱們爲 lastname 是 "Wilson" 的人添加 firstname:
UPDATE Person SET FirstName = 'Fred' WHERE LastName = 'Wilson'
LastName | FirstName | Address | City |
---|---|---|---|
Gates | Bill | Xuanwumen 10 | Beijing |
Wilson | Fred | Champs-Elysees |
咱們會修改地址(address),並添加城市名稱(city):
UPDATE Person SET Address = 'Zhongshan 23', City = 'Nanjing' WHERE LastName = 'Wilson'
DELETE 語句用於刪除表中的行。
DELETE FROM 表名稱 WHERE 列名稱 = 值
TOP 子句用於規定要返回的記錄的數目。
對於擁有數千條記錄的大型表來講,TOP 子句是很是有用的。
註釋:並不是全部的數據庫系統都支持 TOP 子句。
SELECT TOP number|percent column_name(s) FROM table_name
SELECT column_name(s) FROM table_name LIMIT number
SELECT * FROM Persons LIMIT 5
SELECT column_name(s) FROM table_name WHERE ROWNUM <= number
如今,咱們但願從上面的 "Persons" 表中選取 50% 的記錄。
咱們可使用下面的 SELECT 語句:
SELECT * FROM Persons
TOP 50 PERCENT
LIKE 操做符用於在 WHERE 子句中搜索列中的指定模式。
SELECT column_name(s) FROM table_name WHERE column_name LIKE pattern
在搜索數據庫中的數據時,您可使用 SQL 通配符。
在搜索數據庫中的數據時,SQL 通配符能夠替代一個或多個字符。
SQL 通配符必須與 LIKE 運算符一塊兒使用。
在 SQL 中,可以使用如下通配符:
通配符 | 描述 |
---|---|
% | 替代一個或多個字符 |
_ | 僅替代一個字符 |
[charlist] | 字符列中的任何單一字符 |
[^charlist] 或者 [!charlist] |
不在字 |
IN 操做符容許咱們在 WHERE 子句中規定多個值。
SELECT column_name(s) FROM table_name WHERE column_name IN (value1,value2,...)
select * from userinfo where username in('gaoxiangyu','wudi')
BETWEEN 操做符在 WHERE 子句中使用,做用是選取介於兩個值之間的數據範圍。
操做符 BETWEEN ... AND 會選取介於兩個值之間的數據範圍。這些值能夠是數值、文本或者日期。
SELECT column_name(s) FROM table_name WHERE column_name BETWEEN value1 AND value2
select * from userinfo where username between 'gao' and 'wudi'
如需使用上面的例子顯示範圍以外的人,請使用 NOT 操做符:
SELECT * FROM Persons WHERE LastName BETWEEN 'Adams' AND 'Carter'
NOT
SELECT column_name(s) FROM table_name AS alias_name
SELECT column_name AS alias_name FROM table_name
有時爲了獲得完整的結果,咱們須要從兩個或更多的表中獲取結果。咱們就須要執行 join。
數據庫中的表可經過鍵將彼此聯繫起來。主鍵(Primary Key)是一個列,在這個列中的每一行的值都是惟一的。在表中,每一個主鍵的值都是惟一的。這樣作的目的是在不重複每一個表中的全部數據的狀況下,把表間的數據交叉捆綁在一塊兒。
請看 "Persons" 表:
Id_P | LastName | FirstName | Address | City |
---|---|---|---|---|
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_O | OrderNo | Id_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
結果集:
LastName | FirstName | OrderNo |
---|---|---|
Adams | John | 22456 |
Adams | John | 24562 |
Carter | Thomas | 77895 |
Carter | Thomas | 44678 |
除了上面的方法,咱們也可使用關鍵詞 JOIN 來從兩個表中獲取數據。
若是咱們但願列出全部人的定購,可使用下面的 SELECT 語句:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons ON Persons.Id_P = Orders.Id_P ORDER BY Persons.LastName INNER JOIN Orders
結果集:
LastName | FirstName | OrderNo |
---|---|---|
Adams | John | 22456 |
Adams | John | 24562 |
Carter | Thomas | 77895 |
Carter | Thomas | 44678 |
除了咱們在上面的例子中使用的 INNER JOIN(內鏈接),咱們還可使用其餘幾種鏈接。
下面列出了您可使用的 JOIN 類型,以及它們之間的差別。
select id,username,sum from userinfo inner join useraccount on userinfo.username=useraccount.account_name order by sum
UNION 操做符用於合併兩個或多個 SELECT 語句的結果集。
請注意,UNION 內部的 SELECT 語句必須擁有相同數量的列。列也必須擁有類似的數據類型。同時,每條 SELECT 語句中的列的順序必須相同。
SELECT column_name(s) FROM table_name1 UNION SELECT column_name(s) FROM table_name2
註釋:默認地,UNION 操做符選取不一樣的值。若是容許重複的值,請使用 UNION ALL。
SELECT column_name(s) FROM table_name1 UNION ALL SELECT column_name(s) FROM table_name2
另外,UNION 結果集中的列名老是等於 UNION 中第一個 SELECT 語句中的列名。
E_ID | E_Name |
---|---|
01 | Zhang, Hua |
02 | Wang, Wei |
03 | Carter, Thomas |
04 | Yang, Ming |
E_ID | E_Name |
---|---|
01 | Adams, John |
02 | Bush, George |
03 | Carter, Thomas |
04 | Gates, Bill |
列出全部在中國和美國的不一樣的僱員名:
SELECT E_Name FROM Employees_China SELECT E_Name FROM Employees_USA UNION
E_Name |
---|
Zhang, Hua |
Wang, Wei |
Carter, Thomas |
Yang, Ming |
Adams, John |
Bush, George |
Gates, Bill |
註釋:這個命令沒法列出在中國和美國的全部僱員。在上面的例子中,咱們有兩個名字相同的僱員,他們當中只有一我的被列出來了。UNION 命令只會選取不一樣的值。
UNION ALL 命令和 UNION 命令幾乎是等效的,不過 UNION ALL 命令會列出全部的值。
SQL Statement 1 UNION ALL SQL Statement 2
列出在中國和美國的全部的僱員:
SELECT E_Name FROM Employees_China SELECT E_Name FROM Employees_USA UNION ALL
E_Name |
---|
Zhang, Hua |
Wang, Wei |
Carter, Thomas |
Yang, Ming |
Adams, John |
Bush, George |
Carter, Thomas |
Gates, Bill |
SELECT INTO 語句從一個表中選取數據,而後把數據插入另外一個表中。
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
下面的例子會製做 "Persons" 表的備份復件:
* Persons_backup FROM Persons SELECTINTO
IN 子句可用於向另外一個數據庫中拷貝表:
* Persons 'Backup.mdb' FROM Persons SELECTINTOIN
若是咱們但願拷貝某些域,能夠在 SELECT 語句後列出這些域:
LastName,FirstName Persons_backup FROM Persons SELECTINTO
咱們也能夠添加 WHERE 子句。
下面的例子經過從 "Persons" 表中提取居住在 "Beijing" 的人的信息,建立了一個帶有兩個列的名爲 "Persons_backup" 的表:
LastName,Firstname Persons_backup FROM Persons City='Beijing' SELECTINTOWHERE
從一個以上的表中選取數據也是能夠作到的。
下面的例子會建立一個名爲 "Persons_Order_Backup" 的新表,其中包含了從 Persons 和 Orders 兩個表中取得的信息:
Persons.LastName,Orders.OrderNo Persons_Order_Backup Persons Orders Persons.Id_P=Orders.Id_P
SELECTINTOFROMINNER JOINON
CREATE DATABASE 用於建立數據庫。
CREATE DATABASE database_name
CREATE TABLE 語句用於建立數據庫中的表。
CREATE TABLE 表名稱 ( 列名稱1 數據類型, 列名稱2 數據類型, 列名稱3 數據類型, .... )
數據類型(data_type)規定了列可容納何種數據類型。下面的表格包含了SQL中最經常使用的數據類型:
數據類型 | 描述 |
---|---|
|
僅容納整數。在括號內規定數字的最大位數。 |
|
容納帶有小數的數字。 "size" 規定數字的最大位數。"d" 規定小數點右側的最大位數。 |
char(size) | 容納固定長度的字符串(可容納字母、數字以及特殊字符)。 在括號中規定字符串的長度。 |
varchar(size) | 容納可變長度的字符串(可容納字母、數字以及特殊的字符)。 在括號中規定字符串的最大長度。 |
date(yyyymmdd) | 容納日期。 |
本例演示如何建立名爲 "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_P | LastName | FirstName | Address | City |
---|---|---|---|---|
注意屬性最後一個後面沒!!逗號‘,’
UNIQUE 約束惟一標識數據庫表中的每條記錄。
UNIQUE 和 PRIMARY KEY 約束均爲列或列集合提供了惟一性的保證。
PRIMARY KEY 擁有自動定義的 UNIQUE 約束。
請注意,每一個表能夠有多個 UNIQUE 約束,可是每一個表只能有一個 PRIMARY KEY 約束。
下面的 SQL 在 "Persons" 表建立時在 "Id_P" 列建立 UNIQUE 約束:
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)
PRIMARY KEY 約束惟一標識數據庫表中的每條記錄。
主鍵必須包含惟一的值。
主鍵列不能包含 NULL 值。
每一個表都應該有一個主鍵,而且每一個表只能有一個主鍵。
下面的 SQL 在 "Persons" 表建立時在 "Id_P" 列建立 PRIMARY KEY 約束:
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)
CHECK 約束用於限制列中的值的範圍。
若是對單個列定義 CHECK 約束,那麼該列只容許特定的值。
若是對一個表定義 CHECK 約束,那麼此約束會在特定的列中對值進行限制。
創建索引的目的是加快對錶中記錄的查找或排序。爲表設置索引要付出代價的:一是增長了數據庫的存儲空間,二是在插入和修改數據時要花費較多的時間(由於索引也要隨之變更)。數據庫索引就是爲了提升表的搜索效率而對某些字段中的值創建的目錄 。
在表上建立一個簡單的索引。容許使用重複的值:
CREATE INDEX index_name ON table_name (column_name)
ALTER TABLE 語句用於在已有的表中添加、修改或刪除列。
如需在表中添加列,請使用下列語法:
ALTER TABLE table_name ADD column_name datatype
要刪除表中的列,請使用下列語法:
ALTER TABLE table_name DROP COLUMN column_name
Auto-increment 會在新記錄插入表中時生成一個惟一的數字。
咱們一般但願在每次插入新記錄時,自動地建立主鍵字段的值。
咱們能夠在表中建立一個 auto-increment 字段。
下列 SQL 語句把 "Persons" 表中的 "P_Id" 列定義爲 auto-increment 主鍵:
CREATE TABLE Persons ( LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255), ) P_Id int NOT NULL AUTO_INCREMENT,PRIMARY KEY (P_Id)
MySQL 使用 AUTO_INCREMENT 關鍵字來執行 auto-increment 任務。