MySQL入门技能树

作者:IT邦德 中国DBA联盟(ACDU)成员,10余年DBA工作经验 擅长主流数据Oracle、MySQL、PG 运维开发, 备份恢复,安装迁移,性能优化、故障应急处理等 ​ 微信:jem_db QQ交流群:168797397 公众号:IT邦德

1.关系型数据库

1.1 MySQL 服务器 关于 MySQL 服务器,以下说法错误的是:C A.MySQL 可以设置监听端口、地址和最大连接数 B.MySQL 的每个数据表可以指定存储引擎 C.MySQL 的服务器和客户端必须运行在不同的计算机上。 D.MySQL 的超级用户默认为 root 1.2 连接 MySQL 数据库 下列选项中,可以用于连接到 MySQL 数据库的有: A A.全部都可以 B.JDBC 库 mysql:mysql-connector-java C.命令行工具 mysql D.Python DBAPI 实现 MySQLdb 1.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数据库,以下说法错误的是:D 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, 2 3.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 列的类型应该是: B A.int B.decimal C.long D.float 注解: DECIMAL(P,D); P是表示有效数字数的精度,P范围为1〜65 D是表示小数点后的位数,D的范围是0~30 MySQL要求D小于或等于(<=)P DECIMAL(4,2) 23.46 4.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 ); 查询 2022 年 5 月 25 日下单的所有单价低于 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.存储过程的参数类型可以是IN、OUT和INOUT,而存储函数的参数类型只能是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.3 或 4 8.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.2, 4 D.1, 2, 4 9.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 ) 中价格在 1000 到 2000 之间(包含1000和2000)的数据,以下查询中错误的是: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;

10.内置函数

