[Linux]经典面试题 - 数据库管理 - MySQL
参考:
一、SQL语句
可以把 SQL 分成两个部分:数据操作语言(DML)和数据定义语言(DDL)
SQL 适用于执行查询的语法。但是 SQL 语言也包含用于增删改查的语法。
增删改查语句构成 SQL 的 DML 部分:
- SELECT - 查询
- UPDATE - 更改
- DELETE - 删除
- INSERT INTO - 增加
创建删除表格,定义索引(键),规定表间链接和设定约束的 DDL 语句:
- CREATE DATABASE - 创建新数据库
- ALTER DATABASE - 修改数据库
- CREATE TABLE - 创建新表
- ALTER TABLE - 变更(改变)数据库表
- DROP TABLE - 删除表
- CREATE INDEX - 创建索引(搜索键)
- DROP INDEX - 删除索引
二、数据库简介
-
数据库(DataBase)是按照数据结构来组织、存储和管理数据的仓库。
-
每个数据库都有一个或多个不同的API用于对数据的增删改查。
三、关系型数据库
RDBMS(Relational DataBase Management System),关系型数据库。
关系型数据库的一些术语:
- 数据库(DataBase):数据库是表的集合,可以理解为用来存放数据表的仓库。
- 数据表(Table):表是数据的矩阵,看起来就像一个简单的Excel表格。
- 列(Column):一列相同类型的数据。
- 行(Row):一组相关的数据。
- 主键(Primary Key):主键是唯一的,一个数据表中只能包含一个主键,可以使用主键来查询数据。
- 外键(Foreign key):外键用于关联两个表。
- 复合键(Composite key):复合键将多个列作为一个索引键,一般用于符合索引。
- 索引(Index):使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。
四、MySQL 安装
在 CentOS 7 之后的MySQL被其分支MariaDB代替,在存储引擎方面采用XtraDB来代替MySQL的InnoDB。
查看系统中的是否自带MariaDB:
[root@localhost ~]# rpm -qa | grep mariadb
mariadb-errmsg-10.3.28-1.module_el8.3.0+757+d382997d.x86_64
mariadb-10.3.28-1.module_el8.3.0+757+d382997d.x86_64
mariadb-gssapi-server-10.3.28-1.module_el8.3.0+757+d382997d.x86_64
mariadb-backup-10.3.28-1.module_el8.3.0+757+d382997d.x86_64
mariadb-connector-c-config-3.1.11-2.el8_3.noarch
mariadb-server-10.3.28-1.module_el8.3.0+757+d382997d.x86_64
mariadb-server-utils-10.3.28-1.module_el8.3.0+757+d382997d.x86_64
mariadb-common-10.3.28-1.module_el8.3.0+757+d382997d.x86_64
mariadb-connector-c-3.1.11-2.el8_3.x86_64
如果有,可以选择卸载(因为系统自带的版本可能会比较旧,存在兼容性问题)
rpm -e mariadb // 普通删除模式
rpm -e --nodeps mariadb // 强力删除模式,会删除依赖文件
安装 Mariadb:
yum install -y mariadb mariadb-server
初始化 Mariadb:
mysqld --initialize
设置开机启动:
systemctl enable mariadb.service
systemctl start mariadb.service
验证:
[root@localhost ~]# mysqladmin --version
mysqladmin Ver 9.1 Distrib 10.3.28-MariaDB, for Linux on x86_64
初始化root登录密码:
mysqladmin -u root password "new_password"
登录数据库:
mysql -u root -p
五、MySQL 管理
5.1 用户设置
在MySQL(MariaDB)中,添加用户有两种方式:
5.1.1 创建用户
切换到mysql库:
MariaDB [(none)]> use mysql;
添加sky用户,密码为skybiubiu:
MariaDB [mysql]> create user sky identified by 'skybiubiu';
Query OK, 0 rows affected (0.000 sec)
5.1.2 用户授权
以skydb库为例子:
MariaDB [mysql]> CREATE DATABASE skydb;
Query OK, 1 row affected (0.000 sec)
通过GRANT命令进行授权,授予sky用户SELECT,INSERT,UPDATE操作权限:
MariaDB [skydb]> GRANT SELECT,INSERT,UPDATE ON skydb.*
-> TO 'sky'@'localhost'
-> IDENTIFIED BY 'skybiubiu';
Query OK, 0 rows affected (0.001 sec)
5.2 管理命令
- USE 数据库名 - 选择要操作的数据库
- SHOW DATABASES - 查看所有数据库
- SHOW TABLES - 查看指定库的所有表
- SHOW COLUMNS FROM 数据表 - 显示数据表的属性,属性类型,主键信息,NULL,默认值等信息
- SHOW INDEX FROM 数据表 - 显示数据表的详细索引信息,包括主键。
- SHOW TABLE STATUS [FROM db_name] [LIKE 'pattern'] - 查看表状态
六、MySQL 数据结构
有三种主要的类型:Text(文本)、Number(数字)和 Date/Time(日期/时间)类型。
6.1 Text 类型
数据类型 | 描述 |
---|---|
CHAR(size) | 保存固定长度的字符串(可包含字母、数字以及特殊字符)。在括号中指定字符串的长度。最多 255 个字符。 |
VARCHAR(size) | 保存可变长度的字符串(可包含字母、数字以及特殊字符)。在括号中指定字符串的最大长度。最多 255 个字符。注释:如果值的长度大于 255,则被转换为 TEXT 类型。 |
TINYTEXT | 存放最大长度为 255 个字符的字符串。 |
TEXT | 存放最大长度为 65,535 个字符的字符串。 |
BLOB | 用于 BLOBs(Binary Large OBjects)。存放最多 65,535 字节的数据。 |
MEDIUMTEXT | 存放最大长度为 16,777,215 个字符的字符串。 |
MEDIUMBLOB | 用于 BLOBs(Binary Large OBjects)。存放最多 16,777,215 字节的数据。 |
LONGTEXT | 存放最大长度为 4,294,967,295 个字符的字符串。 |
LONGBLOB | 用于 BLOBs (Binary Large OBjects)。存放最多 4,294,967,295 字节的数据。 |
ENUM(x,y,z,etc.) | 允许您输入可能值的列表。可以在 ENUM 列表中列出最大 65535 个值。如果列表中不存在插入的值,则插入空值。注释:这些值是按照您输入的顺序排序的。可以按照此格式输入可能的值: ENUM('X','Y','Z') |
SET | 与 ENUM 类似,不同的是,SET 最多只能包含 64 个列表项且 SET 可存储一个以上的选择。 |
6.2 Number 类型
数据类型 | 描述 |
---|---|
TINYINT(size) | -128 到 127 常规。0 到 255 无符号*。在括号中规定最大位数。 |
SMALLINT(size) | -32768 到 32767 常规。0 到 65535 无符号*。在括号中规定最大位数。 |
MEDIUMINT(size) | -8388608 到 8388607 普通。0 to 16777215 无符号*。在括号中规定最大位数。 |
INT(size) | -2147483648 到 2147483647 常规。0 到 4294967295 无符号*。在括号中规定最大位数。 |
BIGINT(size) | -9223372036854775808 到 9223372036854775807 常规。0 到 18446744073709551615 无符号*。在括号中规定最大位数。 |
FLOAT(size,d) | 带有浮动小数点的小数字。在 size 参数中规定最大位数。在 d 参数中规定小数点右侧的最大位数。 |
DOUBLE(size,d) | 带有浮动小数点的大数字。在 size 参数中规定最大位数。在 d 参数中规定小数点右侧的最大位数。 |
DECIMAL(size,d) | 作为字符串存储的 DOUBLE 类型,允许固定的小数点。在 size 参数中规定最大位数。在 d 参数中规定小数点右侧的最大位数。 |
这些整数类型拥有额外的选项 UNSIGNED。通常,整数可以是负数或正数。如果添加 UNSIGNED 属性,那么范围将从 0 开始,而不是某个负数。
6.3 Date 类型
数据类型 | 描述 |
---|---|
DATE() | 日期。格式:YYYY-MM-DD注释:支持的范围是从 '1000-01-01' 到 '9999-12-31' |
DATETIME() | *日期和时间的组合。格式:YYYY-MM-DD HH:MM:SS注释:支持的范围是从 '1000-01-01 00:00:00' 到 '9999-12-31 23:59:59' |
TIMESTAMP() | *时间戳。TIMESTAMP 值使用 Unix 纪元('1970-01-01 00:00:00' UTC) 至今的秒数来存储。格式:YYYY-MM-DD HH:MM:SS注释:支持的范围是从 '1970-01-01 00:00:01' UTC 到 '2038-01-09 03:14:07' UTC |
TIME() | 时间。格式:HH:MM:SS注释:支持的范围是从 '-838:59:59' 到 '838:59:59' |
YEAR() | 2 位或 4 位格式的年。注释:4 位格式所允许的值:1901 到 2155。2 位格式所允许的值:70 到 69,表示从 1970 到 2069。 |
七、MySQL 库&表操作
7.1 库操作
7.1.1 创建库
方法一:登入MySQL中,通过SQL语句创建。
CREATE DATABASE IF NOT EXISTS <数据库名>;
- IF NOT EXISTS - 如果不存在该数据库则创建。
方法二:在bash中,利用mysqladmin命令创建。
mysqladmin -u root -p create <数据库名>
7.1.2 删除库
同上两种删除库的方法:
登入MySQL中,通过SQL语句删除:
DROP DATABASE <数据库名>;
在Bash,通过mysqladmin命令删除:
mysqladmin -u root -p drop <数据库名>
7.1.3 选择库
进入mysql,使用SQL语句选择库:
USE <数据库名>;
7.2 表操作
7.2.1 创建表
登入MySQL中,通过SQL语句创建:
CREATE TABLE <表名> (column_name column_type);
示例:
CREATE TABLE IF NOT EXISTS books (
BookID INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
Title VARCHAR(100) NOT NULL,
SeriesID INT, AuthorID INT)CHARSET UTF8;
注意:`
是反单引号,ESC下面那个,可加可不加。
- NOT NULL - 该字段不能为空。
- AUTO_INCREMENT - 自增,常用于主键,数值会自动加1。
- PRIMARY KEY - 定义主键,可使用多列来定义主键,列间以逗号分隔。
- ENGINE - 设置存储引擎。
- CHARSET - 设置编码。
7.2.2 删除表
登入MySQL中,通过SQL语句创建:
DROP TABLE <表名>;
示例:
MariaDB [skydb]> show tables;
+-----------------+
| Tables_in_skydb |
+-----------------+
| books |
| sky_table |
+-----------------+
2 rows in set (0.000 sec)
MariaDB [skydb]> DROP TABLE sky_table;
Query OK, 0 rows affected (0.002 sec)
MariaDB [skydb]> show tables;
+-----------------+
| Tables_in_skydb |
+-----------------+
| books |
+-----------------+
1 row in set (0.000 sec)
7.2.3 查询表
查看库中所有表:
MariaDB [skydb]> SHOW TABLES;
+-----------------+
| Tables_in_skydb |
+-----------------+
| books |
+-----------------+
1 row in set (0.000 sec)
查看一个某个表头的详情:
MariaDB [skydb]> DESCRIBE books;
+----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+----------------+
| BookID | int(11) | NO | PRI | NULL | auto_increment |
| Title | varchar(100) | NO | | NULL | |
| SeriesID | int(11) | YES | | NULL | |
| AuthorID | int(11) | YES | | NULL | |
+----------+--------------+------+-----+---------+----------------+
4 rows in set (0.001 sec)
DESCRIBE 可以简写为 DESC。
7.3 数据操作
7.3.1 插入数据
INSERT INTO books (Title, SeriesID, AuthorID)
VALUES ("Lair of Bones", 2, 2);
7.3.2 查询数据
语法:
SELECT column_name,column_name
FROM table_name
[WHERE Clause]
[LIMIT N][ OFFSET M]
Clause - 从哪个表里找。
LIMIT N - 设定返回的记录数。
OFFSET M - 查询数据的偏移量,默认为0。
效果:
MariaDB [skydb]> SELECT * FROM books;
+--------+---------------+----------+----------+
| BookID | Title | SeriesID | AuthorID |
+--------+---------------+----------+----------+
| 1 | Lair of Bones | 2 | 2 |
| 2 | Lair of Bones | 2 | 2 |
+--------+---------------+----------+----------+
2 rows in set (0.000 sec)
因为我插入了两次数据,所以有两条一样的,留着下面更改的时候用。
7.3.3 更改数据
将7.3.2中BookID为2的Title改为 I'm SkyBiuBiu
SQL语法:
UPDATE books
SET Title = "I'm SkyBiuBiu"
WHERE BookID = 2;
效果:
MariaDB [skydb]> SELECT * FROM books;
+--------+---------------+----------+----------+
| BookID | Title | SeriesID | AuthorID |
+--------+---------------+----------+----------+
| 1 | Lair of Bones | 2 | 2 |
| 2 | I'm SkyBiuBiu | 2 | 2 |
+--------+---------------+----------+----------+
2 rows in set (0.000 sec)