SQL

(全部內容大部分來自http://www.w3school.com.cn)

一、什麼是 SQL?

  • SQL 指結構化查詢語言
  • SQL 使咱們有能力訪問數據庫
  • SQL 是一種 ANSI 的標準計算機語言

編者注:ANSI,美國國家標準化組織數據庫

二、SQL 能作什麼?

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

 

 

三、SQL DML 和 DDL

能夠把 SQL 分爲兩個部分:數據操做語言 (DML) 和 數據定義語言 (DDL)。spa

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

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

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

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

SQL 中最重要的 DDL 語句:ci

  • CREATE DATABASE - 建立新數據庫
  • ALTER DATABASE - 修改數據庫
  • CREATE TABLE - 建立新表
  • ALTER TABLE - 變動(改變)數據庫表
  • DROP TABLE - 刪除表
  • CREATE INDEX - 建立索引(搜索鍵)
  • DROP INDEX - 刪除索引

四、重要事項

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

 

五、SQL SELECT 語法

SELECT 列名稱 FROM 表名稱    (能夠選取多個列,用‘,’隔開)  select id,usernname,psaaword from gaoxiangyu.userinfo

以及:字符串

SELECT * FROM 表名稱

六、SQL SELECT DISTINCT 語句

在表中,可能會包含重複值。這並不成問題,不過,有時您也許但願僅僅列出不一樣(distinct)的值。get

關鍵詞 DISTINCT 用於返回惟一不一樣的值。產品

語法:

SELECT DISTINCT 列名稱 FROM 表名稱

select distinct password from gaoxiangyu.userinfo

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

七、WHERE 子句

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

語法

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

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

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

註釋:在某些版本的 SQL 中,操做符 <> 能夠寫爲 !=。

使用 WHERE 子句

若是隻但願選取居住在城市 "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 運算符

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 語句用於根據指定的列對結果集進行排序。

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 語句用於向表格中插入新的行。

語法

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 語句用於修改表中的數據。

語法:

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'

結果:

1三、DELETE 語句

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

語法

DELETE FROM 表名稱 WHERE 列名稱 = 值

1四、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

SQL TOP PERCENT 實例

如今,咱們但願從上面的 "Persons" 表中選取 50% 的記錄。

咱們可使用下面的 SELECT 語句:

SELECT  * FROM Persons

TOP 50 PERCENT

1五、LIKE 操做符

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

SQL LIKE 操做符語法

SELECT column_name(s)
FROM table_name
WHERE column_name LIKE pattern

在搜索數據庫中的數據時,您可使用 SQL 通配符。

1六、SQL 通配符

在搜索數據庫中的數據時,SQL 通配符能夠替代一個或多個字符。

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

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

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

[^charlist]

或者

[!charlist]

不在字
 
  

1七、IN 操做符

IN 操做符容許咱們在 WHERE 子句中規定多個值。

SQL IN 語法

SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1,value2,...)
select * from userinfo where username in('gaoxiangyu','wudi')

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

1八、BETWEEN 操做符

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

SQL BETWEEN 語法

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

1九、SQL Alias

表的 SQL Alias 語法

SELECT column_name(s)
FROM table_name
AS alias_name

列的 SQL Alias 語法

SELECT column_name AS alias_name
FROM table_name

 

20、Join 和 Key

有時爲了獲得完整的結果,咱們須要從兩個或更多的表中獲取結果。咱們就須要執行 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

SQL JOIN - 使用 Join

除了上面的方法,咱們也可使用關鍵詞 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

不一樣的 SQL JOIN

除了咱們在上面的例子中使用的 INNER JOIN(內鏈接),咱們還可使用其餘幾種鏈接。

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

  • JOIN: 若是表中有至少一個匹配,則返回行
  • LEFT JOIN: 即便右表中沒有匹配,也從左表返回全部的行
  • RIGHT JOIN: 即便左表中沒有匹配,也從右表返回全部的行
  • FULL JOIN: 只要其中一個表中存在匹配,就返回行
select id,username,sum from userinfo inner join useraccount on userinfo.username=useraccount.account_name order by sum


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_ID E_Name
01 Zhang, Hua
02 Wang, Wei
03 Carter, Thomas
04 Yang, Ming

Employees_USA:

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

2一、使用 UNION 命令

實例

列出全部在中國和美國的不一樣的僱員名:

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 ALL 命令和 UNION 命令幾乎是等效的,不過 UNION ALL 命令會列出全部的值。

SQL Statement 1
UNION ALL
SQL Statement 2

使用 UNION ALL 命令

實例:

列出在中國和美國的全部的僱員:

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

 

2二、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" 表的備份復件:

 *
 Persons_backup
FROM Persons
SELECTINTO

IN 子句可用於向另外一個數據庫中拷貝表:

 *
 Persons  'Backup.mdb'
FROM Persons
SELECTINTOIN

若是咱們但願拷貝某些域,能夠在 SELECT 語句後列出這些域:

 LastName,FirstName
 Persons_backup
FROM Persons
SELECTINTO

SQL SELECT INTO 實例 - 帶有 WHERE 子句

咱們也能夠添加 WHERE 子句。

下面的例子經過從 "Persons" 表中提取居住在 "Beijing" 的人的信息,建立了一個帶有兩個列的名爲 "Persons_backup" 的表:

 LastName,Firstname
 Persons_backup
FROM Persons
 City='Beijing'
SELECTINTOWHERE

SQL SELECT INTO 實例 - 被鏈接的表

從一個以上的表中選取數據也是能夠作到的。

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

 Persons.LastName,Orders.OrderNo
 Persons_Order_Backup
 Persons
 Orders
 Persons.Id_P=Orders.Id_P

SELECTINTOFROMINNER JOINON

2三、CREATE DATABASE 語句

CREATE DATABASE 用於建立數據庫。

SQL CREATE DATABASE 語法

CREATE DATABASE database_name


2四、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_P LastName FirstName Address City
         

注意屬性最後一個後面沒!!逗號‘,’

 

SQL UNIQUE 約束

UNIQUE 約束惟一標識數據庫表中的每條記錄。

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

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

請注意,每一個表能夠有多個 UNIQUE 約束,可是每一個表只能有一個 PRIMARY KEY 約束。

2四、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 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 CHECK 約束

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

若是對單個列定義 CHECK 約束,那麼該列只容許特定的值。

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

 

創建索引的目的是加快對錶中記錄的查找或排序。爲表設置索引要付出代價的:一是增長了數據庫的存儲空間,二是在插入和修改數據時要花費較多的時間(由於索引也要隨之變更)。數據庫索引就是爲了提升表的搜索效率而對某些字段中的值創建的目錄 。

SQL CREATE INDEX 語法

在表上建立一個簡單的索引。容許使用重複的值:

CREATE INDEX index_name
ON table_name (column_name)

2五、ALTER TABLE 語句

ALTER TABLE 語句用於在已有的表中添加、修改或刪除列。

SQL ALTER TABLE 語法

如需在表中添加列,請使用下列語法:

ALTER TABLE table_name
ADD column_name datatype

要刪除表中的列,請使用下列語法:

ALTER TABLE table_name 
DROP COLUMN column_name


Auto-increment 會在新記錄插入表中時生成一個惟一的數字。

2六、AUTO INCREMENT 字段

咱們一般但願在每次插入新記錄時,自動地建立主鍵字段的值。

咱們能夠在表中建立一個 auto-increment 字段。

用於 MySQL 的語法

下列 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 任務。

相關文章
相關標籤/搜索