10.1 锁函数 关于锁函数,下列说法正确的是:C 1.GET_LOCK(value,timeout)函数使用字符串value给定的名字获取锁,持续timeout秒。 2.如果 GET_LOCK 成功获取锁,则返回1,如果获取锁超时,则返回0,如果发生错误,则返回NULL。 3.RELEASE_LOCK(value)函数将以value命名的锁解除。 4.如果 RELEASE_LOCK 解除成功,则返回1,如果线程还没有创建锁,则返回0,如果以value命名的锁不存在,则返回NULL。 5.IS_FREE_LOCK(value)函数判断以value命名的锁是否可以被使用。 6.如果IS_FREE_LOCK判断锁可以被使用,则返回1,如果不能使用,也就是说正在被使用,则返回0,如果发生错误,则返回NULL。 7.IS_USED_LOCK(value)函数判断以value命名的锁是否正在被使用,如果正在被使用,则返回使用该锁的数据库连接ID,否则返回NULL。 A.1, 3, 5, 7 B.全都不对 C.全部都对 D.2, 3, 4 注解: MySQL中提供了对数据进行加锁和解锁的函数, 这些函数包括GET_LOCK(value,timeout)、RELEASE_LOCK(value)、IS_FREE_LOCK(value)和IS_USED_LOCK(value)函数。 10.2 JSON 关于 MySQL 的 JSON 操作,以下说法正确的是:D JSON_CONTAINS(json_doc,value)函数查询JSON类型的字段中是否包含value数据。如果包含则返回1,否则返回0。 JSON_PRETTY(json_doc)函数以优雅的格式显示JSON数据。 JSON_SEARCH(json_doc ->> $[*].key,type,value)函数在JSON类型的字段指定的key中,查找字符串value。如果找到value值,则返回索引数据。 JSON_DEPTH(json_doc)函数返回JSON数据的最大深度。 JSON_LENGTH(json_doc[,path])函数返回JSON数据的长度。 JSON_KEYS(json_doc[,path])函数返回JSON数据中顶层key组成的JSON数组。 JSON_INSERT(json_doc,path,val[,path,val] …)函数用于向JSON数据中插入数据。 JSON_REMOVE(json_doc,path[,path] …)函数用于移除JSON数据中指定key的数据。 JSON_REPLACE(json_doc,path,val[,path,val] …)函数用于更新JSON数据中指定Key的数据。 JSON_SET(json_doc,path,val[,path,val] …)函数用于向JSON数据中插入数据。 JSON_TYPE(json_val)函数用于返回JSON数据的JSON类型。 JSON_VALID(value)函数用于判断value的值是否是有效的JSON数据,如果是,则返回1,否则返回0,如果value的值为NULL,则返回NULL。 A.11, 12 B.全都不对 C.1, 2, 3, 4, 5 D.全部都对 注解: JSON函数是对数据库中JSON数据类型的数据进行处理的函数,MySQL中内置了一系列的JSON函数 10.3 窗口函数 ## 首尾 关于 window function 的首尾操作,以下说法正确的是: C 1.FIRST_VALUE(expr)函数返回第一个expr的值。 2.LAST_VALUE(expr)函数返回最后一个expr的值。 A.1 B.全都不对 C.全部都对 D.2 ## RANK 关于 window function 的序号操作,以下说法正确的是:B 1.ROW_NUMBER()函数能够对数据中的序号进行顺序显示。 2.使用RANK()函数能够对序号进行并列排序,并且会跳过重复的序号 3.DENSE_RANK()函数对序号进行并列排序,并且不会跳过重复的序号 4.RANK() 函数可能输出形如 1, 2, 2, 4 的数列 5.DNSE_RANK() 函数可能输出形如 1, 2, 2, 3 的数列 A.1, 2, 3 B.以上都对 C.4, 5 D.以上都不对 ## 向前和向后 关于向前和向后取值,以下说法正确的是:B 1.LAG(expr,n)函数返回当前行的前n行的expr的值。 2.LEAD(expr,n)函数返回当前行的后n行的expr的值。 A.全都不对 B.全部都对 C.1 D.2 ## 分布函数 关于分布函数,以下说法正确的是:D 1.PERCENT_RANK()函数是等级值百分比函数。 2.CUME_DIST()函数主要用于查询小于或等于某个值的比例 3.PERCENT_RANK()按照 (rank – 1) / (rows – 1) 计算, 其中,rank的值为使用RANK()函数产生的序号,rows的值为当前窗口的总记录数。 A.2, 3 B.1, 2 C.全都不对 D.全部都对 10.4 时间日期函数 ## DAY Joe 需要从日期中提取当天是几号,下列哪些函数可以实现这个功能?B A.DAY B.DAYOFMONTH C.DAYOFYEAR D.TO_DAYS A.只有 2 B.1 和 2 C.只有 1 D.都不对 ## 当前时间 Joe 需要在程序中获取当前时间,但是不包含日期部分。下列哪些函数可以提供这个功能?D 1.now() 2.curtime() 3.sysdate() 4.current_time() 5.current_timestamp() A.1, 2, 3, 4 B.4, 5 C.全部都错 D.2, 4 Joe 在程序中获取当前时间,下面哪个函数不能满足要求?A 1.now() 2.sysdate() 3.CURRENT_TIMESTAMP() 4.LOCALTIME() 5.current() A.5 B.3 C.4 D.2 ## WeekDay Joe 想要用 weekday 生成每周分析报表, 这个函数会将如期映射为整数,当 weekday 返回 0 ,代表周几?C A.全都不是 B.视时区不同而变 C.周一 D.周六 ## TO_DAYS TO_DAYS 函数返回的是?C A.当前时间到 0000 年 1 月 1 日的天数。 B.当前时间到 1970 年 1 月 1 日的天数。 C.给定时间到 0000 年 1 月 1 日的天数。 D.给定时间到 1970 年 1 月 1 日的天数。 注解: 给定一个日期date, 返回一个从年份0开始计算的天数,从公元0年开始算 ## EXTRACT 关于 Extract 操作和其它日期时间函数的对应关系,下列说法正确的是:D 1.extract(mirosecond from date) 相当于 ms(date) 2.extract(second from date) 相当于 second(date) 3.extract(minute from date) 相当于 minute(date) 4.extract(hour from date) 相当于 hour(date) 5.extract(day from date) 相当于 day(date) 6.extract(week from date) 相当于 week(date) 7.extract(month from date) 相当于 month(date) 8.extract(quarter from date) 相当于 quarter(date) 9.extract(year from date) 相当于 year(date) A.1, 2, 3, 4 B.全部都对 C.5, 6, 7, 8, 9 D.2, 3, 4, 5, 6, 7, 8, 9 注解 EXTRACT(unit FROM date) EXTRACT()函数需要两个参数:unit和date extract(mirosecond from date) 相当于 microsecond(date) ## TIMESTAMP 关于 UNIX 时间戳和 MySQL 的日期时间类型,以下说法正确的是:B 1.UNIX_TIMESTAMP(date) 函数将 date 转换为 UNIX 时间戳 2.FROM_UNIXTIME(timestamp) 将 UNIX 时间戳 timestamp 转换为 date 类型 3.extract(timestamp from date) 可以将 date 转换为 Unix 时间戳 4.extract(datetime from timestamp) 可以将时间戳转换为 datetime A.全部都对 B.1, 2 C.3, 4 D.全都不对 ## FROM_DAYS FROM_DAYS 函数返回的是?A A.给定从 0000 年 1 月 1 日起的天数,返回对应的日期 B.给定从当前日期算起的天数,返回对应的日期 C.都不对 D.给定从 1970 年 1 月 1 日起的天数,返回对应的日期 ## MAKE DATE AND TIME 关于日期时间构造方法,下面说法正确的是:C 1.MAKETIME(hour,minute,second)函数将给定的小时、分钟和秒组合成时间并返回。 2.MAKEDATE(year,n)函数针对给定年份与所在年份中的天数返回一个日期。 3.LAST_DAY(date)函数返回date所在月份的最后一天的日期。 4.TIME_TO_SEC(time)函数将time的时分秒部分转化为秒并返回结果值。 5.SEC_TO_TIME(seconds)函数将seconds描述转化为包含小时、分钟和秒的时间。 A.4, 5 B.全都不对 C.全部都对 D.1, 2, 3 ## 日期时间计算 以下关于时间和日期数据计算的知识,哪些是正确的? 1.ADDTIME(time1,time2)函数返回time1加上time2的时间。其中,time2是一个表达式,也可以是一个数字,当time2为一个数字时,代表的是秒。 2.SUBTIME(time1,time2)函数返回time1减去time2后的时间。其中,time2是一个表达式,也可以是一个数字,当time2为一个数字时,代表的是秒。 3.DATE_ADD(date,INTERVAL expr type)函数返回与date加上INTERVAL时间间隔的日期。Type 与 extract 参数中毫秒之外的部分相同。 4.DATE_SUB(date,INTERVAL expr type)函数返回与date减去INTERVAL时间间隔的日期。Type 与 extract 参数中毫秒之外的部分相同。 5.DATEDIFF(date1,date2) 函数计算两个日期之间相差的天数。 6.PERIOD_ADD(time,n)函数返回time加上n后的时间。 A.4, 5 B.2, 3, 4, 5 C.全部都对 D.全都不对 ## 格式化 关于日期时间数据的格式化,以下说法正确的是:D 1.DATE_FORMAT(date,format)函数按照指定的格式format来格式化日期date。 2.TIME_FORMAT(time,format)函数按照指定的格式format来格式化日期date。 3.GET_FORMAT(date_type,format_type)函数返回日期字符串的显示格式,其中date_type表示日期类型,format_type表示格式化类型。 A.1, 2 B.1, 3 C.2, 3 D.全部都对 10.5 其他函数 ## 类型转换 Joe 想要把字符串表示的整数转为整数类型,可行的方法是:A A.SELECT CAST(123 AS SIGNED); select signed(123); C.全都不对 D.SELECT CAST(123 AS INT); ## 编码转换 Joe 需要将下面这个查询select name from goods; 中的 name 字段的字符集改为 gb 18030,他应该怎么做?B A.select convert(name from utf8mb4 to gb18303) from goods; B.select convert(name using gb18030) from goods; C.所有都错 D.select str(name, gb18303) from goods;

