第三章:
    学习内容:DML,DQL
    练习1
    1.向部门表新增一个部门,部门编号为50,部门名称为HR,工作地点为SY。
    INSERT INTO dept (DEPTNO,DNAME,Daddress) VALUES (50,”HR”,”SY”);
    2.向部门表新增一个部门,部门编号为60,部门名称为MARKET。
    INSERT INTO dept (DEPTNO,DNAME) VALUES (60,”MARKET”);

    练习2
    1.向员工表中新增一个员工,员工编号为8888,姓名为BOB,岗位为CLERK,经理为号7788,入职日期为1985-03-03,薪资3000,奖金和部门为空
    INSERT INTO emp (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL) VALUES (8888,”BOB”,”CLERK”,7788,”1985-03-03”,3000);

    练习3
    1.使用CREATE TABLE emp_back as
    SELECT FROM EMP WHERE 1=0,创建emp_back表,拷贝下来即可。
    CREATE TABLE emp_back as
    SELECT
    FROM EMP WHERE 1=0;

    2.把emp表中入职日期大于1982年1月1日之前的员工信息复制到emp_back表中。
    INSERT INTO emp_back SELECT * FROM emp WHERE HIREDATE>”1982-1-1” ;

    练习4
    1.修改部门20的员工信息,把82年之后入职的员工入职日期向后调整10天
    update emp SET HIREDATE=DATE_ADD(HIREDATE,INTERVAL 10 DAY) WHERE DEPTNO=20 ;
    2.修改奖金为null的员工,奖金设置为0
    UPDATE emp SET COMM =0 WHERE COMM IS NULL;
    3.修改工作地点在NEW YORK或CHICAGO的员工工资,工资增加500
    UPDATE emp SET SAL=SAL+500 WHERE DEPTNO IN (SELECT DEPTNO FROM dept WHERE LOC=”NEW YORK” OR LOC=”CHICAGO”);

    练习5
    1.删除经理编号为7566的员工记录
    DELETE FROM emp WHERE MGR=7566;
    2.删除工作在NEW YORK的员工记录
    DELETE FROM emp WHERE address=”NEW YORK”;
    3.删除工资大于所在部门平均工资的员工记录 —每个部门的平均薪资
    解1:DELETE FROM emp WHERE emp.EMPNO IN
    ( SELECT from(SELECT e.EMPNO from
    emp e INNER JOIN (SELECT DEPTNO ,AVG(SAL) AS “SAL2” from emp where DEPTNO IS NOT NULL GROUP BY DEPTNO) a
    ON e.DEPTNO=a.DEPTNO WHERE e.SAL>a.SAL2) c );
    解2:DELETE FROM emp WHERE empno IN (SELECT
    FROM (SELECT empno FROM emp B JOIN (SELECT AVG(SAL) as avg,deptno FROM emp GROUP BY deptno) AS A ON A.deptno = B.deptno WHERE sal > A.avg) AS TEMP); —待验证???
    解3:
    DELETE FROM emp WHERE emp.EMPNO IN (SELECT * FROM (SELECT emp.EMPNO FROM emp,(SELECT AVG(emp.SAL) b,emp.DEPTNO FROM emp GROUP BY emp.DEPTNO) a WHERE a.DEPTNO =emp.DEPTNO AND emp.SAL > a.b) c ) —待验证???

    练习5
    1.test表为空表,分析如下语句操作后,最后test表的状态。
    BEGININSERT INTO test(id,name) values(1, ‘a’);
    INSERT INTO test(id,name) values(2, ‘b’);
    SAVEPOINT s1; — 设置定点
    INSERT INTO test(id,name) values(3, ‘c’);
    INSERT INTO test(id,name) values(4, ‘d’);
    DELETE FROM test WHERE id in (1,3); —设置定点
    ROLLBACK TO s1; —回滚到s1断点 , 则s1后的执行语句到当前回滚操作的更新语句撤销并恢复
    DELETE FROM test WHERE id in (2,4);
    COMMIT;
    ROLLBACK;

    第三章课后作业:

    第四章:

    课后作业:
    1.查询入职时间在1982-7-9之后,并且不从事SALESMAN工作的员工姓名、入职时间、职位。
    SELECT ENAME,HIREDATE,JOB FROM emp WHERE JOB NOT IN (‘SALESMAN’) AND HIREDATE>’1982-07-09’;
    2.查询员工姓名的第三个字母是a的员工姓名。
    SELECT ENAME FROM emp WHERE ENAME LIKE ‘__a%’;
    3.查询除了10、20号部门以外的员工姓名、部门编号。
    SELECT ENAME,EMPNO FROM emp WHERE DEPTNO NOT IN(10,20);
    4.查询部门号为30号员工的信息,先按工资降序排序,再按姓名升序排序。
    SELECT FROM emp WHERE DEPTNO=30 ORDER BY SAL,ENAME
    5.查询没有上级的员工(经理号为空)的员工姓名。
    SELECT
    FROM emp WHERE MGR IS NULL;
    6.查询工资大于等于4500并且部门为10或者20的员工的姓名\工资、部门编号。
    SELECT ENAME,SAL,DEPTNO FROM emp WHERE SAL>=4500 AND (DEPTNO=10 OR DEPTNO=20);

    练习1
    1.使用两种方式查询所有员工(EMP)信息
    SELECT *from emp;
    select EMPNO,ENAME,JOB,MGR,HIREDATE,SAL FROM emp;

    2.查询(EMP)员工编号、员工姓名、员工职位、员工月薪、工作部门编号。
    SELECT EMPNO,ENAME,JOB,SAL,DEPTNO FROM emp;

    练习2
    1.员工转正后,月薪上调20%,请查询出所有员工转正后的月薪。
    SELECT ENAME,SAL0.02 from emp ;
    2.员工试用期6个月,转正后月薪上调20%,请查询出所有员工工作第一年的年薪所得(不考虑奖金部分,年薪的试用期6个月的月薪+转正后6个月的月薪)
    SELECT ENAME as 员工姓名,SAL
    6+SAL0.026 AS “年薪” FROM eMP;

    练习3
    1.员工转正后,月薪上调20%,请查询出所有员工转正后的月薪。
    SELECT ENAME,SAL0.02 from emp ;
    2.员工试用期6个月,转正后月薪上调20%,请查询出所有员工工作第一年的年薪所得(不考虑奖金部分,年薪的试用期6个月的月薪+转正后6个月的月薪)
    SELECT ENAME as 员工姓名,SAL
    6+SAL0.026 AS “年薪” FROM emp;
    1.员工试用期6个月,转正后月薪上调20%,请查询出所有员工工作第一年的所有收入(需考虑奖金部分),要求显示列标题为员工姓名,工资收入,奖金收入,总收入。
    SELECT ENAME AS 员工姓名, SAL6+SAL0.026 AS 工资收入,COMM AS 奖金收入,SAL6+SAL0.026+ISNULL(COMM,0) AS 总收入 from emp;

    练习4
    1.查询员工表中一共有哪几种岗位类型
    SELECT DISTINCT DEPTNO FROM emp ;

    练习5
    1. 分别查看员工表、部门表、薪资等级表的表结构
    DESC emp;
    DESC dept;
    DESC salgrade;

    练习6
    1.查询职位为SALESMAN的员工编号、职位、入职日期。
    SELECT EMPNO,JOB,HIREDATE FROM emp where JOB=”SALESMAN”;
    2.查询1985年12月31日之前入职的员工姓名及入职日期。
    SELECT ENAME,HIREDATE FROM emp WHERE HIREDATE<’1985-12-31’;
    3.查询部门编号不在10部门的员工姓名、部门编号。
    SELECT ENAME,DEPTNO FROM emp WHERE DEPTNO NOT IN (10);

    练习7
    1.查询入职日期在82年至85年的员工姓名,入职日期。
    SELECT ENAME,HIREDATE FROM emp WHERE HIREDATE BETWEEN ‘1982-0-0’ AND ‘1985-0-0’;
    2.查询月薪在3000到5000的员工姓名,月薪。
    SELECT ENAME,SAL FROM emp WHERE SAL BETWEEN 3000 AND 5000;
    3.查询部门编号为10或者20的员工姓名,部门编号。
    SELECT ENAME,DEPTNO FROM emp WHERE DEPTNO IN (10,20);
    4.查询经理编号为7902, 7566, 7788的员工姓名,经理编号。
    SELECT ENAME,MGR FROM emp WHERE MGR IN (7902,7566,7788);

    练习8
    1.查询员工姓名以W开头的员工姓名。
    SELECT ENAME FROM emp WHERE ENAME LIKE “W%”;
    2.查询员工姓名倒数第2个字符为T的员工姓名。
    SELECT ENAME FROM emp WHERE ENAME LIKE “%T_”;
    3.查询奖金为空的员工姓名,奖金。
    SELECT ENAME FROM emp WHERE COMM IS NULL;

    练习9
    1.查询工资超过2000并且职位是MANAGER,或者职位是SALESMAN的员工姓名、职位、工资
    SELECT ENAME,JOB,SAL FROM emp WHERE ( SAL>2000 AND JOB=”MANAGER” ) OR JOB=”SALESMAN”;
    2.查询工资超过2000并且职位是 MANAGER或SALESMAN的员工姓名、职位、工资。
    SELECT ENAME,JOB,SAL FROM emp WHERE sal>2000 AND (JOB=”MANAGER” OR JOB=”SALESMAN”);
    3.查询部门在10或者20,并且工资在3000到5000之间的员工姓名、部门、工资。
    SELECT ENAME,JOB,SAL FROM emp WHERE sal BETWEEN 3000 AND 5000 AND DEPTNO IN (10,20);
    4.查询入职日期在81年,并且职位不是SALES开头的员工姓名、入职日期、职位。
    SELECT ENAME,HIREDATE,JOB FROM emp WHERE HIREDATE LIKE “1981%” AND JOB NOT LIKE “SALES%”;
    5.查询职位为SALESMAN或MANAGER,部门编号为10或者20,姓名包含A的员工姓名、职位、部门编号。
    SELECT ENAME,JOB,DEPTNO FROM emp WHERE (JOB=”SALESMAN” OR JOB=”MANAGER”) AND DEPTNO IN (10,20) AND ENAME LIKE “%A%”;

    练习10
    1.查询部门在20或30的员工姓名,部门编号,并按照工资升序排序。
    SELECT ENAME,DEPTNO FROM emp WHERE DEPTNO IN (20,30) ORDER BY SAL;
    2.查询工资在2000-3000之间,部门不在10号的员工姓名,部门编号,工资,并按照部门升序,工资降序排序。
    SELECT ENAME,DEPTNO,SAL FROM emp WHERE SAL BETWEEN 2000 AND 3000 AND DEPTNO NOT IN (10) ORDER BY DEPTNO ASC,SAL DESC;
    3.查询入职日期在82年至83年之间,职位以SALES或者MAN开头的员工姓名,入职日期,职位,并按照入职日期降序排序。
    SELECT ENAME,HIREDATE,JOB FROM emp WHERE HIREDATE BETWEEN ‘1982-0-0’ AND ‘1983-0-0’ AND ENAME LIKE “MAN%” OR ENAME LIKE “SALES%”
    ORDER BY HIREDATE DESC;

    练习11
    1.查询入职日期最早的前5名员工姓名,入职日期。
    SELECT ENAME,HIREDATE FROM emp ORDER BY HIREDATE LIMIT 0,5;
    2.查询工作在CHICAGO并且入职日期最早的前2名员工姓名,入职日期。
    SELECT ENAME,HIREDATE FROM emp WHERE ADDRESS=”CHICAGO” ORDER BY HIREDATE LIMIT 0,2;
    3.按照每页显示5条记录,分别查询第1页,第2页,第3页信息,要求显示员工姓名、入职日期、部门名称。
    SELECT ENAME AS 员工姓名,HIREDATE AS “入职日期”,DEPTNO AS “部门名称” from emp LIMIT 0,5;
    SELECT ENAME AS 员工姓名,HIREDATE AS “入职日期”,DEPTNO AS “部门名称” from emp LIMIT 6,5;
    SELECT ENAME AS 员工姓名,HIREDATE AS “入职日期”,DEPTNO AS “部门名称” from emp LIMIT 12,5;