MySQL入门技能树,我通关了

253 阅读22分钟

我正在参与掘金技术社区创作者签约计划招募活动,点击链接报名投稿

📢📢📢📣📣📣
哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10年DBA工作经验
中国DBA联盟(ACDU)成员,目前从事DBA及程序编程😜😜😜
擅长Oracle、MySQL、PG 运维开发,备份恢复,安装迁移,性能优化、故障应急处理。
❤️❤️❤️感谢各位大可爱小可爱!❤️❤️❤️

摘要:本文对MySQL做了详细的说明,按照提问的形式,体系化的技能树帮助大家掌握MySQL

1.关系型数据库

1.1 MySQL 服务器
关于 MySQL 服务器,以下说法错误的是:C
A.MySQL 可以设置监听端口、地址和最大连接数
B.MySQL 的每个数据表可以指定存储引擎
C.MySQL 的服务器和客户端必须运行在不同的计算机上。
D.MySQL 的超级用户默认为 root1.2 连接 MySQL 数据库
下列选项中,可以用于连接到 MySQL 数据库的有: A
A.全部都可以
B.JDBCmysql:mysql-connector-java
C.命令行工具 mysql
D.Python DBAPI 实现 MySQLdb1.3. MySQL 存储引擎
关于 MySQL 的存储引擎,下列说法错误的是: A
1.InnoDB 支持事务,有更好的并发能力。
2.MyISAM 不支持事务和外键,结构简单,可以压缩为只读状态。
3.Memory 引擎将数据保存在内存中,重启会丢失数据,读速度快很快,适合作为会话表和缓存表。
4.临时表默认使用 Memory 引擎。
​
A.4
B.1, 2, 3
C.全部都对
D.2, 3, 4
​
注解:
常用的存储引擎有以下: 
Innodb引擎:Innodb引擎提供了对数据库ACID事务的支持。并且还提供了行级锁和外键的约束。它的设计的目标就是处理大数据容量的数据库系统。
MyIASM引擎(原本Mysql的默认引擎):不提供事务的支持,也不支持行级锁和外键。
MEMORY引擎:所有的数据都在内存中,数据的处理速度快,但是安全性不高。
​
如果没有特别的需求,使用默认的Innodb即可。
MyISAM:以读写插入为主的应用程序,比如博客系统、新闻门户网站。 
Innodb:更新(删除)操作频率也高,或者要保证数据的完整性;并发量高,支持事务和外键。比如OA自动化办公系统。
​
​
内存临时表采用的是memory存储引擎,
磁盘临时表采用的是myisam存储引擎(磁盘临时表也可以使用innodb存储引擎,通过internal_tmp_disk_storage_engine参数来控制使用哪种存储引擎,
从mysql5.7.6之后默认为innodb存储引擎,之前版本默认为myisam存储引擎
​
​
1.4 数据库基本概念
下列数据库产品中,哪一个通常不被视作关系型数据库? B
A.PostgreSQL
B.redis
C.MySQL
D.H2

2.安装和登陆

2.1 开发机安装
Joe 刚刚入职 EMP 公司,现在他需要在新领到的开发机上安装 MySQL 或 MariaDB(MySQL 的分支) ,下列说法不正确的是: B
A.在 FreeBSD 上,可以用 ports 安装。
B.MySQL 需要超级用户 root,windows 的超级用户为 administrator ,所以 windows 上无法安装 MySQL。
C.在 windows 上,可以下载安装包进行安装。
D.在 Mac 上可以用 Homebrew 安装。
​
注解:
FreeBSD 是一种 UNIX操作系统
Homebrew是一款Mac OS平台下的软件包管理工具,拥有安装、卸载、更新、查看、搜索等很多实用的功能。
简单的一条指令,就可以实现包管理,而不用你关心各种依赖和文件路径的情况,十分方便快捷。
​
2.2 初始化账户
Joe 已经在自己的开发机安装好 MySQL,他现在有一个系统用户 joe,该用户有 sudo 权限。
现在他想要建立一个名为 joe 的开发用户,
并且: - 这个用户只能在本机登录 - 使用简单的口令 joe - 要有足够高的权限,用于接下来的开发工作
那么,Joe 应该采用下列哪个方案 D
​
A.以 root 用户登录数据库
shell sudo su mysql mysql
为 joe 授权
sql grant all privileges on *.* to joe;flush privileges ;
​
B.以 joe 用户登录数据库
shell mysql mysql
创建数据库用户 joe
sql create user 'joe'@'localhost' identified by 'joe';
flush privileges ;
​
C.以 root 登录到本机的 mysql 库
shell sudo su mysql mysql
创建数据库用户 joe 并授权:
sql create user 'joe'@'%' identified by 'joe';
grant all privileges on *.* to joe;
flush privileges ;
​
D.以 root 登录到本机的 mysql 库
shell sudo su mysql mysql
创建数据库用户 joe 并授权:
sql create user 'joe'@'localhost' identified by 'joe';
grant all privileges on *.* to `joe`@`localhost`;
flush privileges ;
​
2.3 登录
Joe 在自己的电脑上创建了 'joe'@'localhost' 账户,那么关于他使用 joe 账户登录本机mysql数据库,以下说法错误的是:
A.Joe 可以为 joe 账户从其它网络地址登录的会话设置不同的口令和权限。
B.Joe 可以在自己的开发机上使用以下命令登录:
mysql -ujoe -p -h localhost mysql 
C.Joe 可以为自己的账户设定口令的有效期。
D.如果 Joe 的开发机上已经部署了ssh服务,那么他可以在局域网的内的任何计算机上使用
mysql -h Joe的开发机地址 -ujoe -p mysql 登录。

3.使用数据库

3.1 创建和删除数据库
Joe 在开发机上创建了一个名为 goods 的数据库,做了一些练习,现在他需要删除这个数据库,重建一个 goods。那么他需要的步骤是:C
A.
delete database goods;
create database goods;
B.
use goods;
drop database goods;
make database goods;
C.
drop database goods;
create database goods;
D.
cd goods;
drop database goods;
create database goods;
​
3.2 创建和删除表
Joe 想要在 goods 数据库创建一个 goods_category 表,管理商品的类别,那么正确的建表语句应该是:C
A.
DROP TABLE goods_category
(
    id         INT PRIMARY KEY,
    category VARCHAR(30),
    remark   VARCHAR(100)
);
​
B.
MAKE TABLE goods_category
(
    id         INT PRIMARY KEY ,
    category VARCHAR(30),
    remark   VARCHAR(100)
);
​
C.
CREATE TABLE goods_category
(
    id         INT PRIMARY KEY ,
    category VARCHAR(30),
    remark   VARCHAR(100)
);
​
D.
ADD TABLE goods_category
(
    id         INT PRIMARY KEY,
    category VARCHAR(30),
    remark   VARCHAR(100)
);
​
​
Joe 需要重建一个 id 为自增字段的 goods_category 。他已经删除了旧表,那么接下来应该:C
A.
CREATE TABLE goods_category
(
    id         INT PRIMARY KEY,
    category VARCHAR(30),
    remark   VARCHAR(100)
) ENGINE INNODB;
​
B.
CREATE TABLE goods_category
(
    id         INT PRIMARY KEY SERIALS,
    category VARCHAR(30),
    remark   VARCHAR(100)
) ENGINE INNODB;
​
C.
CREATE TABLE goods_category
(
    id         INT PRIMARY KEY AUTO_INCREMENT,
    category VARCHAR(30),
    remark   VARCHAR(100)
) ENGINE INNODB;
​
D.
CREATE TABLE goods_category
(
    id         INT ,
    category VARCHAR(30),
    remark   VARCHAR(100),
    PRIMARY KEY ID AUTO_INCREMENT
) ENGINE INNODB;
​
​
Joe 想要删除数据库中的 good_category 表,他应该怎么操作?C
A.truncate table goods_category;
B.delete table where name = 'good_category';
C.drop table goods_category;
D.remove table good_category;
​
​
3.3 数据库编码
Joe 希望 goods 数据库可以处理各种不同语言文字的内容,因此他要确定 goods 数据库的编码,确保其为 ut8,下面哪些步骤是他需要做的?C
(这里我们假设Joe第一次查看编码时,发现 goods 现在的编码为 latin1 )。
​
执行 SHOW CREATE DATABASE goods; 查看 goods 的编码
备份数据库
取消默认编码 ALTER DATABASE goods CHARACTER UNSET;
执行 ALTER DATABASE goods CHARACTER SET utf8; 设定编码
删除 goods 数据库 DROP DATABASE goods
用 utf8 编码重建 goods 数据库 CREATE DATABASE goods DEFAULT CHARACTER SET utf8
删除默认编码 ALTER DATABASE goods DROP CHARACTER
再次执行 SHOW CREATE DATABASE goods; 查看 goods 的编码
导入数据
​
请在以下选项中选择
A.1, 2, 3, 4, 5, 6, 7
B.1, 3, 2, 4, 9
C.1, 4, 8
D.7, 8 5, 4, 23.4 存储引擎
Joe 需要确保 goods_category 表的存储引擎为 innodb ,那么建表语句应该是:
​
WITH ENGINE=INNODB CREATE TABLE goods_category
(
    id         INT,
    category VARCHAR(30),
    remark   VARCHAR(100)
);
​
SAVE TABLE goods_category
(
    id         INT,
    category VARCHAR(30),
    remark   VARCHAR(100)
) AS INNODB;
​
CREATE TABLE goods_category
(
    id         INT,
    category VARCHAR(30),
    remark   VARCHAR(100)
) INNODB;
​
CREATE TABLE goods_category
(
    id         INT,
    category VARCHAR(30),
    remark   VARCHAR(100)
) ENGINE=INNODB;

4.数据类型

4.1 数值的隐式类型转换
​
Joe 需要使用下列表做一项数值计算
Joe 需要使用下列表做一项数值计算
​
点击进入MySQL实战练习环境。
​
show databases; 列出所有数据库
show tables; 列出所有表
create table points(
    id int primary key auto_increment,
    x int,
    y int
);
​
计算查询为:
select id, (x^2 + y^2)/2 as result from points;
得到的结果集中,result 列的类型应该是: BA.int
B.decimal
C.long
D.float
​
注解:
DECIMAL(P,D);
P是表示有效数字数的精度,P范围为165
D是表示小数点后的位数,D的范围是0~30
MySQL要求D小于或等于(<=)P
DECIMAL(4,2)
23.464.2 时间默认值
Joe 写了一个订单表的创建语句:
create table orders (
    id int primary key auto_increment,
    item_id int,
    amount int,
    unit_price decimal(12, 4),
    price decimal(12, 4)
);
​
现在,Joe 需要给这个表加入下单时间,即订单写入数据库的时间,那么他应该将这个语句修改为:C
A.
create table orders (
    id int primary key auto_increment,
    item_id int,
    amount int,
    unit_price decimal(12, 4),
    price decimal(12, 4),
    ts datetime default now()
);
B.
create table orders (
    id int primary key auto_increment,
    item_id int,
    amount int,
    unit_price decimal(12, 4),
    price decimal(12, 4),
    ts varchar(16) default now()
);
C.
create table orders (
    id int primary key auto_increment,
    item_id int,
    amount int,
    unit_price decimal(12, 4),
    price decimal(12, 4),
    ts timestamp default now()
);
D.
create table orders (
    id int primary key auto_increment,
    item_id int,
    amount int,
    unit_price decimal(12, 4),
    price decimal(12, 4),
    ts date default now()
);
​
注解:
A答案也可以
DATE:YYYY-MM-DD 日期值
TIME:HH:MM:SS 时间值或持续时间
YEAR:YYYY 年份值
DATETIME:YYYY-MM-DD HH:MM:SS 混合日期和时间值
TIMESTAMP:YYYYMMDDHHMMSS 混合日期和时间值,时间戳
​
4.3 文本字段
Joe 在设计订单表,他已经完成了下列内容:
create table orders (
    id int primary key auto_increment,
    item_id int,
    amount int,
    unit_price decimal(12, 4),
    price decimal(12, 4),
    ts timestamp default now()
);
现在他需要给订单表加入一个 description 字段,这个字段需要保存订单的文字说明,这些文本不会超过两千字节, Joe 应该把建表语句修改为:C
A.
create table orders (
    id int primary key auto_increment,
    item_id int,
    amount int,
    unit_price decimal(12, 4),
    price decimal(12, 4),
    description varchar(256) default '',
    ts timestamp default now()
);
B.
create table orders (
    id int primary key auto_increment,
    item_id int,
    amount int,
    unit_price decimal(12, 4),
    price decimal(12, 4),
    description varchar(2000),
    ts timestamp default now()
);
C.
create table orders (
    id int primary key auto_increment,
    item_id int,
    amount int,
    unit_price decimal(12, 4),
    price decimal(12, 4),
    description text(2000),
    ts timestamp default now()
);
D.
create table orders (
    id int primary key auto_increment,
    item_id int,
    amount int,
    unit_price decimal(12, 4),
    price decimal(12, 4),
    description tinytext(2000),
    ts timestamp default now()
);
​
​
CHAR:定长字符串 0-255 字节
VARCHAR:0-65535 字节 变长字符串 --频繁改变的列建议用vachar 类型
BLOB:0-65535 字节 二进制形式的长文本数据,二进制大对象
TEXT:0-65535 字节 长文本数据 、varchar 的加长增强版
LONGTEXT:0-4294967295 字节极大文本数据
ENUM: 1-2 字节 枚举类型(单一值)
SET:1-8 字节 一个集合
tinytext 最⼤长度255个字符(2^8-1)
​
​
4.4 二进制字符串
现在 Joe 的订单表已经有了如下形态:
create table orders (
    id int primary key auto_increment,
    item_id int,
    amount int,
    unit_price decimal(12, 4),
    price decimal(12, 4),
    description varchar(2000),
    ts timestamp default now()
);
​
他需要添加一个字段,用来保存订单的相关图片,由于特殊的业务需要,这些图片必须保存在数据库中,图片的大小不超过100K。
那么他应该将建表语句修改为: A
A.
create table orders (
    id int primary key auto_increment,
    item_id int,
    amount int,
    unit_price decimal(12, 4),
    price decimal(12, 4),
    description varchar(2000),
    picture blob,
    ts timestamp default now()
);
B.
create table orders (
    id int primary key auto_increment,
    item_id int,
    amount int,
    unit_price decimal(12, 4),
    price decimal(12, 4),
    description varchar(2000),
    picture text,
    ts timestamp default now()
);
C.
create table orders (
    id int primary key auto_increment,
    item_id int,
    amount int,
    unit_price decimal(12, 4),
    price decimal(12, 4),
    description varchar(2000),
    picture binary(100000),
    ts timestamp default now()
);
D.
create table orders (
    id int primary key auto_increment,
    item_id int,
    amount int,
    unit_price decimal(12, 4),
    price decimal(12, 4),
    description varchar(2000),
    picture varbinary(100000),
    ts timestamp default now()
);
​
注解:
在mysql中,存储图片用BLOB类型;
BLOB类型是一种特殊的二进制类型,可以存储数据量很大的二进制数据,包括图片、视频等
MySQL的四种BLOB类型
类型 大小(单位:字节)
TinyBlob 最大 255
Blob 最大 65K
MediumBlob 最大 16M
LongBlob 最大 4G
​
BINARY 和 VARBINARY 类型
BINARY 和 VARBINARY 类型类似于 CHAR 和 VARCHAR,不同的是它们包含二进制字节字符串。

5.数据修改

5.1 插入
Goods 数据库中有一个表:
create table book(
    id int primary key auto_increment,
    title varchar(200) not null ,
    description varchar(1000) default '',
    price decimal(12, 4),
    isbn char(16) not null ,
    publish_at date not null 
);
create unique index idx_book_isbn on book(isbn);
​
那么下列哪个选项的代码可以执行成功?C
A.
insert into book(title, price, isbn, publish_at) select 'a book title', 'unknown', 'xx-xxxx-xxxx', '2019-12-1';
insert into book(title, price, isbn, publish_at) select 'a other book title', 'unknown', 'xx-xxxx-xxxx', '2019-12-1';
B.
insert into book(title, price, isbn, publish_at) select null, 'unknown', 'xx-xxxx-xxxx', '2019-12-1';
insert into book(title, price, isbn, publish_at) select null, 'unknown', 'xx-xxxx-xxxx', '2019-12-1';
C.
insert into book(title, price, isbn, publish_at) select 'a book title', 25.4, 'xx-xxxx-xxxx', '2019-12-1';
insert into book(title, price, isbn, publish_at) select 'a other book title', 25.4, 'yy-yyyy-xxxx', '2019-12-1'; 
D.
insert into book(price, isbn, publish_at) select 25.4, 'xx-xxxx-xxxx', '2019-12-1';
insert into book(price, isbn, publish_at) select 35.4, 'yy-yyyy-xxxx', '2019-12-1';
​
5.2 更新数据
现有 employee 表如下:
create table employee
(
    id serial primary key,
    name varchar(64),
    dept varchar(64),
    salary decimal(12, 4)
);
​
Joe 希望修改销售部(dept 字段为 sale)员工 Dora Muk 的工资,将其增加 1000。
正确的修改语句是:A
A.
update employee set salary = salary + 1000 where dept = 'sale' and name = 'Dora Muk';
B.
update employee set salary = salary + 1000 where name = 'Dora Muk';
C.
update employee set salary = salary + 1000;
D.
update employee set salary += 1000;
​
​
5.3 删除
现在 orders 表结构如下:
create table orders (
                        id int primary key auto_increment,
                        item_id int,
                        amount int,
                        unit_price decimal(12, 4),
                        price decimal(12, 4),
                        description varchar(2000),
                        ts timestamp default now(),
                        deal bool default false
);
​
有一个业务系统会实时的将已经成交(deal 字段为 true)的订单数据转储,
现在我们仅需要一个清理程序,将已经成交的数据从 orders表删除并记录被删除的数据id。
下面哪个操作是对的? C
​
A.在一个独立的定时任务中执行
delete
from orders;
​
B.在一个独立的定时任务中执行
truncate orders;
​
C.在一个独立的定时任务中执行
delete
from orders
where deal;
​
D.建立视图
create view order_view as
select id, meta, content, created_at
from orders
where not deal;
并要求业务系统只能访问这个视图。

6.数据查询

6.1 基本语法
下列 SQL 语句,哪一项不合法?B
A.select id, name, dept, salary from employee where salary > 10000;
B.from test select abc;
C.select * from employee;
D.select now();
​
6.2 Where 条件
Joe 希望从 orders 表
create table orders
(
    id          int primary key auto_increment,
    item_id     int,
    amount      int,
    unit_price  decimal(12, 4),
    price decimal(12, 4),
    description varchar(2000),
    ts          timestamp default now(),
    deal        bool      default false
);
​
查询 2022525 日下单的所有单价低于 20 的订单id,那么这个查询应该如何写? A
A.
select id
from orders
where date(ts) = '2022-05-25'
  and unit_prise < 20;
​
B.
select id
from orders
which date(ts) = '2022-05-25'
   or unit_prise < 20;
​
C.
select id
from (select * from orders where date(ts) = '2022-05-25') as o
where unit_prise < 20;
​
D.
select id
from orders 
if date(ts) = '2022-05-25' or unit_prise < 20;
​
6.3 数值计算
Points 表结构如下:
create table points(
    id int primary key auto_increment,
    x float,
    y float
)
​
现在 Joe 想要求写一个查询,得到每个点的id和模。
即 √(x^2+y^2) 。这个查询应该是:D
​
A.select sqrt(vx + vy) from points where x^2 as vx, y^2 as vy ;
B.select sqrt(vx+vy) from (select x^2 as vx, y^2 as vy from points) as t;
C.select id + sqrt(x^2 + y^2) from points;
D.select id, sqrt(x^2 + y^2) from points;
​
6.4 函数和过程
关于 MySQL 的函数和过程,以下说法正确的是:C
1.存储过程和存储函数都是一系列SQL语句的集合, 这些SQL语句被封装到一起组成一个存储过程或者存储函数保存到数据库中。
2.应用程序调用存储过程只需要通过CALL关键字并指定存储过程的名称和参数即可;
3.应用程序调用存储函数只需要通过SELECT关键字并指定存储函数的名称和参数即可。
4.存储函数必须有返回值,而存储过程没有。
5.存储过程的参数类型可以是INOUTINOUT,而存储函数的参数类型只能是IN。
​
A.1, 2
B.3, 4, 5
C.所有都是
D.2, 3, 4, 5

7.命令行工具

7.1 登录远程服务器
Joe 需要登录团队的开发服务器上的goods数据库,这台服务器地址是 10.123.45.17 ,MySQL 端口是 3306 。
用户名是 joe,口令是 ixhewui 。
那么 Joe 需要如何操作?A
​
A.在终端输入
mysql -h 10.123.45.17 -p -ujoe goods
出现口令输入提示时输入口令。
​
B.在终端输入
mysql -h 10.123.45.17 -p3306 -ujoe goods
出现口令输入提示时输入口令。
​
C.在终端输入
mysql -ujoe 10.123.45.17/goods
出现口令输入提示时输入口令。
​
D.在终端输入
mysql mysql://joe@10.123.45.17/goods
出现口令输入提示时输入口令。
​
7.2 MySQLAdmin
关于 MySQLAdmin,以下说法正确的是:C
1.可以用类似 mysql 命令行的参数配置需要连接的服务器
2.可以在 /etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf 
中的某一个配置文件中配置连接选项,MySQLAdmin 会按顺序加载,重复项则后面的覆盖前面的。
3.MySQLAdmin 可以在 Shell 脚本中执行命令来完成一些数据库维护工作。
4.mysqladmin ping 命令可以检查服务器的运行状态
5.mysqladmin mount 命令可以将存储设备挂载到 MySQL 服务。
​
A.2, 3, 4
B.1, 2, 3
C.1, 2, 3, 4
D.3, 4, 5
​
7.3 MyISAMPack
关于 myisampack ,下列说法哪些是正确的? D
1.myisampack命令用来压缩MyISAM数据表
2.压缩后的数据表比原数据表占用更少的磁盘空间
3.压缩后的数据表为只读数据表,不能对压缩后的数据表中的数据进行插入、更新和删除操作
4.压缩后的数据表文件体积缩小,写入速度更快
5.经过压缩的 MyISAM 表可以支持事务
​
A.1, 3, 5
B.1, 3, 4
C.所有都对
D.1, 2, 3
​
注解:
myisampack命令用来压缩MyISAM数据表,压缩后的数据表比原数据表占用更少的磁盘空间。
但是压缩后的数据表为只读数据表,不能对压缩后的数据表中的数据进行插入、更新和删除操作。
​
例如,将t_goods数据表的存储引擎修改为MyISAM。
mysql> ALTER TABLE t_goods ENGINE=MyISAM;
​
7.4 MySQLBinlog
关于 mysqlbinlog ,以下说法正确的是:A
1.mysqlbinlog 命令行采用和 mysql 命令行一致的连接参数登录服务器,并通过 --read-from-remote-server 读取远程服务器
2.mysqlbinlog 命令行通过命令行参数设定分析的目标文件
3.可以指定 -o 参数设定忽略前 n 条操作记录
4.可以通过 --start-datetime 和 --stop-datetime 指定要分析的时间段
5.可以通过 --start-position 和 --stop-position 指定要分析的操作序列的范围
​
A.全都正确
B.1,2, 4
C.1, 2, 3, 4
D.全都错误
​
注解:
mysqlbinlog命令主要用来管理MySQL产生的二进制日志,mysqlbinlog的使用格式如下:
mysqlbinlog [options] log_file ...
其中,log_file为二进制日志文件的名称,options为mysqlbinlog命令的选项,options的可选值比较多,
可以在服务器命令行输入如下命令查看options支持的可选值。
mysqlbinlog --no-defaults -help
​
也可以参考MySQL的官方文档,
网址为https://dev.mysql.com/doc/refman/8.0/en/mysqlbinlog.html。
​
7.5 MySQLDump
​
关于 mysqldump 工具,以下说法正确的是:C
1.mysqldump 使用与 mysql 命令行一致的参数选项,设定要连接的 MySQL 服务器
2.可以在 /etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf 中的某一个配置文件中配置连接选项,
3.MySQLDump 会按顺序加载,重复项则后面的覆盖前面的。
4.mysqldump 默认输出内容到终端,可以通过管道重定向到文件
5.可以通过 -r 或 --result-file 指定输出的文件
6.设定 --no-data 可以只导出数据结构,不包括数据
7.设定 --no-create-info 可以只导出数据
8.--databases 选项可以指定仅导出哪些数据库
9.--tables 选项可以指定仅导出哪些表(覆盖 databases)
​
​
A.2, 4, 6
B.2, 3, 4, 5
C.以上都对
D.1
​
注解:
mysqldump是一个数据导出工具,能够导出数据库中的数据并进行备份,或者将数据迁移到其他数据库中。
mysqldump命令的使用格式如下:
shell> mysqldump [options] db_name [tbl_name ...]
shell> mysqldump [options] --databases db_name ...
shell> mysqldump [options] --all-databases
​
其中,options为mysqldump命令的一些选项,可以使用如下命令查阅。
mysqldump --help
​
可以参考MySQL官方文档,
网址为https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html。
​
7.5 MySQLCheck
​
关于 mysqlcheck 命令行,以下说法正确的是:C
mysqlcheck命令主要用来维护数据库中MyISAM存储引擎的数据表
可以在 /etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf 中的某一个配置文件中配置连接选项,
MySQLCheck 会按顺序加载,重复项则后面的覆盖前面的。
指定 -c 选项检查错误
指定 -a 或 --analyze 则仅检查给定的表
指定 -r 选项则进行修复操作
​
A.4, 5
B.1, 2, 3
C.全部都对
D.2, 3, 4, 5
​
注解:
mysqlcheck命令主要用来维护数据库中MyISAM存储引擎的数据表,其使用方式如下:
shell> mysqlcheck [options] db_name [tbl_name ...]
shell> mysqlcheck [options] --databases db_name ...
shell> mysqlcheck [options] --all-databases
​
其中,options选项的值,可以输出如下命令进行查阅。
mysqlcheck --help
​
可以参考MySQL官方文档,
网址为https://dev.mysql.com/doc/refman/8.0/en/mysqlcheck.html。
​
检查goods数据库中的数据表。
mysqlcheck -uroot -p -c goods
Enter password: 
goods.t_goods                                      OK
goods.t_goods_back                                 OK
goods.t_goods_category                             OK
​
7.6 MySQLShow
关于 mysqlshow 工具,以下说法正确的是:C
1.mysqlshow命令主要用来查看MySQL中存在的数据库和数据表,以及数据表中的字段和索引等信息
2.可以在 /etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf 中的某一个配置文件中配置连接选项,
MySQLShow 会按顺序加载,重复项则后面的覆盖前面的。
3.--count 选项可以查看各数据库中表的数量和数据行数
4.传入数据库命可以查看指定数据库的各表行数和列数
5.传入库名和表名可以查看指定数据表的列数和行数
6.指定 -k 选项可以查看索引的信息
​
A.2, 3, 4, 5
B.2, 3, 5, 6
C.全部都对
D.全都不对
​
​
注解:
mysqlshow命令主要用来查看MySQL中存在的数据库和数据表,以及数据表中的字段和索引等信息,使用格式如下:
shell> mysqlshow [options] [db_name [tbl_name [col_name]]]
​
其中,options的取值可以输入如下命令进行查阅。
mysqlshow --help
​
可以参考MySQL官方文档,
网址为https://dev.mysql.com/doc/refman/8.0/en/mysqlshow.html。
​
1)查看MySQL中所有的数据库。
mysqlshow -uroot -p
2)查看每个数据库中数据表的数量和数据的总条数信息。
mysqlshow -uroot -p --count
3)查看goods数据库下每个表中字段的数量和表中记录的数量。
mysqlshow -uroot -p goods --count
4)查看goods数据库下t_goods数据表的信息
mysqlshow -uroot -p goods t_goods --count
5)查看goods数据库下t_goods数据表中的所有索引
mysqlshow -uroot -p goods t_goods -k
6)显示t_goods数据表的状态信息
mysqlshow -uroot -p goods t_goods -i
​
​
7.7 MySQLPump
关于 mysqlpump 工具,以下说法正确的是:
mysqldump 使用与 mysql 命令行一致的参数选项,设定要连接的 MySQL 服务器
可以在 /etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf 中的某一个配置文件中配置连接选项,
MySQLPump 会按顺序加载,重复项则后面的覆盖前面的。
mysqlpump备份数据时支持并行处理、备份用户和压缩备份文件等功能
mysqldump支持在备份数据时,可以为指定的数据库分配不同的线程数进行备份
通过 --include-databases 选项,可以对部分数据库进行备份。
通过 --exclude-databases 选项,可以排除部分数据库
​
A.以上都对
B.2, 4, 6
C.1, 2, 3, 4, 5
D.1
​
注解:
默认备份 表,视图,存储过程,存储函数,触发器,事件,MySQL 5.7及以上版本才支持
​
​
7.8 MySQLmport
关于 mysqlimport 工具,以下说法正确的是
1.mysqlimport 使用与 mysql 命令行一致的参数选项,设定要连接的 MySQL 服务器
2.可以在 /etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf 中的某一个配置文件中配置连接选项,
MySQLImport 会按顺序加载,重复项则后面的覆盖前面的。
3.mysqlimport 通过 -T 参数将 mysqldump 导出的文件导入到数据库
4.指定 -c 或 --columns 可以指定需要导入的字段
5.指定 -d 或 --delete 会先删除既有的数据再导入
6.指定 -i 或 --ignore,遇到主键冲突时,忽略这一行
​
​
注解:
mysqlimport命令主要用来向数据库中导入数据,如果使用mysqldump命令导出数据时使用了-T参数,
则可以使用mysqlimport命令将mysqldump导出的文件内容导入数据库中。
​
mysqlimport命令的使用格式如下:
shell> mysqlimport [options] db_name textfile1 [textfile2 ...]
其中,关于options的具体信息,可以使用如下命令查阅。
mysqlimport --help
可以参考MySQL官方文档,网址为https://dev.mysql.com/doc/refman/8.0/en/mysqlimport.html
​
案例:
mysqlimport -uroot -p goods t_goods goods.txt --fields-terminated-by=',' --fields-
enclosed-by='"'

