大家好,我是云计算磊哥,从业20年的IT老鸟。运维培训15年,总结了一套从入门到精通的全运维开发宝典手册。准备用300天时间写一套博文,手把手从安装软件讲起,从行业到产品,从过去到未来,从理论到操作,从视频到文档工具,一站式。从零基础入门到20k运维开发工程师岗位诸多就业问题。多方位全方面的给你讲清楚云计算这个行业该如何做。关注我。后续AI大模型开发课程更精彩。
开源数据库MySQL DBA运维实战 表
1 初识SQL语言
SQL(Structured Query Language 即结构化查询语言)
DDL (data definition language)语句 数据库定义语言: 数据库、表、视图、索引、存储过程,例如CREATE DROP ALTER
DML(data manipulation language)语句 数据库操纵语言: 插入数据INSERT、删除数据DELETE、更新数据UPDATE
DQL (Data Query Language )语句 数据库查询语言: 查询数据SELECT
DCL (Data Control Language)语句 数据库控制语言: 例如控制用户的访问权限GRANT、REVOKE
2 名词解释
数据库服务器: 运行着数据库应用程序的设备.
数据库: 表的管理单元.
默认数据库:
- information_schema: 虚拟库,主要存储了系统中的一些数据库对象的信息,例如用户表信息、列信息、权限信息、字符信息等
- performance_schema: 主要存储数据库服务器的性能参数
- mysql: 授权库,主要存储系统用户的权限信息
- sys: 主要存储数据库服务器的性能参数
表: 记录的管理单元
记录: 字段的管理单元
字段: 字段名,字段类型(长度),字段约束组成
类型: 字符,数字,日期
约束: 不能为空,自动增长等
图示

3 DDL1(库)
3.1 定义库
创建业务数据库
shell
语法:CREATE DATABASE 数据库名;
要求:
- 区分大小写
- 唯一性
- 不能使用关键字如 create select
- 不能单独使用数字
查看数据库
shell
语法: SHOW DATABASES;
选择数据库
USE 数据库名
查询当前库
SELECT database();
删除数据库
DROP DATABASE 数据库名;
系统中的位置
/usr/local/mysql/data/ 源码安装
/var/lib/mysql/ RPM安装
3.2 数据类型
MySQL常见的数据类型
前言
在MySQL数据库管理系统中,可以通过存储引擎来决定表的类型。同时,MySQL数据库管理系统也提供了数据类型决定表存储数据的类型。
数值类型
- 整数类型 INT
- 浮点数类型 FLOAT DOUBLE
- 定点数类型 DEC
- 位类型 BIT
字符串类型
- CHAR系列 CHAR VARCHAR
- TEXT系列 TEXT
- BLOB 系列 BLOB
- BINARY系列 BINARY VARBINARY
- 枚举类型:ENUM
- 集合类型: SET
时间和日期类型
- DATE
- TIME
- DATETIME
- TIMESTAMP
- YEAR
- TIME
数据类型测试
===整数类型测试:tinyint,int
1 创建一个表
mysql> create table test1(
tinyint_test tinyint,
int_test int
);
2 查询表结构
mysql> desc test1;
+--------------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+------------+------+-----+---------+-------+
| tinyint_test | tinyint(4) | YES | | NULL | |
| int_test | int(11) | YES | | NULL | |
+--------------+------------+------+-----+---------+-------+
2 rows in set (0.01 sec)
3 插入数值
mysql> insert into test1 values (111,111);
Query OK, 1 row affected (0.09 sec)
mysql> insert into test1(tinyint_test) values(128);
ERROR 1264 (22003): Out of range value for column 'tinyint_test' at row 1
mysql> insert into test1(int_test) values(2147483647);
Query OK, 1 row affected (0.05 sec)
mysql> insert into test1(int_test) values(2147483648);
ERROR 1264 (22003): Out of range value for column 'int_test' at row 1
结论:
TINYINT有符号型最大127
INT有符号型最大2147483647
===浮点数类型测试:float
shell
1 创建一个表
mysql> create table test4(float_test float(5,2)); //一共5位,小数占2位
Query OK, 0 rows affected (0.00 sec)
2查询表结构
mysql> desc test4;
+------------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+------------+------+-----+---------+-------+
| float_test | float(5,2) | YES | | NULL | |
+------------+------------+------+-----+---------+-------+
1 row in set (0.00 sec)
3插入合法数据,非法数据
mysql> insert into test4 values (10.2), (70.243), (70.246);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
4查询表内容
mysql> select * from test4;
+------------+
| float_test |
+------------+
| 10.20 |
| 70.24 |
| 70.25 |
+------------+
3 rows in set (0.00 sec)
5插入非法数据
mysql> insert into test4 values (1111.2);
ERROR 1264 (22003): Out of range value for column 'float_test' at row 1
===时间和日期类型测试:year、date、time、datetime、timestamp
1 创建一个表
mysql> create table test_time(
d date,
t time,
dt datetime
);
Query OK, 0 rows affected (0.03 sec)
2查看表结构
mysql> desc test_time;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| d | date | YES | | NULL | |
| t | time | YES | | NULL | |
| dt | datetime | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
3 rows in set (0.01 sec)
3插入时间
mysql> insert into test_time values(now(),now(),now());
Query OK, 1 row affected, 1 warning (0.02 sec)
4查看表内容
mysql> select * from test_time;
+------------+----------+---------------------+
| d | t | dt |
+------------+----------+---------------------+
| 2016-12-18 | 00:06:10 | 2013-12-18 00:06:10 |
+------------+----------+---------------------+
1 row in set (0.00 sec)
===字符串类型测试:CHAR、VARCHAR
1创建表
mysql> create table vc (
v varchar(4),
c char(4)
);
Query OK, 0 rows affected (0.03 sec)
2 查看表结构
mysql> desc vc;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| v | varchar(4) | YES | | NULL | |
| c | char(4) | YES | | NULL | |
+-------+------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
3插入数据
mysql> insert into vc values('a','a');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> insert into vc values('ab ','ab ');
Query OK, 1 row affected, 1 warning (0.00 sec)
4查询表内容
mysql> select * from vc;
+------+------+
| v | c |
+------+------+
| a | a |
| ab | ab |
+------+------+
1 row in set (0.00 sec)
5调动函数 length(v) 统计长度的函数
mysql> select length(v),length(c) from vc;
+-----------+-----------+
| length(v) | length(c) |
+-----------+-----------+
| 1 | 1|
| 4 | 2 |
+-----------+-----------+
1 row in set (0.00 sec)
mysql> select concat(v,'='), concat(c,'=') from vc; //在后面加字符'=',看的更清楚
+---------------+---------------+
| concat(v,'=') | concat(c,'=') |
+---------------+---------------+
| a= | a= |
| ab = | ab= |
+---------------+---------------+
1 row in set (0.00 sec)
在检索的时候,CHAR列删除了尾部的空格,而VARCHAR则保留这些空格
===枚举类型、集合类型:ENUM类型,SET测试
作用
字段的值只能在给定范围中选择
常见的是单选按钮和复选框
enum 单选 只能在给定的范围内选一个值,如性别 sex 男male/女female
set 多选 在给定的范围内可以选择一个或一个以上的值(爱好1,爱好2,爱好3...)
目标

