SQL 中級教程

一、LIMIT

  1. 從 “Websites” 表中選取頭兩條記錄
    SELECT * FROM Websites LIMIT 2;
    在這裏插入圖片描述

二、LIKE

  1. 選取 name 以字母 “G” 開始的所有客戶
    SELECT * FROM Websites WHERE name LIKE 'G%';
    在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述
  2. 通過使用 NOT 關鍵字,您可以選取不匹配模式的記錄。
    下面的 SQL 語句選取 name 不包含模式 “oo” 的所有客戶:在這裏插入圖片描述

三、通配符

通配符 描述
% 替代 0 個或多個字符
_ 替代 1 個字符
[charlist] 字符列中的任何單一字符
[^charlist]或[!charlist] 不在字符列中的任何單一字符
  1. MySQL 中使用 REGEXP 或 NOT REGEXP 運算符 (或 RLIKE 和 NOT RLIKE) 來操作正則表達式。
    下面的 SQL 語句選取 name 以 “G”、“F” 或 “s” 開始的所有網站:
    SELECT * FROM Websites WHERE name RLIKE '^[FGs]';
    在這裏插入圖片描述
  2. 選取 name 以 A 到 H 字母開頭的網站
    3.
  3. 不以A-H開頭
    4.

四、IN

1. 選取 name 爲 “Google” 或 “菜鳥教程” 的所有網站:

在這裏插入圖片描述

五、BETWEEN

  1. 選取 alexa 介於 1 和 20 之間的所有網站
    SELECT * FROM Websites WHERE alexa BETWEEN 1 AND 20;在這裏插入圖片描述
  2. 選取 alexa 介於 1 和 20 之間但 country 不爲 USA 和 IND 的所有網站
    3.
  3. 選取 name 以介於 ‘A’ 和 ‘H’ 之間字母開始的所有網站
    4.
  4. 選取 name 不介於 ‘A’ 和 ‘H’ 之間字母開始的所有網站
    5.
  5. date 介於 ‘2016-05-10’ 和 ‘2016-05-14’ 之間的所有訪問記錄:在這裏插入圖片描述

六、別名

  1. 指定了兩個別名,一個是 name 列的別名,一個是 country 列的別名。提示:如果列名稱包含空格,要求使用雙引號或方括號:
    SELECT name AS n,country AS c FROM Websites;在這裏插入圖片描述
  2. 把三個列(url、alexa 和 country)結合在一起,並創建一個名爲 “site_info” 的別名:在這裏插入圖片描述
  3. 指定表別名 “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” 列聯繫起來的。
在這裏插入圖片描述

  1. INNER JOIN 關鍵字在表中存在至少一個匹配時返回行,INNER JOIN 與 JOIN 是相同的。在這裏插入圖片描述
    INNER JOIN 關鍵字在表中存在至少一個匹配時返回行。如果 “Websites” 表中的行在 “access_log” 中沒有匹配,則不會列出這些行

  2. 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)中沒有匹配。

  3. RIGHT JOIN 關鍵字從右表(table2)返回所有的行,即使左表(table1)中沒有匹配。如果左表中沒有匹配,則結果爲 NULL。在這裏插入圖片描述在某些數據庫中,RIGHT JOIN 稱爲 RIGHT OUTER JOIN。
    4. RIGHT JOIN 關鍵字從右表(Websites)返回所有的行,即使左表(access_log)中沒有匹配。

  4. 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 語句中的列名。
  1. 從 “Websites” 和 “apps” 表中選取所有不同的country(只有不同的值):
    select country from Websites union select country from apps;在這裏插入圖片描述
  2. 使用 UNION ALL 從 “Websites” 和 “apps” 表中選取所有的country(也有重複的值):在這裏插入圖片描述
  3. 使用 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 約束,那麼此約束會基於行中其他列的值在特定的列中對值進行限制。

  1. 在 “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) )
  2. 如需命名 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') )
  3. 當表已被創建時,如需在 “P_Id” 列創建 CHECK 約束,請使用下面的 SQL
    ALTER TABLE Persons ADD CHECK (P_Id>0)
  4. 如需命名 CHECK 約束,並定義多個列的 CHECK 約束,請使用下面的 SQL 語法:
    ALTER TABLE Persons ADD CONSTRAINT chk_Person CHECK (P_Id>0 AND City='Sandnes')
  5. 如需撤銷 CHECK 約束,請使用下面的 SQL:
    ALTER TABLE Persons DROP CHECK chk_Person

十一、DEFAULT 約束

  1. 下面的 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' )
  2. 通過使用類似 GETDATE() 這樣的函數,DEFAULT 約束也可以用於插入系統值:
    CREATE TABLE Orders ( O_Id int NOT NULL, OrderNo int NOT NULL, P_Id int, OrderDate date DEFAULT GETDATE() )
  3. 當表已被創建時,如需在 “City” 列創建 DEFAULT 約束,請使用下面的 SQL:
    ALTER TABLE Persons ALTER City SET DEFAULT 'SANDNES'
  4. 撤銷 DEFAULT 約束,請使用下面的 SQL:
    ALTER TABLE Persons ALTER City DROP DEFAULT

十二、索引 CREATE INDEX

  1. 在表上創建一個簡單的索引。允許使用重複的值:
    CREATE INDEX index_name ON table_name (column_name)
  2. 在表上創建一個唯一的索引。不允許使用重複的值:唯一的索引意味着兩個行不能擁有相同的索引值。
    Creates a unique index on a table. Duplicate values are not allowed: CREATE UNIQUE INDEX index_name ON table_name (column_name)
    希望索引不止一個列,您可以在括號中列出這些列的名稱,用逗號隔開

