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: `教學紀錄`