11.聚合和分组

11.1 count 练习 Joe 建立了一个名为items的表 mysql> select * from items; +—-+———–+ | id | item | +—-+———–+ | 1 | 2 | | 2 | NULL | | 3 | 9 | | 4 | 534214123 | +—-+———–+ 当他执行 select count(*), count(item) from items; 会得到什么结果?A A.4, 3 B.3, 4 C.4, NULL D.NULL, NULL 注解:官方给的答案有问题 11.4 最大值练习 利用员工信息表: create table employee ( id serial primary key, name varchar(256), dept varchar(256), salary decimal(12, 4) ); Joe 做了一些关于 max 函数的练习,其中不正确的是:A A. select id, dept, max(salary) as salary, name from employee group by dept 可以得到每个部门工资最高的员工的全部信息。 B. select max(salary) as salary from employee 可以得到全部员工中最高的工资。 C. select dept, min(salary) from employee group by dept having max(salary) > 50000 可以得到员工最高工资超过五万的部门,及其最低工资的清单 D. select dept, max(salary) as salary from employee group by dept 可以得到每个部门的最高工资。 11.6 Having Joe 要从 employee 表 sql create table employee ( id serial primary key, name varchar(256), dept varchar(256), salary decimal(12, 4) ); 中得到每月工资开支超过十万的部门,这个查询应该怎么写?C A.select dept from employee where sum(salary) > 100000 order by dept; B.select dept from employee group by dept where sum(salary) > 100000; C.select dept from employee group by dept having sum(salary) > 100000; D.select dept from employee where sum(salary) > 100000 group by dept;

12.子查询

