SQL高級語句(二)


SELECT TOP子句:

SELECT TOP子句用於指定要返回的記錄數量,在包含千條記錄的大型表上很有用。

並不是所有的數據庫系統都支持SELECT TOP子句。MYSQL支持LIMIT子句來選擇有限數量的記錄,而Oracle使用ROWNUM。

SQL server語法:

SELECT TOP number\percent column_name(s)

FROM table_name

WHERE condition

選擇滿足條件condition的table_name表中的一定數量的column_name(s)列;

MYSQL語法:

SELECT column_name(s)

FROM table_name

WHERE condition

LIMIT number

選擇滿足條件condition的table_name表中的一定數量的column_name(s)列;

Oracle語法:

SELECT column_name(s)

FROM table_name

WHERE condition AND ROWNUN<=number

選擇滿足條件condition的table_name表中的一定數量的column_name(s)列;

SQL LIKE運算符:

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

有兩個通配符與LIKE一起使用:

% -百分號表示零個、一個或多個字符;

_ -下划線表示單個字符;

MS ACCESS 使用問號(?)而不是下划線(_);

百分號可以和下划線組合使用。

SELECT column1,column2...

FROM table_name

WHERE columnN LIKE pattern;

選擇table_name的columnN列中匹配pattern模式的column1,column2...

‘%’和‘_’通配符顯示不同LIKE運算符的例子:

LIKE運算符

描述

WHERE CustomerName LIKE 'a%'

查找以‘a’開頭的任何值

WHERE CustomerName LIKE '%a'

查找以‘a’結尾的任何值

WHERE CustomerName LIKE '%or%'

在任何位置查找具有“or”字符的任何值

WHERE CustomerName LIKE '_r%"

查找第二個字符是‘r’的任何值

WHERE CustomerName LIKE ‘a_%_%’

查找以‘a’開頭且字符串至少是三個字符的值

WHERE CustomerName LIKE ‘a%o’

查找以‘a’開頭‘o’結尾的任何值

SQL通配符:

通配符用於替換字符串中的其他任何字符,如LIKE語句中提到的“%”和“_”。

在MS Access和SQL Server中,也可以使用:

[charlist] -定義要匹配的字符的集合和范圍;

[^charlist]或[!charlist] -定義不匹配字符的集合和范圍。

如:

SELECT * FROM Customers

WHERE City LIKE '[bsp']%';

選擇所有City以“b”,“s”或“p”開頭的客戶;

IN運算符:

IN運算符允許在WHERE子句中指定多個值;是多個OR條件的簡寫;

SELECT column_name(s)

FROM table_name

WHERE column_name IN(value1,value2...);

或者:

SECECT column_name(s)

FROM  table_name

WHERE column_name IN (SELECT statement)

 BETWEEN運算符:

BETWEEN運算符選擇給定范圍內的值,值可以是數字、文本或日期;

SELCET column_name(s)

FROM table_name

WHERE column_name BETWEEN value1 AND value 2;

從table_name處選擇column_name(s)哪里的column_name的值范圍在value1到value2之間;

顯示示例范圍外的值用NOT BETWEEN;

在不同的數據庫中,BETWEEN操作符包含的范圍不同,如一些數據庫中包含value1和value2;一些數據庫選擇兩個數據之間的值但不包括value1和value2;一些數據庫只包括前者,即value1但不包括value2。因此,使用時需檢測BETWEEN操作符的包含范圍;

SQL通用數據類型:

數據類型 描述
CHARACTER(n) 字符/字符串。固定長度n
VARCHAR(n)或CHARACTER VARYING(n) 字符/字符串。可變長度,最大長度為n
BINARY(n) 二進制串。固定長度n
BOOLEAN 存儲TRUE或FALSE值
VARBINARY(n)或BINARY VARING(n) 二進制串。可變長度,最大長度為n
INTEGER(p) 整數值(沒有小數點)。精度p
SMALLINT 整數值(沒有小數點)。精度5
INTEGER 整數值(沒有小數點)。精度10
 BIGINT 整數值(沒有小數點)。精度19 
 DECIMAL(p,s) 精確數值,精度p,小數點后位數s。 
 NUMERIC(p,s) 同DECIMAL(p,s) 
 FLOAT(p) 近似數值。尾數精度p 
 REAL 近似數值。尾數精度7 
 FLOAT 近似數值。尾數精度16 
 DOUBLE PRECISION 近似數值。尾數精度16 
 DATE 存儲年月日的值 
 TIME 存儲小時,分,秒的值 
 TIMESTAMP 存儲年月日,小時,分,秒的值 
 INTERVAL 由一些整數數段組成,代表一段時間,取決於區間的類型 
 ARRAY 元素的固定長度的有序集合 
 MULTISET 元素的可變長度的無序集合 
 XML 存儲XML數據 

