# 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');
```