---
# System prepended metadata

title: SQL筆記
tags: [教學紀錄]

---

SQL筆記
===
![downloads](https://img.shields.io/github/downloads/atom/atom/total.svg)
![build](https://img.shields.io/appveyor/ci/:user/:repo.svg)
![chat](https://img.shields.io/discord/:serverId.svg)

## 目錄章節

[TOC]


{%hackmd BJrTq20hE %}


## 語法教學

### 範例1 : Student 表格與 score 表格進行撈取

![](https://i.imgur.com/ffOUE8Y.png)


```SQL=
--多欄位用逗點區隔
select 欄位1,欄位2
 ```
![](https://i.imgur.com/NsIrYWT.png)

```SQL=
#計算指定欄位數目
count
```
```SQL=
SELECT COUNT("欄位名")
FROM "表格名";
```
```SQL=
# 依照某欄位進行群組分類
group by
```
```SQL=
SELECT "欄位1", SUM("欄位2")
FROM "表格名"
GROUP BY "欄位1";
```
```SQL=
#後面不要空白 聚合函數放在最後面
count +group by
count 
```
 ![](https://i.imgur.com/B040HqX.png)

```SQL=
SELECT COUNT("欄位名")
FROM "表格名";
Group by “欄位名";
```

![](https://i.imgur.com/t2xpNSM.png)



### 範例2 : 表格連接 Join

```SQL=
--有交集的部分才帶出來
inner join
--不管有沒有交集全列出
full join 
--左邊(右邊)的表有交集才帶出來
left right join 
```
![](https://i.imgur.com/jWxtpTw.png)

![](https://i.imgur.com/KYqRy27.png)


```SQL=
where
--設立條件將資料撈出來
SELECT "欄位名"
FROM "表格名"
WHERE "條件";


where  and --兩個條件都符合
where  or --符合其中一個條件
字串 ＝'  '
數字 , 日期 ：欄位   >=< 關鍵數字
```

#### AND

找出生日大於1990年且小於1992年的人
![](https://i.imgur.com/DlGcKEE.png)

找出生日為1989-07-01和1990-01-20的人
![](https://i.imgur.com/sQTznpL.png)


#### OR

找出id等於01號或02號或08號的人
![](https://i.imgur.com/C6MnDzH.png)



### 範例3 : 數字

找出生日在1990之後的人
![](https://i.imgur.com/6NWRTaV.png)


 
#### 題目:
#### 查詢”01"課程比”02"課程成績高的學生的資訊及課程分數
```SQL=
 a2.* # 星號[全部表格]
where 沒有限制幾個and, or
```

結構說明:
```SQL=
SELECT  欄位別名 - 將s_score 取別名為a1,a3(將s_score 創建a1與a3欄位來顯示)只要別名不重複就可以
FROM  score表格別名為a1 , student 表格別名為a2 , score表格別名為a3 (別名不重複即可)
WHERE a1.s_id欄位連結a2.s_id欄位 AND a1.c_id =’01’ and a3.c_id =’02’ 撈出c_id = 01和02
AND    a1.s_score > a3.s_score  撈出01大於02的成績
```
![](https://i.imgur.com/OnXKKlg.png)


顯示結果:
![](https://i.imgur.com/b79Bzdo.png)


### 範例4 : Order By


結構說明：

```SQL=
SELECT "欄位名"
FROM "表格名"
[WHERE "條件"]
ORDER BY "欄位名" [ASC, DESC]
```
==ASC 代表結果會以由小往大的順序列出，而 DESC 代表結果會以由大往小的順序列出==

==預設排序是ASC==

==多個欄位＝＝
==ORDER BY "欄位一" [ASC, DESC], "欄位二" [ASC, DESC]==


下圖為指定s_birth 由大到小排序

![](https://i.imgur.com/NBQ8wVj.png)




### 範例5 : in
結構說明：
```sql=
SELECT "欄位名"
FROM "表格名"
WHERE "欄位名" IN ('值一', '值二', ...)
```


下圖為找出三位人名、 撈出01號或08號或02號的同學
![](https://i.imgur.com/nb8G6Wt.png)


### 範例6：like
結構說明：

```sql=
SELECT "欄位名"
FROM "表格名"
WHERE "欄位名" LIKE '萬用字元關鍵字'
```

==% (百分比符號)：代表零個、一個、或數個字母。==

==_ (底線)：代表剛好一個字母。==



下圖為找出姓氏為'王'的同學
![](https://i.imgur.com/r6dW1d6.png)


### 範例7:Trim （去除空白）


```sql=
SELECT TRIM ('   Sample   ');
'Sample'
SELECT LTRIM ('   Sample   ');
'Sample   '
SELECT RTRIM ('   Sample   ');
'   Sample'
```
==TRIM 去掉開頭跟結尾的空白
LTRIM 去掉開頭
RTRIM 去掉結尾==

![](https://i.imgur.com/iqVEvR6.png)


### 範例8:AVG

```sql=
SELECT AVG("欄位名")
FROM "表格名";
```
```sql=
SELECT AVG(Sales) FROM Store_Information;
```

![](https://i.imgur.com/Vsj14Ey.png)



### 範例9:count
```sql=
SELECT COUNT("欄位名")
FROM "表格名";
```
==Is not null > 反向思考 若沒指定不是空白 則會連空值一併計算==

==聚合函數後面都要括號==

![](https://i.imgur.com/NPz5mSC.png)

1.下圖為計算S_name不計算重複的學生

==distinct 篩掉重複的==
![](https://i.imgur.com/j1gxpJX.png)

2.下圖為計算S_name學生有幾位

![](https://i.imgur.com/p2sLPqq.png)

### 範例10: MAX
```sql=
SELECT MAX ("欄位名")
FROM "表格名";
```
下圖為找出s_score最高分者
![](https://i.imgur.com/juLtn8L.png)

### 範例11:Min
```sql=
SELECT MIN ("欄位名")
FROM "表格名";
```
下圖為找出s_score最低分者
![](https://i.imgur.com/tnyGlDP.png)

### 範例12:Sum
```sql=
SELECT SUM ("欄位名")
FROM "表格名";
```
下圖為加總s_id='02'的學生分數
![](https://i.imgur.com/Xc8nDA9.png)

### 範例13:Group by

```sq;=
SELECT "欄位1", SUM("欄位2")
FROM "表格名"
GROUP BY "欄位1";

```

==1.撈全部欄位 聚合函數放後面
2.如果是用聚合函數以外的欄位 全部都要放在group by的條件==

==有group by出來的欄位 都要特別select出來==

==1.where ....group by
2.group by ....having==


以s_id為群組做全體學生分數加總
![](https://i.imgur.com/5uAuId1.png)


### 範例14:Having

```sql=
SELECT "欄位1", SUM("欄位2")
FROM "表格名"
GROUP BY "欄位1"
HAVING (函數條件);
```
```sql=
SELECT Store_Name, SUM(Sales)
FROM Store_Information
GROUP BY Store_Name
HAVING SUM(Sales) > 1500;
```

照s_id分組  撈出分數>=200的同學
![](https://i.imgur.com/OehUVkV.png)

### 範例15 concat （欄位字串連接）
```sql=
select concat('欄位', '欄位');
select concat ('欄位'- '欄位');
select concat (欄位,欄位);
```

以下為將s_name與s_sex 欄位做字串串連
![](https://i.imgur.com/SEcM8He.png)

以下為將s_name與s_sex 欄位字串串連, 並且將此攔取名為A1
![](https://i.imgur.com/9iAeOZ4.png)


### 範例16 join+別名（請參照前面join章節）

==inner join兩個表格有相同的值才做串連
outjoin兩個表格不管有無相同值都做串連==

==除了from以外的別名是放前面==

![](https://i.imgur.com/HLFrBus.png)


以下為score與student表格做s_id串連
依照姓名,時間,生日做類別
將sum(A1.s_score)取別名為sumscore




> 因此處score帶出會與sumscore衝突
> 故group by帶出不須選score欄位故group by帶出不須選score欄位

==group by聚合函數以外都要帶出來==

![](https://i.imgur.com/LCMGdvL.png)


### 範例17:Insert into 更新表格資料

```sql= 
單筆
INSERT INTO "表格名" ("欄位1", "欄位2", ...)
VALUES ("值1", "值2", ...);

```

```sql=
多筆
INSERT INTO "表格1" ("欄位1", "欄位2", ...)
SELECT "欄位3", "欄位4", ...
FROM "表格2";
```


==1. 要照欄位順序
2.欄位數量要正確 不可多不可少
3. 欄位資料型態要正確==

以下為更新單筆資料
![](https://i.imgur.com/AN8Z7Iw.png)


==從另一張長一樣的表格 把1998年的資料撈出來 insert到我們這張表==

以下為設定條件更新多筆資料
![](https://i.imgur.com/w0zhw1d.png)


練習:
insert 六個欄位的值



==日期格式要用dash==

==insert是指定更新某格 不會更動到其他==

執行語法
![](https://i.imgur.com/0siw0nn.png)
執行結果
![](https://i.imgur.com/CAxV8cL.png)


**update與replace差別:**
> update 更新整列資料 列-rowdata
> replace 取代某個字串某幾個字

---

### 範例18:Update

```sql=
UPDATE "表格名"
SET "欄位1" = [新值]
WHERE "條件";
```

下圖為更新id=2的人 將他的生日更新為1996-2-27
![](https://i.imgur.com/GxYjTDs.png)


下圖為將id=1的人 city更新成'苗栗國',生日更新為1996-08-28
![](https://i.imgur.com/TlAM13F.png)


 ### 範例19:Delete 刪除表格內容(留欄位)
 
```sql=
DELETE FROM "表格名"
WHERE "條件";
```

下圖為刪除Customer 表格內容
![](https://i.imgur.com/TIaXbzq.png)


### 範例20:Drop 直接把form刪掉

```sql=
DROP TABLE "表格名";

```

下圖執行完語法後 Customer已不在form清單
![](https://i.imgur.com/DFMrwKS.png)
 ###### tags: `教學紀錄`


