# Ch03 SQL常見的函數 ## 1 字串函數 ### Left( ) 函數 【定義】傳回字串左邊指定數量的字元 【語法】Left(Str,n) //取出Str字串的左邊n個字元 【實例】在「學生資料表」中查詢學生姓名是姓 '李' 字開頭的名單 ```sql= SELECT * FROM 學生資料表 WHERE Left(姓名,1)='李'; ``` >函數中的字串也可以是屬性為字串的欄位 * Right( ) 函數 【定義】傳回字串右邊指定數量的字元 【語法】Right(Str,n) //取出Str字串的右邊n個字元 【實例】在「學生資料表」中查詢學生姓名的最後一個字是 '安' 的學生 ```sql= SELECT * FROM 學生資料表 WHERE Right(姓名,1)='安'; ``` * Substring( ) 函數 【定義】傳回字串中間指定位置和數量的字元。 【語法】Substring(Str, n, m) //取出Str字串從第n個字元開始到右邊m個字元 【實例】在「科系代碼表」中,查詢是「資管系」的系主任 ```sql= SELECT * FROM 科系代碼表 WHERE Substring(系名,1,2)='資管'; ``` * Length( ) 函數 【定義】傳回**數字的長度**。 【語法】Length(n) //指取出n長度的值 【實例】在「學務處資料表」中,查詢學生操行成績是三位數 (也就是100分)的學生的「學號、操行成績」 ```sql= SELECT 學號, 操行成績 FROM 學務處資料表 WHERE Length(操行成績)=3; ``` * CHAR_Length( ) 函數 【定義】傳回**字串的長度**。 【語法】CHAR_Length(Str) //指取出Str字串長度的值 ```sql= SELECT * FROM 課程資料表 Order by CHAR_Length(課程名稱); SELECT * FROM 課程資料表 WHERE CHAR_Length(課程名稱) >4 ; ``` * LTrim( ) 與 Trim( ) 與 RTrim( ) 函數 【定義】刪除字串中的空白字元 【語法】 LTrim(Str) //刪除Str字串中左邊的空白字元 Trim(Str) //刪除Str字串中左、右兩邊的空白字元 RTrim(Str) //刪除Str字串中右邊的空白字元 ```sql= Select LTrim(' 資料庫系統 '); → 印出「資料庫系統△△△」 Select RTrim(' 資料庫系統 '); → 印出「△△△資料庫系統」 ``` * Lower( ) 與 Upper() 函數 【定義】轉換小寫與大寫字母 【語法】Lower(Str) //將Str字串中大寫的字母轉換為小寫字母 Upper(Str) //將Str字串中小寫的字母轉換為大寫字母 ```sql= Select Lower('Visual Basic 2010'); → 印出「visual basic 2010」 Select Upper('Visual Basic 2010'); → 印出「VISUAL BASIC 2010」 ``` ```sql= Select Lower(系碼) From 科系代碼表; ``` * Stuff( ) 函數, Replace( ) 函數 【定義】將字串中某些特定字串取代成另一字串 【語法】Stuff(Str1, n, m, Str2) //將Str1字串從 n 起始位置到往右m個位置, 取代為Str2 【語法】Replace(Str, str1, str2) //將Str字串中, 所有出現str1的字串都換成str2 【舉例】 ```sql= Select Stuff('Visual Basic 2010', 2, 1, ''); → Vsual Basic 2010 Select Stuff('Visual Basic 2010', 8, 5,'C#'); →Visual C# 2010 Select Replace('www.mysql.com', 'w', 'Wo'); →WoWoWo.mysql.com ``` * Space( ) 函數, Concat( ) 函數 【定義】傳回重複空白的字串字元 。 【語法】Space(n) //傳回n個空白字元 【定義】傳回合併括號內的字串 【語法】 Concat(Str1, Str2, ...) //將Str1, Str2, ...串接起來 【舉例】請找出「學生資料表」中,將學號與姓名合併顯示, 並在中間空二個空白格。 ```SQL= SELECT Concat(學號, SPACE(2), 姓名) AS 學生, 系碼 FROM 學生資料表; ``` * Locate( ) 函數, Instr( ) 函數 【定義】傳回查詢子字串在某字串中的位置 。 【語法】Locate(subStr,str) ; Instr(str, sbuStr) //傳回字串subStr在字串str中, 第一個出現的位置, //如果subStr不是在str裏面,則返回0. ```SQL= Select Locate('bar', 'foobarbar'); → 印出「4」 Select Locate('xbar', 'foobarbar'); → 印出「0」 Select Instr('foobarbar', 'bar') ; → 印出「4」 Select Instr('foobarbar', 'xbar'); → 印出「0」 ``` * Repeat( ) 函數 【定義】傳回指定字串重復多次的字串。 【語法】Repeat(Str, n) //傳回字串Str重複n次的新字串, //如果n <= 0,則傳回一個空字串 //如果 Str 或 n 是NULL,則傳回NULL。 ```SQL= Select Repeat('MySql', 3); → 印出「MySqlMySqlMySql」 ``` * Reverse( ) 函數 【定義】傳回顛倒字符順序的字符串str 。 【語法】Reverse(Str) //傳回字串Str重複n次的新字串, //如果n <= 0,則傳回一個空字串 //如果 Str 或 n 是NULL,則傳回NULL。 ```SQL= Select Reverse('abc'); → 印出「cba」 ``` ## 2 數值函數 * Sign ( ) 取正負符號函數 【語法】Sign(x) 【說明】取x的正負符號,當X>0時,則Sgn_value= 1 當X=0時,則Sgn_value= 0 當X<0時,則Sgn_value= -1 ```SQL= Select Sign(100), Sign(100-100), Sign(100-200); ``` ![](https://i.imgur.com/iyJTHXq.png) * Abs( ) 函數 【語法】 Abs(x) //取x的絕對值 【範例】 ```SQL= Select Abs(-100); →100 ``` * Round ( ) 函數 【語法】Round(num,length) //取四捨五入 【說明】num代表數字型態的資料。 length代表精準度之位數。 【範例】 ```SQL= Select Round(100.25,1); →100.3 ``` * Floor( ) 函數 【語法】Floor (x) 【說明】取≦x的最大整數值 【舉例】 > 讓數字變小 ```SQL= Select Floor(99.9), Floor(-99.9); →99, -100 ``` * Ceiling( )函數 【語法】Ceiling(n) 【說明】取≧n的最小整數值 > 讓數字變大 ```SQL= Select Ceiling(99.9), Ceiling(-99.9); →100, -99 ``` ```SQL= Select 學號, 課號, Round (成績, 1), Floor(成績), Ceiling(成績) From 選課資料表; ``` * Power( ) 函數 【語法】Power(x,y) 【說明】取x的y次方。 【範例】 ```SQL= Select Power(2, 4); →16 ``` * Sqrt ( ) 函數 【語法】Sqrt(x) 【說明】取x的平方根,x必須≧0,否則程式會產生錯誤。 程式中的Sqrt(x)是數學上的X1/2 ```SQL= Select Sqrt(2); →1.41421 ``` ## 3 日期/時間函數 * Now( ), Current_date(), Current_time()函數 【定義】傳回當前的日期和時間。 【語法1】Now( ) //返回當前的日期和時間 //格式: YYYY-MM-DD HH:MM:SS // 或: YYYYMMDDHHMMSS 【語法2】Current_date ( ) //返回當前的日期值 //格式: YYYY-MM-DD 或 YYYYMMDD 【語法3】Current_time ( ) //返回當前的時間值 //格式: HH:MM:SS 或 HHMMSS ```SQL= Select now(); → 2020-03-17 20:18:50 Select Current_date (); → 2020-03-17 Select Current_time (); → 20:18:50 ``` * Dayofweek( ) 函數, Weekday() 函數 【定義】傳回日期為星期幾的索引數字。 【語法1】DayofWeek(date) //返回日期date的星期索引 // 1=星期天,2=星期一, ...7=星期六 【語法2】Weekday(date) //返回日期date的星期索引 // 0=星期一,1=星期二, ......6= 星期天 ```SQL= Select DayofWeek('1998-02-03'), Weekday('1998-02-03’); Select DayofWeek (now()), Weekday(now()); ``` 【定義】傳回日期的 "日" (整數)。 【語法】Dayofmonth(date) //返回date的月份中的日期, 範圍1~31 【定義】傳回日期是一年中的第幾日。 【語法】Dayofyear(date) //返回date在一年中的日數, 範圍1~366 【舉例】 ```SQL= Select Dayofmonth ('1997-11-05'); →5 Select Dayofyear ('1998-02-03'); →34 ``` * Month( ), Year( ) 函數 【定義】傳回日期的 "月" (整數) 或 "年" (整數) 。 【語法1】Month(date) //返回date的月份, 範圍1~12 【語法2】Year(date) //返回date的年份, 範圍1000~9999 ```SQL= Select Month('2020-03-19'); →3 Select Year('2020-03-19'); →2020 ``` * Dayname( ), Monthname( ) 函數 【定義】傳回日期的星期 或 月份名字。 【語法1】Dayname(date) //返回date的星期名字 【語法2】Monthname(date) //返回date的月份名字 ```SQL= Select Dayname('2020-03-19'), Monthname('2020-03-19'); ``` * Quarter( ) 函數 【定義】傳回日期的季 (整數)。 【語法】Quarter (date) //返回date一年中的季度,範圍1~4 【舉例】 ```SQL= Select Quarter('2020-03-19’); → 1 ``` * Hour( ), Minute( ), Second( ) 函數 【定義】傳回時間的 小時 或 分 或 秒。 【語法1】Hour(time) //返回time的小時,範圍: 0~23 【語法2】Minute(time) //返回time的分,範圍: 0~59 【語法3】Second(time) //返回time的秒,範圍: 0~59 ```SQL= Select Hour('10:05:03'), Minute('10:05:03'), Second('10:05:03'); ```