SQL高級運用

原文鏈接:https://www.runoob.com/sql/sql-tutorial.html

接上篇“SQL基本運用”:https://blog.csdn.net/weichi7549/article/details/98478335

下列例子中用到的數據庫表如下:

Websites表:

mysql> SELECT * FROM Websites;
+----+--------------+---------------------------+-------+---------+
| id | name         | url                       | alexa | country |
+----+--------------+---------------------------+-------+---------+
| 1  | Google       | https://www.google.cm/    | 1     | USA     |
| 2  | 淘寶          | https://www.taobao.com/   | 13    | CN      |
| 3  | 菜鳥教程      | http://www.runoob.com/    | 4689  | CN      |
| 4  | 微博          | http://weibo.com/         | 20    | CN      |
| 5  | Facebook     | https://www.facebook.com/ | 3     | USA     |
| 7  | stackoverflow | http://stackoverflow.com/ |   0 | IND     |
+----+---------------+---------------------------+-------+---------+

access_log表:

mysql> SELECT * FROM access_log;
+-----+---------+-------+------------+
| aid | site_id | count | date       |
+-----+---------+-------+------------+
|   1 |       1 |    45 | 2016-05-10 |
|   2 |       3 |   100 | 2016-05-13 |
|   3 |       1 |   230 | 2016-05-14 |
|   4 |       2 |    10 | 2016-05-14 |
|   5 |       5 |   205 | 2016-05-14 |
|   6 |       4 |    13 | 2016-05-15 |
|   7 |       3 |   220 | 2016-05-15 |
|   8 |       5 |   545 | 2016-05-16 |
|   9 |       3 |   201 | 2016-05-17 |
+-----+---------+-------+------------+
9 rows in set (0.00 sec)

apps表:

mysql> SELECT * FROM apps;
+----+------------+-------------------------+---------+
| id | app_name   | url                     | country |
+----+------------+-------------------------+---------+
|  1 | QQ APP     | http://im.qq.com/       | CN      |
|  2 | 微博 APP | http://weibo.com/       | CN      |
|  3 | 淘寶 APP | https://www.taobao.com/ | CN      |
+----+------------+-------------------------+---------+
3 rows in set (0.00 sec)

8、【select top】子句規定要返回的記錄的數目。

MySQL語法

SELECT column_name(s) FROM table_name LIMIT number;

例子:

SELECT * FROM Persons LIMIT 5;//從Persons表中取出前5條數據


注意:並非所有的數據庫系統都支持 SELECT TOP 語句。 MySQL 支持 LIMIT 語句來選取指定的條數數據, Oracle 可以使用 ROWNUM 來選取。

9、【like】在 WHERE 子句中搜索列中的指定模式。

select column_name(s) from table_name where column like pattern;

例子:

select * from Websites where name like 'G%';//查詢Websites 表中name以G開頭的所有數據。

select * from Websites where name like '%G%';//查詢Websites 表中name包含G的所有數據。

select * from Websites where name not like '%G%';//查詢Websites 表中name不包含G的所有數據。

10、【% _  [charlist]】等通配符,通常與like一起使用

select * from Websites where name like '_oogle';//查詢以任一個字符開頭,後面是oogle的所有數據

select * from Websites where name like 'G_o_le';//同上類似


MySQL 中使用 REGEXP 或 NOT REGEXP 運算符 (或 RLIKE 和 NOT RLIKE) 來操作正則表達式。


——下面的 SQL 語句選取 name 以 "G"、"F" 或 "s" 開始的所有網站:

   select * from Websites where name REGEXP '^[GFs]';

——下面的 SQL 語句選取 name 以 A 到 H 字母開頭的網站:

   select * from Websites where name REGEXP '^[A-H]';

——下面的 SQL 語句選取 name 不以 A 到 H 字母開頭的網站:

   select * from Websites where name REGEXP '^[^A-H]';

11、【SQL別名】創建別名是爲了讓列名稱的可讀性更強。

1、列的別名

列的 SQL 別名語法:

SELECT column_name AS alias_name FROM table_name;