12.1 子查询 现有员工表 create table employee ( id serial primary key, name varchar(256), dept varchar(256), salary decimal(12, 4) ); Joe 希望找出比销售部(dept 为 sale)工资最高的员工工资更高的那部分人, 查询出他们的完整信息,下面哪一项可以满足要求?D A. select l.id, l.name, l.dept, l.salary from employee as l join employee as r on l.salary > max(r.salary) where r.dept = sale group by r.dept B. select id, name, dept, salary from employee having salary > (select max(salary) from employee where dept = sale) C. select id, name, dept, salary from employee where dept = sale group by dept having salary > max(salary) D. select id, name, dept, salary from employee where salary > (select max(salary) from employee where dept = sale) 12.1 ANY Joe 想要从员工表 create table employee( id int primary key auto_increment, name varchar(256), dept varchar(64), salary decimal(12, 4) ); 构造一个员工列表,排除每个部门最高工资的员工。这个查询可以怎样写?C A. select o.id, o.name, o.dept, o.salary from employee as o left join employee as i on o.dept = i.dept and o.salary < i.salary where i.id is not null; B. select id, name, dept, salary from employee as o join employee as i on o.dept = i.dept and o.salary < i.salary C. select id, name, dept, salary from employee as o where o.salary < any(select salary from employee as i where i.dept=o.dept) D. select o.id, o.name, o.dept, o.salary from employee as o left join employee as i on o.dept = i.dept and o.salary < i.salary where i.id is null; ## ALL Joe 想从员工表 create table employee( id int primary key auto_increment, dept_id int, name varchar(256), post varchar(16) ) 中找出所有其所在部门没有助理(post 为 assistant)的员工信息。 由于 Joe 没有其它表的查询权限,他只能查询员工表,这个查询应该是:D A. select id, name, dept from employee as o where assistant != all(select post from employee as i); B. select id, name, dept from employee as o where assistant != ANY(select post from employee as i where o.dept = i.dept); C. select id, name, dept from employee as o where assistant = all(select post from employee as i where o.dept = i.dept); D. select id, name, dept from employee as o where assistant != all(select post from employee as i where o.dept = i.dept); ## Exists Joe 想从员工表 create table employee( id int primary key auto_increment, dept_id int, name varchar(256), post varchar(16) ) 中找出所有其所在部门没有助理(post 为 assistant)的员工信息。 由于 Joe 没有其它表的查询权限, 他只能查询员工表, 并且这一次他想用 exists 实现。这个查询应该是:C A. select id, name, dept from employee as o where assistant = not exists(select post from employee as i where o.dept = i.dept); B. select id, name, dept from employee as o where not exists(select * from employee as i where o.dept = i.dept and post!=assistant); C. select id, name, dept from employee as o where not exists(select * from employee as i where o.dept = i.dept and post=assistant); D. select id, name, dept from employee as o where assistant != exists(select post from employee as i); ## IN Joe 想要从员工表 create table employee( id int primary key auto_increment, dept_id int, name varchar(256), post varchar(16) ) 中查询出研发部(dept为rd)和人力资源部(dept为hr)的员工列表,这个查询应该怎么写?C A. select id, dept, name, post from employee where dept in (dev, hr); B. select id, dept, name, post from employee where dept in (select * from dev, hr); C. select id, dept, name, post from employee where dept in (select dev, hr); D. select id, dept, name, post from employee where dept in (dev and hr); ## 列子查询 Joe 打算写一个查询,根据员工表 create table employee ( id int primary key auto_increment, dept varchar(64), name varchar(256), post varchar(16) ) 统计每个部门的人数,但是他不打算用 group by。那么还可以怎做?D A. select distinct(dept) as dept, (select count(*) from employee as i) as emp from employee as o; B. select distinct(dept) as dept, (select count(*) from employee where dept = dept) as emp from employee C. select dept as dept, (select count(*) from employee as i where i.dept = o.dept) as emp from employee as o D. select distinct(dept) as dept, (select count(*) from employee as i where i.dept = o.dept) as emp from employee as o;

13.连接查询