8.数据库组成

8.1 表
​
## 表的基本结构
关于数据表的介绍,哪一句是对的? C
A.索引列的内容是唯一的
B.表的主键必须是自增的整数 id
C.表中每一行记录的结构都要遵循表定义。
D.每个表只能有一个索引
​
## 建表语句
现在Joe 需要建立一个简化的交易流水表 trade,需要一个自增主键,一个content字段保存订单详情,, 
需要有一个时间戳字段记录订单入库时间,那么哪一个语句是对的?C
​
A.
create table trade (
    id integer primary key,
    content varchar(8000),
    created_at timestamp default now()
);
​
B.
create table trade (
    id serial,
    content varchar(8000),
    created_at timestamp default now()
);
​
C.
create table trade (
    id int primary key auto_increment,
    content varchar(8000),
    created_at timestamp default now()
);
​
D.
create table trade (
    id serial primary key,
    content varchar(8000),
    created_at timestamp
);
​
## 自增序列
关于 MySQL 的自增字段,错误的说法是:D
A.自增字段必须是主键。
B.插入操作失败,自增计数仍然会被递增,下次操作使用下一个整数。
C.自增字段默认从 1 开始。
D.自增字段必须名为 id。
​
8.2 视图
Joe 需要给 goods 表
create table goods(
    id int primary key auto_increment,
    category_id int,
    category varchar(64),
    name varchar(256),
    price decimal(12, 4),
    stock int,
    upper_time timestamp
)
​
添加一个视图,仅展示价格超过 1000 的商品价格和名称,下列选项中正确的是:A
A.
CREATE VIEW view_name_price 
    AS 
    SELECT name, price 
    FROM goods
    WHERE price > 1000;