不同數據庫平台某些數據類型的通用數據名稱:

數據類型 Access SQLServer Oracle MySQL PostgreSQL
boolean Yes/No Bit Byte N/A Boolean
integer

Number(integer)

Int Number Int(Integer) Int(Integer)
float Number(single) Float(Real) Number Float Numeric
currency Currency Money N/A N/A Money
string(fixed) N/A Char Char Char Char
string(variable)

Text(<256)

Memo(65k+)

Varchar

Varchar

Varchar2

Varchar Varchar
binary object OLE Object Memo

Binary(fixed up to 8k)

Varbinary(<8k)

Image(<2GB)

Long

Raw

Blob

Text

Binary

Varbinary

SQL連接語句:

JOIN用於把兩個或多個表的行結合起來,基於這些表中的共同字段;

JOIN類型:

INNER JOIN:如果表中有至少一個匹配,則返回行;

LEFT JOIN:即使右表中沒有匹配,也從左表返回所有的行;

RIGHT JOIN:即使左表中沒有匹配,也從右表返回所有行;

FULL JOIN:只要其中一個表存在匹配,則返回行;

INNER JOIN語法:

SELECT column_name(s)

FROM table1

INNER JOIN table2 ON table1.column_name = table2.column_name;

選擇table1和table2中所有滿足table1.column_name = table2.column_name的column_name(s)列的所有記錄;

如果表中至少有一個匹配項,INNER JOIN關鍵字將會列出滿足條件的所有行,如果不匹配,則不會列出行;

LEFT JOIN語法:

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;

SQL左連接LEFT JOIN關鍵字返回左表(table1)中所有行,即使在右表(table2)中沒有匹配;當右表中無對應的匹配值時,對應的位置輸出NULL。

SQL 右連接:

RIGHT JION返回右表table2的所有行,即使左表table1中沒有匹配;當左表中無對應的匹配值時,對應的位置輸出為NULL;

SELECT column_name(s)

FROM table_name

RIGHT JOIN table2

ON table1.column_name = table2.column_name

SQL  FULL OUTER JOIN關鍵字(完整外部連接)

當左表table1和右表table2表記錄匹配時,FULL OUTER JOIN關鍵字將會返回所有記錄;

SELECT column_name(s)

FROM table1

FULL OUTER JOIN table2

ON table1.column_name = table2.column_name;

 SQL自連接:

SELECT column_name(s)

FROM table1 T1,table1 T2

WHERE condition;

示例:

以下SQL語句匹配來自同一城市的客戶:

SELECT A.CostomerName,B.CostomerName,A.City

FROM Customer A,Customer B

WHERE A.CustomerID <>B.CustomerID

AND A.City = B.City

ORDER BY A.City;

SQL UNION運算符:

UNION運算符用於組合兩個或更多SELECT語句的結果集;

UNION中每個SELECT語句必須具有相同的列數,這些列也必須具有相似的數據類型,每個SELECT語句中的列也必須以相同的順序排列;

SELECT column_name(s) FROM table1

UNION 

SELECT column_name(s) FROM table2;

默認情況下,UNION運算符選擇一個不同的值,如果需要允許重復值,則需要使用UNOIN ALL;

SQL UNION ALL 語法:

SELECT column_name(s) FROM table1

UNION ALL

SELECT column_name(s) FROM table2;

UNION結果集中列名總是等於UNION中第一個SELECT語句中的列名;

SELECT INTO語句:

從一個表中復制數據,然后將數據插入到另一個新表中;

SELECT column_name(s)

INTO newtable [IN externaldb]

FROM table1;

從table1中復制column_name(s)列到新表newtable中,IN externaldb表示復制到另一個數據庫中,不寫表示復制與本數據庫目錄下;

將使用SELECT語句中定義的列名和類型創建新表,可以使用AS語句來定義一個新名稱;

INSERT INTO SELECT語句:

從表中復制數據,並將數據插入到現有的表中;目標表中的任何現有行都不會受到影響;

INSERT INTO table2

(column_name(s))

SELECT column_name(s)

FROM table1;

撤銷索引,表以及數據庫:

DROP INDEX用於刪除表中的索引;

不同數據庫語法稍有差異:

MS Access DROP INDEX index_name ON table_name
MS SQL Server

DROP INDEX table_name.index_name

DB2/Oracle DROP INDEX index_name

MySQL

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 table_name;

 CREAT DATABASE語句:

CREAT DATABASE dbname;

創建數據庫dbname;

CREAT TABLE語句:

CREAT TABEL table_name

(

column1_name data_type(size),

column2_name data_type(size),

...

);

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;

MySQL/Oracle:

ALTER TBALE table_name

MODIFY COLUMN column_name datatype;

AUTO INCREMENT 字段:

以下SQL語句將“Person”表中的“ID”字段定義為自動遞增主鍵字段:

MySQL:

CREAT TABLE Person

(

  ID int NOT NULL AUTO_INCREMENT,

LastName varchar(255) NOT NULL,

FirstName varchar(255),

Address varchar(255),

City varchar(255),

PRIMAR KEY (ID)

);

默認情況下,AUTO_INCREMENT的起始值為1,每個記錄增加1;

若要以其他值開始AUTO_INCREMENT序列,需對其賦初值,如:

ALTER TABLE Person AUTO_INCREMENT = 100

SQL Server為“Person”中“ID”字段設置自動遞增語法:

CREAT TABLE

(

  ID int IDENTITY(1,1) PRIMARY KEY,

LastName varchar(255) NOT NULL,

FirstName varchar(255),

Address varchar(255),

City varchar(255)

);

SQL Server 中使用IDENTITY關鍵字執行自動增量;上面示例設置初始值為1,增量為1;若要設置初始值為10,增量為2,則改為IDENTITY(10,2);

Access設置為“person”表中的“ID”字段自增語法:

CREAT TABLE Persons

  ID Integer PRIMARY KEY AUTOINCREMENT,

LastName varchar(255) NOT NULL,

FirstName varchar(255),

Address varchar(255),

City varchar(255)

);

Access中使用AUTOINCREMENT完成自增,默認情況下初始值為1,每次自動增加1;若要設置初始值為10,每次增量為2,則改為AUTOINCREMENT(10,2);

Oracle語法:

CREAT SEQUENCE seq_person

MINVALUE 1

START WITH 1

INCREMENT BY 1

CACHE 10

上面的代碼創建了一個名為“seq_person”的序列(sequence)對象,它以1開頭,以1遞增,次對象緩存10個值以提高性能;

若要向“Person”表中插入新記錄,需用nextval函數,該函數從序列中檢索下一個值:

INSERT INTO Persons(ID,FirstName,LastName)

Value(seq_person.nextval,'lars','Monsen')

SQL視圖:

在SQL中,視圖是基於SQL語句的結果集的可視化表;視圖包括行和列,就像真正的表一樣;視圖中的字段是一個或多個數據庫中真實表中的字段;視圖中總是顯示最新數據,每當用戶查詢視圖時,數據庫引擎就用視圖的SQL語句重新構建數據;

CREAT VIEW語法:

CREAT VIEW view_name AS

SELECT column_name(s)

FROM table_name

WHERE condition;

更新視圖:

CREAT OR REPLACE VIEW 語法:

CREAT OR REPLACE VIEW view_name AS 

SELECT column_name(s)

FROM table_name

WHERE condition

撤銷視圖:

DROP VIEW view_name

SQL Date函數:

MySQL中內置日期函數:

函數 描述
NOW() 返回當前的時間和日期
CURDATE() 返回當前的日期
CURTIME() 返回當前的時間
DATE() 提取日期或日期/時間表達式中的日期
EXTRACT() 返回日期/時間的單獨部分
DATE_ADD() 向日期中添加指定的時間間隔
DATE_SUB() 從日期減去指定的時間間隔
DATEDIFF 返回兩個日期間的天數
DATE_FORMAT() 用不同的格式顯示日期/時間

SQL Server Date函數:

函數 描述
GETDATE() 返回當前的時間和日期
DATEPART() 返回日期/時間單獨的部分
DATEADD() 在日期中添加或減去指定的時間間隔
DATEDIFF() 返回兩個日期間的時間
CONVERT() 用不同的格式顯示日期/時間

SQL Date數據類型:

MySQL:

DATE -格式:YYYY-MM-DD

DATETIME -格式:YYYY-MM-DD HH:MM:SS

TIMESTAMP -格式:YYYY-MM-DD HH:MM:SS

YEAR -格式:YYYY或YY

SQL Server:

DATE -格式:YYYY-MM-DD

DATETIME -格式:YYYY-MM-DD HH:MM:SS

SMALLDATETIME -格式:YYYY-MM-DD HH:MM:SS

TIMESTAMP -格式:唯一的數字

為了查詢更加簡單和易於維護,盡量不要使用日期中的時間部分;

SQL NULL值:

如果表中的列是可選的,那么我們可以插入一個新記錄或現有的記錄,而無須向里面添加一個值,則意味着該字段將存儲為NULL;

NULL值的處理與其他值不同,為未知的或不適當值的占位符;無法比較NULL和0,因為他們是不等價的;

測試NULL值不能使用=,<或<>。必須使用IS NULL或IS NOT NULL操作符;

如:

SELECT * FROM Customers

WHERE Address IS NULL;

將會選擇出Cutomers表中Address字段為空的值的列表,反正,IS NOT NULL則是選擇表中值不為空的列表。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM