# [SELECT語句 說明](https://hackmd.io/@xhining/SkZzu9lZs)
## ※SELECT 語句說明
#### 1. 單資料表:(以F1180024 員工資料表為例)
```sql
SELECT 姓名, 部門代號, 縣市, 目前月薪資
FROM EMPLOYEE
WHERE 縣市 LIKE '台%' AND 目前月薪資>=50000
ORDER BY 縣市, 目前月薪資 DESC
```
#### 2. 排序改變
```sql
SELECT 姓名, 部門代號, 縣市, 目前月薪資
FROM EMPLOYEE
WHERE 縣市 LIKE '台%' AND 目前月薪資>=50000
ORDER BY 目前月薪資 DESC, 縣市
```
#### 3. 條件改變
```sql
SELECT 姓名, 部門代號, 縣市, 目前月薪資
FROM EMPLOYEE
WHERE 縣市 LIKE '%市' AND 目前月薪資>=50000
ORDER BY 目前月薪資 DESC, 縣市
```
#### 4. 多資料表1:
```sql
SELECT 姓名, E.部門代號, 部門名稱, 縣市, 目前月薪資
FROM EMPLOYEE E INNER JOIN DEPT D ON E.部門代號=D.部門代號
WHERE 縣市 LIKE '台北%' AND 目前月薪資>=50000
ORDER BY 部門代號, 目前月薪資 DESC
```
#### 5. 多資料表2:
```sql
SELECT E.部門代號, 部門名稱, E.姓名, 年, 月, 假別,天數
FROM EMPLOYEE E INNER JOIN DEPT D ON E.部門代號=D.部門代號 INNER JOIN absent L ON E.姓名=L.姓名
WHERE 縣市 LIKE '台%' AND L.假別='事假'
ORDER BY 部門代號, E.姓名, 年, 月
```
#### 6. 多資料表2:各部門員工的89年事假天數(加總)
```sql
SELECT E.部門代號, 部門名稱, E.姓名, 年, 假別, sum(天數) 天數
FROM EMPLOYEE E INNER JOIN DEPT D ON E.部門代號=D.部門代號 INNER JOIN absent L ON E.姓名=L.姓名
WHERE 縣市 LIKE '台%' AND L.假別='事假' AND 年=89
GROUP BY E.部門代號, 部門名稱, E.姓名, 年, 假別
ORDER BY 部門代號, E.姓名, 年
```
## ※GROUP BY以客戶檔在各縣市的情形為例
#### 7. 原資料(沒有使用GROUP BY)
|縣市|客戶寶號|
|:---:|:---:|
|台中市|洽興金屬工業股份有限公司|
|台北市|新益機械工廠股份有限公司|
|台北市|天源義記機械股份有限公司|
|台北市|家鄉事業股份有限公司|
|台南縣|四維企業(股)公司|
|台南縣|永輝興電機工業股份有限公司|
|台中市|溪泉電器工廠股份有限公司|
|台中縣|善品精機股份有限公司|
|台北市|佳樂電子股份有限公司|
|台北市|科隆實業股份有限公司|
|台北市|永光壓鑄企業公司|
|台北市|正五傑機械股份有限公司|
|台北市|集上科技股份有限公司|
|台北市|強安鋼架工程股份有限公司|
|台北市|菱生精密工業股份有限公司|
|台北市|昆信機械工業股份有限公司|
|台北市|麥柏股份有限公司|
|台北市|九和汽車股份有限公司|
|台北市|遠東氣體工業股份有限公司|
|台北市|諾貝爾生物有限公司|
|台北市|有萬貿易股份有限公司|
|台北縣|真正精機股份有限公司|
|台北縣|東興振業股份有限公司|
|台北縣|漢寶農畜產企業股份有限公司|
|台北縣|大喬機械公司|
|台北縣|達亞汽車股份有限公司|
|桃園縣|台灣航空電子股份有限公司|
|桃園縣|鐶琪塑膠股份有限公司|
|桃園縣|亞智股份有限公司|
|桃園縣|九華營造工程股份有限公司|
|桃園縣|台灣保谷光學股份有限公司|
|桃園縣|豐興鋼鐵(股)公司|
|高雄市|中友開發建設股份有限公司|
|高雄市|長生營造股份有限公司|
|新竹市|百容電子股份有限公司|
|新竹市|欣中天然氣股份有限公司|
|新竹市|比力機械工業股份有限公司|
|新竹縣|詮讚興業公司|
|台中縣|台灣釜屋電機股份有限公司|
|台北市|國光血清疫苗製造股份有限公司|
|台北市|台灣製罐工業股份有限公司|
|台北市|雅企科技(股)
|台北市|國豐電線工廠股份有限公司|
|台北市|金興鋼鐵股份有限公司|
|台北縣|原帥電機股份有限公司|
|台北縣|新寶纖維股份有限公司|
|台南縣|太平洋汽門工業股份有限公司|
|台南縣|喬福機械工業股份有限公司|
|桃園縣|楓原設計公司|
|桃園縣|日南紡織股份有限公司|
|桃園縣|台灣勝家實業股份有限公司|
|桃園縣|周家合板股份有限公司|
|新竹市|英業達股份有限公司|
|新竹縣|羽田機械股份有限公司|
|台中市|中衛聯合開發公司|
|台北市|台中精機廠股份有限公司|
|台北市|東陽實業(股)公司|
|台北市|金泰成粉廠股份有限公司|
|台北市|現代農牧股份有限公司|
|台北市|惠亞工程股份有限公司|
#### 8. 找出客戶檔公司地址來自各縣市的家數
```sql
SELECT 縣市, COUNT(*) 家數
FROM CUSTOMER
GROUP BY 縣市
ORDER BY 縣市
```
# 1180024SQL範例題
一、 範例(Customer、Employee、Students)
#### 1. 查客戶行業別為機械類而且縣市在台北市或台中市
```sql
SELECT 客戶寶號,客戶代號 ,縣市,行業別,統一編號
FROM CUSTOMER
WHERE 行業別='機械' AND (縣市='台北市' OR 縣市='台中市')
```
#### 2. 客戶寶號有"電機"的公司
```sql
SELECT 客戶寶號,客戶代號 ,縣市,行業別,統一編號
FROM CUSTOMER
WHERE 客戶寶號 LIKE '%電機%'
```
#### 3. 找姓林或姓陳的員工(1)
- 作法1
```sql
SELECT 姓名,現任職稱,目前月薪資,年假天數,部門代號,縣市,郵遞區號 FROM EMPLOYEE
WHERE 姓名 LIKE '林%' OR 姓名 LIKE '陳%'
```
- 作法2
- SQL Server
```sql
SELECT 姓名,現任職稱,目前月薪資,年假天數,部門代號,縣市,郵遞區號 FROM EMPLOYEE
WHERE 姓名 LIKE '[林陳]%'
```
- MariaDB
```sql
SELECT 姓名,現任職稱,目前月薪資,年假天數,部門代號,縣市,郵遞區號 FROM EMPLOYEE
WHERE 姓名 REGEXP '^[陳林]'
```
#### 4. 職稱是工程師,薪資要 35000以上,不要住在台北縣及台北市
```sql
SELECT 姓名,現任職稱,目前月薪資,年假天數,部門代號,縣市,郵遞區號
FROM EMPLOYEE
WHERE 縣市 NOT LIKE '台北%' AND 現任職稱 LIKE '%工程師' AND 目前月薪資>=35000
```
#### 5. 員工薪資前10名
- SQL Server
```sql
SELECT TOP 10
FROM EMPLOYEE
ORDER BY 目前月薪資 DESC
```
- MariaDB
```sql
SELECT 姓名,現任職稱,目前月薪資,年假天數,部門代號,縣市,郵遞區號
FROM EMPLOYEE
ORDER BY 目前月薪資 DESC
LIMIT 10
```
#### 6. 員工薪資後10名 (ASC 可免)
```sql
SELECT 姓名,現任職稱,目前月薪資,年假天數,部門代號,縣市,郵遞區號
FROM EMPLOYEE
ORDER BY 目前月薪資 ASC
LIMIT 10
```
#### 7. 員工薪資前10 % * (MariaDB沒有PERCENT)
- SQL Server
```sql
SELECT TOP 10 PERCENT *
FROM EMPLOYEE
ORDER BY 目前月薪資 DESC
```
- MariaDB
```sql
SELECT @rowid,rowid,姓名,現任職稱,目前月薪資,年假天數,縣市
FROM (SELECT EMPLOYEE.*,@rowid := @rowid +1 AS rowid
FROM (SELECT @rowid:=0) SUB , EMPLOYEE ORDER BY 目前月薪資 DESC) AS temp
WHERE rowid <= FLOOR(0.1 * @rowid)
ORDER BY 目前月薪資 DESC
```
#### 8. 請找出客戶檔公司地址來自各縣市的家數
欄位依序:縣市, 家數;
排序:縣市
```sql
SELECT 縣市, COUNT(*) 家數 FROM CUSTOMER
GROUP BY 縣市
ORDER BY 縣市
```
|縣市|家數|
|:---:|:---:|
|台中市|3|
|台中縣|2|
|台北市|26|
|台北縣|7|
|台南縣|4|
|桃園縣|10|
|高雄市|2|
|新竹市|4|
|新竹縣|2|
#### 9. 請找出客戶檔在90年沒有過交易的公司
欄位依序:客戶代號, 客戶寶號, 交易客戶代號;
排序:客戶代號
- 老師參考解答
1. 先建Sales交易檔 90年有交易的客戶代號子查詢S,
2. 使用客戶檔C與子查詢S作Left Join
```sql
SELECT C.客戶代號, 客戶寶號 ,S.客戶代號 交易客戶代號
FROM CUSTOMER C LEFT JOIN
(SELECT 客戶代號 FROM SALES WHERE 交易年=90 GROUP BY 客戶代號) S
on C.客戶代號=S.客戶代號
WHERE S.客戶代號 is null
ORDER BY C.客戶代號
```
- 同學參考解答
```sql
SELECT DISTINCT A.客戶代號, A.客戶寶號 FROM CUSTOMER A,SALES B
WHERE A.客戶代號 = B.客戶代號 AND B.交易年<>90
ORDER BY 1
```
#### 10. 請找出生日之月份為3月的學生
欄位依序:學號, 姓名, 生日, 出生月;
排序:年齡由大而小
- 老師參考解答
```sql
SELECT 學號, 姓名, 出生年月日 生日, month(出生年月日) 出生月 FROM STUDENTS
WHERE month(出生年月日)=3
ORDER BY 出生年月日
```
- 同學參考解答
```sql
SELECT 學號, 姓名,cast(出生年月日 AS DATE) 生日,MONTH(出生年月日) 出生月份 FROM STUDENTS
WHERE MONTH(出生年月日)=3
ORDER BY 出生年月日 ASC
```
#### 11. 請找各月份出生的學生
欄位依序:出生月, 人數;
排序:出生月
- 老師參考解答
```sql
SELECT month(出生年月日) 出生月, Count(*) 人數 FROM STUDENTS
GROUP BY month(出生年月日)
ORDER BY 出生月
```
- 同學參考解答
```sql
SELECT MONTH(出生年月日) AS 出生月份 ,COUNT(*) 人數 FROM STUDENTS
GROUP BY 出生月份
ORDER BY 1
```
#### 12. 請找出已經40歲的學生。
欄位依序:學號, 姓名, 出生年月日, 滿40歲生日;
排序:出生年月日
- 老師參考解答
```sql
SELECT 學號, 姓名, 出生年月日, Date_Add(year,40,出生年月日) 滿40歲生日
FROM STUDENTS
WHERE DateAdd(year,40,出生年月日)<GETDATE()
ORDER BY 出生年月日
```
- MariaDB
```sql
SELECT 學號, 姓名, 出生年月日,出生年月日+ INTERVAL 40 YEAR 滿40歲生日
FROM STUDENTS
WHERE now() >= (出生年月日+ INTERVAL 40 YEAR)
ORDER BY 出生年月日
```
#### 13. 請找出各個畢業國中各有多少學生(有修業的)
欄位依序:畢業國中, 人數;
排序:畢業國中
```sql
SELECT 畢業國中,COUNT(*) 人數 FROM STUDENTS
WHERE 畢業國中 LIKE '%畢業'
GROUP BY 畢業國中
ORDER BY 畢業國中
```
#### 14. 請找出各個班級各有多少學生(班級參見”班級座號”)
欄位依序:班級, 人數;
排序:班級
- 老師參考解答
```sql
SELECT LEFT(班級座號,3) 班級, Count(*) 人數 FROM STUDENTS
GROUP BY LEFT(班級座號,3)
ORDER BY 班級
```
- 同學參考解答
```sql
SELECT SUBSTRING(班級座號,1,3) 班級,COUNT(*) 人數 FROM STUDENTS
GROUP BY SUBSTRING(班級座號,1,3) ORDER BY 1
```
#### 15. 請找出各個科別各有多少學生
欄位依序:科別, 人數;
排序:科別
```sql
SELECT 科別,COUNT(*) 人數
FROM STUDENTS
GROUP BY 科別
ORDER BY 科別
```
#### 16. 請找出104-107班在90年3月的事假, 病假, 公假, 曠課各多少時數。(請假記錄檔-RECORDS)
欄位依序:班級, 事假, 病假, 公假, 曠課;
排序:班級
- 老師參考解答
```sql
SELECT LEFT(班級座號,3) 班級, SUM(R.事假) 事假, SUM(R.病假) 病假, SUM(R.公假) 公假, SUM(R.曠課) 曠課
FROM RECORDS AS R
WHERE LEFT(年月日,4)=9003
GROUP BY LEFT(班級座號,3)
HAVING LEFT(班級座號,3) >='104' AND LEFT(班級座號,3)<='107'
ORDER BY 班級
```
- MariaDB
```sql
SELECT LEFT(班級座號,3) 班級, SUM(R.事假) 事假, SUM(R.病假) 病假, SUM(R.公假) 公假, SUM(R.曠課) 曠課
FROM RECORDS AS R
WHERE LEFT(年月日,4)=9003 AND LEFT(班級座號,3) >='104' AND LEFT(班級座號,3)<='107'
GROUP BY LEFT(班級座號,3)
ORDER BY 班級
```
- 同學參考解答
```sql
SELECT SUBSTRING(班級座號,1,3) 班級,SUM(事假) 事假,SUM(病假) 病假,SUM(公假) 公假,SUM(曠課) 曠課 FROM RECORDS
WHERE 年月日>=900301 AND 年月日 <=900331 AND 班級座號>=10400 AND 班級座號<=10799
GROUP BY SUBSTRING(班級座號,1,3)
ORDER BY 1
```