​
B.
CREATE VIEW view_name_price
    AS 
BEGIN
    SELECT name, price
    FROM goods
    WHERE price > 1000;
END;
​
C.
CREATE VIEW view_name_price 
    AS 
    SELECT name, price 
    FROM goods;
​
D.
CREATE VIEW view_name_price 
    AS 
    SELECT * 
    FROM goods
    WHERE price > 1000;
    
8.3 存储过程和函数
​
## 计税函数
每月生成工资单时,Joe 需要根据 employee 表的 salary 字段,计算出每个员工的所得税和税后工资, 
因此他决定写一个 individual_income_tax 函数,根据睡前工资计算税额。不考虑实现逻辑,这个函数的声明应该是:
A.
create function individual_income_tax(salary decimal(12, 4))
    deterministic
begin 
    -- ...
end;
​
B.
create function decimal(12, 4) individual_income_tax(salary decimal(12, 4))
begin 
    -- ...
end;
​
C.
create store function individual_income_tax(salary decimal(12, 4)) returns decimal(12, 4)
    deterministic
begin 
    -- ...
end;
​
D.
create function individual_income_tax(salary decimal(12, 4)) returns decimal(12, 4)
deterministic
begin 
    -- ...
end;
​
​
注解:
存储过程和函数不仅能够简化开发人员开发应用程序的工作量,而且对于存储过程和函数中SQL语句的变动,无须修改上层应用程序的代码,
这也大大简化了后期对于应用程序维护的复杂度。
​
其中,DETERMINISTIC表示执行当前存储过程后得出的结果数据是确定的,即对于当前存储过程来说,每次输入相同的数据时,都会得到相同的输出结果
​
​
## 创建存储过程
计算个人所得税的函数 individual_income_tax 很好用,但是每次要保存税额和税后工资,
Joe 希望这个计算更紧凑一些,在已经有 individual_income_tax 的前提下,Joe 决定 写一个存储过程 sp_idt ,
同时生成所得税和税后工资。这个存储过程的声明应该是:B
​
A.
create procedure sp_idt(salary decimal(12, 4)) returns (tax decimal(12, 4), take_home decimal(12, 4))
begin 
    set tax = individual_income_tax(salary);
    set take_home = salary - tax;
