SQL Notes
資料庫
創建資料庫
sql
CREATE DATABASE <database_name>;
CREATE DATABASE `<database_name>`;設定 utf-8 編碼
- 用
utf8_general_ci排序
sql
CREATE DATABASE <database_name>
CHARACTER SET utf8 COLLATE utf8_general_ci;列出所有資料庫
sql
SHOW DATABASES;刪除資料庫
sql
DROP DATABASE <database_name>;
DROP DATABASE `<database_name>`;選擇資料庫
sql
USE <database_name>;
USE `<database_name>`;資料表
型態
| 型態 data_type | 描述 |
|---|---|
| INT | 整數 |
| FLOAT (n) | 浮點數 ( 較不精確,最大位數 n ) |
| DECIMAL (m, n) | 浮點數 ( 較精確,總共 m 位數、小數點後有 n 位 ) |
| VARCHAR (n) | 字串 ( 最多存放 n 個字元,最大值 255 ) |
| CHAR (n) , CHARACTER (n) | 固定長度字串 |
| BLOB | Binary large object 圖片、影片、檔案... |
| DATE | YYYY-MM-DD 日期 |
| TIMESTAMP | YYYY-MM-DD HH:MM:SS 時間 |
創建資料表
限制 Constraint
PRIMARY KEY:用於資料的唯一識別,不能重複NOT NULL:強制該欄位一定要給定值 ( 不能是NULL)UNIQUE:所有值不能重複DEFAULT:如果欄位沒有值,會自動定預設值AUTO_INCREMENT:自動+1 ( 不用自己手動更新 id )
sql
CREATE TABLE `<table_name>`(
`<id>` INT PRIMARY KEY AUTO_INCREMENT,
`<column_name>` <data_type>,
`<column_name>` <data_type> NOT NULL,
`<column_name>` <data_type> UNIQUE,
`<column_name>` <data_type> DEFAULT <value>,
);sql
CREATE TABLE `<table_name>`(
`<id>` INT AUTO_INCREMENT,
`<column_name>` <data_type>,
`<column_name>` <data_type> NOT NULL,
`<column_name>` <data_type> UNIQUE,
`<column_name>` <data_type> DEFAULT <value>,
PRIMARY KEY(`<id>`)
);設定 Foreign Key
將 column_nameA 對應到 table_name1 表格的 column_name2 屬性
sql
CREATE TABLE `<table_name1>`(
`<id>` INT PRIMARY KEY,
`<column_name1>` <data_type>,
`<column_name2>` <data_type>,
);
CREATE TABLE `<table_name2>`(
`<id>` INT PRIMARY KEY,
`<column_nameA>` <data_type>,
`<column_nameB>` <data_type>,
FOREIGN KEY (`column_nameA`) REFERENCES `table_name1`(`<column_name2>`) ON DELETE SET NULL
);Foreign Key 刪除 / 更新限制
sql
ON DELETE <Constraints>
ON UPDATE <Constraints>| Constraints | 描述 |
|---|---|
RESTRICT | ( 預設情況 ) 拒絕被刪除 / 更改 |
SET NULL | 刪除 / 更新了父表中的一條記錄,那麼子表中 Foreign Key 相應記錄的字段將設置為 NULL |
SET DEFAULT | 刪除 / 更新了父表中的一條記錄,那麼子表中 Foreign Key 相應記錄的字段將設定為默認值 |
CASCADE | 刪除 / 更新了父表中的一條記錄,那麼子表中 Foreign Key 相應記錄將被刪除 / 更新 |
在舊表格上補上 Foreign Key
sql
ALTER TABLE `<table_name1>`
ADD FOREIGN KEY (`<column_name1>`)
REFERENCES `<table_name2>`(`<column_nameB>`)
ON DELETE SET NULL;創建 view ( 視觀表 )
將搜尋出來建立的表暫存起來
sql
CREATE VIEW `<view_table_name>` AS (SELECT ... FROM ... WHERE ...);查看資料表
屬性和其型別、限制 ( 是顯示定義,不是內容 )
sql
DESCRIBE `<table_name>`;列出所有資料表
sql
SHOW TABLES;刪除資料表
sql
DROP TABLE `<table_name>`;刪除 view
sql
DROP VIEW `<view_table_name>`;屬性
新增屬性
sql
ALTER TABLE `<table_name>` ADD <column_name> <data_type>;刪除屬性
sql
ALTER TABLE `<table_name>` DROP COLUMN <column_name>;儲存資料
- 字串要記得用單、雙引號
NULL:空白
sql
INSERT INTO `<table_name>` VALUES(<id_value>, <column_value>, ...);- 可更改填入屬性的順序
- 沒有被填到的屬性則視為
NULL
sql
INSERT INTO `<table_name>`(`<column_name>`, `<id>`, ...)
VALUES(<column_value>, <id_value>, ...);列出表格內所有資料
*意旨全部
sql
SELECT * FROM `<table_name>`;修改資料
更新 table_name 內的資料
WHERE 判斷
| 運算子 | 作用 |
|---|---|
| = | 等於 |
| !=、<> | 不等於 |
| > | 大於 |
| < | 小於 |
| >= | 大於等於 |
| <= | 小於等於 |
將 column_name 裡為 column_value 都更新改成 new_column_value
sql
UPDATE <table_name>`
SET `<column_name>` = "<new_column_value>"
WHERE `<column_name>` = "<column_value>";- 也可以判斷非本身的 column_value 去更新其他 column_value
sql
UPDATE <table_name>`
SET `<column_name>` = "<new_column_value>"
WHERE `<column_name_2>` = "<column_value_2>";SET可以一次設定多個 ( 以逗點,相隔 )WHERE也可以判斷多個條件- 若沒有寫
WHERE,則將 column_name 屬性內容全部更新
sql
UPDATE `<table_name>`
SET `<column_name_x>` = "<new_column_value_x>",
`<column_name_y>` = "<new_column_value_y>"
WHERE `<column_name_2>` = "<column_value_2>" OR
`<column_name_3>` = "<column_value_3>";刪除資料
寫條件式判斷要刪除哪些資料 ( 符合即刪除 )
sql
DELETE FROM `<table_name>`
WHERE `<column_name>` = "<column_value>";- 若沒有寫
WHERE,則將資料表內全部清空
sql
DELETE FROM `<table_name>`取得、搜尋資料
取得特定屬性資料
sql
SELECT `<column_name>` FROM `<table_name>`;- 可以一次選擇多個
sql
SELECT `<column_name>`, `<column_name2>`... FROM `<table_name>`;- 運用判斷式列出需要的資料
sql
SELECT * FROM `<table_name>`
WHERE `<column_name>` = "<column_value>";- 運用判斷式列出屬性內容符合 string 的資料
sql
SELECT * FROM `<table_name>`
WHERE `<column_name>` IN("string1", "string2", ...);sql
SELECT * FROM `<table_name>`
WHERE `<column_name>` = "string1" OR `<column_name>` = "string2" OR ...;- 也可以從搜尋表中再搜尋 ( 巢狀查詢 ) 藉由另一個資料表內容作為此資料表的搜尋判斷條件 需要反過來的情況可以使用
NOT IN
sql
SELECT DISTINCT * FROM `<table_name>`
WHERE `<column_name>` IN(SELECT `<column_name>` FROM ... WHERE ...);| 運算子 | 意義 |
|---|---|
ANY | 任何一個滿足就回傳 True |
SOME | 任何一個滿足就回傳 True |
ALL | 全部滿足才回傳 True |
- 此欄位的值需要大於全部的搜索表內容條件的欄位值才會被顯示 (範例)
sql
SELECT DISTINCT * FROM `<table_name>`
WHERE `<column_name>` > ALL(SELECT `<column_name>` FROM ... WHERE ...);- 搜尋在另一個資料表內有存在的欄位才會被顯示 需要反過來的情況可以使用
NOT EXISTS
sql
SELECT * FROM `<table_name1>`
WHERE EXISTS
(SELECT * FROM `<table_name2>` WHERE <table_name2>.id=<table_name1>.id);- UNION
- 用來將兩個(以上) SQL 查詢的結果合併起來,而由 UNION 查詢中各別 SQL 語句所產生的欄位需要是相同的資料型別及順序。
- 查詢只會回傳不同值的資料列,有如
SELECT DISTINCT。 UNION ALL則會列出所有的資料,不論是否重複。- 像是 OR (聯集),如果紀錄存在於第一個查詢結果集或第二個查詢結果集中,就會被取出。
sql
SELECT <column_name1> FROM <table_name1>
UNION
SELECT <column_name2> FROM <table_name2>;UNION 與 JOIN 不同的地方在於,JOIN 是作橫向結合 (合併多個資料表的各欄位);而 UNION 則是作垂直結合 (合併多個資料表中的紀錄)。
- Joined Tables LEFT JOIN 會回傳左側資料表中所有資料,就算沒有符合連接條件,而右側資料表中如果沒有匹配的資料值就會顯示為
NULL。
sql
SELECT <table_column1>, <table_column2>...
FROM <table_name1>
LEFT JOIN <table_name2>
ON <table_name1>.<column_name>=<table_name2>.<column_name>;取得資料並根據特定屬性排序
根據 column_name 屬性的資料去做排序
sql
SELECT * FROM `<table_name>` ORDER BY `<column_name>`;- 將排序由高到低
ASC:由低到高 ( 預設 ) DESC:由高到低
sql
SELECT * FROM `<table_name>` ORDER BY `<column_name>` DESC;- 若根據第一個屬性排序相同,則再根據第二個屬性做排序
sql
SELECT * FROM `<table_name>` ORDER BY `<column_name>`, `<column_name2>`;限制回傳資料數量
列出前 number 筆資料
sql
SELECT * FROM `<table_name>` LIMIT <number>;- 可先做排序再列出有限資料
sql
SELECT * FROM `<table_name>` ORDER BY `<column_name>` LIMIT <number>;限制重複回傳
若 table_value 有重複的,則只會回傳第一個
sql
SELECT DISTINCT `<column_name>` FROM `<table_name>`;聚合函式 Aggregate Functions
- 回傳此 table 的資料數量
sql
SELECT COUNT(*) FROM `<table_name>`;- 回傳此屬性內有值 ( 非 NULL ) 的資料數量
sql
SELECT COUNT(`<column_name>`) FROM `<table_name>`;- 回傳符合條件的資料數量
sql
SELECT COUNT(*) FROM `<table_name>`
WHERE <條件判斷>;- 回傳此屬性的值做總和
sql
SELECT SUM(`<column_name>`) FROM `<table_name>`;- 回傳此屬性的值做平均
sql
SELECT AVG(`<column_name>`) FROM `<table_name>`;- 回傳此屬性內最大的值
sql
SELECT MAX(`<column_name>`) FROM `<table_name>`;- 回傳此屬性內最小的值
sql
SELECT MIN(`<column_name>`) FROM `<table_name>`;- 可以根據欄位名稱做分類群組
sql
SELECT AVG(`<column_name>`) FROM `<table_name>` GROUP BY `<column_name>`;- 對函式產生的值來設定條件 如果被
SELECT的只有函式欄, 那就不需要GROUP BY子句。 因為函式產生的值不能使用WHERE
sql
SELECT `<column_name1>`, SUM(`<column_name2>`)
FROM `<table_name>`
GROUP BY `<column_name1>`
HAVING (<function condition>);萬用字元 Wildcards
TIP
%:代表多個字元。_:代表 1 個字元。
- 列出此屬性的值開頭為 string 的資料
sql
SELECT * FROM `<table_name>`
WHERE `<column_name>` LIKE 'string%';- 列出此屬性的值尾端為 string 的資料
sql
SELECT * FROM `<table_name>`
WHERE `<column_name>` LIKE '%string';- 列出此屬性的值中間有 string 的資料
sql
SELECT * FROM `<table_name>`
WHERE `<column_name>` LIKE '%string%';