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則是選擇表中值不為空的列表。