表school.student3
姓名 name varchar(50)
性别 sex enum('m','f')
爱好 hobby set('music','book','game','disc')
示例
1 创建表
mysql> use school
mysql> create table student3(
name varchar(50),
sex enum('m','f'),
hobby set('music','book','game','disc')
);
Query OK, 0 rows affected (0.31 sec)
2查看表结构
mysql> desc student3;
+-------+-----------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-----------------------------------+------+-----+---------+-------+
| name | varchar(50) | YES | | NULL | |
| sex | enum('m','f') | YES | | NULL | |
| hobby | set('music','book','game','disc') | YES | | NULL | |
+-------+-----------------------------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> show create table student3\G
*************************** 1. row ***************************
Table: student3
Create Table: CREATE TABLE `student3` (
`name` varchar(50) default NULL,
`sex` enum('m','f') default NULL,
`hobby` set('music','book','game','disc') default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
========================================================
3插入数据
mysql> insert into student3 values ('tom','m','book,game');
Query OK, 1 row affected (0.00 sec)
4查询数据
mysql> select * from student3;
+------+------+-----------+
| name | sex | hobby |
+------+------+-----------+
| tom | boy | book,game |
+------+------+-----------+
1 row in set (0.00 sec)
5插入非法数据
mysql> insert into student3 values ('jack','m','film');
ERROR 1265 (01000): Data truncated for column 'hobby' at row 1
超出范围
3.3 DDL2(表)
前言
在了解的数据类型后,下面我们就完整的学习,一张表该如何管理。
通过什么类型存储什么样的数据呢?
表的创建之后,后期该如何管理呢?
分类
MySQL表操作 DDL
目的
表是数据库存储数据的基本单位,由若干个字段组成,主要用来存储数据记录。表的操作
包括创建表、查看表、修改表和删除表。
这些操作都是数据库管理中最基本,也是最重要的操作。本节内容包括:
命令汇总
创建表 create table
查看表结构 desc table, show create table
表完整性约束
修改表 alter table
复制表 create table ...
删除表 drop table
表school.student1示例
1.创建表
mysql> CREATE DATABASE school; //创建数据库school
mysql> use school; //使用库
mysql> create table student1(
id int,
name varchar(50),
sex enum('m','f'),
age int
);
Query OK, 0 rows affected (0.03 sec)
2.查看所有表
mysql> show tables; //查看表(当前所在库)
+------------------+
| Tables_in_school |
+------------------+
| student1 |
+------------------+
1 row in set (0.00 sec)
3.查看表内容
mysql> select * from student1; //查询表中所有字段的值
Empty set (0.00 sec)
mysql> select id,name,sex,age from student1; //查询表中所有字段的值
Empty set (0.00 sec)
mysql> select name,age from student1; //查询表中指定字段的值
Empty set (0.00 sec)
4.查看表结构
mysql> desc student1;
5.表中插入内容
mysql>insert into student values
(1,'zhangsan','m',33) ,
(2,'lisi','f',20) ,
(1,'wangwu','m',40) ,
6.查询表的内容
mysql> select * from student;
3.4 完整性约束扩展
目的
由于生活中需要避免重名的情况,所以数据库中使用完整性约束来限定此类要求。
用于保证数据的完整性和一致性
约束类型
PRIMARY KEY (PK)
标识该字段为该表的主键,可以唯一的标识记录,不可以为空 UNIQUE + NOT NULL
员工信息表
FOREIGN KEY (FK)
标识该字段为该表的外键,实现表与表(父表主键/子表1外键/子表2外键)之间的关联
员工工资表
UNIQUE KEY (UK)
标识该字段的值是唯一的,可以为空,一个表中可以有多个UNIQUE KEY
AUTO_INCREMENT
标识该字段的值自动增长(整数类型,而且为主键)
DEFAULT
为该字段设置默认值
字段是否有默认值,缺省的默认值是NULL,如果插入记录时不给字段赋值,此字段使用默认值
NOT NULL
标识该字段不能为空
是否允许为空,默认NULL,可设置NOT NULL,字段不允许为空,必须赋值
UNSIGNED
无符号,正数
ZEROFILL
使用0填充,例如0000001
约束类型测试
===默认值、空值:DEFAULT、NOT NULL
目的:
1 某列设置为"不允许为空",请思考可否不插入数值。
2 某列设置默认值,并不输入数值,请思考该列是否会显示默认值。
1创建表
mysql> create table student.student4(
id int not null,
name varchar(50) not null,
sex enum ('m','f') default 'm' not null,
age int unsigned default 18 not null,
hobby set('music','disc','dance','book') default 'book,dance'
);
Query OK, 0 rows affected (0.01 sec)
2 查看表结构
MariaDB [student]> desc student4;
+-------+------------------------------------+------+-----+------------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------------------------+------+-----+------------+-------+
| id | int(11) | NO | | NULL | |
| name | varchar(50) | NO | | NULL | |
| sex | enum('m','f') | NO | | m | |
| age | int(10) unsigned | NO | | 18 | |
| hobby | set('music','disc','dance','book') | YES | | dance,book | |
+-------+------------------------------------+------+-----+------------+-------+
5 rows in set (0.00 sec)
3 插入数据
mysql> insert into student4 values(1,'jack','m',20,'book');
Query OK, 1 row affected (0.00 sec)
mysql> select * from student4;
mysql> insert into student4(id,name) values(2,'robin');
Query OK, 1 row affected (0.00 sec)
mysql> select * from student4;
4插入非法数据
随便找一列,插入空值
mysql> insert into student4 values(3,NULL,'m',40,'book');
ERROR 1048 (23000): Column 'name' cannot be null
注意观察输出错误的结果,理解默认值和空值的含义。NULL函数是空值的意思。
===设置唯一约束 UNIQUE
目的
1 unique唯一的特性。
2 unique是可以为空的。
为部门创建一张员工信息表
1 创建表 表company.department1
mysql> CREATE TABLE company.department1 (dept_id INT,
dept_name VARCHAR(30) UNIQUE,
comment VARCHAR(50)
);
2查看表结构 观察UNIQUE的显示位置
MariaDB [(none)]> desc company.department1;
+-----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| dept_id | int(11) | YES | | NULL | |
| dept_name | varchar(30) | YES | UNI | NULL | |
| comment | varchar(50) | YES | | NULL | |
+-----------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
3插入数据
insert into department1 values (1,'zhangsan','yyy');
insert into department1 values (1,NULL,'yyy');
非法数据
insert into department1 values (1,'zhangsan','yyy');
ERROR 1062 (23000): Duplicate entry 'zhangsan' for key 'dept_name'
===设置主键约束 PRIMARY KEY
目的
1.primary key 字段的值是不允许重复,且不允许NULL(UNIQUE + NOT NULL)
2.单列做主键
3.多列做主键(复合主键)
1创建表
表school.student6 方法一
mysql> create table student6(
id int primary key not null auto_increment,
name varchar(50) not null,
sex enum('male','female') not null default 'male',
age int not null default 18
);
Query OK, 0 rows affected (0.00 sec)
2查询表结构
desc student6;
+-------+-----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-----------------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(50) | NO | | NULL | |
| sex | enum('male','female') | NO | | male | |
| age | int(11) | NO | | 18 | |
+-------+-----------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
3插入数据
mysql> insert into student6 values (1,'alice','female',22);
mysql> insert into student6(name,sex,age) values
('jack','male',19),
('tom','male',23);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
4查询表内容
mysql> select * from student6;
+----+-------+------+-----+
| id | name | sex | age |
+----+-------+------+-----+
| 1 | alice | female | 22 |
| 2 | jack | male | 19 |
| 3 | tom | male | 23 |
+----+-------+------+-----+
3 rows in set (0.00 sec)
5 插入非法数据
MariaDB [company]> insert into student6(name,sex,age) values (3,'jack','male',19);
ERROR 1136 (21S01): Column count doesn't match value count at row 1
6 主键设置了自动增长,再次尝试插入数据。成功(注意不要插入主键)
3.5 DDL3(修改)课下作业
分类
修改表名
ALTER TABLE 表名
RENAME 新表名;
增加字段
ALTER TABLE 表名
ADD 字段名 数据类型 [完整性约束条件...],
ADD 字段名 数据类型 [完整性约束条件...];
追加
ALTER TABLE 表名
ADD 字段名 数据类型 [完整性约束条件...] FIRST;
首列
ALTER TABLE 表名
ADD 字段名 数据类型 [完整性约束条件...] AFTER 字段名;
中间
删除字段
sql
ALTER TABLE 表名
DROP 字段名;
修改字段
sql
ALTER TABLE 表名
MODIFY 字段名 数据类型 [完整性约束条件...];
ALTER TABLE 表名
CHANGE 旧字段名 新字段名 旧数据类型 [完整性约束条件...];
ALTER TABLE 表名
CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件...];
示例
sql
1.修改表名
ALTER TABLE t1 RENAME t2;
2. 添加字段
mysql> create table student10 (id int);
mysql> alter table student10
-> add name varchar(20) not null,
-> add age int not null default 22;
mysql> alter table student10
-> add stu_num int not null after name; //添加name字段之后
mysql> alter table student10
-> add sex enum('male','female') default 'male' first; //添加到最前面
3. 删除字段
mysql> alter table student10
-> drop sex;
mysql> alter table service
-> drop mac;
4.删除主键[primary key auto_increment]
a. 删除自增约束
mysql> alter table student10 modify id int not null;
b. 删除主键
mysql> alter table student10
-> drop primary key;
5.1修改字段类型modify
mysql> alter table student10
-> modify age tinyint not null default 22; //注意保留原有的约束条件
mysql> alter table student10
-> modify id int not null primary key ; //修改字段类型、约束、主键
5. 2增加约束(针对已有的主键增加auto_increment)
mysql> alter table student10
modify id int not null
primary key
auto_increment; //错误,该字段已经是primary key
ERROR 1068 (42000): Multiple primary key defined
mysql> alter table student10
modify id int not null
???
auto_increment;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
6. 增加复合主键
mysql> alter table student10 add primary key(host_ip,port);
7. 增加主键
mysql> alter table student1
-> add primary key(id);
8. 增加主键和自动增长
mysql> alter table student1
-> modify id int not null primary key auto_increment;
9. 修改存储引擎
mysql> alter table service engine=innodb;
//engine=myisam|memory|....
innodb提供事物支持及主外键高级功能
MyISAM不支持事物处理,强调高性能。
memory仅内存
3.6 DDL4(复制删除)扩展
分类
- 复制表结构+记录 (key不会复制: 主键、外键和索引)
- 只复制表结构
- 复制表结构,包括Key
- 删除表
示例
1 .复制表结构+记录 (key不会复制: 主键、外键和索引)
sql
mysql> create table new_service
select * from service;
2.只复制表结构
sql
mysql> create table new1_service select * from service where 1=2; //条件为假,查不到任何记录
3.复制表结构,包括Key
sql
mysql> create table t4 like employees;
4.删除表
sql
DROP TABLE 表名;
mysql阶段csdn配套视频 https://edu.csdn.net/course/detail/40864