牛客网数据库SQL实战解析(41-50题)

2022-10-30,,,,

牛客网SQL刷题地址: https://www.nowcoder.com/ta/sql?page=0

牛客网数据库SQL实战解析(01-10题): https://blog.csdn.net/u010666669/article/details/104763370

牛客网数据库SQL实战解析(11-20题): https://blog.csdn.net/u010666669/article/details/104863298

牛客网数据库SQL实战解析(21-30题): https://blog.csdn.net/u010666669/article/details/104871373

牛客网数据库SQL实战解析(31-40题): https://blog.csdn.net/u010666669/article/details/104977904

牛客网数据库SQL实战解析(41-50题): https://blog.csdn.net/u010666669/article/details/104979427

牛客网数据库SQL实战解析(51-61题): https://blog.csdn.net/u010666669/article/details/104980372

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

CREATE TRIGGER audit_log AFTER INSERT ON employees_test
BEGIN
INSERT INTO audit VALUES (NEW.ID, NEW.NAME);
END;

解析:构造触发器时注意以下几点:

1、用 CREATE TRIGGER 语句构造触发器,用 BEFORE或AFTER 来指定在执行后面的SQL语句之前或之后来触发TRIGGER

2、触发器执行的内容写出 BEGIN与END 之间

3、可以使用 NEW与OLD 关键字访问触发后或触发前的employees_test表单记录

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

DELETE FROM titles_test
WHERE id NOT IN (
SELECT MIN(id)
FROM titles_test
GROUP BY emp_no
)
;

解析:删除数据用 DELETE。

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

UPDATE titles_test SET to_date = NULL, from_date = '2001-01-01'
WHERE to_date = '9999-01-01'
;

解析:用 UPDATE 语句更新若干列,UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值。

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

UPDATE titles_test SET id=5, emp_no=10005
WHERE id=5 AND emp_no=10001
;

解析:UPDATE更新数据,用,分割两列。

45. 将titles_test表名修改为titles_2017。

ALTER TABLE titles_test RENAME TO titles_2017 ;

解析:alter语句修改表名。

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

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

解析:外键约束 FOREIGN KEY。由于SQLite中不能通过 ALTER TABLE ... ADD FOREIGN KEY ... REFERENCES ... 语句来对已创建好的字段创建外键,因此只能先删除表,再重新建表的过程中创建外键。参考资料:https://www.sqlite.org/foreignkeys.html

47. 存在如下的视图:

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

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

SELECT ev.*
FROM emp_v ev, employees e
WHERE ev.emp_no=e.emp_no
;

解析:这道题出得没意思了。。。

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

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

解析:更新表字段。

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

SELECT "select count(*) from " || name || ";" AS cnts
FROM sqlite_master WHERE type = 'table'
;

解析:在 SQLite 系统表 sqlite_master 中可以获得所有表的索引,其中字段 name 是所有表的名字,而且对于自己创建的表而言,字段 type 永远是 'table'。参考:https://blog.csdn.net/xingfeng0501/article/details/7804378

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

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

解析:用 ||  做字段拼接。mysql 用 concat() 拼接。

牛客网数据库SQL实战解析(41-50题)的相关教程结束。

《牛客网数据库SQL实战解析(41-50题).doc》

下载本文的Word格式文档,以方便收藏与打印。