表的 SQL 別名語法:

SELECT column_name(s) FROM table_name AS alias_name;


例子:

SELECT name AS n, country AS c FROM Websites;//name別名設成n,country設成c

//把三個列(url、alexa 和 country)結合在一起,並創建一個名爲 "site_info" 的別名

SELECT name, CONCAT(url, ', ', alexa, ', ', country) AS site_info FROM Websites;

2、表的別名

//使用 "Websites" 和 "access_log" 表,並分別爲它們指定表別名 "w" 和 "a",使sql語句更簡潔。

SELECT w.name, w.url, a.count, a.date 

FROM Websites AS w, access_log AS a 

WHERE 

a.site_id=w.id and w.name="菜鳥教程";



//下面語句和上面效果一樣,但未使用別名

SELECT Websites.name, Websites.url, access_log.count, access_log.date 

FROM Websites, access_log 

WHERE Websites.id=access_log.site_id and Websites.name="菜鳥教程";

12、【join】連接,將兩個或多個表的行結合起來

 "Websites" 表和 "access_log"表 見文章開頭! 

請注意,"Websites" 表中的 "id" 列指向 "access_log" 表中的字段 "site_id"。上面這兩個表是通過 "site_id" 列聯繫起來的。

然後,如果我們運行下面的 SQL 語句(包含 INNER JOIN):

SELECT Websites.id, Websites.name, access_log.count, access_log.date
FROM Websites
INNER JOIN access_log
ON Websites.id=access_log.site_id;

不同的 SQL JOIN

在我們繼續講解實例之前,我們先列出您可以使用的不同的 SQL JOIN 類型:

  • INNER JOIN:如果表中有至少一個匹配,則返回行
  • LEFT JOIN:即使右表中沒有匹配,也從左表返回所有的行
  • RIGHT JOIN:即使左表中沒有匹配,也從右表返回所有的行
  • FULL JOIN:只要其中一個表中存在匹配,則返回行

首先,連接的結果可以在邏輯上看作是由SELECT語句指定的列組成的新表。

左連接與右連接的左右指的是以兩張表中的哪一張爲基準,它們都是外連接。

外連接就好像是爲非基準表添加了一行全爲空值的萬能行,用來與基準表中找不到匹配的行進行匹配。假設兩個沒有空值的表進行左連接,左表是基準表,左表的所有行都出現在結果中,右表則可能因爲無法與基準表匹配而出現是空值的字段。

13、【union操作符】合併兩個或多個select語句的結果集

SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;

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

SELECT column_name(s) FROM table1
UNION ALL
SELECT column_name(s) FROM table2;

註釋:UNION 結果集中的列名總是等於 UNION 中第一個 SELECT 語句中的列名。

注意:UNION 內部的每個 SELECT 語句必須擁有相同數量的列。列也必須擁有相似的數據類型。
同時,每個 SELECT 語句中的列的順序必須相同。
例子:

//從 "Websites" 和 "apps" 表(見文章開頭)中選取所有不同的country(只有不同的值):
SELECT country FROM Websites
UNION
SELECT country FROM apps
ORDER BY country;

例子:

//從 "Websites" 和 "apps" 表(見文章開頭)中選取所有的country(也有重複的值):
SELECT country FROM Websites
UNION ALL
SELECT country FROM apps
ORDER BY country;
例子:

//從 "Websites" 和 "apps" 表(見文章開頭)中選取所有的中國(CN)的數據(也有重複的值):
SELECT country, name FROM Websites
WHERE country='CN'
UNION ALL
SELECT country, app_name FROM apps
WHERE country='CN'
ORDER BY country;

14、【select into】一個表複製數據,然後把數據插入到另一個新表中

注意:

MySQL 數據庫不支持 SELECT ... INTO 語句,但支持 INSERT INTO ... SELECT 。

可以使用以下語句來拷貝表結構及數據:(效果相同)

CREATE TABLE 新表
AS
SELECT * FROM 舊錶 

SQL select into 語法及例子

//複製所有的列插入到新表中:
SELECT *
INTO newtable [IN externaldb]
FROM table1;


