--- title: SQL基本指令語法 tags: MySQL/MariaDB資料庫 --- SQL基本語法操作 === 符號: * 上引號:` ` => 用來包住資料表及欄位名稱 * 單引號:' ' => 包住字串及值 * 分號 : ; => 句子結尾 INSERT 新增/插入 --- ```sql= INSERT INTO `資料表名稱` (`欄位1`,`欄位2`,`欄位3`) VALUES('欄位1內容','欄位2內容','欄位3內容') ``` UPDATE 更新 --- * 一定要加WHERE 不然會把整個資料表的這幾個欄位都改成此次更新的內容 例:更新 資料表 欄位1的內容 改成 新的內容 id是需要改變的那一筆資料 ```sql= UPDATE `資料表名稱` SET `欄位1`='欄位1內容', `欄位2`='欄位2內容' WHERE `id`='id'; ``` DELETE 刪除 --- * 軟刪除 Soft Delete= 標記被刪除 類似資源回收桶的功能 例:刪除 資料表 id欄位的 id欄位內的內容 ```sql= DELETE FROM `資料表名稱` WHERE `id`='id'; ``` SELECT 查詢 --- * 只做讀取的動作 不會做破壞資料庫內容的操作 例:查詢 資料表 id欄 19筆資料 ```sql= SELECT * FORM `資料表名稱` WHERE `id`<20 ``` 例:想查詢 資料表 欄位1 欄位2 序號100-200的資料 ```sql= SELECT `想顯示的欄位1` as '欄位名稱1想要顯示成什麼名稱' , `想顯示的欄位2` as '欄位名稱2想要顯示成什麼名稱' FORM `資料表名稱` WHERE `id`<100 OR `id`>200 ``` IN 特殊指定 --- 例:想查詢 資料表 id編號 23 36 98 ```sql= SELECT * FROM `資料表名稱` WHERE `id` IN ('23' , '36' , '98'); ``` BETWEEN 兩者之間 --- * 小的在前 大的在後 * 等同給大於小於的條件式搜尋 例 :查詢資料表 id 編號 `小的數字`到`大的數字`的內容 ```sql= SELECT * FROM `資料表名稱` WHERE `id` BETWEEN `小的數字` AND `大的數字` 等同 SELECT * FROM `資料表名稱` WHERE `id` >= '小的數字' AND `id` <= '大的數字' ``` ORDER BY 排序 --- * ASC  遞增排序 (預設) * DESC 遞減排序 例:查詢 資料表 id 49以內的資料 排序方式 ```sql= SELECT * FROM `資料表` WHERE `id`<=49 ORDER BY `id` ASC; 或者 SELECT * FROM `資料表` WHERE `id`<=49 ORDER BY `id` DESC; 也可以進行兩次的排序 SELECT * FROM `資料表` ORDER BY `欄位1` ASC, `欄位2` DESC; ``` GROUP BY 群組 --- 例:把表單 的 欄位1 跟(欄位2 取3位數排序) ```sql= SELECT `欄位1`, SUBSTRING(`欄位2`,1,3) as '欄位2要顯示的名稱' FROM`表單` GROUP BY`欄位1`, SUBSTRING(`欄位2`,1,3); ``` LIMIT 限制筆數 --- * 索引值從0開始,0是第一筆 例: 找表單前20筆資料 找表單11-20筆資料 ```sql= SELECT * FROM `表單` LIMIT 20; SELECT * FROM `表單` LIMIT 10,20; ``` 聚合函式(數學函式) --- |函式|用途| | -------- | -------- | | AVG | 計算欄位的平均值 | | COUNT | 計算查詢結果的筆數 | | MAX | 取出欄位中的最大值 | | MIN | 取出欄位中的最小值 | | SUM | 計算欄位中的總計 | 例:在表單中找出欄位1最大單位的資料 ```sql= SELECT max(`欄位1`), as 'MAX' FROM `表單` GROUP BY(`欄位1`); SELECT min(`欄位1`), as 'MIN' FROM `表單` GROUP BY(`欄位1`); SELECT `欄位1`, count(`欄位2`) as '數量詞' FROM `表單` GROUP BY(`欄位1`); ``` 字串函式 --- |函式|用途| | -------- | -------- | | CHAR_LENGTH | 取得字串的長度(多字元及字集方式) | | LENGTH | 取得字串的長度(bytes) | | CONCAT | 字串合併 | | GROUP_CONCAT | 將GROUP BY結果中的某個欄位內容串成字串 | | LEFT | 取出左邊開始的指定長度字串 | | RIGHT | 取出右邊開始的指定長度字串 | | SUBSTRING | 取出指定位置開始的指定長度字串 | ```sql= SELECT CONCAT(`欄位1`,"-",`欄位2`) FROM `表單` LIMIT 10; ``` 日期/時間函式 --- |函式 |用途| | -------- | -------- | |CURRENT_DATE |當前的系統日期| |CURRENT_TIME |當前的系統時間| |NOW |當前的系統日期及時間| |DATEDIFF |計算兩個日期間差距的天數| |TIMESTAMPDIFF| 計算兩個日期時間差距的單位,可選擇要返回的數值是時間還是日期| |YEAR |取出日期時間格的資料 年的部份| |MONTH |取出日期時間格的資料 月的部份| |DATE |取出日期時間格的資料 日期的部份| |HOUR |取出日期時間格的資料 小時的部份| |MINUTE |取出日期時間格的資料 分鐘的部份| |SECOND |取出日期時間格的資料 秒的部份| 例:找出表單裡面欄位1每個月的人數 ```sql= SELECT Month(`欄位1`) as '月份', COUNT (*) as '人數' FROM `表單` GROUP BY MONTH(`欄位1`) ORDER BY MONTH(`欄位1`) ``` 例:算出 40筆 表單 時間距/365=年齡 ```sql= SELECT `name` , FLOOR(DATEDIFF(CURRENT_DATE(),`birthday`)/365)as'年齡', FROM `表單` LIMIT 40 ``` 例:找出表單內10個人下次生日天數 ```sql= SELECT `name` ,`birthday`, FLOOR(DATEDIFF(CURRENT_DATE(),`birthday`)/365) AS '年齡' , IF (DATEDIFF(CURRENT_DATE(),REPLACE(`birthday`,LEFT(`birthday`,4), LEFT(CURRENT_DATE(),4))) > 0 , 365-DATEDIFF(CURRENT_DATE(),REPLACE(`birthday`,LEFT(`birthday`,4),LEFT(CURRENT_DATE(),4))), 0-DATEDIFF(CURRENT_DATE(),REPLACE(`birthday`,LEFT(`birthday`,4),LEFT(CURRENT_DATE(),4)))) as '下次生日天數' FROM `students` LIMIT 10; ``` 流程控制函式 --- |函式| 用途| | -------- | -------- | |CASE |類似switch case的用法| |IF |和if else一樣的用法| |IFNULL |判斷第一個參數是否為null,決定返回的值| Inner Join內部結合查詢 --- * 內部結合查詢的結果只會出現所有資料夾的共有內容 * Inner Join跟Out Join都稱為聯表查詢 * 內部查詢的前提是資料表要設關聯 * 兩邊的資料表要共有資料 * 如面試有要求使用inner join語法的話是用上面的指令 * 初學者建議用下面的指令 ```sql= SELECT * FROM `表單1` INNER JOIN `表單2` ON `表單1`.`id` = `表單2`.`1_id` 簡化成 SELECT * FROM `表單1` , `表單2` WHERE `表單1`.`id` = `表單2`.`1_id` ``` Out Join外部結合查詢 --- * 固定一張資料表的內容 * 結合另一張表就算沒有對應資料也會留下固定資料表內的內容 * 分成左結合跟右結合 * Left Join(左結合) ```sql= SELECT * FROM '表單1' LEFT JOIN `表單2` ON `表單1` . `id` = `表單2` . `1_id` ``` * Right Join(右結合) ```sql= SELECT * FROM '表單1' LEFT JOIN `表單2` ON `表單1` . `id` = `表單2` . `2_id` ``` 子查詢(SubQuery) --- * 屬於比較進階的應用 * 資料表關聯變得複雜或者需要特殊查詢時使用 * 通常是電商或者材料行那種很多細項的才會使用子查詢 * 在Select區段的子查詢 * Select的子查詢大多是一個值的結果 例:要查詢學生的成績及全班平均分數 ```sql= SELECT `class_code` as `班級`, count("*") as "人數" , (SELECT count(*) FROM `class_student`) as '總人數' FROM `class_student` GROUP BY `class_code` ``` * 在from區段的子查詢 * 其結果被視為是一張資料表 * 等同做了一次結合查詢 * 通常是梆子查詢的結果命名一個暫時的表名 例:students表單的id跟students的score及A表單的address FROM students這張表裡取得的結果 命名為A 條件是students的id=A的id ```sql= SELECT `students`.`id`,`students`.`score`,`A`.`address` FROM `students`,(SELECT `id`,`address` FROM `private`)A WHERE `students`.`id`=`A`.`id` ``` * 在where(join)區段的子查詢 正規表達式 === * 一種用來描述字串 符合某個語法規則的模型 LIKE模糊查詢 === * 用LIKE來查詢模糊條件 * 搭配%符號來查詢符合條件的資料 例:找出table裡面name項目下姓陳的人 ```sql= SELECT * FROM `table` WHERE `name` LIKE "陳%"; ```