「牛客网SQL实战」| Day6 | 表的创建 | 数据的插入 | 创建与使用索引

☺☺☺

文章目录

      • 六道题
        • 考查知识点
        • 一、将employees表的所有员工的last_name和first_name拼接起来作为Name,中间以一个空格区分
        • 二、创建一个actor表,包含如下列信息
          • 知识点:创建数据表
        • 三、对于表actor批量插入如下数据(不能有2条insert语句哦!)
          • 知识点:向数据表中添加数据
        • 四、对于表actor批量插入如下数据,如果数据已经存在,请忽略(不支持使用replace操作)
        • 五、请你创建一个actor_name表,并且将actor表中的所有first_name以及last_name导入该表.
        • 六、针对如下表actor结构创建索引
          • 知识点:创建与使用索引

六道题

考查知识点
题号 知识点
1 sqlite中字符串拼接符号为||;在MySQL中拼接用contact函数 ,语法格式为:CONCAT(char c1, char c2, ..., char cn) ,其中char代表字符串,定长与不定长均可以
2 创建数据表:CREATE TABLE <表名> (列名和具体定义)
3 向数据表中插入数据:INSERT INTO <表名> (列名) VALUES (数据1),(数据2)
4 INSERT IGNORE插入数据,若数据存在则忽略
5 创建表并导入已有表的数据:将创建表中的VALUES替换为子查询SELECT
6 创建索引CREATE INDEX ; 创建唯一索引CREATE UNIQUE INDEX
一、将employees表的所有员工的last_name和first_name拼接起来作为Name,中间以一个空格区分
  • 题目描述:

将employees表的所有员工的last_name和first_name拼接起来作为Name,中间以一个空格区分
(注:该数据库系统是sqllite,字符串拼接为 || 符号,不支持concat函数)
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));

  • 分析:
    这是一个新的知识点,考察sql里字符串的拼接。牛客用的sqlite,所以拼接符号为||,在MySQL中拼接用contact函数
#语法格式:
CONCAT(char c1, char c2, ..., char cn) ,其中char代表字符串,定长与不定长均可以
  • 代码:
SELECT (e.last_name ||' '|| e.first_name) AS Name
FROM employees e
二、创建一个actor表,包含如下列信息
  • 题目描述:

创建一个actor表,包含如下列信息(注:sqlite获取系统默认时间是datetime(‘now’,‘localtime’))
「牛客网SQL实战」| Day6 | 表的创建 | 数据的插入 | 创建与使用索引_第1张图片

  • 分析:本题考查的数数据表的创建
知识点:创建数据表
  1. 数据表由行和列组成,所以创建湖居标的过程就是定义数据表的列的过程,也就是定义数据表结构的过程。
  • 创建表的语法:名字不用加单引号
CREATE TABLE <表名>
(
	<列名> <数据类型> [DEFAULT] [<列约束1> <列约束2> ...]
)
  1. 数据类型:
    smallint:表示精确数值型,-2^15~2^15-1
    varcahr:表示字符型,是非定长的Unicode字符
    timestamp:表示特殊的数据类型。提供数据库范围内的唯一值。所定义的列更新或添加数据行时,此列的值会被自动更新。每个数据库表中只能有一个timestamp列。
  2. 数据表的约束
    NULL/NOT NULL:表示该列值可以为空或不能为空
    PRIMARY KEY约束(主键约束):用于定义基本表的主键。约束方式有两种:
    (1)直接将字段PRIMARY KEY加到该列的定义里;
    (2)或者在表定义的最后一行加上 PRIMARY KEY(<主键名>)
  3. sqlite中获取当前时间用:(DATETIME('now', 'localtime'))注意前后都要加上括号;
    MySQL中获取当前时间函数用now(),具体如下:
