# [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 ```