---
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 "陳%";
```