持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情
前言
上篇我们学习完了MySQL中的单行函数。有兴趣的小伙伴可以阅读(# MySQL学习-函数(十一))。
下面就MySQL中的函数,做一些练习。
练习一
显示系统的时间(注:日期+时间)
这里使用时间函数NOW(),即可以得出结果。
SELECT NOW()
FROM DUAL;
| NOW() |
|---|
| 2022-05-28 10:53:34 |
当然这里也可以使用其他函数,比如SYSDATE(),CURRENT_TIMESTAMP(),LOCALTIME(),LOCALTIMESTAMP(),也可以得出想要的结果。这里我们只要记住NOW()和SYSDATE()即可。
练习二
查询员工号,姓名,工资,以及工资提高百分之20后的结果。
这里使用乘法,使用原工资乘以1.2即可得到想要的结果。
SELECT employee_id, name, salary, salary * 1.2 "new salary"
FROM employees;
| employee_id | name | salary | new salary |
|---|---|---|---|
| 1 | xiaoming | 6800.00 | 8160.00 |
| 2 | xiaomei | 3200.00 | 3840.00 |
练习三
将员工的姓名按首字母排序,并写出姓名的长度。
计算长度,这里使用LENGTH函数进行计算得出结果。按字母排序,使用order by。
SELECT name, LENGTH(name)
FROM employees
ORDER BY name ASC;
| name | LENGTH(name) |
|---|---|
| xiaoming | 8 |
| xiaomei | 7 |
练习四
查询员工id,姓名,工资,并作为一个列输出,别名为OUT_PUT
作为一个列输出,即将这些字段连接起来,使用CONCAT函数。
SELECT CONCAT(employee_id, name, salary) "OUT_PUT"
FROM employees;
| OUT_PUT |
|---|
| 1xiaoming6800.00 |
| 2xiaomei3200.00 |
练习五
查询公司各员工工作的年数、工作的天数,并按工作年数的降序排序。
分析一
employees表中有员工的入职日期字段,通过此字段,使用日期计算函数DATEDIFF()即可计算出需要的年数,天数等结果。
SELECT employee_id, hire_date, DATEDIFF(CURDATE(), hire_date) / 365 "worked_years", DATEDIFF(CURDATE(), hire_date) "worked_days"
FROM employees
ORDER BY worked_years DESC;
| employee_id | hire_date | worked_years | worked_days |
|---|---|---|---|
| 1 | 2020-08-12 | 1.7918 | 654 |
| 2 | 2022-03-28 | 0.1671 | 61 |
分析二
除了使用DATEDIFF()函数,我们还可以使用TO_DAYS()函数来进行计算,只不过这里还需要使用减法进行操作。
SELECT employee_id, hire_date, DATEDIFF(CURDATE(), hire_date) / 365 "worked_years", DATEDIFF(CURDATE(), hire_date) "worked_days", TO_DAYS(CURDATE()) - TO_DAYS(hire_date) "worked_days1"
FROM employees
ORDER BY worked_years DESC;
| employee_id | hire_date | worked_years | worked_days | worked_days1 |
|---|---|---|---|---|
| 1 | 2020-08-12 | 1.7918 | 654 | 654 |
| 2 | 2022-03-28 | 0.1671 | 61 | 61 |
可以看到能得出相同的结果。
练习六
查询员工姓名,入职时间,部门id,满足以下条件,入职时间在2020年之后,部门id为80或90或110,commission_pct不为空
这里条件部门id为80或90或110,可以使用IN,条件commission_pct不为空,可以使用IS NOT NULL。条件入职时间在2020年之后,可以直接使用>=。
SELECT name, hire_date, department_id
FROM employees
WHERE department_id IN (80, 90, 110)
AND commission_pct IS NOT NULL
AND hire_date >= '2020-01-01';
| name | hire_date | department_id |
|---|---|---|
| xiaoming | 2020-08-12 | 110 |
| xiaomei | 2022-03-28 | 80 |
直接使用>=,这里存在着隐式转换,帮助我们计算得到了结果。
这里也可以使用显示转换的操作,得出同样的结果。
- 格式化:日期 ---> 字符串,使用date_format函数,date_format(hire_date, '%Y-%m-%d') >= '2020-01-01'
- 格式化:日期 ---> 字符串,也可以直接使用年进行转化计算。date_format(hire_date, '%Y') >= '2020'
- 解析:字符串 ---> 日期,使用STR_TO_DATE函数,hire_date >= STR_TO_DATE('2020-01-01', '%Y-%m-%d')
练习七
查询公司中入职超过100天的员工姓名和入职时间。
使用DATEDIFF函数计算得到天数并与100天计算进行比较得出结果。
SELECT name, hire_date
FROM employees
WHERE DATEDIFF(CURDATE(), hire_date) > 100;
| name | hire_date |
|---|---|
| xiaoming | 2020-08-12 |
练习八
查询产生下面的结果:
earns monthly but wants <salary * 3>
这里使用连接字符串进行连接。
SELECT CONCAT(name, ' earns ', salary, ' monthly but wants ', salary * 3) "want salary"
FROM employees;
| want salary |
|---|
| xiaoming earns 6800.00 monthly but wants 20400.00 |
| xiaomei earns 3200.00 monthly but wants 9600.00 |
如果想把工资的小数点去掉,可以使用TRUNCATE函数,截取整数。
SELECT CONCAT(name, ' earns ', TRUNCATE(salary, 0), ' monthly but wants ', TRUNCATE(salary * 3, 0)) "want salary"
FROM employees;
| want salary |
|---|
| xiaoming earns 6800 monthly but wants 20400 |
| xiaomei earns 3200 monthly but wants 9600 |
练习九
使用case-when,按照下面的条件,查询产生结果:
| job | grade |
|---|---|
| AD_PRES | A |
| ST_MAN | B |
| IT_PROG | C |
这里使用case when THEN else END函数。
SELECT name, job_id, CASE job_id WHEN 'AD_PRES' THEN 'A'
WHEN 'ST_MAN' THEN 'B'
WHEN 'IT_PROG' THEN 'C'
END "grade"
FROM employees;
| name | job_id | grade |
|---|---|---|
| xiaoming | AD_PRES | A |
| xiaomei | IT_PROG | C |
单行函数的练习就全做完了,明天继续学习MySQL的其他函数。