13.1 自连接 现有 node 表如下: create table node( id int primary key auto_increment, pid int, content varchar(256) ) 现在Joe 想要给出 content 以 fork- 开头的所有节点,和它们的子节点, 输出 parent_id, parent_content, child_id, child_content 。 他应该怎么做?D A. select l.id as parent_id, l.content as parent_content, r.id as child_id, r.content as child_content from node as l, node as r where l.id =(+) r.pid l.content like fork-%; B. select l.id as parent_id, l.content as parent_content, r.id as child_id, r.content as child_content from node as l right join node as r on l.id = r.pid where l.content like fork-%; C. select l.id as parent_id, l.content as parent_content, r.id as child_id, r.content as child_content from node as l cross join node as r on l.id = r.pid where l.content like fork-%; D. select l.id as parent_id, l.content as parent_content, r.id as child_id, r.content as child_content from node as l join node as r on l.id = r.pid where l.content like fork-%; 13.2 左连接 现有部门表 create table department( id int primary key auto_increment, name varchar(256) ) 和员工表 create table employee( id int primary key auto_increment, dept_id int, name varchar(256), post varchar(16) ) Joe 想要列出所有的部门,如果这个部门有部门助理(post 为 assistant), 则将 stuff 的名字也列出来,那么这个查询应该是:D A. select d.id, d.name, e.name as assistant from department as d join employee as e on e.dept = d.id where e.post = assistant B. select d.id, d.name, e.name as assistant from employee as e left join department as d on e.dept = d.id where e.post = assistant C. select d.id, d.name, e.name as assistant from department as d cross join employee as e on e.dept = d.id where e.post = assistant D. select d.id, d.name, e.name as assistant from department as d left join employee as e on e.dept = d.id where e.post = assistant 13.3 右连接 现有部门表 create table department( id int primary key auto_increment, name varchar(256) ) 和员工表 create table employee( id int primary key auto_increment, dept_id int, name varchar(256), post varchar(16) ) 公司经过了一轮调整后,员工信息有些混乱,现在 Joe 要写一个查询, 找出部门信息写错的员工,这些员工所在的部门在 department 表中没有对应记录。D A. select e.id, e.name, e.dept from department as d join employee as e on d.id = e.dept where d.id is null; B. select e.id, e.name, e.dept from employee as e right join department as d on d.id = e.dept where d.id is null; C. select e.id, e.name, e.dept from department as d right join employee as e on d.id = e.dept where d.id is null; D. select e.id, e.name, e.dept from employee as e right join department as d on d.id = e.dept where e.id is null; 13.4 Cross Join Joe 需要生成 goods 表 create table goods( id int primary key auto_increment, category varchar(64), name varchar(256), price decimal(12, 4), stock int, upper_time timestamp ) 中所有T恤(category为T-Shirt)的所有尺寸,尺寸信息在 size 表 create table size( id int primary key auto_increment, name varchar(16) )中,那么这个查询应该是:D A. select g.id, g.name, s.name as size from goods as g full join size as s where g.category = T-Shirt; B. select g.id, g.name, s.name as size from goods as g left join size as s where g.category = T-Shirt; C. select g.id, g.name, s.name as size from goods as g right join size as s where g.category = T-Shirt; D. select g.id, g.name, s.name as size from goods as g cross join size as s where g.category = T-Shirt; 注解:交叉连接; 交叉联接; 笛卡尔乘积; 13.5 工资最高的人 现有员工信息表如下: create table employee ( id serial primary key, name varchar(256), dept varchar(256), salary money ); 下面哪条查询,可以给出每个部门工资最高的员工的 id, name, dept, salary 四项信息?D A. select id, name, dept, max(salary) from employee group by dept; B. select id, name, dept, max(salary) from employee where salary = max(salary) group by dept; C. select id, name, dept, max(salary) from employee group by dept, id, name; D. select l.id, l.name, l.dept, l.salary from employee as l join (select max(salary) as salary, dept from employee group by dept) as r on l.dept = r.dept and l.salary = r.salary

14.索引

14.1 关于 MySQL 的索引,一下说法正确的是: D 1.索引可以指定不同的格式,以满足不同的性能需求 2.索引可以伴有唯一约束 3.主键会自动包含聚集索引 4.聚集索引只能应用于自增字段 5.索引可以基于一个或多个字段 6.可以创建函数或表达式索引 7.MySQL 支持全文索引(Full Text Index) A.全部都对 B.4, 5, 6, 7 C.2, 4, 6, 8 D.1, 2, 3, 5, 6, 7 13.2 删除索引 Joe 想要删除创建在 goods 表创建的索引,但是他已经忘了这个索引的名字,那么他应该怎么做?C A.执行 show index from goods; 查看 goods 表的索引(假设查到是 idx_goods_category),然后执行 alter table goods drop idx_goods_category; B.执行 show index from goods; 查看 goods 表的索引(假设查到是 idx_goods_category),然后执行 alter table goods delete index idx_goods_category; C.执行 show index from goods; 查看 goods 表的索引(假设查到是 idx_goods_category),然后执行 alter table goods drop index idx_goods_category; D.执行 show index from goods; 查看 goods 表的索引(假设查到是 idx_goods_category),然后执行 alter table goods remove index idx_goods_category;

© 版权声明
THE END