MySQL学习-函数(十二)

209 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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_idnamesalarynew salary
1xiaoming6800.008160.00
2xiaomei3200.003840.00

练习三

将员工的姓名按首字母排序,并写出姓名的长度。
计算长度,这里使用LENGTH函数进行计算得出结果。按字母排序,使用order by。

SELECT name, LENGTH(name)
FROM employees
ORDER BY name ASC;
nameLENGTH(name)
xiaoming8
xiaomei7

练习四

查询员工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_idhire_dateworked_yearsworked_days
12020-08-121.7918654
22022-03-280.167161

分析二

除了使用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_idhire_dateworked_yearsworked_daysworked_days1
12020-08-121.7918654654
22022-03-280.16716161

可以看到能得出相同的结果。

练习六

查询员工姓名,入职时间,部门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';
namehire_datedepartment_id
xiaoming2020-08-12110
xiaomei2022-03-2880

直接使用>=,这里存在着隐式转换,帮助我们计算得到了结果。
这里也可以使用显示转换的操作,得出同样的结果。

  • 格式化:日期 ---> 字符串,使用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;
namehire_date
xiaoming2020-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,按照下面的条件,查询产生结果:

jobgrade
AD_PRESA
ST_MANB
IT_PROGC

这里使用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;
namejob_idgrade
xiaomingAD_PRESA
xiaomeiIT_PROGC

单行函数的练习就全做完了,明天继续学习MySQL的其他函数。