其他函数
一、If
语法:IF(expr1,expr2,expr3)
描述:如果 expr1 是 TRUE,则返回值 expr2;否则返回值 expr3。IF() 的返回值为数字值或字符串值,具体情况视其所在语境而定。
mysql> SELECT IF(1>2,2,3);
3
mysql> SELECT IF(1<2,'yes ','no');
'yes'
mysql> SELECT IF(STRCMP('test','test1'),'no','yes');
'no'
expr1 作为一个整数值进行计算,就是说,假如你正在验证浮点值或字符串值,那么应该使用比较运算进行检验。
mysql> SELECT IF(0.1,1,0);
0
mysql> SELECT IF(0.1<>0,1,0);
1
在上面的第一个例子中,IF(0.1)的返回值为0,原因是 0.1 被转化为整数值,从而引起一个对 IF(0)的检验。这或许不是你想要的情况。在第二个例子中,比较检验了原始浮点值,目的是为了了解是否其为非零值。比较结果使用整数。
二、控制流程函数 Case
CASE 是SQL 用来做为 if-then-else 之类逻辑的关键字。
语法:CASE value WHEN [compare-value] THEN result
[WHEN [compare-value] THEN result ...]
[ELSE result]
END
或者
CASE WHEN [condition] THEN result
[WHEN [condition] THEN result ...]
[ELSE result]
END
描述:在第一个方案的返回结果中, value=compare-value。而第二个方案的返回结果是第一种情况的真实结果。如果没有匹配的结果值,则返回结果为ELSE后的结果,如果没有ELSE 部分,则返回值为 NULL。"条件" 可以是一个数值或是公式。ELSE 子句则并不是必须的。
mysql> SELECT CASE 1 WHEN 1 THEN 'one'
-> WHEN 2 THEN 'two' ELSE 'more' END;
'one'
mysql> SELECT CASE WHEN 1>0 THEN 'true' ELSE 'false' END;
'true'
mysql> SELECT CASE BINARY 'B'
-> WHEN 'a' THEN 1 WHEN 'b' THEN 2 END;
NULL
三、检查NULL值 IFNULL函数
语法:IFNULL(expr1,expr2)
描述:假如expr1 不为 NULL,则返回值 expr1; 否则返回值 expr2。IFNULL()的返回值是数字或是字符串,具体情况取决于其所使用的语境。
mysql> SELECT IFNULL(1,0);
1
mysql> SELECT IFNULL(NULL,10);
10
mysql> SELECT IFNULL(1/0,10);
10
mysql> SELECT IFNULL(1/0,'yes');
'yes'
【参考资料】
W3SChool 在线SQL教程 http://www.w3SChool.com.cn/sql/sql_func.asp SQL 函数
http://www.w3SChool.com.cn/sql/sql_func_avg.asp SQL AVG 函数
http://www.w3SChool.com.cn/sql/sql_func_count.asp SQL COUNT() 函数
http://www.w3SChool.com.cn/sql/sql_func_max.asp SQL MAX() 函数
http://www.w3SChool.com.cn/sql/sql_func_min.asp SQL MIN() 函数
http://www.w3SChool.com.cn/sql/sql_func_sum.asp SQL SUM() 函数
http://www.w3SChool.com.cn/sql/sql_func_len.asp SQL LEN() 函数
http://www.w3school.com.cn/sql/sql_func_round.asp SQL ROUND() 函数
http://www.w3school.com.cn/sql/sql_dates.asp SQL Date 函数
http://www.w3SChool.com.cn/sql/sql_func_now.asp SQL NOW() 函数
http://www.w3SChool.com.cn/sql/sql_func_format.asp SQL FORMAT() 函数
课后练习:
1. 判断正误
1)AVG 函数返回全部行里指定字段的平均值,包括 NULL 值。
2)SUM 函数用于统计字段之和。
3)COUNT(*) 函数统计表里的全部行。
4)当查询里出现函数嵌套时,最外层的函数会首先被处理。
2. 下面的 SELECT 语句能运行吗?如果不行,应该如何修改?
a.
SELECT COUNT(*)
FROM EMPLOYEE_PAY_TBL;
b.
SELECT COUNT(EMP_ID),SALARY
FROM EMPLOYEE_PAY_TBL;
c.
SELECT MIN(BONUS), MAX(SALARY)
FROM EMPLOYEE_PAY_TBL;
WHERE SALARY > 20000;
d.
SELECT COUNT(DISTINCT PROD_ID)
FROM PRODUCTS_TBL;
e.
SELECT AVG(LAST_NAME) FROM EMPLOYEE_TBL;
f.
SELECT AVG(PAGER) FROM EMPLOYEE _TBL;
3. 利用 learnsql 数据库里的表 EMPLOYEE_TBL 构造 SQL 语句,完成如下练习:
1)平均薪水是多少?
2)最高奖金是多少?
3)总薪水是多少?
4)最低小时工作是多少?
5)表里有多少行记录?
4. 编写一个查询,来确定有多少雇员的姓以 G 开头?
5. 编写一个查询,来确定系统中所有订单的总额。如果每个产品的价格是$10.00,全部订单的总额是多少?
6. 如果所有雇员的姓名按照字母表排序,那么编写一个查询,来确定第一个和最后一个雇员的姓名是什么?
7. 编写一个查询,对雇员姓名列使用AVG函数。查询语句能运行吗?思考为什么会产生这样的结果。
8. 匹配下面的字符串函数与其描述:
描述 函数
a. 从字符串里选择一部分 CONCAT
b. 从字符串左侧或右侧剪切字符串 RPAD
c. 把全部字符都改变为大写 LPAD
d. 确定字符串的长度 RTRIM
e. 连接字符串 UPPER
f. 字符替换 LTRIM
LENGTH
REPLACE
SUBSTRING
9. 输入如下命令,把每个雇员的姓和名连接起来:
SELECT CONCAT(LAST_NAME, ',', FIRST_NAME)
FROM EMPLOYEE_TBL;
10. 输入以下MySQL命令,显示每个雇员的完整姓名和电话区号:
SELECT CONCAT(LAST_NAME, ',', FIRST_NAME),SUBSTRING(PHONE,1,3)
FROM EMPLOYEE_TBL;
11. 编写一个SQL语句,列出雇员的电子邮件地址。电子邮件地址并不是数据库里的一个字段,雇员的电子邮件地址应该由以下形式构成:FIRST,LAST@ERPTECH.COM
举例来说,John Smith 的电子邮件地址是JOHN.SMITH@ERPTECH.COM。
12. 编写一个SQL语句,以如下形式列出雇员的姓名、ID和电话号码。
1)姓名显示为 SMITH,JOHN;
2)雇员ID显示为 999-99-9999;
3)电话号码显示为 (999)999-9999。
13. 输入以下 SQL 代码,从服务器显示当前日期、时间:
SELECT CURRENT_DATE;
SELECT NOW();
14. 输入以下 SQL 代码,显示每名雇员的受雇日期:
SELECT EMP_ID, DATE_HIRE
FROM EMPLOYEE_PAY_TBL;
15. 在MySQL里,通过联合使用 EXTRACT 函数与 MySQL 日期描述,我们能够以多种格式显示日期。
输入以下代码显示每名雇员的受雇年份:SELECT EMP_ID, EXTRACT(YEAR FROM DATE_HIRE) FROM EMPLOYEE_PAY_TBL;
16. 输入以下语句,显示当前日期和每名雇员的受雇日期: SELECT EMP_ID, DATE_HIRE, CURRENT_DATE FROM EMPLOYEE_PAY_TBL;
17. 每名雇员是在星期几被雇用的?
18. 今天是一年中的第几天?
19. 输入3行SQL代码,第一行获得系统时间,第2行将系统时间转换成日期型数据,第3行将系统时间转换成时间值。