SQL筆記
===



## 目錄章節
[TOC]
{%hackmd BJrTq20hE %}
## 語法教學
### 範例1 : Student 表格與 score 表格進行撈取

```SQL=
--多欄位用逗點區隔
select 欄位1,欄位2
```

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

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

### 範例2 : 表格連接 Join
```SQL=
--有交集的部分才帶出來
inner join
--不管有沒有交集全列出
full join
--左邊(右邊)的表有交集才帶出來
left right join
```


```SQL=
where
--設立條件將資料撈出來
SELECT "欄位名"
FROM "表格名"
WHERE "條件";
where and --兩個條件都符合
where or --符合其中一個條件
字串 =' '
數字 , 日期 :欄位 >=< 關鍵數字
```
#### AND
找出生日大於1990年且小於1992年的人

找出生日為1989-07-01和1990-01-20的人

#### OR
找出id等於01號或02號或08號的人

### 範例3 : 數字
找出生日在1990之後的人

#### 題目:
#### 查詢”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的成績
```

顯示結果:

### 範例4 : Order By
結構說明:
```SQL=
SELECT "欄位名"
FROM "表格名"
[WHERE "條件"]
ORDER BY "欄位名" [ASC, DESC]
```
==ASC 代表結果會以由小往大的順序列出,而 DESC 代表結果會以由大往小的順序列出==
==預設排序是ASC==
==多個欄位==
==ORDER BY "欄位一" [ASC, DESC], "欄位二" [ASC, DESC]==
下圖為指定s_birth 由大到小排序

### 範例5 : in
結構說明:
```sql=
SELECT "欄位名"
FROM "表格名"
WHERE "欄位名" IN ('值一', '值二', ...)
```
下圖為找出三位人名、 撈出01號或08號或02號的同學

### 範例6:like
結構說明:
```sql=
SELECT "欄位名"
FROM "表格名"
WHERE "欄位名" LIKE '萬用字元關鍵字'
```
==% (百分比符號):代表零個、一個、或數個字母。==
==_ (底線):代表剛好一個字母。==
下圖為找出姓氏為'王'的同學

### 範例7:Trim (去除空白)
```sql=
SELECT TRIM (' Sample ');
'Sample'
SELECT LTRIM (' Sample ');
'Sample '
SELECT RTRIM (' Sample ');
' Sample'
```
==TRIM 去掉開頭跟結尾的空白
LTRIM 去掉開頭
RTRIM 去掉結尾==

### 範例8:AVG
```sql=
SELECT AVG("欄位名")
FROM "表格名";
```
```sql=
SELECT AVG(Sales) FROM Store_Information;
```

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

1.下圖為計算S_name不計算重複的學生
==distinct 篩掉重複的==

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

### 範例10: MAX
```sql=
SELECT MAX ("欄位名")
FROM "表格名";
```
下圖為找出s_score最高分者

### 範例11:Min
```sql=
SELECT MIN ("欄位名")
FROM "表格名";
```
下圖為找出s_score最低分者

### 範例12:Sum
```sql=
SELECT SUM ("欄位名")
FROM "表格名";
```
下圖為加總s_id='02'的學生分數

### 範例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為群組做全體學生分數加總

### 範例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的同學

### 範例15 concat (欄位字串連接)
```sql=
select concat('欄位', '欄位');
select concat ('欄位'- '欄位');
select concat (欄位,欄位);
```
以下為將s_name與s_sex 欄位做字串串連

以下為將s_name與s_sex 欄位字串串連, 並且將此攔取名為A1

### 範例16 join+別名(請參照前面join章節)
==inner join兩個表格有相同的值才做串連
outjoin兩個表格不管有無相同值都做串連==
==除了from以外的別名是放前面==

以下為score與student表格做s_id串連
依照姓名,時間,生日做類別
將sum(A1.s_score)取別名為sumscore
> 因此處score帶出會與sumscore衝突
> 故group by帶出不須選score欄位故group by帶出不須選score欄位
==group by聚合函數以外都要帶出來==

### 範例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. 欄位資料型態要正確==
以下為更新單筆資料

==從另一張長一樣的表格 把1998年的資料撈出來 insert到我們這張表==
以下為設定條件更新多筆資料

練習:
insert 六個欄位的值
==日期格式要用dash==
==insert是指定更新某格 不會更動到其他==
執行語法

執行結果

**update與replace差別:**
> update 更新整列資料 列-rowdata
> replace 取代某個字串某幾個字
---
### 範例18:Update
```sql=
UPDATE "表格名"
SET "欄位1" = [新值]
WHERE "條件";
```
下圖為更新id=2的人 將他的生日更新為1996-2-27

下圖為將id=1的人 city更新成'苗栗國',生日更新為1996-08-28

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

### 範例20:Drop 直接把form刪掉
```sql=
DROP TABLE "表格名";
```
下圖執行完語法後 Customer已不在form清單

###### tags: `教學紀錄`