//只複製希望的列插入到新表中:
SELECT column_name(s)
INTO newtable [IN externaldb]
FROM table1;


例子:

//創建 Websites 的備份復件:
SELECT *
INTO WebsitesBackup2016
FROM Websites;

//只複製一些列插入到新表中:
SELECT name, url
INTO WebsitesBackup2016
FROM Websites;

//只複製中國的網站插入到新表中:
SELECT *
INTO WebsitesBackup2016
FROM Websites
WHERE country='CN';

//複製多個表中的數據插入到新表中:
SELECT Websites.name, access_log.count, access_log.date
INTO WebsitesBackup2016
FROM Websites
LEFT JOIN access_log
ON Websites.id=access_log.site_id;

//提示:SELECT INTO 語句可用於通過另一種模式創建一個新的空表。只需要添加促使查詢沒有數據返回的 WHERE 子句即可:
SELECT *
INTO newtable
FROM table1
WHERE 1=0;

15、【insert into select】語句從一個表複製數據,然後把數據插入到一個已存在的表中

//從一個表中複製所有的列插入到另一個已存在的表中:
INSERT INTO table2
SELECT * FROM table1;

//可以只複製希望的列插入到另一個已存在的表中:
INSERT INTO table2
(column_name(s))
SELECT column_name(s)
FROM table1;

注意:目標表中任何已存在的行都不會受影響。
例子:

//複製 "apps" 中的數據插入到 "Websites" 中:
INSERT INTO Websites (name, country)
SELECT app_name, country FROM apps;

//只復apps表中QQ APP(id=1)的數據  到 "Websites" 中:
INSERT INTO Websites (name, country)
SELECT app_name, country FROM apps
WHERE id=1;

16、select into from 和 insert into select 都是用來複製表,兩者區別如下:

select into from 要求目標表不存在,因爲在插入時會自動創建;insert into select from 要求目標表存在。

1. 複製表結構及其數據:

create table table_name_new as select * from table_name_old

2. 只複製表結構:

create table table_name_new as select * from table_name_old where 1=2;

或者:

create table table_name_new like table_name_old

3. 只複製表數據:

如果兩個表結構一樣:

insert into table_name_new select * from table_name_old

如果兩個表結構不一樣:

insert into table_name_new(column1,column2...) select column1,column2... from table_name_old

17、【create database】語句,創建數據庫

CREATE DATABASE dbname;

例子:

//創建一個名爲 "my_db" 的數據庫:
CREATE DATABASE my_db;

數據庫表可以通過 CREATE TABLE 語句來添加。

18、【create table】語句,創建數據表

基本語法:
CREATE TABLE table_name
(
column_name1 data_type(size),
column_name2 data_type(size),
column_name3 data_type(size),
....
);

例子:

CREATE TABLE Persons
(
PersonID int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);

19、【SQL約束】規定表中的數據規則。

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

語法:

CREATE TABLE table_name
(
column_name1 data_type(size) constraint_name,
column_name2 data_type(size) constraint_name,
column_name3 data_type(size) constraint_name,
....
);

在 SQL 中,有如下約束:

  • NOT NULL - 指示某列不能存儲 NULL 值。
  • UNIQUE - 保證某列的每行必須有唯一的值。
  • PRIMARY KEY - NOT NULL 和 UNIQUE 的結合。確保某列(或兩個列多個列的結合)有唯一標識,有助於更容易更快速地找到表中的一個特定的記錄。
  • FOREIGN KEY - 保證一個表中的數據匹配另一個表中的值的參照完整性。
  • CHECK - 保證列中的值符合指定的條件。
  • DEFAULT - 規定沒有給列賦值時的默認值。

20、【NOT NULL】約束

下面的 SQL 強制 "P_Id" 列和 "LastName" 列不接受 NULL 值:

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

21、【UNIQUE】約束

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

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

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

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

命名 UNIQUE 約束,並定義多個列的 UNIQUE 約束,請使用下面的 SQL 語法:
(MySQL / SQL Server / Oracle / MS Access適用)

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