end;
​
B.
create procedure sp_idt(in salary decimal(12, 4), out tax decimal(12, 4), out take_home decimal(12, 4)) 
begin 
    set tax = individual_income_tax(salary);
    set take_home = salary - tax;
end;
​
C.
create procedure sp_idt(in salary decimal(12, 4)) 
begin
    declare tax, take_home decimal(12, 4);
    set tax = individual_income_tax(salary);
    set take_home = salary - tax;
    select tax, take_home;
end;
​
D.
create procedure sp_idt(salary decimal(12, 4)) returns (decimal(12, 4), decimal(12, 4))
begin 
    declare tax, take_home decimal(12, 4);
    set tax = individual_income_tax(salary);
    set take_home = salary - tax;
    return (tax, take_home);
end;
​
​
## 删除函数
Joe 将计税逻辑放到了 sp_idt 中,现在不需要 individual_income_tax 函数了,他应该怎样删除这个函数?D
A.delete function individual_income_tax;
B.remove function individual_income_tax;
C.drop function individual_income_tax(decimal(12, 4));
D.drop function individual_income_tax;
​
8.4 索引和约束
​
## 主键
关于 MySQL 的主键,哪一项是错误的?A
A.主键列只能是自增 id。
B.主键或唯一键可以被引用为外键约束
C.语法约束上,可以允许无主键的表,但是从工程实践上,应该保持每个表都有正确的主键。
D.主键应可以唯一的标识数据,并且主键的一部分不应该依赖另一部分。
​
## 唯一约束
现有一个图书登记表:
create table book(
    id int primary key auto_increment,
    title text,
    publish_at date,
    isbn text
)
​
我们发现有时候客户可能会重复输入同一本书的信息,怎样约束用户不会输入同一本书?A
​
1.删除id列,将isbn设置为主键
2.在 isbn 列上加唯一约束
3.执行 create index on book(id, title, publish_at, isbn)
4.在 id 键上加唯一约束
​
A.1 或者 2
B.4
C.3
D.348.5 触发器
SmartMarket 公司的OA数据库中包含以下结构:
create table employee(
    id serial primary key ,
    name varchar(256),
    dept varchar(64),
    salary decimal(12, 4)
);
​
create table budget(
    id serial primary key ,
    dept varchar(64),
    amount decimal(12, 4)
)
​
我们省略了无关的内容。当某个员工的工资发生变动时,我们要修改他所在部门的预算。
那么以下哪个选项可以解决问题?D
​
A.将预算总额字段变成计算列,通过统计员工工资生成。
B.在 budget 表添加触发器,当员工信息变动时,重算相关部门的预算。
C.将员工信息表的工资字段设置为部门预算总额的外键引用字段,并设置级联更新。
D.在 employee 表添加一个 after 触发器,当员工信息变动时,重算相关部门的预算。
​
​
##交易审计
​
Orders 表
create table orders
(
    id          int primary key auto_increment,
    item_id     int,
    amount      int,
    unit_price  decimal(12, 4),
    total       decimal(12, 4),
    description varchar(2000),
    ts          timestamp default now()
);
​
记录了未完成的订单。审计部门现在需要记录其变更——新增或删除,该表不会发生update——即将修改都记录到 orders_log 表
create table orders_log
(
    log_id          int primary key auto_increment,
    id     int,
    item_id     int,
    amount      int,
    unit_price  decimal(12, 4),
    total       decimal(12, 4),
    description varchar(2000),
    ts          timestamp,
    direction   varchar(16),      
    log_at      timestamp default now()
);
​
那么应该如何做?D
​
A.
create trigger in_orders after insert on orders
    for each row insert into orders_log(id, item_id, amount, unit_price, total, description, ts, direction)
    values(NEW.id, NEW.item_id, NEW.amount, NEW.unit_price, NEW.total, NEW.description, NEW.ts, 'in');