now()函数以`yyyy-mm-dd hh:mm:ss返回当前的日期时间,可以直接存到datetime字段中。 
curdate()以’yyyy-mm-dd’的格式返回今天的日期,可以直接存到date字段中。 
curtime()以’hh:mm:ss’的格式返回当前的时间,可以直接存到time字段中。 
  • 代码:
CREATE TABLE actor
(
    actor_id SMALLINT(5) NOT NULL,
    first_name VARCHAR(45) NOT NULL,
    last_name VARCHAR(45) NOT NULL,
    last_update TIMESTAMP NOT NULL DEFAULT (DATETIME('now', 'localtime')),
    PRIMARY KEY(actor_id)
)
三、对于表actor批量插入如下数据(不能有2条insert语句哦!)
  • 题目描述:

对于表actor批量插入如下数据(不能有2条insert语句哦!)
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’)))
「牛客网SQL实战」| Day6 | 表的创建 | 数据的插入 | 创建与使用索引_第2张图片

  • 分析:本题考察的是数据表中的添加数据
    需要注意的是时间这列数据,虽然题目中所创建的表格是默认值为当前的时间,但是题目要求要添加的数据为两个具体的时间,因此需要向数据表中添加题目要求的两个新时间。
知识点:向数据表中添加数据
  1. 向数据表中添加一行新的记录
INSERT INTO <表名> 
VALUES ()
  1. 向数据表中添加部分数数据
INSERT INTO <表名> (列名)
VALUES ()
  1. 添加多行数据
    方法1:
INSERT INTO <表名>
VALUES (1),(2)...

方法2:

INSERT INTO <表名>
SELECT 1, 数据
UNION SELECT 2, 数据
  1. 拓展用法
    insert into:插入数据,如果重复,则报错
    insert repalce:插入替换数据,如果存在则替换数据
    insert ignore:如果存在数据,则忽略。
  • 代码:
INSERT INTO actor
VALUES 
(1, 'PENELOPE', 'GUINESS', '2006-02-15 12:34:33'),
(2, 'NICK', 'WAHLBERG', '2006-02-15 12:34:33')

或者

INSERT INTO actor
SELECT 1, 'PENELOPE', 'GUINESS', '2006-02-15 12:34:33'
UNION SELECT 2, 'NICK', 'WAHLBERG', '2006-02-15 12:34:33'
四、对于表actor批量插入如下数据,如果数据已经存在,请忽略(不支持使用replace操作)
  • 题目描述:

对于表actor批量插入如下数据,如果数据已经存在,请忽略(不支持使用replace操作)
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’)))
在这里插入图片描述

  • 分析:
    OK,这道题是真的有点懵,第一次用IGNORE这个方法,而且这个方法在sqlite3和mysql下是有区别的
  • 代码:
    sqlite3下:
INSERT OR IGNORE INTO actor
VALUES (3, 'ED', 'CHASE', '2006-02-15 12:34:33')

mysql下去掉OR

INSERT IGNORE INTO actor
values(3,'ED','CHASE','2006-02-15 12:34:33');
五、请你创建一个actor_name表,并且将actor表中的所有first_name以及last_name导入该表.
  • 题目描述:

对于如下表actor,其对应的数据为:
「牛客网SQL实战」| Day6 | 表的创建 | 数据的插入 | 创建与使用索引_第3张图片
请你创建一个actor_name表,并且将actor表中的所有first_name以及last_name导入该表.
actor_name表结构如下:
「牛客网SQL实战」| Day6 | 表的创建 | 数据的插入 | 创建与使用索引_第4张图片

  • 分析:
    第一次学。
    总之创建一个新表然后导入已有表的数据就是将VALUES的部分替换成了子查询SELECT
  • 代码:
    sqlite3下:
CREATE TABLE actor_name AS 
SELECT first_name, last_name
FROM actor

MySQL下:AS可有可无

CREATE TABLE actor_name
SELECT first_name, last_name
FROM actor
六、针对如下表actor结构创建索引
  • 题目描述:

针对如下表actor结构创建索引:
(注:在 SQLite 中,除了重命名表和在已有的表中添加列,ALTER TABLE 命令不支持其他操作)
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
(请先创建唯一索引,再创建普通索引)

  • 分析:
    考察创建与使用索引
    本题需要使用两条CREATE INDEX语句实现,其中一个是唯一索引需要用到CREATE UNIQUE INDEX,另一个是普通索引直接CREATE INDEX即可,注意这两条语句中间用分号;隔开。
知识点:创建与使用索引
  1. 索引: 数据库中的索引是某个表中一列或多列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。
    索引是一种可以加快检索的数据库结构,它包含从表或视图的一列或多列生成的键。通过创建设计良好的索引,可以显著提高数据库查询和应用程序的性能。索引一旦创建,将由DBMS自动管理和维护。当插入、删除或修改记录时,DBMS会自动更新表中的索引。唯一索引:唯一索引能够保证索引键中国不包含重复的值,从而使表中的一行在某种方式上具有唯一性。
    注意: 如果表中仅有几行,或列中只包含几个不同的值,不推荐创建索引,因为SQL Server 在小型表中用索引搜索数据所花的时间比逐行搜索更长。

  2. 索引的分类:
    唯一索引(UNIQUE): 不允许两行具有相同的索引值(创建了唯一约束,系统将自动创建唯一索引)
    主键索引 : 主键索引要求主键中的每个值是唯一的,(创建主键自动创建主键索引,即创建PRIMARY KEY或UNIQUE约束时会为指定列自动创建唯一索引。)
    聚集索引(CLUSTERED): 表中各行的物理顺序与键值的逻辑(索引)顺序相同,表中只能包含一个聚集索引,主键列默认为聚集索引
    非聚集索引(NONCLUSTERED): 表中各行的物理顺序与键值的逻辑(索引)顺序不匹配,表中可以有249个非聚集索引

  3. 使用SQL语句创建索引:CREATE INDEX

CREATE [索引类型] INDEX 索引名称
ON 表名(列名)
WITH FILLFACTOR = 填充因子值0~100
GO

例如:为表SC在SNo和CNo上建立唯一索引SCI。

CREATE UNIQUE INDEX SCI ON SC(SNo, CNo)
  • 代码:
CREATE UNIQUE INDEX uniq_idx_firstname ON actor(first_name);
CREATE INDEX idx_lastname  ON actor(last_name);

你可能感兴趣的:(数据库,笔试题,数据库,mysql,sql)