zoukankan      html  css  js  c++  java
  • mysql新手进阶01

    生活不止眼前的苟且,还有诗和远方。

    请根据给出的数据库表结构来回答相应问题:
    DEPT (DEPTNO INT, DNAME VARCHAR(14),LOC VARCHAR(13));
    EMP (EMPNO INT,ENAME VARCHAR(10), JOB VARCHAR(9), MGR INT, HIREDATE DATE,
    SAL FLOAT, COMM FLOAT, DEPTNO INT);
    BONUS (ENAME VARCHAR(10), JOB VARCHAR(9), SAL INT, COMM INT);
    SALGRADE ( GRADE INT, LOSAL INT, HISAL INT);
    其中表中包含如下数据:

    DEPT表:

    EMP表:

    SALGRADE表:

    BONUS表: 无数据
    根据上面描述完成下面问题:
    (注意:注意保存脚本,尤其是DDL和DML,以便进行数据还原)
    DDL
    1.写出上述表的建表语句。此外,在DEPT上创建名为”PK_DEPT”的主键约束,在EMP表上创建名为” PK_EMP”的主键约束以及指向表DEPT的外键约束” FK_DEPTNO”。

    命令:
    create table DEPT (DEPTNO INT,
    DNAME VARCHAR(14),
    LOC VARCHAR(13),
    constraint pk_dept primary key (DEPTNO));

    create table EMP (EMPNO INT,
    ENAME VARCHAR(10),
    JOB VARCHAR(9),
    MGR INT,
    HIREDATE DATETIME,
    SAL FLOAT,
    COMM FLOAT,
    DEPTNO INT,
    constraint pk_emp primary key (EMPNO),
    constraint fk_deptno foreign key (deptno) references dept(deptno));

    create table BONUS(ENAME VARCHAR(10),
    JOB VARCHAR(9),
    SAL INT,
    COMM INT);
    create table SALGRADE ( GRADE INT,
    LOSAL INT,
    HISAL INT);

    DML
    2.给出相应的INSERT语句来完成题中给出数据的插入。

    命令:
    insert into dept values(10, 'accounting', 'New York');
    insert into dept values(20, 'research', 'Dallas');
    insert into dept values(30, 'sales', 'Chicago');
    insert into dept values(40, 'operations', 'Boston');

    insert into emp values(7369, 'SMITH', 'CLERK', 7902, '1980-12-17 0:00:00', 800, NULL, 20);
    insert into emp values(7499, 'ALLEN', 'SALESMAN', 7698, '1981-2-20 0:00:00', 1600, 300, 30);
    insert into emp values(7521, 'WARD', 'SALESMAN', 7698, '1981-2-22 0:00:00', 1250, 500, 30);
    insert into emp values(7566, 'JONES', 'MANAGER', 7839, '1981-4-2 0:00:00', 2975, NULL, 20);
    insert into emp values(7654, 'MARTIN', 'SALESMAN', 7698, '1981-9-28 0:00:00', 1250, 1400, 30);
    insert into emp values(7698, 'BLAKE', 'MANAGER', 7839, '1981-5-1 0:00:00', 2850, NULL, 30);
    insert into emp values(7782, 'CLARK', 'MANAGER', 7839, '1981-6-9 0:00:00', 2450, NULL, 10);
    insert into emp values(7788, 'SCOTT', 'ANALYST', 7566, '1987-6-13 0:00:00', 3000, NULL, 20);
    insert into emp values(7839, 'KING', 'PRESIDENT', NULL, '1981-11-17 0:00:00', 5000, NULL, 10);
    insert into emp values(7844, 'TURN', 'SALESMAN', 7698, '1981-9-8 0:00:00', 1500, 0, 30);
    insert into emp values(7876, 'ADAMS', 'CLERK', 7788, '1987-6-13 0:00:00', 1100, NULL, 20);
    insert into emp values(7900, 'JAMES', 'CLERK', 7698, '1981-12-3 0:00:00', 950, NULL, 30);
    insert into emp values(7934, 'MILLER', 'CLERK', 7782, '1982-1-23 0:00:00', 1300, NULL, 10);

    INSERT INTO SALGRADE VALUES(1, 700, 1200);
    INSERT INTO SALGRADE VALUES(2, 1201, 1400);
    INSERT INTO SALGRADE VALUES(3, 1401, 2000);
    INSERT INTO SALGRADE VALUES(4, 2001, 3000);
    INSERT INTO SALGRADE VALUES(5, 3001, 9999);

    3.将所有员工的工资上浮10%.然后查询员工姓名、薪水、补助。(emp.sal为工资,emp.comm为补助)

    命令:
    UPDATE EMP SET SAL = SAL + SAL * 0.1;
    SELECT ENAME, SAL, COMM FROM EMP;
    结果:

    单表查询
    4.查看EMP表中部门号为10的员工的姓名,职位,参加工作时间,工资。

    命令:
    SELECT ENAME, JOB, HIREDATE, SAL FROM EMP WHERE DEPTNO = 10;
    结果:

    5.查所有已有的职位,要求去除重复项。

    命令:
    SELECT DISTINCT JOB FROM EMP;
    结果:

    6.计算每个员工的年薪,并取列名为Salary of Year(emp.sal为员工的月薪),要求输出员工姓名,年薪。

    命令:
    SELECT ENAME ename, SAL*12 'Salary Of Year' FROM EMP;
    结果:

    7.查询每个员工每个月拿到的总金额(emp.sal为工资,emp.comm为补助)。(提示:isnull(ex1,ex2)表示如果ex1为空则返回ex2)

    命令:
    SELECT ENAME ename, isnull(comm, 0)+ sal total FROM EMP;
    结果:

    8.显示职位是主管(manager)的员工的姓名,工资。

    命令:
    SELECT ENAME, SAL FROM EMP WHERE JOB = 'MANAGER';
    结果:

    9.显示第3个字符为大写O的所有员工的姓名及工资。

    命令:
    SELECT ENAME, SAL FROM EMP WHERE ENAME like '__O%';

    结果:

    10.显示职位为销售员(SALESMAN)或主管(MANAGER)的员工的姓名,工资,职位。

    命令:
    select ename, sal, job from emp where job = 'SALESMAN' or job = 'MANAGER';
    结果:

    11.显示所有没有补助的员工的姓名。

    命令:
    select ename from emp where comm is null;
    结果:

    12.显示有补助的员工的姓名,工资,补助。

    命令:
    select ename, sal, comm from emp where comm is not null;
    结果:

    13.排序显示所有员工的姓名,工资(按工资降序方式)。

    命令:
    select ename, sal from emp order by sal desc;
    结果:

    14.显示员工的最高工资和最低工资。

    命令:
    select max(sal) 最高工资, min(sal) 最低工资from emp;
    结果:

    15.显示所有员工的平均工资和总计工资。

    命令:
    select avg(sal) 平均工资, sum(sal) 总计工资from emp;
    结果:

    16.显示补助在员工中的发放比例、即有多少比例的员工有补助。(此题需注意两个问题:1.select语句中进行除法如何保留小数点后数据。2.count函数如何处理null型数据。)

    命令:
    select count(comm) * 1.0 / count(ename) from emp;
    结果:

    聚合查询
    17.显示每种职业的平均工资。

    命令:
    select job, avg(sal) average from emp group by job;
    结果:

    18.显示每个部门每种岗位的平均工资和最高工资。

    命令:
    select deptno, job, avg(sal) average, max(sal) max from emp group by deptno, job;
    结果:

    19.显示平均工资低于2500的部门号,平均工资及最高工资。

    命令:
    select deptno, avg(sal) average, max(sal) max from emp group by deptno having avg(sal) < 2500;
    结果:

    20.上一条语句以平均工资升序排序。

    命令:
    select deptno, avg(sal) average, max(sal) max from emp group by deptno having avg(sal) < 2500 order by avg(sal) asc;

    结果:

    多表查询
    21.显示工资高于2500或岗位为MANAGER的所有员工的姓名,工资,职位,和部门号。

    命令:select ename, sal, job, deptno from emp where sal > 2500 or job = 'MANAGER';
    结果:

    22.排序显示所有员工的姓名,部门号,工资(以部门号升序,工资降序,雇用日期升序显示)。

    命令:select ename, deptno, sal from emp order by deptno asc, sal desc, hiredate asc;
    结果:

    23.采用自然连接的原理显示部门名以及相应的员工姓名。(Sql server不支持NATURAL JOIN语法。)
    命令:select dname, ename from emp, dept where emp.deptno = dept.deptno;
    结果:

    24.查询SCOTT的上级领导的姓名。

    命令:select leader.ename from emp, emp leader where emp.ename = 'SCOTT' and emp.mgr = leader.empno;

    结果:

    25.显示部门的部门名称,员工名即使部门没有员工也显示部门名称。

    命令:select dname, ename from dept left join emp on dept.deptno = emp.deptno;

    结果:

    子查询
    26.显示所有员工的名称、工资以及工资级别。

    命令:select ename, sal, grade from emp, salgrade where emp.sal between salgrade.losal and salgrade.hisal;

    结果:

    27.显示ACCOUNTING部门所有员工的名称,工资。

    命令:select ename, sal from emp, dept where emp.deptno = dept.deptno and dept.dname = 'ACCOUNTING';
    结果:

    28.显示职位属于10号部门所提供职位范围的员工的姓名,职位,工资,部门号。

    命令:select ename, job, sal, deptno from emp where job in (select job from emp where deptno = 10);
    结果:

    29.显示在所有员工用中高于30号部门中任一个员工工资的员工的姓名,工资和部门号。

    命令:select ename, sal, deptno from emp where sal > all (select sal from emp where deptno = 30);
    结果:

    集合查询
    30.显示工资高于2500或职位为MANAGER的员工的姓名,工资和职位(采用UNION语法实现)。

    命令:select ename, sal, job from emp where sal > 2500
    union
    select ename, sal, job from emp where job = 'MANAGER';
    结果:

    31.显示工资高于2500且职位为MANAGER的员工的姓名,工资和职位(采用INTERSECT语法实现)。

    命令:select ename, sal, job from emp where sal > 2500
    intersect
    select ename, sal, job from emp where job = 'MANAGER';
    结果:

    32.显示工资高于2500但职位不是MANAGER的员工的姓名,工资和职位(采用MINUS语法实现)。

    命令:select ename, sal, job from emp where sal > 2500
    EXCEPT
    select ename, sal, job from emp where job = 'MANAGER';
    结果:

  • 相关阅读:
    关于各种好玩的神奇函数
    模板——AC自动机
    模板——造数据
    VIM常用操作
    springboot注解
    面试题
    Linux常用命令
    Zookeeper
    对cpu与load的理解及线上问题处理思路
    top
  • 原文地址:https://www.cnblogs.com/king8/p/8676572.html
Copyright © 2011-2022 走看看