美文网首页
牛客网SQL实战练习——41~50

牛客网SQL实战练习——41~50

作者: 西红柿炒番茄007 | 来源:发表于2020-04-01 10:13 被阅读0次

    牛客网SQL实战练习——41~50

    声明:练习牛客网SQL实战题目,整理笔记。

    41.构造一个触发器audit_log,在向employees_test表中插入一条数据的时候,触发插入相关的数据到audit中。

    CREATE TABLE employees_test(
    ID INT PRIMARY KEY NOT NULL,
    NAME TEXT NOT NULL,
    AGE INT NOT NULL,
    ADDRESS CHAR(50),
    SALARY REAL
    );
    CREATE TABLE audit(
    EMP_no INT NOT NULL,
    NAME TEXT NOT NULL
    );
    

    分析:用 CREATE TRIGGER 语句构造触发器,用 BEFORE或AFTER 来指定在执行后面的SQL语句之前或之后来触发TRIGGER;触发器执行的内容写出 BEGIN与END 之间;可以使用 NEW与OLD 关键字访问触发后或触发前的employees_test表单记录.
    参考代码:

    create trigger audit_log after insert on employees_test
    begin
        insert into audit(EMP_no, NAME) values(new.ID,new.NAME);
    end
    

    42.删除emp_no重复的记录,只保留最小的id对应的记录。

    CREATE TABLE IF NOT EXISTS titles_test (
    id int(11) not null primary key,
    emp_no int(11) NOT NULL,
    title varchar(50) NOT NULL,
    from_date date NOT NULL,
    to_date date DEFAULT NULL);
    
    insert into titles_test values ('1', '10001', 'Senior Engineer', '1986-06-26', '9999-01-01'),
    ('2', '10002', 'Staff', '1996-08-03', '9999-01-01'),
    ('3', '10003', 'Senior Engineer', '1995-12-03', '9999-01-01'),
    ('4', '10004', 'Senior Engineer', '1995-12-03', '9999-01-01'),
    ('5', '10001', 'Senior Engineer', '1986-06-26', '9999-01-01'),
    ('6', '10002', 'Staff', '1996-08-03', '9999-01-01'),
    ('7', '10003', 'Senior Engineer', '1995-12-03', '9999-01-01');
    

    分析:分两步,第一步,按emp_no进行分组,找出emp_no对应的最小id;第二步,删除不再第一步结果中的数据,使用not in关键字。
    参考代码:

    delete from titles_test
    where id not in
    (
        select min(id)
        from titles_test
        group by emp_no
        )
    

    43.将所有to_date为9999-01-01的全部更新为NULL,且 from_date更新为2001-01-01。

    CREATE TABLE IF NOT EXISTS titles_test (
    id int(11) not null primary key,
    emp_no int(11) NOT NULL,
    title varchar(50) NOT NULL,
    from_date date NOT NULL,
    to_date date DEFAULT NULL);
    
    insert into titles_test values ('1', '10001', 'Senior Engineer', '1986-06-26', '9999-01-01'),
    ('2', '10002', 'Staff', '1996-08-03', '9999-01-01'),
    ('3', '10003', 'Senior Engineer', '1995-12-03', '9999-01-01'),
    ('4', '10004', 'Senior Engineer', '1995-12-03', '9999-01-01'),
    ('5', '10001', 'Senior Engineer', '1986-06-26', '9999-01-01'),
    ('6', '10002', 'Staff', '1996-08-03', '9999-01-01'),
    ('7', '10003', 'Senior Engineer', '1995-12-03', '9999-01-01');
    

    分析:这是一道很常规的update更新数据的题目,注意,set后面用逗号隔开。
    参考代码:

    update  titles_test set to_date=null ,from_date ='2001-01-01'
    where to_date='9999-01-01'
    

    44.将id=5以及emp_no=10001的行数据替换成id=5以及emp_no=10005,其他数据保持不变,使用replace实现。

    CREATE TABLE IF NOT EXISTS titles_test (
    id int(11) not null primary key,
    emp_no int(11) NOT NULL,
    title varchar(50) NOT NULL,
    from_date date NOT NULL,
    to_date date DEFAULT NULL);
    
    insert into titles_test values ('1', '10001', 'Senior Engineer', '1986-06-26', '9999-01-01'),
    ('2', '10002', 'Staff', '1996-08-03', '9999-01-01'),
    ('3', '10003', 'Senior Engineer', '1995-12-03', '9999-01-01'),
    ('4', '10004', 'Senior Engineer', '1995-12-03', '9999-01-01'),
    ('5', '10001', 'Senior Engineer', '1986-06-26', '9999-01-01'),
    ('6', '10002', 'Staff', '1996-08-03', '9999-01-01'),
    ('7', '10003', 'Senior Engineer', '1995-12-03', '9999-01-01');
    

    分析:使用replace into替换
    参考代码:`

    replace into titles_test values(5, 10005, 'Senior Engineer', '1986-06-26', '9999-01-01')`
    

    45.将titles_test表名修改为titles_2017。

    CREATE TABLE IF NOT EXISTS titles_test (
    id int(11) not null primary key,
    emp_no int(11) NOT NULL,
    title varchar(50) NOT NULL,
    from_date date NOT NULL,
    to_date date DEFAULT NULL);
    
    insert into titles_test values ('1', '10001', 'Senior Engineer', '1986-06-26', '9999-01-01'),
    ('2', '10002', 'Staff', '1996-08-03', '9999-01-01'),
    ('3', '10003', 'Senior Engineer', '1995-12-03', '9999-01-01'),
    ('4', '10004', 'Senior Engineer', '1995-12-03', '9999-01-01'),
    ('5', '10001', 'Senior Engineer', '1986-06-26', '9999-01-01'),
    ('6', '10002', 'Staff', '1996-08-03', '9999-01-01'),
    ('7', '10003', 'Senior Engineer', '1995-12-03', '9999-01-01');
    

    分析:使用rename to。
    参考代码:

    alter table titles_test rename to titles_2017;
    

    46.在audit表上创建外键约束,其emp_no对应employees_test表的主键id。

    CREATE TABLE employees_test(
    ID INT PRIMARY KEY NOT NULL,
    NAME TEXT NOT NULL,
    AGE INT NOT NULL,
    ADDRESS CHAR(50),
    SALARY REAL
    );
    
    CREATE TABLE audit(
    EMP_no INT NOT NULL,
    create_date datetime NOT NULL
    );
    

    分析:先删除表,然后再建立该表,在表中直接进行外键约束;注意;MySQL的写法与SQLite的写法略有不同。这里使用SQLite。
    参考代码:

    drop table audit;
    create table audit(
        EMP_no int not null,
        create_date datetime not null,
        foreign key(EMP_no) references employees_test(ID));
    

    47.存在如下的视图:

    create view emp_v as select * from employees where emp_no >10005;
    

    如何获取emp_v和employees有相同的数据?

    CREATE TABLE `employees` (
    `emp_no` int(11) NOT NULL,
    `birth_date` date NOT NULL,
    `first_name` varchar(14) NOT NULL,
    `last_name` varchar(16) NOT NULL,
    `gender` char(1) NOT NULL,
    `hire_date` date NOT NULL,
    PRIMARY KEY (`emp_no`));
    输出格式:
    emp_no  birth_date  first_name  last_name   gender  hire_date
    10006   1953-04-20  Anneke  Preusig F   1989-06-02
    10007   1957-05-23  Tzvetan Zielinski   F   1989-02-10
    10008   1958-02-19  Saniya  Kalloufi    M   1994-09-15
    10009   1952-04-19  Sumant  Peac    F   1985-02-18
    10010   1963-06-01  Duangkaew   Piveteau    F   1989-08-24
    10011   1953-11-07  Mary    Sluis   F   1990-01-22
    

    分析:本题可以直接用 WHERE 选取二者 emp_no 相等的记录。
    参考代码:

    select e.*
    from employees as e,emp_v as ev
    where e.emp_no=ev.emp_no
    

    48.将所有获取奖金的员工当前的薪水增加10%。

    create table emp_bonus(
    emp_no int not null,
    recevied datetime not null,
    btype smallint not null);
    CREATE TABLE `salaries` (
    `emp_no` int(11) NOT NULL,
    `salary` int(11) NOT NULL,
    `from_date` date NOT NULL,
    `to_date` date NOT NULL, PRIMARY KEY (`emp_no`,`from_date`));
    

    分析:根据题目正常逻辑,先选出获得奖金的员工emp_no.然后在更新工资的。使用一个子查询即可。
    参考代码:

    update salaries set salary=salary*1.1 where emp_no in (
        select emp_no from emp_bonus
    ) and to_date='9999-01-01'
    

    49.针对库中的所有表生成select count()对应的SQL语句*

    CREATE TABLE `employees` (
    `emp_no` int(11) NOT NULL,
    `birth_date` date NOT NULL,
    `first_name` varchar(14) NOT NULL,
    `last_name` varchar(16) NOT NULL,
    `gender` char(1) NOT NULL,
    `hire_date` date NOT NULL,
    PRIMARY KEY (`emp_no`));
    create table emp_bonus(
    emp_no int not null,
    recevied datetime not null,
    btype smallint not null);
    CREATE TABLE `dept_emp` (
    `emp_no` int(11) NOT NULL,
    `dept_no` char(4) NOT NULL,
    `from_date` date NOT NULL,
    `to_date` date NOT NULL,
    PRIMARY KEY (`emp_no`,`dept_no`));
    CREATE TABLE `dept_manager` (
    `dept_no` char(4) NOT NULL,
    `emp_no` int(11) NOT NULL,
    `from_date` date NOT NULL,
    `to_date` date NOT NULL,
    PRIMARY KEY (`emp_no`,`dept_no`));
    CREATE TABLE `salaries` (
    `emp_no` int(11) NOT NULL,
    `salary` int(11) NOT NULL,
    `from_date` date NOT NULL,
    `to_date` date NOT NULL,
    PRIMARY KEY (`emp_no`,`from_date`));
    输出格式:
    cnts
    select count(*) from employees;
    select count(*) from departments;
    select count(*) from dept_emp;
    select count(*) from dept_manager;
    select count(*) from salaries;
    select count(*) from titles;
    select count(*) from emp_bonus;
    

    分析:在 SQLite 系统表 sqlite_master 中可以获得所有表的索引,其中字段 name 是所有表的名字,而且对于自己创建的表而言,字段 type 永远是 'table'。
    参考代码:

    select "select count(*) from "||name||";" as cnts
    from sqlite_master 
    where type='table';
    

    50.将employees表中的所有员工的last_name和first_name通过(')连接起来。

    CREATE TABLE `employees` (
    `emp_no` int(11) NOT NULL,
    `birth_date` date NOT NULL,
    `first_name` varchar(14) NOT NULL,
    `last_name` varchar(16) NOT NULL,
    `gender` char(1) NOT NULL,
    `hire_date` date NOT NULL,
    PRIMARY KEY (`emp_no`));
    输出格式:
    name
    Facello'Georgi
    Simmel'Bezalel
    Bamford'Parto
    Koblick'Chirstian
    Maliniak'Kyoichi
    Preusig'Anneke
    Zielinski'Tzvetan
    Kalloufi'Saniya
    Peac'Sumant
    Piveteau'Duangkaew
    Sluis'Mary
    

    分析:本题中使用||连接字符串
    参考代码:

    select last_name||"'"||first_name from employees
    

    欢迎关注微信公众号:蛋炒番茄
    同步更新!!!

    相关文章

      网友评论

          本文标题:牛客网SQL实战练习——41~50

          本文链接:https://www.haomeiwen.com/subject/ynlouhtx.html