​
B.
create trigger in_orders after insert on orders
        for each row insert into orders_log(id, item_id, amount, unit_price, total, description, ts, direction)
        values(NEW.id, NEW.item_id, NEW.amount, NEW.unit_price, NEW.total, NEW.description, NEW.ts, 'in');
    after delete on orders
        for each row insert into orders_log(id, item_id, amount, unit_price, total, description, ts, direction)
                     values(OLD.id, OLD.item_id, OLD.amount, OLD.unit_price, OLD.total, OLD.description, OLD.ts, 'out');
C.
create trigger in_orders after insert, after delete on orders
    for each row insert into orders_log(id, item_id, amount, unit_price, total, description, ts, direction)
    values(NEW.id, NEW.item_id, NEW.amount, NEW.unit_price, NEW.total, NEW.description, NEW.ts, 'in');
    
D.
create trigger in_orders after insert on orders
    for each row insert into orders_log(id, item_id, amount, unit_price, total, description, ts, direction)
    values(NEW.id, NEW.item_id, NEW.amount, NEW.unit_price, NEW.total, NEW.description, NEW.ts, 'in');
​
create trigger out_orders after delete on orders
    for each row insert into orders_log(id, item_id, amount, unit_price, total, description, ts, direction)
                 values(OLD.id, OLD.item_id, OLD.amount, OLD.unit_price, OLD.total, OLD.description, OLD.ts, 'out');
                 
