一、LIMIT
- 從 “Websites” 表中選取頭兩條記錄
SELECT * FROM Websites LIMIT 2;
二、LIKE
- 選取 name 以字母 “G” 開始的所有客戶
SELECT * FROM Websites WHERE name LIKE 'G%';
- 通過使用 NOT 關鍵字,您可以選取不匹配模式的記錄。
下面的 SQL 語句選取 name 不包含模式 “oo” 的所有客戶:
三、通配符
通配符 | 描述 |
---|---|
% | 替代 0 個或多個字符 |
_ | 替代 1 個字符 |
[charlist] | 字符列中的任何單一字符 |
[^charlist]或[!charlist] | 不在字符列中的任何單一字符 |
- MySQL 中使用 REGEXP 或 NOT REGEXP 運算符 (或 RLIKE 和 NOT RLIKE) 來操作正則表達式。
下面的 SQL 語句選取 name 以 “G”、“F” 或 “s” 開始的所有網站:
SELECT * FROM Websites WHERE name RLIKE '^[FGs]';
- 選取 name 以 A 到 H 字母開頭的網站
- 不以A-H開頭
四、IN
1. 選取 name 爲 “Google” 或 “菜鳥教程” 的所有網站:
五、BETWEEN
- 選取 alexa 介於 1 和 20 之間的所有網站
SELECT * FROM Websites WHERE alexa BETWEEN 1 AND 20;
- 選取 alexa 介於 1 和 20 之間但 country 不爲 USA 和 IND 的所有網站
- 選取 name 以介於 ‘A’ 和 ‘H’ 之間字母開始的所有網站
- 選取 name 不介於 ‘A’ 和 ‘H’ 之間字母開始的所有網站
- date 介於 ‘2016-05-10’ 和 ‘2016-05-14’ 之間的所有訪問記錄:
六、別名
- 指定了兩個別名,一個是 name 列的別名,一個是 country 列的別名。提示:如果列名稱包含空格,要求使用雙引號或方括號:
SELECT name AS n,country AS c FROM Websites;
- 把三個列(url、alexa 和 country)結合在一起,並創建一個名爲 “site_info” 的別名:
- 指定表別名 “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='菜鳥教程';
七、JOIN
“Websites” 表中的 “id” 列指向 “access_log” 表中的字段 “site_id”。上面這兩個表是通過 “site_id” 列聯繫起來的。
-
INNER JOIN 關鍵字在表中存在至少一個匹配時返回行,INNER JOIN 與 JOIN 是相同的。
INNER JOIN 關鍵字在表中存在至少一個匹配時返回行。如果 “Websites” 表中的行在 “access_log” 中沒有匹配,則不會列出這些行 -
LEFT JOIN 關鍵字從左表(table1)返回所有的行,即使右表(table2)中沒有匹配。如果右表中沒有匹配,則結果爲 NULL。在某些數據庫中,LEFT JOIN 稱爲 LEFT OUTER JOIN。
返回所有網站及他們的訪問量(如果有的話)。
以下實例中我們把 Websites 作爲左表,access_log 作爲右表:
select w.name,a.count,a.date from Websites AS w LEFT JOIN access_log AS a ON w.id=a.site_id ORDER BY a.count DESC;
LEFT JOIN 關鍵字從左表(Websites)返回所有的行,即使右表(access_log)中沒有匹配。 -
RIGHT JOIN 關鍵字從右表(table2)返回所有的行,即使左表(table1)中沒有匹配。如果左表中沒有匹配,則結果爲 NULL。在某些數據庫中,RIGHT JOIN 稱爲 RIGHT OUTER JOIN。
RIGHT JOIN 關鍵字從右表(Websites)返回所有的行,即使左表(access_log)中沒有匹配。 -
FULL OUTER JOIN 關鍵字只要左表(table1)和右表(table2)其中一個表中存在匹配,則返回行.
FULL OUTER JOIN 關鍵字結合了 LEFT JOIN 和 RIGHT JOIN 的結果。
MySQL中不支持 FULL OUTER JOIN
八、UNION
UNION 操作符用於合併兩個或多個 SELECT 語句的結果集。
請注意,UNION 內部的每個 SELECT 語句必須擁有相同數量的列。列也必須擁有相似的數據類型。同時,每個 SELECT 語句中的列的順序必須相同。
- 默認地,UNION 操作符選取不同的值。如果允許重複的值,請使用 UNION ALL
- UNION 結果集中的列名總是等於 UNION 中第一個 SELECT 語句中的列名。
- 從 “Websites” 和 “apps” 表中選取所有不同的country(只有不同的值):
select country from Websites union select country from apps;
- 使用 UNION ALL 從 “Websites” 和 “apps” 表中選取所有的country(也有重複的值):
- 使用 UNION ALL 從 “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;
九、INSERT INTO SELECT
我們可以從一個表中複製所有的列插入到另一個已存在的表中:
INSERT INTO table2
SELECT * FROM table1;
或者我們可以只複製希望的列插入到另一個已存在的表中:
INSERT INTO table2
(column_name(s))
SELECT column_name(s)
FROM table1;
十、CHECK 約束
CHECK 約束用於限制列中的值的範圍。
如果對單個列定義 CHECK 約束,那麼該列只允許特定的值。
如果對一個表定義 CHECK 約束,那麼此約束會基於行中其他列的值在特定的列中對值進行限制。
- 在 “Persons” 表創建時在 “P_Id” 列上創建 CHECK 約束。CHECK 約束規定 “P_Id” 列必須只包含大於 0 的整數。
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) )
- 如需命名 CHECK 約束,並定義多個列的 CHECK 約束,請使用下面的 SQL 語法:
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') )
- 當表已被創建時,如需在 “P_Id” 列創建 CHECK 約束,請使用下面的 SQL
ALTER TABLE Persons ADD CHECK (P_Id>0)
- 如需命名 CHECK 約束,並定義多個列的 CHECK 約束,請使用下面的 SQL 語法:
ALTER TABLE Persons ADD CONSTRAINT chk_Person CHECK (P_Id>0 AND City='Sandnes')
- 如需撤銷 CHECK 約束,請使用下面的 SQL:
ALTER TABLE Persons DROP CHECK chk_Person
十一、DEFAULT 約束
- 下面的 SQL 在 “Persons” 表創建時在 “City” 列上創建 DEFAULT 約束
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() )
- 當表已被創建時,如需在 “City” 列創建 DEFAULT 約束,請使用下面的 SQL:
ALTER TABLE Persons ALTER City SET DEFAULT 'SANDNES'
- 撤銷 DEFAULT 約束,請使用下面的 SQL:
ALTER TABLE Persons ALTER City DROP DEFAULT
十二、索引 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)
希望索引不止一個列,您可以在括號中列出這些列的名稱,用逗號隔開
十三、撤銷索引、撤銷表以及撤銷數據庫
- DROP INDEX 語句用於刪除表中的索引。
ALTER TABLE table_name DROP INDEX index_name
- DROP TABLE 語句用於刪除表。
DROP TABLE table_name
- DROP DATABASE 語句用於刪除數據庫。
DROP DATABASE database_name
- 如果我們僅僅需要刪除表內的數據,但並不刪除表本身,那麼我們該如何做呢?請使用 TRUNCATE TABLE 語句:
TRUNCATE TABLE table_name
十四、ALTER TABLE
- 在 “Persons” 表中添加一個名爲 “DateOfBirth” 的列。
我們使用下面的 SQL 語句:
ALTER TABLE Persons ADD DateOfBirth date
- 改變 “Persons” 表中 “DateOfBirth” 列的數據類型。
我們使用下面的 SQL 語句:
alter table Persons modify column DateOFBirth year;
- 刪除 “Person” 表中的 “DateOfBirth” 列。我們使用下面的 SQL 語句:
ALTER TABLE Persons DROP COLUMN DateOfBirth
十五、AUTO INCREMENT
-
把 “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) )
默認地,AUTO_INCREMENT 的開始值是 1,每條新記錄遞增 1。
要讓 AUTO_INCREMENT 序列以其他的值起始,請使用下面的 SQL 語法:ALTER TABLE Persons AUTO_INCREMENT=100
十六、視圖
1、視圖隱藏了底層的表結構,簡化了數據訪問操作,客戶端不再需要知道底層表的結構及其之間的關係。
2、視圖提供了一個統一訪問數據的接口。(即可以允許用戶通過視圖訪問數據的安全機制,而不授予用戶直接訪問底層表的權限)
3、從而加強了安全性,使用戶只能看到視圖所顯示的數據。
4、視圖還可以被嵌套,一個視圖中可以嵌套另一個視圖。
- 創建
CREATE VIEW view_name AS SELECT column_name(s) FROM table_name WHERE condition
- 更新
CREATE OR REPLACE VIEW view_name AS SELECT column_name(s) FROM table_name WHERE condition
- 刪除
DROP VIEW view_name
十七、Date函數
- MySQL 中最重要的內建日期函數:
NOW() 返回當前的日期和時間
CURDATE() 返回當前的日期
CURTIME() 返回當前的時間
DATE() 提取日期或日期/時間表達式的日期部分
EXTRACT() 返回日期/時間的單獨部分
DATE_ADD() 向日期添加指定的時間間隔
DATE_SUB() 從日期減去指定的時間間隔
DATEDIFF() 返回兩個日期之間的天數
DATE_FORMAT() 用不同的格式顯示日期/時間
- MySQL 使用下列數據類型在數據庫中存儲日期或日期/時間值:
DATE - 格式:YYYY-MM-DD
DATETIME - 格式:YYYY-MM-DD HH:MM:SS
TIMESTAMP - 格式:YYYY-MM-DD HH:MM:SS
YEAR - 格式:YYYY 或 YY
十八、NULL
無法使用比較運算符來測試 NULL 值,比如 =、< 或 <>。
我們必須使用 IS NULL 和 IS NOT NULL 操作符。
- 在 MySQL 中,我們可以使用 IFNULL() 函數,如下所示:
SELECT ProductName,UnitPrice*(UnitsInStock+IFNULL(UnitsOnOrder,0)) FROM Products
- 或者我們可以使用 COALESCE() 函數,如下所示:
SELECT ProductName,UnitPrice*(UnitsInStock+COALESCE(UnitsOnOrder,0)) FROM Products
十九、MySQL 數據類型
1. 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 可存儲一個以上的選擇。
2. Number 類型:
- TINYINT(size) 帶符號-128到127 ,無符號0到255。
- MALLINT(size) 帶符號範圍-32768到32767,無符號0到65535, size 默認爲 6。
- MEDIUMINT(size) 帶符號範圍-8388608到8388607,無符號的範圍是0到16777215。 size 默認爲9
- INT(size) 帶符號範圍-2147483648到2147483647,無符號的範圍是0到4294967295。 size 默認爲 11
- BIGINT(size) 帶符號的範圍是-9223372036854775808到9223372036854775807,無符號的範圍是0到18446744073709551615。size 默認爲 20
- FLOAT(size,d) 帶有浮動小數點的小數字。在 size 參數中規定顯示最大位數。在 d 參數中規定小數點右側的最大位數。
- DOUBLE(size,d) 帶有浮動小數點的大數字。在 size 參數中規顯示定最大位數。在 d 參數中規定小數點右側的最大位數。
- DECIMAL(size,d) 作爲字符串存儲的 DOUBLE 類型,允許固定的小數點。在 size 參數中規定顯示最大位數。在 d 參數中規定小數點右側的最大位數。
以上的 size 代表的並不是存儲在數據庫中的具體的長度,如 int(4) 並不是只能存儲4個長度的數字。
實際上int(size)所佔多少存儲空間並無任何關係。int(3)、int(4)、int(8) 在磁盤上都是佔用 4 btyes 的存儲空間。就是在顯示給用戶的方式有點不同外,int(M) 跟 int 數據類型是相同的。
例如:
1、int的值爲10 (指定zerofill)
int(9)顯示結果爲000000010
int(3)顯示結果爲010
就是顯示的長度不一樣而已 都是佔用四個字節的空間
3. Date 類型:
- DATE() 日期。格式:YYYY-MM-DD
註釋:支持的範圍是從 ‘1000-01-01’ 到 ‘9999-12-31’ - DATETIME() *日期和時間的組合。格式:YYYY-MM-DD HH:MM:SS
註釋:支持的範圍是從 ‘1000-01-01 00:00:00’ 到 ‘9999-12-31 23:59:59’ - TIMESTAMP() *時間戳。TIMESTAMP 值使用 Unix 紀元(‘1970-01-01 00:00:00’ UTC) 至今的秒數來存儲。格式:YYYY-MM-DD HH:MM:SS
註釋:支持的範圍是從 ‘1970-01-01 00:00:01’ UTC 到 ‘2038-01-09 03:14:07’ UTC - TIME() 時間。格式:HH:MM:SS
註釋:支持的範圍是從 ‘-838:59:59’ 到 ‘838:59:59’
即便 DATETIME 和 TIMESTAMP 返回相同的格式,它們的工作方式很不同。在 INSERT 或 UPDATE 查詢中,TIMESTAMP 自動把自身設置爲當前的日期和時間。TIMESTAMP 也接受不同的格式,比如 YYYYMMDDHHMMSS、YYMMDDHHMMSS、YYYYMMDD 或 YYMMDD。