• 单行函数,聚合函数课后练习


    单行函数,聚合函数课后练习
    #第七章 单行函数的课后练习

    1.显示系统时间(注:日期+时间)

    #以下的用哪一个都可以
    SELECT NOW(),SYSDATE(),CURRENT_TIMESTAMP(),LOCALTIME(),LOCALTIMESTAMP()
    FROM DUAL;

    2.查询员工号,姓名,工资,以及工资提高百分之20%后的结果(new salary)

    SELECT employee_id,last_name,salary,salary*1.2 AS newsalary
    FROM employees;

    3.将员工的姓名按首字母排序,并写出姓名的长度(length)

    SELECT last_name,LENGTH(last_name)
    FROM employees
    ORDER BY last_name ASC;
    #ORDER BY last_name DESC;
    #升序为ASC,降序为DESC

    4.查询员工id,last_name,salary,并作为一个列输出,别名为OUT_PUT

    SELECT CONCAT(employee_id,‘,’,last_name,‘,’,salary)OUT_PUT
    FROM employees;

    5.查询公司各员工工作的年数、工作的天数,并按工作年数的降序排序

    SELECT employee_id,last_name,CURDATE(),hire_date,(CURDATE()-hire_date)/10000 “工作年数”,(CURDATE()-hire_date)/10000*365 “工作天数”
    FROM employees
    ORDER BY (CURDATE()-hire_date)/10000 DESC;
    #上面自己写的不完全正确存在较大误差,以下是标准答案
    SELECT employee_id,DATEDIFF(CURDATE(),hire_date)/365 “worked_years”,DATEDIFF(CURDATE(),hire_date)“worked days”
    FROM employees;

    6.查询员工姓名,hire_date , department_id,满足以下条件:雇用时间在1997年之后,department_id

    为80 或 90 或110, commission_pct不为空
    SELECT last_name,hire_date,department_id
    FROM employees
    WHERE commission_pct IS NOT NULL AND(CURDATE()-hire_date)/10000-24<0 AND department_id IN(80,90,110);

    #以下是标准答案
    SELECT last_name,hire_date,department_id
    FROM employees
    WHERE department_id IN(80,90,110)
    AND commission_pct IS NOT NULL
    #and hire_date >=‘1997-01-01’ #该行存在隐式转换,可以这样写也比较简单
    #可以显式转换:字符串转化为date日期或者date日期转化为字符串
    #and date_format(hire_date,‘%Y’)>=‘1997’ #显式转换,格式化,日期转化为字符串
    AND hire_date>=STR_TO_DATE(‘1997-01-01’,‘%Y-%m-%d’);#显式转化,解析,字符串转化为日期

    7.查询公司中入职超过10000天的员工姓名、入职时间

    SELECT last_name,hire_date,(CURDATE()-hire_date)/10000365
    FROM employees
    WHERE (CURDATE()-hire_date)/10000
    365>10000
    #下面是标准答案
    SELECT last_name,hire_date
    FROM employees
    WHERE DATEDIFF(CURDATE(),hire_date)>=10000

    8.做一个查询,产生下面的结果

    earns monthly but wants 3>
    earns monthly but wants 3>
    – 例如 Dream Salary
    – King earns 24000 monthly but wants 72000
    #trun
    SELECT CONCAT(last_name, ’ earns ', TRUNCATE(salary, 0) , ’ monthly but wants ',TRUNCATE(salary * 3, 0)) “Dream Salary”
    FROM employees;
    SELECT TRUNCATE(133.35567,3),TRUNCATE(5003.10,4)

    9.使用case-when,按照下面的条件:

    job grade
    AD_PRES A
    ST_MAN B
    IT_PROG C
    SA_REP D
    ST_CLERK E
    #以job_id作为case选择条件
    SELECT last_name , Job_id, CASE job_id
    WHEN ‘AD_PRES’ THEN ‘A’
    WHEN ‘ST_MAN’ THEN ‘B’
    WHEN ‘IT_PROG’ THEN ‘C’
    WHEN ‘SA_REP’ THEN ‘D’
    WHEN ‘ST_CLERK’ THEN ‘E’
    ELSE ‘F’
    END
    “grade”
    FROM employees
    #end代表case循环查询结束,"grade"是给查询结果起的别名

    #第八章 聚合函数的课后练习

    #1.where子句可否使用组函数进行过滤?
    #不能,group by紧跟着having

    #2.查询公司员工工资的最大值,最小值,平均值,总和
    SELECT MAX(salary),MIN(salary),AVG(salary),SUM(salary)
    FROM employees;

    #3.查询各job_id的员工工资的最大值,最小值,平均值,总和
    SELECT job_id,MAX(salary),MIN(salary),AVG(salary),SUM(salary)
    FROM employees
    GROUP BY job_id;

    #4.选择具有各个job_id的员工人数
    SELECT job_id,ROUND(SUM(salary)/AVG(salary))AS"job人数",COUNT(1),COUNT(*) #round()使其取整
    FROM employees
    GROUP BY job_id;

    5.查询员工最高工资和最低工资的差距(DIFFERENCE)

    SELECT MAX(salary)-MIN(salary) AS"difference"
    FROM employees;

    6.查询各个管理者手下员工的最低工资,其中最低工资不能低于6000,

    没有管理者的员工不计算在内 此题重要

    SELECT manager_id, MIN(salary)
    FROM employees
    WHERE manager_id IS NOT NULL
    GROUP BY manager_id
    HAVING MIN(salary) > 6000;

    7.查询所有部门的名字,location_id,员工数量和平均工资,并按平均工资降序

    #题目中有所有,因此要考虑外连接的问题
    #下面能筛选出27行结果,写count(字段)的方式而不是count(1)或count(*)因为部门空的话也显示1
    SELECT department_name,e.department_id,location_id, COUNT(employee_id), AVG(salary) avg_sal
    FROM employees e RIGHT JOIN departments d
    ON e.department_id = d.department_id
    GROUP BY department_name, location_id
    ORDER BY avg_sal DESC;

    8.查询每个工种、每个部门的部门名、工种名和最低工资

    SELECT e.department_id,e.job_id,MIN(salary)
    FROM employees e JOIN departments d
    ON e.department_id=d.department_id
    GROUP BY department_name,job_id;
    #上面去掉了没有人的部门,没有人的部门最低工资为null

    #下面查询的存在没有人的部门,最低工资为null,left join的话会把部门列的很全
    SELECT d.department_name,job_id,MIN(salary)
    FROM departments d LEFT JOIN employees e
    ON d.department_id=e.department_id
    GROUP BY department_name,job_id;

  • 相关阅读:
    web蓝桥杯真题:绝美宋词
    Spring源码:Spring 如何解决 Bean 的循环依赖
    目前比较好用的LabVIEW架构及其选择
    基于java“多面体”艺术培训机构管理计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署
    java 字符串只保留数字、字母、中文
    【嵌入式】常用串口协议与转换芯片详解
    Python笔记 之 wmi模块
    矩阵的QR分解
    ConstantPool::allocate记录
    这一次,Windows 站起来了:Windows ​& Linux 的性能 Battle
  • 原文地址:https://blog.csdn.net/m0_46914845/article/details/126015729