-- Oracle 实现
SELECT emp_name||','||sex||','||salary
FROM employee;
解析解析:CONCAT 函数用于连接两个字符串。MySQL 中的 CONCAT_WS 扩展了该功能;Oracle 支持使用 || 连接字符串。
25. 如何获取员工邮箱中的用户名部分( @ 符号之前的字符串)?
答案答案:
SELECT emp_name, SUBSTR(email, 1, INSTR(email,'@') - 1)
FROM employee;
解析解析:此处使用了两个字符串函数,INSTR 函数查找 @ 符号的位置,SUBSTR 函数获取该位置之前的子串。
26. 将员工邮箱中的“.com”替换为“.net”,写出 SQL 语句?
答案答案:
SELECT emp_name, REPLACE(EMAIL, '.com','.net')
FROM employee;
解析解析:REPLACE 函数用于替换字符串中的字串。另外,TRIM 函数用于截断字符串。
27. 如何返回随机排序的员工信息?
答案答案:
-- MySQL 实现
SELECT emp_name, RAND()
FROM employee
ORDER BY RAND();
-- Oracle 实现
SELECT emp_name, DBMS_RANDOM.VALUE
FROM employee
ORDER BY DBMS_RANDOM.VALUE;
解析解析:利用生成随机数的函数进行排序。MySQL 使用 RAND 函数,Oracle 使用 DBMS_RANDOM.VALUE 函数。
28. 数学函数 CEILING、FLOOR 和 ROUND 有什么区别?
答案答案:
SELECT CEILING(1.1), FLOOR(1.1), ROUND(1.1)
FROM employee
WHERE emp_id = 1;
解析解析:CEILING 向上取整,FLOOR 向下取整,ROUND 四舍五入。Oracle 中使用 CEIL 函数替代 CEILING。
29. 下图是一个学生成绩表(score),如何知道每个学生的最高得分? 答案答案:
SELECT student_id, GREATEST(chinese, math, english, history)
FROM score;
解析解析:GREATEST 函数用于返回列表中的最大值,LEAST 函数用于返回列表中的最小值。
30. 如何知道每个员工的工作年限?
答案答案:
SELECT emp_name, EXTRACT( year FROM CURRENT\_DATE) - EXTRACT( year FROM HIRE_DATE)
FROM employee;
解析解析:CURRENT_DATE 函数返回当前日期,EXTRACT 函数可以提取日期数据中的各个部分,本例中使用 year 参数获取年
份信息。
31. 工资信息比较敏感,不宜直接显示。按照范围显示收入水平,小于 10000 显示为“低收入”,大于等于 10000 并且小于
20000 显示为“中等收入”,大于 20000 显示为“高收入”。如何使用 SQL 实现?
答案答案:
SELECT emp_name,
CASE WHEN salary < 10000 THEN '低收入'
WHEN salary < 20000 THEN '中等收入'
ELSE '高收入'