ALTER TABLE 時的 SQL UNIQUE 約束

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

(MySQL / SQL Server / Oracle / MS Access適用)

ALTER TABLE Persons
ADD UNIQUE (P_Id)

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

(MySQL / SQL Server / Oracle / MS Access適用)

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

 

撤銷 UNIQUE 約束

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

MySQL:

ALTER TABLE Persons
DROP INDEX uc_PersonID

SQL Server / Oracle / MS Access:

ALTER TABLE Persons
DROP CONSTRAINT uc_PersonID

22、【PRIMARY KEY】約束

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

主鍵必須包含唯一的值。

主鍵列不能包含 NULL 值。

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

在 "Persons" 表創建時在 "P_Id" 列上創建 PRIMARY KEY 約束:

MySQL:

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

SQL Server / Oracle / MS Access:

CREATE TABLE Persons
(
P_Id int NOT NULL PRIMARY KEY,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
MySQL / SQL Server / Oracle / MS Access:

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

註釋:在上面的實例中,只有一個主鍵 PRIMARY KEY(pk_PersonID)。
然而,pk_PersonID 的值是由兩個列(P_Id 和 LastName)組成的。
此爲聯合主鍵,詳見:http://click.aliyun.com/m/23921/ 

ALTER TABLE 時的 SQL PRIMARY KEY 約束

當表已被創建時,如需在 "P_Id" 列創建 PRIMARY KEY 約束,請使用下面的 SQL:

(MySQL / SQL Server / Oracle / MS Access)

ALTER TABLE Persons
ADD PRIMARY KEY (P_Id)

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

(MySQL / SQL Server / Oracle / MS Access)

ALTER TABLE Persons
ADD CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,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

23、【FOREIGN KEY】 約束

一個表中的 FOREIGN KEY 指向另一個表中的 UNIQUE KEY(唯一約束的鍵)。

一個表中的 FOREIGN KEY 指向另一個表中的 UNIQUE KEY(唯一約束的鍵)。

讓我們通過一個實例來解釋外鍵。請看下面兩個表:

"Persons" 表:

P_Id LastName FirstName Address City
1 Hansen Ola Timoteivn 10 Sandnes
2 Svendson Tove Borgvn 23 Sandnes
3 Pettersen Kari Storgt 20 Stavanger

"Orders" 表:

O_Id OrderNo P_Id
1 77895 3
2 44678 3
3 22456 2
4 24562 1

請注意,"Orders" 表中的 "P_Id" 列指向 "Persons" 表中的 "P_Id" 列。

"Persons" 表中的 "P_Id" 列是 "Persons" 表中的 PRIMARY KEY。

"Orders" 表中的 "P_Id" 列是 "Orders" 表中的 FOREIGN KEY。

FOREIGN KEY 約束用於預防破壞表之間連接的行爲。

FOREIGN KEY 約束也能防止非法數據插入外鍵列,因爲它必須是它指向的那個表中的值之一。

 

CREATE TABLE 時的 SQL FOREIGN KEY 約束

下面的 SQL 在 "Orders" 表創建時在 "P_Id" 列上創建 FOREIGN KEY 約束:

MySQL:

CREATE TABLE Orders
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
P_Id int,
PRIMARY KEY (O_Id),
FOREIGN KEY (P_Id) REFERENCES Persons(P_Id)
)

SQL Server / Oracle / MS Access:

CREATE TABLE Orders
(
O_Id int NOT NULL PRIMARY KEY,
OrderNo int NOT NULL,
P_Id int FOREIGN KEY REFERENCES Persons(P_Id)
)

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

MySQL / SQL Server / Oracle / MS Access:

CREATE TABLE Orders
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
P_Id int,
PRIMARY KEY (O_Id),
CONSTRAINT fk_PerOrders FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)
)

ALTER TABLE 時的 SQL FOREIGN KEY 約束

當 "Orders" 表已被創建時,如需在 "P_Id" 列創建 FOREIGN KEY 約束,請使用下面的 SQL:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Orders
ADD FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)

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

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Orders
ADD CONSTRAINT fk_PerOrders
FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)

