Bootstrap

头歌:MySQL函数的使用

学校头歌,找不到答案于是自己做,造福一下本校暂时还没有做完的同学,答案仅供参考。

第1关:字符串函数

USE company;

#请在此处添加实现代码

########## 以首字母大写,其他字母小写的方式显示所有员工姓名(别名:name) ##########

SELECT CONCAT(upper(SUBSTR(ename,1,1)),LOWER(SUBSTR(ename,2,LENGTH(ename)))) 
as name from employee;

########## 将员工的工作用大写字母显示 ##########

SELECT upper(job) 
from employee;

########## 显示姓名超过5个字符的员工姓名ename ##########

SELECT ename
from employee
where LENGTH(ename)>5;

########## 用'!'来填充员工工作job的结尾处,别名job,按10个字符长度输出, ##########

SELECT RPAD(job,10,'!')
as job from employee

第2关:数学函数

USE mydb;

#请在此处添加实现代码

########## 输出半径为3的圆的面积(别名:面积),保留6位小数 ##########
 
select round(pi()*pow(3,2),6)面积;

########## 求左侧表达式的值,四舍五入保留2位小数(别名:结果) ##########

 select round(sqrt(abs(pow(3,3)-pow(4,4))/pow(2,2)),2)结果;

########## 随机生成一个以130或131或132或133开头的手机号phone  ##########
########## 提示:号码分成3个区段,生成3个随机数后赋给3个变量,再拼接成手机号 ##########
 
set @head=floor(130+rand()*4);
set @middle=floor(1000+rand()*9000);
set @endl=floor(1000+rand()*9000);

##########显示输出随机生成的电话号码,为避免测试不匹配,请大家自行在相关软件上操作  ##########

##########select concat(@head,@middle,@endl) phone;

第3关:日期时间函数

USE company;
#请在此处添加实现代码
#### 查询2010年2月或3月入职的员工姓名和入职时间
select ename,hiredate from employee
where strcmp(year(hiredate),2010)=0 and (strcmp(month(hiredate),2)=0 or strcmp(month(hiredate),3)=0);
#### 显示员工在此公司工作了几个月(别名:工作时长,要求结果是向上取整数)
select ename,ceil(datediff('2020-12-31',hiredate)/30) 工作时长 from employee;
#### 查询所有员工的姓名、加入公司的年份和月份(别名:入职年份、入职月份),并且按照年份排序
select ename,year(hiredate) 入职年份 , month(hiredate) 入职月份
from employee
order by year(hiredate),month(hiredate);
#### 给研发部任职日期超过10年的员工加薪10%
update employee set sal=sal+sal*0.1  where year(now())-year(hiredate)>10 and dno=(select dno from department where dname='research');
select eno,ename,age,sex,job,dno,sal,comm,phone,hiredate from employee

第4关:条件控制函数

USE company;

#请在此处添加实现代码

########## 部门名称中带'S'字符的部门名称、该部门所有员工的总收入(工资+津贴,别名total)及部门人数(别名num) ##########

select dname,sum(ifnull(sal,0)+ifnull(comm,0)) total ,count(eno) num
from employee  join department using(dno)
where dname like '%s%'
group by dno;

########## 以指定格式显示员工的姓名ename和佣金comm(例如:Tom's comm is 1000),如果佣金为NULL显示为null,如Jack's comm is null ##########

select concat(ename,'''s comm is ',ifnull(comm,'null')) as 佣金结果 from employee;

第5关:类型转换函数

USE sales;

#请在此处添加实现代码

########## 显示每种商品的销售价格区间(进价的10%-30%),显示格式见左侧 ##########
########## 要求将所求价格由数值转换为字符,并保留2位小数后进行字符串的连接操作  ##########

select gdname,
concat( 'The price range is (',
cast(round(purcprice*1.1,2) AS CHAR),
' ~ ',
cast(round(purcprice*1.3,2) AS CHAR),
')')  pricerange
from goods;

第6关:其它常用函数

USE company;

#请在此处添加实现代码

########## 获取MySQL版本号和数据库名 ##########

SELECT VERSION(), DATABASE();

########## 取得每个部门最高薪水的人员姓名,提示:先求每个部门的最高薪水,再将此结果表作为临时表和employee表连接 ##########

select a.dno,a.ename,a.sal from employee a join
(select dno,max(sal) maxsal from employee group by dno) t
on t.dno = a.dno
where a.sal = t.maxsal
order by a.dno;

第7关:用户自定义函数

#请在此处添加实现代码

########## 定义一个函数maxofthree(),输出三个数中的最大值 ##########

DELIMITER @@
CREATE FUNCTION maxofthree(a int,b int,c int) 
    RETURNS int
    BEGIN
        declare t int DEFAULT 0;
        if a>b then
          set t=a;
        else
          set t=b;
        end if;
        if c>t then
         set  t=c;
        end if;
        return t;
    end
    @@

;