牛客网sql题目总结(五)

41.

  • 题目描述
    将所有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 语句用于修改表中的数据,语法:
    UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
update titles_test
set to_date=NULL,from_date='2001-01-01'
where to_date='9999-01-01'

42.

  • 题目描述
    将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 的新记录中 id=5,与表中的主键 id=5 冲突,故会替换掉表中 id=5 的记录,否则会插入一条新记录(例如新插入的记录 id = 10)。并且要将所有字段的值写出,否则将置为空。可参考:
    http://blog.csdn.net/zhangjg_blog/article/details/23267761
replace into titles_test(id,emp_no,title,from_date,to_date)
values(5,10005,'Senior Engineer','1986-06-26','9999-01-01')

方法二:运用REPLACE(X,Y,Z)函数。其中X是要处理的字符串,Y是X中将要被替换的字符串,Z是用来替换Y的字符串,最终返回替换后的字符串。以下语句用 UPDATE和REPLACE 配合完成,用REPLACE函数替换后的新值复制给 id=5 的 emp_no。REPLACE的参数为整型时也可通过。

UPDATE titles_test 
SET emp_no = REPLACE(emp_no,10001,10005) 
WHERE id = 5

43.

  • 题目描述
    将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’),
08-03’, ‘9999-01-01’),
(‘7’, ‘10003’, ‘Senior Engineer’, ‘1995-12-03’, ‘9999-01-01’);

alter table titles_test rename to titles_2017

44.

  • 题目描述
    在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
);

DROP TABLE audit;
CREATE TABLE audit(
    EMP_no INT NOT NULL,
    create_date datetime NOT NULL,
    FOREIGN KEY(EMP_no) REFERENCES employees_test(ID));

45.

  • 题目描述
    存在如下的视图:
    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
  • 题目解答
    由于视图 emp_v 的记录是从 employees 中导出的,所以要判断两者中相等的数据,只需要判断emp_no相等即可。
    用 WHERE 选取二者 emp_no 相等的记录:
select employees.*
from employees,emp_v
where employees.emp_no=emp_v.emp_no

46.

  • 题目描述
    将所有获取奖金的员工当前的薪水增加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,即用 INNER JOIN 连接 salaries 和 emp_bonus,且用 s.to_date = ‘9999-01-01’ 表示当前薪水,然后再用 UPDATE … SET … WHERE … IN … 语句来更新表中数据。

UPDATE salaries SET salary = salary * 1.1 
WHERE emp_no IN
(SELECT s.emp_no FROM salaries AS s INNER JOIN emp_bonus AS eb 
ON s.emp_no = eb.emp_no AND s.to_date = '9999-01-01')

47.

  • 题目描述
    针对库中的所有表生成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;
  • 题目解答
    本题主要有以下两个关键点:
    1、在 SQLite 系统表 sqlite_master 中可以获得所有表的索引,其中字段 name 是所有表的名字,而且对于自己创建的表而言,字段 type 永远是 ‘table’,详情可参考:
    http://blog.csdn.net/xingfeng0501/article/details/7804378
    2、在 SQLite 中用 “||” 符号连接字符串
SELECT "select count(*) from " || name || ";" AS cnts
FROM sqlite_master WHERE type = 'table'

48.

  • 题目描述
    将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

49.

  • 题目描述
    查找字符串’10,A,B’ 中逗号’,’出现的次数cnt。
  • 题目解答
    由于 SQLite 中没有直接统计字符串中子串出现次数的函数,因此本题用length()函数与replace()函数的结合灵活地解决了统计子串出现次数的问题,属于技巧题,即先用replace函数将原串中出现的子串用空串替换,再用原串长度减去替换后字符串的长度,最后除以子串的长度(本题中此步可省略,若子串长度大于1则不可省试想一下子串若不是一个逗号,而是两个逗号,就知道除以子串长度的意义了。)
sELECT (length("10,A,B")-length(replace("10,A,B",",","")))/length(",") AS cnt

50.

  • 题目描述
    获取Employees中的first_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));
    输出格式:
    first_name
    Chirstian
    Tzvetan
    Bezalel
    Duangkaew
    Georgi
    Kyoichi
    Anneke
    Sumant
    Mary
    Parto
    Saniya
  • 题目解答
    本题考查 substr(X,Y,Z) 或 substr(X,Y) 函数的使用。其中X是要截取的字符串。Y是字符串的起始位置(注意第一个字符的位置为1,而不为0),取值范围是±(1~length(X)),当Y等于length(X)时,则截取最后一个字符;当Y等于负整数-n时,则从倒数第n个字符处截取。Z是要截取字符串的长度,取值范围是正整数,若Z省略,则从Y处一直截取到字符串末尾;若Z大于剩下的字符串长度,也是截取到字符串末尾为止。
select first_name 
from employees
ORDER BY substr(first_name,-2)

猜你喜欢

转载自blog.csdn.net/qq_33186949/article/details/80213059