1. 程式人生 > 其它 >SQL語句之高階使用

SQL語句之高階使用

1、select top

select top 用於規定要返回的資料的數目 注意:並非所有的資料庫系統都支援 SELECT TOP 語句。 MySQL 支援 LIMIT 語句來選取指定的條數資料, Oracle 可以使用 ROWNUM 來選取 SqlServer語法:
SELECT TOP 50 PERCENT * FROM Websites;

  

Oracle語法:

SELECT *
FROM Persons
WHERE ROWNUM <=5;

  

MySQL語法:

SELECT *
FROM Persons
LIMIT 5;

  

2、like

語法:

SELECT column_name(s)
FROM table_name
WHERE column_name LIKE pattern;

"%" 符號用於在模式的前後定義萬用字元(預設字母)

3、SQL萬用字元

1、萬用字元可用於替代字串中的任何其他字元。
2、在 SQL 中,萬用字元與 SQL LIKE 操作符一起使用

例:

選取 name 以 "G"、"F" 或 "s" 開始的所有網站:(MySQL 中使用REGEXP或NOT REGEXP運算子 (或 RLIKE 和 NOT RLIKE) 來操作正則表示式。)
SELECT * FROM Websites
WHERE name REGEXP '^[GFs]';

  

4、in

IN 操作符允許您在 WHERE 子句中規定多個值。

語法:

SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1,value2,...);

例:

SELECT * FROM Websites
WHERE name IN ('Google','菜鳥教程');

  

in和=對比:

相同點:均在WHERE中使用作為篩選條件之一、均是等於的含義。 不同點:IN可以規定多個值,等於規定一個值。
IN
SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1,value2,...);
= SELECT column_name(s) FROM table_name WHERE column_name=value1;

  

5、between

BETWEEN 操作符用於選取介於兩個值之間的資料範圍內的值。 BETWEEN 操作符選取介於兩個值之間的資料範圍內的值。這些值可以是數值、文字或者日期。 語法:
SELECT column_name(s)
FROM table_name
WHERE column_name BETWEEN value1 AND value2;

如需顯示不在上面例項範圍內的網站,使用 NOT BETWEEN:

SELECT * FROM Websites
WHERE alexa NOT BETWEEN 1 AND 20;

  

6、SQL別名

語法:

SELECT column_name AS alias_name
FROM table_me;

例:

SELECT name AS n, country AS c
FROM Websites;


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

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

  

表的SQL別名語法:

SELECT column_name(s)
FROM table_name AS alias_name;

例:

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="菜鳥教程";

  

7、join

作用:SQL JOIN 子句用於把來自兩個或多個表的行結合起來,基於這些表之間的共同欄位。

(1)inner join(也可以縮寫成join)——內聯接

求交集,如果表中有至少一個匹配,則返回行

SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name=table2.column_name;

SELECT column_name(s)
FROM table1
JOIN table2
ON table1.column_name=table2.column_name;

  

(2)left join——左聯接

LEFT JOIN 關鍵字從左表(table1)返回所有的行,即使右表(table2)中沒有匹配。如果右表中沒有匹配,則結果為 NULL。

SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name=table2.column_name;

SELECT column_name(s)
FROM table1
LEFT OUTER JOIN table2
ON table1.column_name=table2.column_name;

  

(3)right join——右聯接

RIGHT JOIN 關鍵字從右表(table2)返回所有的行,即使左表(table1)中沒有匹配。如果左表中沒有匹配,則結果為 NULL。

SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name=table2.column_name; 

SELECT column_name(s)
FROM table1
RIGHT OUTER JOIN table2
ON table1.column_name=table2.column_name;

  

(4)full join(也叫作full outer join)——全聯接

FULL OUTER JOIN 關鍵字只要左表(table1)和右表(table2)其中一個表中存在匹配,則返回行.

FULL OUTER JOIN 關鍵字結合了 LEFT JOIN 和 RIGHT JOIN 的結果。

SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
ON table1.column_name=table2.column_name;  

8、union

作用:UNION 操作符合並兩個或多個 SELECT 語句的結果。
注意:UNION 內部的每個 SELECT 語句必須擁有相同數量的列。列也必須擁有相似的資料型別。同時,每個 SELECT 語句中的列的順序必須相同。 union語法:
SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;

  

union all語法:

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

注意:預設地,UNION 操作符選取不同的值。如果允許重複的值,請使用 UNION ALL。
UNION 結果集中的列名總是等於 UNION 中第一個 SELECT 語句中的列名

9、select into

SELECT INTO 語句從一個表複製資料,然後把資料插入到另一個新表中。

    注意:     MySQL 資料庫不支援 SELECT ... INTO 語句,但支援 INSERT INTO ... SELECT select into語法:
SELECT *
INTO newtable [IN externaldb]
FROM table1;

或:

SELECT column_name(s)
INTO newtable [IN externaldb]
FROM table1;

下面的語句可以複製表結構和表資料:

CREATE TABLE 新表 AS SELECT * FROM 舊錶;
或:
CREATE TABLE 新表 SELECT * FROM 舊錶;

10、insert into select

INSERT INTO SELECT 語句從一個表複製資料,然後把資料插入到一個已存在的表中。目標表中任何已存在的行都不會受影響。

語法:

INSERT INTO table2
SELECT * FROM table1;

---------------------------------- INSERT INTO table2 (column_name(s)) SELECT column_name(s) FROM table1;