十三、撤銷索引、撤銷表以及撤銷數據庫

  1. DROP INDEX 語句用於刪除表中的索引。
    ALTER TABLE table_name DROP INDEX index_name
  2. DROP TABLE 語句用於刪除表。
    DROP TABLE table_name
  3. DROP DATABASE 語句用於刪除數據庫。
    DROP DATABASE database_name
  4. 如果我們僅僅需要刪除表內的數據,但並不刪除表本身,那麼我們該如何做呢?請使用 TRUNCATE TABLE 語句:
    TRUNCATE TABLE table_name

十四、ALTER TABLE

  1. 在 “Persons” 表中添加一個名爲 “DateOfBirth” 的列。
    我們使用下面的 SQL 語句:
    ALTER TABLE Persons ADD DateOfBirth date在這裏插入圖片描述
  2. 改變 “Persons” 表中 “DateOfBirth” 列的數據類型。
    我們使用下面的 SQL 語句:
    alter table Persons modify column DateOFBirth year;
  3. 刪除 “Person” 表中的 “DateOfBirth” 列。我們使用下面的 SQL 語句:
    ALTER TABLE Persons DROP COLUMN DateOfBirth
    在這裏插入圖片描述

十五、AUTO INCREMENT

  1. 把 “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、視圖還可以被嵌套,一個視圖中可以嵌套另一個視圖。

  1. 創建
    CREATE VIEW view_name AS SELECT column_name(s) FROM table_name WHERE condition
  2. 更新
    CREATE OR REPLACE VIEW view_name AS SELECT column_name(s) FROM table_name WHERE condition
  3. 刪除
    DROP VIEW view_name

十七、Date函數

  1. MySQL 中最重要的內建日期函數:

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

  1. 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 操作符。

  1. 在 MySQL 中,我們可以使用 IFNULL() 函數,如下所示:
    SELECT ProductName,UnitPrice*(UnitsInStock+IFNULL(UnitsOnOrder,0)) FROM Products
  2. 或者我們可以使用 COALESCE() 函數,如下所示:
    SELECT ProductName,UnitPrice*(UnitsInStock+COALESCE(UnitsOnOrder,0)) FROM Products

十九、MySQL 數據類型

1. Text 類型:

  1. CHAR(size) 保存固定長度的字符串(可包含字母、數字以及特殊字符)。在括號中指定字符串的長度。最多 255 個字符。
  2. VARCHAR(size) 保存可變長度的字符串(可包含字母、數字以及特殊字符)。在括號中指定字符串的最大長度。最多 255 個字符。註釋:如果值的長度大於 255,則被轉換爲 TEXT 類型。
  3. TINYTEXT 存放最大長度爲 255 個字符的字符串。
  4. TEXT 存放最大長度爲 65,535 個字符的字符串。
  5. BLOB 用於 BLOBs(Binary Large OBjects)。存放最多 65,535 字節的數據。
  6. MEDIUMTEXT 存放最大長度爲 16,777,215 個字符的字符串。
  7. MEDIUMBLOB 用於 BLOBs(Binary Large OBjects)。存放最多 16,777,215 字節的數據。
  8. LONGTEXT 存放最大長度爲 4,294,967,295 個字符的字符串。
  9. LONGBLOB 用於 BLOBs (Binary Large OBjects)。存放最多 4,294,967,295 字節的數據。
  10. ENUM(x,y,z,etc.) 允許您輸入可能值的列表。可以在 ENUM 列表中列出最大 65535 個值。如果列表中不存在插入的值,則插入空值。
    註釋:這些值是按照您輸入的順序排序的。
    可以按照此格式輸入可能的值: ENUM(‘X’,‘Y’,‘Z’)
  11. SET 與 ENUM 類似,不同的是,SET 最多隻能包含 64 個列表項且 SET 可存儲一個以上的選擇。

2. Number 類型:

  1. TINYINT(size) 帶符號-128到127 ,無符號0到255。
  2. MALLINT(size) 帶符號範圍-32768到32767,無符號0到65535, size 默認爲 6。
  3. MEDIUMINT(size) 帶符號範圍-8388608到8388607,無符號的範圍是0到16777215。 size 默認爲9
  4. INT(size) 帶符號範圍-2147483648到2147483647,無符號的範圍是0到4294967295。 size 默認爲 11
  5. BIGINT(size) 帶符號的範圍是-9223372036854775808到9223372036854775807,無符號的範圍是0到18446744073709551615。size 默認爲 20
  6. FLOAT(size,d) 帶有浮動小數點的小數字。在 size 參數中規定顯示最大位數。在 d 參數中規定小數點右側的最大位數。
  7. DOUBLE(size,d) 帶有浮動小數點的大數字。在 size 參數中規顯示定最大位數。在 d 參數中規定小數點右側的最大位數。
  8. 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 類型:

  1. DATE() 日期。格式:YYYY-MM-DD
    註釋:支持的範圍是從 ‘1000-01-01’ 到 ‘9999-12-31’
  2. DATETIME() *日期和時間的組合。格式:YYYY-MM-DD HH:MM:SS
    註釋:支持的範圍是從 ‘1000-01-01 00:00:00’ 到 ‘9999-12-31 23:59:59’
  3. 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
  4. TIME() 時間。格式:HH:MM:SS
    註釋:支持的範圍是從 ‘-838:59:59’ 到 ‘838:59:59’

即便 DATETIME 和 TIMESTAMP 返回相同的格式,它們的工作方式很不同。在 INSERT 或 UPDATE 查詢中,TIMESTAMP 自動把自身設置爲當前的日期和時間。TIMESTAMP 也接受不同的格式,比如 YYYYMMDDHHMMSS、YYMMDDHHMMSS、YYYYMMDD 或 YYMMDD。

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