撤銷 FOREIGN KEY 約束

如需撤銷 FOREIGN KEY 約束,請使用下面的 SQL:

MySQL:

ALTER TABLE Orders
DROP FOREIGN KEY fk_PerOrders

SQL Server / Oracle / MS Access:

ALTER TABLE Orders
DROP CONSTRAINT fk_PerOrders

24、【CHECK】 約束

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

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

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

CREATE TABLE 時的 SQL CHECK 約束

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

MySQL:

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

SQL Server / Oracle / MS Access:

CREATE TABLE Persons
(
P_Id int NOT NULL CHECK (P_Id>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
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT chk_Person CHECK (P_Id>0 AND City='Sandnes')
)

 

ALTER TABLE 時的 SQL CHECK 約束

當表已被創建時,如需在 "P_Id" 列創建 CHECK 約束,請使用下面的 SQL:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Persons
ADD CHECK (P_Id>0)

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

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Persons
ADD CONSTRAINT chk_Person CHECK (P_Id>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

25、【DEFAULT】 約束

DEFAULT 約束用於向列中插入默認值。

如果沒有規定其他的值,那麼會將默認值添加到所有的新記錄。

CREATE TABLE 時的 SQL DEFAULT 約束

下面的 SQL 在 "Persons" 表創建時在 "City" 列上創建 DEFAULT 約束:

My SQL / SQL Server / Oracle / MS Access:

CREATE TABLE Persons
(
    P_Id int NOT NULL,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255) DEFAULT 'Sandnes'
)

通過使用類似 GETDATE() 這樣的函數,DEFAULT 約束也可以用於插入系統值:

CREATE TABLE Orders
(
    O_Id int NOT NULL,
    OrderNo int NOT NULL,
    P_Id int,
    OrderDate date DEFAULT GETDATE()
)

ALTER TABLE 時的 SQL DEFAULT 約束

當表已被創建時,如需在 "City" 列創建 DEFAULT 約束,請使用下面的 SQL:

MySQL:

ALTER TABLE Persons
ALTER City SET DEFAULT 'SANDNES'

SQL Server / MS Access:

ALTER TABLE Persons
ADD CONSTRAINT ab_c DEFAULT 'SANDNES' for City

Oracle:

ALTER TABLE Persons
MODIFY City DEFAULT 'SANDNES'

 

撤銷 DEFAULT 約束

如需撤銷 DEFAULT 約束,請使用下面的 SQL:

MySQL:

ALTER TABLE Persons
ALTER City DROP DEFAULT

SQL Server / Oracle / MS Access:

ALTER TABLE Persons
ALTER COLUMN City DROP DEFAULT

26、【CREATE INDEX】 語句

CREATE INDEX 語句用於在表中創建索引。

在不讀取整個表的情況下,索引使數據庫應用程序可以更快地查找數據。

索引

您可以在表中創建索引,以便更加快速高效地查詢數據。

用戶無法看到索引,它們只能被用來加速搜索/查詢。

註釋:更新一個包含索引的表需要比更新一個沒有索引的表花費更多的時間,這是由於索引本身也需要更新。因此,理想的做法是僅僅在常常被搜索的列(以及表)上面創建索引。

SQL CREATE INDEX 語法

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

CREATE INDEX index_name
ON table_name (column_name)

SQL CREATE UNIQUE INDEX 語法

在表上創建一個唯一的索引。不允許使用重複的值:唯一的索引意味着兩個行不能擁有相同的索引值。Creates a unique index on a table. Duplicate values are not allowed:

CREATE UNIQUE INDEX index_name
ON table_name (column_name)

註釋:用於創建索引的語法在不同的數據庫中不一樣。因此,檢查您的數據庫中創建索引的語法。


CREATE INDEX 實例

下面的 SQL 語句在 "Persons" 表的 "LastName" 列上創建一個名爲 "PIndex" 的索引:

CREATE INDEX PIndex
ON Persons (LastName)

如果您希望索引不止一個列,您可以在括號中列出這些列的名稱,用逗號隔開:

CREATE INDEX PIndex
ON Persons (LastName, FirstName)

27、【DROP】語句,去除索引、表、數據庫

通過使用 DROP 語句,可以輕鬆地刪除索引、表和數據庫。

DROP INDEX 語句

DROP INDEX 語句用於刪除表中的索引。

用於 MS Access 的 DROP INDEX 語法:

DROP INDEX index_name ON table_name

用於 MS SQL Server 的 DROP INDEX 語法:

DROP INDEX table_name.index_name

用於 DB2/Oracle 的 DROP INDEX 語法:

DROP INDEX index_name

用於 MySQL 的 DROP INDEX 語法:

ALTER TABLE table_name DROP INDEX index_name

 

DROP TABLE 語句

DROP TABLE 語句用於刪除表。

DROP TABLE table_name

 

DROP DATABASE 語句

DROP DATABASE 語句用於刪除數據庫。

DROP DATABASE database_name

 

TRUNCATE TABLE 語句

如果我們僅僅需要刪除表內的數據,但並不刪除表本身,那麼我們該如何做呢?

請使用 TRUNCATE TABLE 語句:

TRUNCATE TABLE table_name

28、【ALTER TABLE】 語句

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

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

ALTER TABLE table_name
ADD column_name datatype

如需刪除表中的列,請使用下面的語法(請注意,某些數據庫系統不允許這種在數據庫表中刪除列的方式):

ALTER TABLE table_name
DROP COLUMN column_name

要改變表中列的數據類型,請使用下面的語法:

SQL Server / MS Access:

ALTER TABLE table_name
ALTER COLUMN column_name datatype

My SQL / Oracle:

ALTER TABLE table_name
MODIFY COLUMN column_name datatype

Oracle 10G 之後版本:

ALTER TABLE table_name
MODIFY column_name datatype;

29、【AUTO INCREMENT】 字段

在新記錄插入表中時生成一個唯一的數字。

下面的 SQL 語句把 "Persons" 表中的 "ID" 列定義爲 auto-increment 主鍵字段:

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

MySQL 使用 AUTO_INCREMENT 關鍵字來執行 auto-increment 任務。

默認地,AUTO_INCREMENT 的開始值是 1,每條新記錄遞增 1。

要讓 AUTO_INCREMENT 序列以其他的值起始,請使用下面的 SQL 語法:

ALTER TABLE Persons AUTO_INCREMENT=100

要在 "Persons" 表中插入新記錄,我們不必爲 "ID" 列規定值(會自動添加一個唯一的值):

INSERT INTO Persons (FirstName,LastName) VALUES ('Lars','Monsen')

上面的 SQL 語句會在 "Persons" 表中插入一條新記錄。"ID" 列會被賦予一個唯一的值。"FirstName" 列會被設置爲 "Lars","LastName" 列會被設置爲 "Monsen"。

30、【SQL視圖】

視圖是可視化的表。

本章講解如何創建、更新和刪除視圖。

SQL CREATE VIEW 語句

在 SQL 中,視圖是基於 SQL 語句的結果集的可視化的表。

視圖包含行和列,就像一個真實的表。視圖中的字段就是來自一個或多個數據庫中的真實的表中的字段。

您可以向視圖添加 SQL 函數、WHERE 以及 JOIN 語句,也可以呈現數據,就像這些數據來自於某個單一的表一樣。

SQL CREATE VIEW 語法

CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition

註釋:視圖總是顯示最新的數據!每當用戶查詢視圖時,數據庫引擎通過使用視圖的 SQL 語句重建數據。


SQL CREATE VIEW 實例

樣本數據庫 Northwind 擁有一些被默認安裝的視圖。

視圖 "Current Product List" 會從 "Products" 表列出所有正在使用的產品(未停產的產品)。這個視圖使用下面的 SQL 創建:

CREATE VIEW [Current Product List] AS
SELECT ProductID,ProductName
FROM Products
WHERE Discontinued=No

我們可以像這樣查詢上面這個視圖:

SELECT * FROM [Current Product List]

Northwind 樣本數據庫的另一個視圖會選取 "Products" 表中所有單位價格高於平均單位價格的產品:

CREATE VIEW [Products Above Average Price] AS
SELECT ProductName,UnitPrice
FROM Products
WHERE UnitPrice>(SELECT AVG(UnitPrice) FROM Products)

我們可以像這樣查詢上面這個視圖:

SELECT * FROM [Products Above Average Price]

Northwind 樣本數據庫的另一個視圖會計算在 1997 年每個種類的銷售總數。請注意,這個視圖會從另一個名爲 "Product Sales for 1997" 的視圖那裏選取數據:

CREATE VIEW [Category Sales For 1997] AS
SELECT DISTINCT CategoryName,Sum(ProductSales) AS CategorySales
FROM [Product Sales for 1997]
GROUP BY CategoryName

我們可以像這樣查詢上面這個視圖:

SELECT * FROM [Category Sales For 1997]

我們也可以向查詢添加條件。現在,我們僅僅需要查看 "Beverages" 類的銷售總數:

SELECT * FROM [Category Sales For 1997]
WHERE CategoryName='Beverages'

 


SQL 更新視圖

您可以使用下面的語法來更新視圖:

SQL CREATE OR REPLACE VIEW 語法

CREATE OR REPLACE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition

現在,我們希望向 "Current Product List" 視圖添加 "Category" 列。我們將通過下列 SQL 更新視圖:

CREATE VIEW [Current Product List] AS
SELECT ProductID,ProductName,Category
FROM Products
WHERE Discontinued=No

SQL Server

ALTER VIEW [ schema_name . ] view_name [ ( column [ ,...n ] ) ] 
[ WITH <view_attribute> [ ,...n ] ] 
AS select_statement 
[ WITH CHECK OPTION ] [ ; ]

<view_attribute> ::= 
{ 
    [ ENCRYPTION ]
    [ SCHEMABINDING ]
    [ VIEW_METADATA ]     
} 
  • schema_name: 視圖所屬架構的名稱。
  • view_name: 要更改的視圖。
  • column: 將成爲指定視圖的一部分的一個或多個列的名稱(以逗號分隔)。

 


SQL 撤銷視圖

您可以通過 DROP VIEW 命令來刪除視圖。

SQL DROP VIEW 語法

DROP VIEW view_name

31、【DATE】日期適用

詳見:https://www.runoob.com/sql/sql-dates.html

32、【 IS NULL 和 IS NOT NULL 】值的使用

如果表中的某個列是可選的,那麼我們可以在不向該列添加值的情況下插入新記錄或更新已有的記錄。這意味着該字段將以 NULL 值保存。

NULL 值的處理方式與其他值不同。

NULL 用作未知的或不適用的值的佔位符。

註釋:無法比較 NULL 和 0;它們是不等價的。


SQL 的 NULL 值處理

請看下面的 "Persons" 表:

P_Id LastName FirstName Address City
1 Hansen Ola   Sandnes
2 Svendson Tove Borgvn 23 Sandnes
3 Pettersen Kari   Stavanger

假如 "Persons" 表中的 "Address" 列是可選的。這意味着如果在 "Address" 列插入一條不帶值的記錄,"Address" 列會使用 NULL 值保存。

那麼我們如何測試 NULL 值呢?

無法使用比較運算符來測試 NULL 值,比如 =、< 或 <>。

我們必須使用 IS NULL 和 IS NOT NULL 操作符。


SQL IS NULL

我們如何僅僅選取在 "Address" 列中帶有 NULL 值的記錄呢?

我們必須使用 IS NULL 操作符:

SELECT LastName,FirstName,Address FROM Persons
WHERE Address IS NULL

結果集如下所示:

LastName FirstName Address
Hansen Ola  
Pettersen Kari  

提示:請始終使用 IS NULL 來查找 NULL 值。


SQL IS NOT NULL

我們如何僅僅選取在 "Address" 列中不帶有 NULL 值的記錄呢?

我們必須使用 IS NOT NULL 操作符:

SELECT LastName,FirstName,Address FROM Persons
WHERE Address IS NOT NULL

結果集如下所示:

LastName FirstName Address
Svendson Tove Borgvn 23

33、ISNULL()、NVL()、IFNULL() 和 COALESCE() 函數

看下面的 "Products" 表:

P_Id ProductName UnitPrice UnitsInStock UnitsOnOrder
1 Jarlsberg 10.45 16 15
2 Mascarpone 32.56 23  
3 Gorgonzola 15.67 9 20

假如 "UnitsOnOrder" 是可選的,而且可以包含 NULL 值。

我們使用下面的 SELECT 語句:

SELECT ProductName,UnitPrice*(UnitsInStock+UnitsOnOrder) FROM Products

在上面的實例中,如果有 "UnitsOnOrder" 值是 NULL,那麼結果是 NULL。

微軟的 ISNULL() 函數用於規定如何處理 NULL 值。

NVL()、IFNULL() 和 COALESCE() 函數也可以達到相同的結果。

在這裏,我們希望 NULL 值爲 0。

下面,如果 "UnitsOnOrder" 是 NULL,則不會影響計算,因爲如果值是 NULL 則 ISNULL() 返回 0:

SQL Server / MS Access

SELECT ProductName,UnitPrice*(UnitsInStock+ISNULL(UnitsOnOrder,0)) FROM Products

Oracle

Oracle 沒有 ISNULL() 函數。不過,我們可以使用 NVL() 函數達到相同的結果:

SELECT ProductName,UnitPrice*(UnitsInStock+NVL(UnitsOnOrder,0)) FROM Products

MySQL

MySQL 也擁有類似 ISNULL() 的函數。不過它的工作方式與微軟的 ISNULL() 函數有點不同。

在 MySQL 中,我們可以使用 IFNULL() 函數,如下所示:

SELECT ProductName,UnitPrice*(UnitsInStock+IFNULL(UnitsOnOrder,0)) FROM Products

或者我們可以使用 COALESCE() 函數,如下所示:

SELECT ProductName,UnitPrice*(UnitsInStock+COALESCE(UnitsOnOrder,0)) FROM Products

34、SQL通用數據類型

在 MySQL 中,有三種主要的類型:Text(文本)、Number(數字)和 Date/Time(日期/時間)類型。

Text 類型:

數據類型 描述
CHAR(size) 保存固定長度的字符串(可包含字母、數字以及特殊字符)。在括號中指定字符串的長度。最多 255 個字符。
VARCHAR(size) 保存可變長度的字符串(可包含字母、數字以及特殊字符)。在括號中指定字符串的最大長度。最多 255 個字符。註釋:如果值的長度大於 255,則被轉換爲 TEXT 類型。
TINYTEXT 存放最大長度爲 255 個字符的字符串。
TEXT 存放最大長度爲 65,535 個字符的字符串。
BLOB 用於 BLOBs(Binary Large OBjects)。存放最多 65,535 字節的數據。
MEDIUMTEXT 存放最大長度爲 16,777,215 個字符的字符串。
MEDIUMBLOB 用於 BLOBs(Binary Large OBjects)。存放最多 16,777,215 字節的數據。
LONGTEXT 存放最大長度爲 4,294,967,295 個字符的字符串。
LONGBLOB 用於 BLOBs (Binary Large OBjects)。存放最多 4,294,967,295 字節的數據。
ENUM(x,y,z,etc.) 允許您輸入可能值的列表。可以在 ENUM 列表中列出最大 65535 個值。如果列表中不存在插入的值,則插入空值。

註釋:這些值是按照您輸入的順序排序的。

可以按照此格式輸入可能的值: ENUM('X','Y','Z')

SET 與 ENUM 類似,不同的是,SET 最多隻能包含 64 個列表項且 SET 可存儲一個以上的選擇。

其他數據類型及不同數據庫的數據類型參考:

https://www.runoob.com/sql/sql-datatypes-general.html

https://www.runoob.com/sql/sql-datatypes.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章