牛客网sql题目总结(四)

31.

  • 题目描述
    这里写图片描述
  • 题目解答
    根据题意,本题关键点是actor_id的主键设置与last_update的默认获取系统时间:
    1、在actor_id字段末尾加上PRIMARY KEY是将该字段设置为主键,或者在表的最后一行加上PRIMARY KEY(actor_id)
    2、在last_update末尾加上DEFAULT是为该字段设置默认值,且默认值为(datetime(‘now’,’localtime’)),即获得系统时间,注意最外层的括号不可省略
create table actor(actor_id smallint(5) not null primary key,
                  first_name varchar(45) not null,
                  last_name varchar(45) not null,
                  last_update timestamp not null  DEFAULT (datetime('now','localtime')))

32.

  • 题目描述
    这里写图片描述
  • 题目解答
    利用VALUES(value1, value2, …), (value1, value2, …), …(value1, value2, …),
INSERT INTO actor
VALUES (1, 'PENELOPE', 'GUINESS', '2006-02-15 12:34:33'),
(2, 'NICK', 'WAHLBERG', '2006-02-15 12:34:33')

33.

  • 题目描述
    这里写图片描述
  • 题目解答
    如果不存在则插入,如果存在则忽略
    INSERT OR IGNORE INTO tablename VALUES(…);
    如果不存在则插入,如果存在则替换
    INSERT OR REPLACE INTO tablename VALUES(…);
    这里存在表示的是unique属性的列值存在的情况下,unique表示键值唯一
insert or ignore into actor
values(3,'ED','CHASE','2006-02-15 12:34:33');

34.

  • 题目描述
    这里写图片描述
  • 题目解答
    插入数据语句使用insert into,查询使用select,将查询到的数据直接插入到表中直接使用
CREATE TABLE actor_name
(
first_name varchar(45) NOT NULL,
last_name varchar(45) NOT NULL
);
INSERT INTO actor_name SELECT first_name, last_name FROM actor;

35.

  • 题目描述
    针对如下表actor结构创建索引:
    CREATE TABLE IF NOT EXISTS actor (
    actor_id smallint(5) NOT NULL PRIMARY KEY,
    first_name varchar(45) NOT NULL,
    last_name varchar(45) NOT NULL,
    last_update timestamp NOT NULL
    DEFAULT (datetime(‘now’,’localtime’)))
    对first_name创建唯一索引uniq_idx_firstname,对last_name创建普通索idx_lastname

  • 题目解答
    1、创建唯一索引:create unique index ‘index_name’
    on table_name(column)
    2、创建普通索引:create index ‘index_name’ on table_name(column)

create unique index uniq_idx_firstname on actor(first_name);
create index idx_lastname on actor(last_name)

36.

  • 题目描述
    针对actor表创建视图actor_name_view,只包含first_name以及last_name两列,并对这两列重新命名,first_name为first_name_v,last_name修改为last_name_v:
    CREATE TABLE IF NOT EXISTS actor (
    actor_id smallint(5) NOT NULL PRIMARY KEY,
    first_name varchar(45) NOT NULL,
    last_name varchar(45) NOT NULL,
    last_update timestamp NOT NULL
    DEFAULT (datetime(‘now’,’localtime’)))

  • 题目解答
    创建视图:create view view_name (字段名1,字段名2) as select ….

create view actor_name_view as
select first_name as first_name_v ,last_name as last_name_v from  actor

37.

  • 题目描述
    针对salaries表emp_no字段创建索引idx_emp_no,查询emp_no为10005, 使用强制索引。
    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));
    create index idx_emp_no on salaries(emp_no);
  • 题目解答
    SQLite中,使用 INDEXED BY 语句进行强制索引查询,可参考:
    http://www.runoob.com/sqlite/sqlite-indexed-by.html
    MySQL中,使用 FORCE INDEX 语句进行强制索引查询,可参考:
    http://www.jb51.net/article/49807.htm
SELECT * FROM salaries INDEXED BY idx_emp_no WHERE emp_no = 10005
SELECT * FROM salaries FORCE INDEX idx_emp_no WHERE emp_no = 10005

38.

  • 题目描述
    存在actor表,包含如下列信息:
    CREATE TABLE IF NOT EXISTS actor (
    actor_id smallint(5) NOT NULL PRIMARY KEY,
    first_name varchar(45) NOT NULL,
    last_name varchar(45) NOT NULL,
    last_update timestamp NOT NULL
    DEFAULT (datetime(‘now’,’localtime’)));
    现在在last_update后面新增加一列名字为create_date, 类型为datetime, NOT NULL,默认值为’0000 00:00:00’
  • 题目解答
    用 ALTER TABLE … ADD … 语句可以向已存在的表插入新字段,并且能够与创建表时一样,在字段名和数据类型后加入NOT NULL、DEFAULT等限定,且sqlite不支持after,在mysql中可以使用after.可参考:
    http://www.runoob.com/sqlite/sqlite-alter-command.html
ALTER TABLE actor ADD COLUMN create_date datetime NOT NULL DEFAULT '0000-00-00 00:00:00';

39.

  • 题目描述
    构造一个触发器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
    );

  • 题目解答
    1.创建触发器使用语句:CREATE TRIGGER trigname;
    2.指定触发器触发的事件在执行某操作之前还是之后,使用语句:BEFORE/AFTER [INSERT/UPDATE/ADD] ON tablename
    3.触发器触发的事件写在BEGIN和END之间;
    4.触发器中可以通过NEW获得触发事件之后2对应的tablename的相关列的值,OLD获得触发事件之前的2对应的tablename的相关列的值

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

40.

  • 题目描述
    删除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’);

  • 题目解答
    先用 GROUP BY 和 MIN() 选出每个 emp_no 分组中最小的 id,然后用 DELETE FROM … WHERE … NOT IN … 语句删除 “非每个分组最小id对应的所有记录”
DELETE FROM titles_test WHERE id NOT IN 
(SELECT MIN(id) FROM titles_test GROUP BY emp_no)

猜你喜欢

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