8.6 存储引擎修改
Goods 表的存储引擎是 MyISAM,Joe 需要把它修改为 InnoDB,他应该怎么做?D
A.alter table goods add engine innodb;
B.alter table goods set engine innodb;
C.将 goods 表的数据导出
重建 goods 表,建表时指定 engine=innodb
导入数据
D.alter table goods engine innodb;

9.查询进阶

9.1 别名
关于别名,以下说法中正确的是:D
1.查询集(表或子查询)可以指定别名
2.查询集的列可以指定别名
3.别名只能用合法的变量名,即字母开头,只由英文数字、字母和下划线组成
4.可以用双引号或反引号将别名包围起来
​
A.全都不对
B.2, 3, 4
C.24
D.1, 2, 49.2 Between
Joe 要查询 goods 表 sql
create table goods(
id int primary key auto_increment,
category_id int,
category varchar(64),
name varchar(256),
price decimal(12, 4),
stock int,
upper_time timestamp
) 中价格在 10002000 之间(包含10002000)的数据,以下查询中错误的是:A
​
​
A.SELECT * FROM goods HAVING price BETWEEN 1000 AND 2000;
B.SELECT * FROM goods WHERE price BETWEEN 1000 AND 2000;
C.SELECT * FROM goods WHERE price >= 1000 AND price <= 2000;
D.SELECT * FROM goods WHERE not (price < 1000 or price > 2000);
​
9.3 透视表
Goods 表结构如下
create table goods(
                      id int primary key auto_increment,
                      category_id int,
                      category varchar(64),
                      name varchar(256),
                      price decimal(12, 4),
                      stock int,
                      upper_time timestamp
)
​
Joe 想要做一个报表,只需要显示商品名和价格分级,其中不足10元的是 cheap, 
超过1000的是expensive,其它的是 normal,这个查询应该怎么写?B
A.
select name,
       case price
           when  < 10 then 'cheap'
           when  > 1000 then 'expensive'
           else 'normal'
           end as level