擴充套件:

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

  

11、建立資料庫語句

CREATE DATABASE dbname;

  

12、建立表語句

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

  

13、SQL約束


SQL 約束用於規定表中的資料規則。 如果存在違反約束的資料行為,行為會被約束終止。 約束可以在建立表時規定(通過 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,
....
);

(1) not null

NOT NULL 約束強制列不接受 NULL 值。 NOT NULL 約束強制欄位始終包含值。這意味著,如果不向欄位新增值,就無法插入新記錄或者更新記錄。 例子:
強制 "ID" 列、 "LastName" 列以及 "FirstName" 列不接受 NULL 值:
CREATE TABLE Persons ( ID int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255) NOT NULL, Age int );

在一個已建立的表的 "Age" 欄位中新增 NOT NULL 約束如下所示:
ALTER TABLE Persons MODIFY Age int NOT NULL;

在一個已建立的表的 "Age" 欄位中刪除 NOT NULL 約束如下所示:
ALTER TABLE Persons MODIFY Age int NULL;

(2)unique

UNIQUE 約束唯一標識資料庫表中的每條記錄。 UNIQUE 和 PRIMARY KEY 約束均為列或列集合提供了唯一性的保證。 PRIMARY KEY 約束擁有自動定義的 UNIQUE 約束。 請注意,每個表可以有多個 UNIQUE 約束,但是每個表只能有一個 PRIMARY KEY 約束。
在 "Persons" 表建立時在 "P_Id" 列上建立 UNIQUE 約束:
MySQL語法:

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



SQL Server / Oracle / MS Access語法:

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

  

如需命名 UNIQUE 約束,並定義多個列的 UNIQUE 約束,使用下面的 SQL 語法:
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)
)

  

當表已被建立時,如需在 "P_Id" 列建立 UNIQUE 約束,使用下面的 SQL:
MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Persons
ADD UNIQUE (P_Id);

如需命名 UNIQUE 約束,並定義多個列的 UNIQUE 約束:

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

  

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

ALTER TABLE Persons
DROP INDEX uc_PersonID


SQL Server / Oracle / MS Access:

ALTER TABLE Persons
DROP CONSTRAINT uc_PersonID

  

(3)primary key

PRIMARY KEY 約束唯一標識資料庫表中的每條記錄。 主鍵必須包含唯一的值。 主鍵列不能包含 NULL 值。 每個表都應該有一個主鍵,並且每個表只能有一個主鍵。
CREATE TABLE 時的 SQL 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) )
如需命名 PRIMARY KEY 約束,並定義多個列的 PRIMARY KEY 約束,請使用下面的 SQL 語法: 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) )

  

ALTER TABLE 時的 SQL PRIMARY KEY 約束

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)

  

撤銷 PRIMARY KEY 約束

MySQL:
ALTER TABLE Persons
DROP PRIMARY KEY



SQL Server / Oracle / MS Access:

ALTER TABLE Persons
DROP CONSTRAINT pk_PersonID

  

(4)foreign key

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

(5)check約束

CHECK 約束用於限制列中的值的範圍。 如果對單個列定義 CHECK 約束,那麼該列只允許特定的值。 如果對一個表定義 CHECK 約束,那麼此約束會基於行中其他列的值在特定的列中對值進行限制。

(6)default約束

DEFAULT 約束用於向列中插入預設值。 如果沒有規定其他的值,那麼會將預設值新增到所有的新記錄。

14、建立索引

create index

CREATE INDEX 語句用於在表中建立索引。 在不讀取整個表的情況下,索引使資料庫應用程式可以更快地查詢資料。
在表上建立一個簡單的索引。允許使用重複的值:

CREATE INDEX index_name
ON table_name (column_name)

  

表上建立一個唯一的索引。不允許使用重複的值:唯一的索引意味著兩個行不能擁有相同的索引值。Creates a unique index on a table. Duplicate values are not allowed:
CREATE UNIQUE INDEX index_name ON table_name (column_name)
註釋:用於建立索引的語法在不同的資料庫中不一樣。因此要檢查資料庫中建立索引的語法。

 

15、刪除索引、表以及資料庫

16、alter

17、auto increment欄位

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

18、檢視

在 SQL 中,檢視是基於 SQL 語句的結果集的視覺化的表。 檢視包含行和列,就像一個真實的表。檢視中的欄位就是來自一個或多個數據庫中的真實的表中的欄位。 您可以向檢視新增 SQL 函式、WHERE 以及 JOIN 語句,也可以呈現資料,就像這些資料來自於某個單一的表一樣。 (1)建立檢視語法:
CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
註釋:檢視總是顯示最新的資料!每當使用者查詢檢視時,資料庫引擎通過使用檢視的 SQL 語句重建資料。

 

(2)建立檢視示例:

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

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

SELECT * FROM [Current Product List]

  

(3)更新檢視

語法:

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

  

(4)刪除檢視

語法:

DROP VIEW view_name

  

19、DATE()函式

20、NULL值

21、NULL函式

22、通用資料型別

資料庫表中的每個列都要求有名稱和資料型別。Each column in a database table is required to have a name and a data type. SQL 開發人員必須在建立 SQL 表時決定表中的每個列將要儲存的資料的型別。資料型別是一個標籤,是便於 SQL 瞭解每個列期望儲存什麼型別的資料的指南,它也標識了 SQL 如何與儲存的資料進行互動。

23、用於各種資料庫的資料型別