目录
一. 库操作
1. 创建数据库
2. 字符集和校验规则
校验规则对数据库的影响
显示创建数据库时对应的命令
3. 修改数据库
4. 数据库删除
备份和恢复
还原
查看连接情况
二. 表操作
1. 创建表(定义实例化格式
2. 创建表案例 (实例化数据类型
3. 查看表
查看表的结构
查看表的创建信息:
4.修改表
1. 更改表的名字
2. 在user表新增一列,用于保存图片路径
3. 修改列中某一字段
4. 修改列名
5. 删除
删除表
删除某列
show | select
操作导图如下:
一. 库操作
1. 创建数据库
语法:
CREATE DATABASE [IF NOT EXISTS] db_name [create_specification] ,
[create_specification] ...
create_specification:
[DEFAULT] CHARACTER SET charset_name
[DEFAULT] COLLATE collation_name
说明:
- 大写的表示关键字
- []是可选项
CHARACTER SET
:指定数据库采用的字符集COLLATE
:指定数据库字符集的校验规则- 本质:在
/var/lib/mysql
下创建一个目录
举例:
理解 数据库 和 文件系统 的关联
创建数据库:本质就是在Linux环境下MySQL特定的路径(数据路径)var/lib/mysql 创建一个目录。
还有一种写法,如果当前没有这个数据库就创建,如果存在就不创建
create database if not exists d1;
- 创建名为 helloworld 的数据库,使用
utf8
字符集,并带校对规则
create database helloworld charset=utf8 collate utf8_general_ci;
下面将详细讲解
2. 字符集和校验规则
0. 字符集是什么?
创建数据库的时候,有两个编码集
- 数据库编码集 – 数据库未来存储数据--写入规则
- 数据库校验集 – 支持数据库进行字段比较使用的编码,本质也是一种读取数据库中数据采用的编码格式--读取原则
数据库无论对数据做任何操作,都必须保证操作和编码必须是编码一致的
- 存数据的时候用什么编码,取的时候就得用什么编码去取
1. 查看系统默认字符集以及校验规则
show variables like 'character_set_database';
show variables like 'collation_database';
博主在安装MySQl时就已经在配置文件中把mysql服务段对应的编码设置成了 utf8。在专栏中的第一篇安装教程中有讲~utf8
就可以使用中文
2. 查看数据库支持的字符集
show charset;
数据库写的时候采用什么编码
3. 查看数据库支持的字符集校验规则
show collation;
未来数据已经有了,想怎么读,读的时候怎么知道这是我想要的,所以对数据做特定的解释,然后才做能对比。
现在也知道创建数据库了,也知道编码和校验规则了。两个合并下面就可以创建出指定编码和校验规则的数据库了。
- 就近原则:下面可以看到创建数据库没有指定,系统就用默认的。
如下就使用 gbk,不适用 utf8 了
create database d3 charset=gbk collate gbk_chinese_ci;
数据库配置文件中配置这个编码有什么意义呢?
- 因为曾经在配置文件中设置过,所以会影响创建数据库时默认编码和校验规则,编码和校验规则是匹配的。
那问题又来了,今天为什么又要设置数据库编码呢?
- 因为数据库里是需要存表的,在数据库里可能要建各种各样的表,有存各种各样数据的需求,这些表采用编码和校验规则是继承至它所在的数据库。
- 数据库默认依赖于mysqld,表依赖于数据库。这样就可以理解为什么要做这样的配置。
校验规则对数据库的影响
不区分大小写--test1
创建一个数据库,校验规则使用utf8_general_ci
(不区分大小写)
create database test1 collate utf8_general_ci;
use test1;
create table person(name varchar(20));
insert into person values('a');
insert into person values('A');
insert into person values('b');
insert into person values('B');
打印
实验
区分大小写--test2
创建一个数据库,校验规则使用utf8_bin
(区分大小写)
create database test2 collate utf8_bin;
use test2;
create table person(name varchar(20));
insert into person values('a');
insert into person values('A');
insert into person values('b');
insert into person values('B');
打印
实验
通过以上实验,我们可以感受到编码规则对数据处理时的影响了
显示创建数据库时对应的命令
show create database db_name;
示例
说明:
- MySQL 建议我们关键字使用大写,但是不是必须的。
- 数据库名字的反引号``,是为了防止使用的数据库名刚好是关键字
- /*!40100 default… */ 这个不是注释,表示当前使用mysql版本大于4.01版本,就执行这句话
3. 修改数据库
语法:
ALTER DATABASE db_name
[alter_spacification] ,[alter_spacification]...
alter_spacification:
[DEFAULT] CHARACTER SET charset_name
[DEFAULT] COLLATE collation_name
- 对数据库的修改主要是修改数据库的字符集,校验规则
示例:
只要指明编码是什么,校验码就会自动去匹配。
4. 数据库删除
语法:
DROP DATABASE [IF EXISTS] db_name;
本质:删除目录
- 数据库内部看不到对应的数据库
- 对应的数据库文件夹被删除,级联删除,里面的数据表全部被删
- 注意:不要随意删除数据库
备份和恢复
1. 备份
语法:命令行中执行
mysqldump -P 3306 -u root -p 密码 -B 数据库名 > 数据库备份存储的文件路径
-B 数据库名
示例:
把test1.sql打开后,可以看到里面是大部分内容我们就见过的,如craete database test1、use test1还有后面插入数据等等。
其实它备份的时候,是把在这个数据库里做的有效操作全备份起来了。
所以说备份的不是只有数据,还把历史上所有有效操作全部备份起来了。
还原
mysql> source ~/repository/Study_Test/MySQL/SnowK.sql;
两个注意点:
- 不用/home/root ,直接/root
- root 下的文件只有 root 下连接 mysql 才有权限恢复
注意事项
如果备份的不是整个数据库,而是其中的一张表,怎么做?
mysqldump -u root -p 数据库名 表名1 表名2 > D:/mytest.sql
同时备份多个数据库
mysqldump -u root -p -B 数据库名1 数据库名2 ... > 数据库存放路径
- 如果备份一个数据库时,没有带上
-B
参数, 在恢复数据库时,需要先创建空数据库,然后使用数据库,再使用source来还原 - 备份时带了 -B 这个备份文件其实是带了create databdase test1,use test1
- 如果没有带 -B 备份的时候只会把这个数据库里面所有表信息数据信息全部备份出来,如果需要还原需要自己先把数据库建好。
查看连接情况
语法:
show processlist;
示例:
- 可以告诉我们当前有哪些用户连接到我们的MySQL
- 如果查出某个用户不是你正常登陆的,很有可能你的数据库被人入侵了
- 以后发现自己数据库比较慢时,可以用这个指令来查看数据库连接情况
二. 表操作
1. 创建表(定义实例化格式
语法:
CREATE table table_name (
field1 datatype,
field2 datatype,
field3 datatype
) character set 字符集 collate 校验规则 engine 存储引擎;
说明:
field
:表示列名datatype
:表示列的类型character set
:字符集,如果没有指定字符集,则以所在数据库的字符集为准collate
:校验规则,如果没有指定校验规则,则以所在数据库的校验规则为准(就近原则
2. 创建表案例 (实例化数据类型
说明:不同的存储引擎,创建表的文件不一样
- 存储引擎是MyISAM,在数据目中有三个不同的文件
-
Users.frm
:表结构Users.MYD
:表数据Users.MYI
:表索引
- 存储引擎是InnoDB,在数据目中有两个不同的文件
-
Users.frm
:表结构Users.ibd
:表数据&表索引
下面先对表进行插入内容 (插入数据
insert into user values (1,'张三','12345','2021-3-22');
这样就形成一张像样的表啦~
3. 查看表
语法:
desc db_name;
查看表的结构
MySQL会记录下来用户的所有操作痕迹的,包括建表、删表等行为都会被记录下来。
查看表的创建信息:
4.修改表
在项目实际开发中,经常修改某个表的结构,比如字段名字,字段大小,字段类型,表的字符集类型,表的存储引擎等等。
我们还有需求,添加字段,删除字段。这时我们就需要修改表。 不会存在查找 !
ALTER TABLE tablename ADD (column datatype [DEFAULT expr][,column
datatype]...);
ALTER TABLE tablename MODIfy (column datatype [DEFAULT expr][,column
datatype]...);
ALTER TABLE tablename DROP (column);
1. 更改表的名字
2. 在user表新增一列,用于保存图片路径
alter table user add image_path varchar(128) comment '用户头像路径' after birthday;
- add 后面跟的是你想新增那一列,列的类型是什么,描述是什么
- after 表示你想指定新增到那一列的后面
3. 修改列中某一字段
alter table user modify name varchar(60);
- modify 后面跟你要改谁,后面在跟新的属性。
- 我们发现name字段大小确实已经变成60了,也没有影响该字段原有数据。
- 但是更为重要的是,如果刚才改字段属性就是只改了字段大小,你会发现以前name后面的comment没有了。
- 说明并不是定向你要改那个字段就给你改那个字段,它是把新的属性直接覆盖把原来创建name字段,属性等全部覆盖掉。
- 换句话说如果未来你想改某一列,你肯定要把这一列曾经的所有属性全部复制下来,在代码中对要改的字段修改,在重新提交一下。
更改前
更改后
4. 修改列名
将name列修改为xingming
alter table user change name xingming varchar(60) DEFAULT NULL; # 新字段需要完整定义
说明:
- change后面跟着旧列名 ,再跟新列名和属性。
- 列名称要改不仅仅需要提供新列名称,这个列的相关属性也需要。相当于把这一列重新设置。
- 因为修改是覆盖实现的
5. 删除
删除表
语法:
DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ...
drop table user;
说明:
- 像create,drop,show tables 都是在做表操作
- 但是select并不是操作表结构,操作的是表的内容。
前面学过SQL分类有:DDL、DML、DCL。 - 像我们目前学到的库的操和表的操作,属于那种类型的SQL呢?DDL 数据定义语言。
删除某列
alter table user drop password;
- drop后面跟着要删除那一列
- 注意:删除字段一定要小心,删除字段及其对应的列数据都没了,所有一定要保证这个数据是真的不要了。
show | select
- show 查 所有
- select 显示(当前/某个 的)内容
show databases;#查库
use#进入某库
select database();#显示当前库
show tables;#查当前库的所有表
insert#实例化插入表内容
select * from xxx;#显示某表
后续讲解 思路:将 数据库 和 linux 系统 连接起来讲解~