from goods;
​
B.
select name,
       case 
           when price < 10 then 'cheap'
           when price > 1000 then 'expensive'
           else 'normal'
       end as level
from goods;
​
C.
select name,
       case
           when price < 10 then 'cheap'
           when price > 1000 then 'expensive'
           case _ 'normal'
           end as level
from goods;
​
D.
select name,
       case
           when price < 10  'cheap'
           when price > 1000 'expensive'
           else 'normal'
           end as level
from goods;
​
​
9.4 Distinct
Joe 想统计以下 goods 表
create table goods(
    id int primary key auto_increment,
    category_id int,
    category varchar(64),
    name varchar(256),
    price decimal(12, 4),
    stock int,
    upper_time timestamp
)中的商品有多少种不同的价格,他应该如何写这条查询?D
​
​
A.select distinct price from goods;
B.select count(distinct *) from goods;
C.select count(price) from goods;
D.select count(distinct price) from goods;
​
9.5 排序
Joe 需要根据员工表
create table employee
(
    id     serial primary key,
    name   varchar(256),
    dept   varchar(256),
    salary decimal(12, 4)
);
生成一份报表,首先按部门名称的字典序排序,部门内部按员工工资从高到低排列,那么这个查询应该是:A
​
A.select id, name, dept, salary from employee order by dept, salary desc;
B.select id, name, dept, salary from employee order by dept desc, salary desc;
C.select id, name, dept, salary from employee order by dept, salary, id, name;
D.select id, name, dept, salary from employee order by dept, salary;
​
9.6 Union
现有员工信息表和顾客信息表如下
create table employee(
    id int primary key auto_increment,
    name varchar(256),
    address varchar(1024),
    dept varchar(64)
    -- ignore more
);
​
create table customer(
                         id int primary key auto_increment,
                         name varchar(256),
                         address varchar(1024),
                         level int
    -- ignore more
)
​
​
Joe 需要员工和顾客的联系方式(姓名+地址)清单,用于邮寄礼品。这个查询如何写?C
A.
select * 
from customer
join employee on customer.id = employee.id
​
B.
select name, address 
from customer, employee
​
C.
select name, address 
from customer
union
select name, address
from employee
​
D.
select * 
from customer
join employee
​
9.7 正则表达式
Joe 想要找出 goods 表中所有名称包含牛奶的冰激凌,他应该怎么写这个查询?C
​
A.
select * 
from goods
where name regexp '牛奶冰激凌';
​
B.所有都不对
​
C.
select * 
from goods
where name regexp '牛奶.*冰激凌';
​
D.
select *
from goods
where name like '牛奶%冰激凌'
​
注解:
MySQL中匹配正则表达式需要使用关键字REGEXP,在REGEXP关键字后面跟上正则表达式的规则即可。
因此,当需要使用正则表达式查询数据时,只需要在WHERE条件中使用REGEXP关键字匹配相应的正则表达式即可。
​
​
9.7 分页
我们有如下订单表:
create table orders
(
    id          serial primary key,
    product_id  integer,
    order_date  date default now(),
    quantity    integer,
    customer_id integer
);
​
现在开发人员希望查询指定的某一天内的数据,并按每一百条一页查询,那么正确的语句应该是:D
A.
select id, product_id, order_date, quantity, customer_id
from orders
where date = $1 and
offset $2 and limit 100; 
​
B.
select id, product_id, order_date, quantity, customer_id
from orders
where date = $1
offset $2; 
​
C.
select id, product_id, order_date, quantity, customer_id
from orders
where date = $1; 
​
D.
select id, product_id, order_date, quantity, customer_id
from orders
where date = $1
offset $2 limit 100; 

cd0cc1d6fe704cdf90f6c3ddcf4aacde.gif

我正在参与掘金技术社区创作者签约计划招募活动,点击链接报名投稿