# 2 、 How to speak MySQL ###### tags: `BE101` `PHP` `2020九月第四周` `進度筆記` `Lidemy心得` ## SQL 指令 - 基本語法 在資料庫 mentor.qoo 執行 SQL 查詢: ### 查詢 `SELECT` 指令 : 找符合條件的資料。 - 可以用行內編輯來更改。 ``` SELECT * FROM `table 名稱` ``` `*` 星號表示欄位名稱,可以找所有欄位,或是不用星號直接用數字,則會顯示數字。 - 可以 `SELECT id, title` , 如果沒有 `title` 的欄位則會顯示錯誤訊息。 - `SELECT id as name` 可以讓欄位名稱改變,但資料內容不便。 - `SELECT * FROM `table 名稱` WHERE id = 2` 可以查詢 id 為 2 的資料。 - `SELECT * FROM `table 名稱` WHERE username = '查詢條件' and id = 2` 可以查詢符合 '查詢條件' 和 'id' 的資料。 - `SELECT * FROM `table 名稱` WHERE username = '查詢條件' or id = 2` 可以查詢符合兩者中其中一方條件的資料。 - WHERE 1 會把所有資料撈出來,後面常接 一兩筆資料條件。 - 簡單字串操作,數學邏輯運算也可以運用在 SELECT 。 *** ### 新增 `INSERT` 指令 : 新增、插入資料。 - `INSERT INTO` : ``` INSERT INTO `table 名稱`(`id`, `username`, `content`, `created_at`) VALUES ([value-1],[value-2],[value-3],[value-4]) ``` - `()` 內是插入資料的欄位名稱;如果 `id` 預設是自動增加就可以拿掉, `created_at` 預設是現在時間點也可以拿掉。 - `()` 內的反引號 `` 去掉也可以(大多情形下);除非欄位名稱有特殊字元,像是叫做 `INSERT INTO`, 會造成混淆,會被解釋成 SQL 指令的一部分,造成出錯。 - 很多 SQL 語法都會用大寫來表示,跟自訂的欄位名稱或是字串區別。 ``` INSERT INTO `table 名稱` (username, content) VALUES ("username01", "content01") ``` 執行後,表示寫入一筆資料到 `table 名稱` , 該筆資料的 `username` 是 "username01" ; `content` 是 "content01" 。 *** ### 修改 `UPDATE` 指令 : 修改、編輯資料。 ``` UPDATE `table 名稱` SET `id`=[value-1], `username`=[value-2], `content`=[value-3], `created_at`=[value-4] WHERE id = 1 ``` 這是固定語法, --- 如果用: ``` UPDATE `table 名稱` SET username = "abc" ``` 這樣會影響到所有資料(table) , 但這種要改變所有資料的情況很少,因此要改變到指定的資料會設指定欄位: 如 , `WHERE id=1` , 這樣會改變 id 是 1 的單筆資料。 --- ``` UPDATE `table 名稱` SET username = "user02", content = "content02" WHERE id = 2 ``` 這樣會改變欄位 id = 2 , 並新增 username 為 "user02" 和 content 為 "content02" 的資料進去。 回 "瀏覽" 去看可以看到變動。 ![](https://i.imgur.com/DYbfdsp.png) *** ### 刪除 `DELETE` 指令 : 刪除資料。 - 指定條件,符合條件者均會被刪除。 ``` DELETE FROM `table 資料` WHERE 0 ``` 執行後會出現確認畫面問你是否刪除。 ![](https://i.imgur.com/6lvrT94.png) 這樣不會刪除資料,因為 WHERE 0 沒有符合任何資料。 --- 如果用: ``` DELETE FROM `table 資料` WHERE id = 2 ``` 這樣會直接把 id = 2 的欄位資料刪除。 --- ### 回溯時間 很多時候的系統內刪除,不是真正的刪除。 - 有些訂單、會員等重要的資料是需要保留的資料。 - 因此有時候會設一個 `is_deleted` 的欄位標籤。 - 而不是直接用 DELETE 刪除。 - 缺點是對於資料庫的空間來說會一直佔據,檔案越來越多。 刪除時可能會在結構新增一個欄位(型態可能為 BOOLEAN) 像這樣: ``` id = 1 ; username = "user01";content = "something";is_deleted = "0";created_at = now the time ``` 在前台刪除資料的時候,可能會在後台把 `is_deleted` 設成 1 ,下的指令可能如下: ``` SELECT * FROM `table 資料` WHERE is_deleted = 0 ``` 會把被刪除的資料顯示給 user 看,但對資料庫來說仍然存在(有標誌、保存 LOG),因此誤刪的情況下還會救回來。 ---