目录
1. 创建数据库
创建数据库的SQL如下:
create database [if not exists] db_name [[default] charset=charset_name] [[default] collate=collation_name]
- [ ]中代表的是可选项,可不加。
- CHARSET用于指定数据库所采用的编码格式。
- COLLATE用于指定数据库所采用的校验规则。
需要注意: 如果创建数据库时未指明数据库的编码格式或校验规则,则默认使用MySQL配置文件中对应的编码格式或校验规则。
采用默认的编码格式和校验规则创建数据库:
如果没有对MySQL的配置文件进行过修改,则默认的编码格式是utf8,默认的校验规则是utf8_general_ci。
指定utf8编码格式创建数据库:
SQL中的charset=utf8,也可以写成character set=utf8或character set utf8。
指定utf8编码格式和utf8_general_ci校验规则创建数据库:
注意: SQL中的collate=utf8_general_ci,也可以写成collate utf8_general_ci。
2. 字符集和校验规则
2.1 默认的字符集和校验规则
查看系统默认的字符集:通过查看MySQL系统变量variables中的character_set_database,可以得知系统默认的字符集。输入:
show variables like 'character_set_database';
如果是在指定数据库下使用该SQL,则查看的是该数据库对应的字符集。
查看系统默认的字符集校验规则:通过查看MySQL系统变量variables中的collation_database,可以得知系统默认的字符集校验规则。输入:
show variables like 'collation_database';
查看数据库支持的字符集:输入show charset
字符集主要是控制用什么语言,比如utf8就可以使用中文。
2.2 支持的字符集校验规则
查看数据库支持的字符集校验规则:输入show collation
2.3 校验规则对数据库的影响
字符集编码格式和字符集校验规则的区别:
- 字符集编码格式指的是在存储数据时各个字符的底层编码,用于指定数据的存储格式。
- 字符集校验规则是在字符集内用于比较字符的一套规则,用于对数据进行比对。
比如我们存储数据的时候是按照utf8的格式进行存储的,那么将来在对数据做比对时也必须按照utf8的格式进行比对,因为“存数据”和“取数据”的方式必须保持一致。
注意: 在对数据库当中的数据进行增删查改时,不可避免的需要进行数据的比对,因为在对数据做增删查改之前,都需要先通过比对的方式找到目标数据。
校验规则对数据库的影响:
现在知道了,为了保证读取的数据和存储的数据是一致的,因此字符集编码格式和校验规则必须是对应的。但实际同一中字符集编码格式一般会有多种可选择的校验规则,比如utf8编码格式的校验规则有utf8_general_ci、utf8_bin、utf8_unicode_ci等校验规则。
使用不同的校验规则操作数据库中的数据可能会得到不同的结果,比如utf8_general_ci校验规则在比对数据时是不区分大小写的,而utf8_bin校验规则在对比数据时则是区分大小写的。
操作数据库时采用utf8_general_ci校验规则:
创建数据库时指定数据库的校验规则为utf8_general_ci,数据库的编码格式默认为utf8:
在该数据库中创建一个简单的person表,由于创建未指定表的编码格式和校验规则,因此person表将继承当前数据库的编码格式和校验规则:
这时向表中插入一些数据:
通过select语句可以查看插入表中的数据:
这时指定查看表中name='aaa'的记录时会将aaa和AAA一并筛选出来,根本原因就是utf8_general_ci校验规则在进行数据比对时是不区分大小写的。如下:
操作数据库时采用utf8_bin校验规则:
创建数据库时指定数据库的校验规则为utf8_bin,数据库的编码格式默认为utf8:
重复之前的操作:
插入数据:
查看:
这时指定查看表中name='alice'的记录时只会将alice筛选出来,根本原因就是utf8_bin校验规则在进行数据比对时是区分大小写的。
3. 库的查看,修改,删除
3.1 查看数据库
输入show database可以查看系统中所有的数据库:
输入show create database 数据库名可以查看对应数据库的创建语句:
- MySQL建议SQL中的关键字使用大写,但不是必须的。
- 数据库的名字加上反引号,是为了防止使用的数据库名与关键字冲突。
/*!40100 DEFAULT CHARACTER SET utf8 */
不是注释,它表示当前MySQL版本如果大于4.10,则执行后面的SQL语句。
3.2 修改数据库
修改数据库的SQL如下:
alter database db_name [[default] charset=character_name] [[default] collate=collation_name];
- 对数据库的修改主要指的是修改数据库的字符集或校验规则。
比如将数据库的字符集改为gbk,并将数据库的校验规则改为gbk_bin。如下:
3.3 删除数据库
删除数据库的SQL如下:
drop database [if exists] db_name;
删除数据库后该数据库对应的文件夹就被删除了:
并且删除数据库后,该数据库下的所有表也都会被级联删除,因此不要随意删除数据库。
4. 库的备份和恢复
4.1 备份数据库
使用如下命令即可对指定数据库进行备份:
mysqldump -P 端口号 -u 用户名 -p 密码 -B 数据库名1 数据库名2 ... > 数据库备份存储的文件路径
为了演示数据库备份,下面我们创建一个test3数据库,并在该数据库中创建两个表。如下:
在两个表中分别插入两条记录:
这时在命令行中执行如下命令即可将该数据库进行备份,并指定将备份后产生的文件存放在当前目录下。如下:
打开back.sql文件即可看到,文件中的内容实际就是我们在该数据库中执行的各种SQL命令,包括创建数据库、创建表、插入数据等SQL语句。如下:
4.2 恢复数据库
使用如下命令即可对指定数据库进行恢复:
source 数据库备份存储的文件路径
为了演示数据库恢复,我们先将刚才创建的test3数据库删除。如下:
这时让MySQL服务器执行如下命令即可对数据库进行恢复。输入source /var/lib/mysql/back.sql
实际恢复数据库的时候就是按顺序执行数据库备份文件中的SQL语句,执行完毕后数据库也就恢复出来了。同时该数据库下的两张表,以及表当中的数据也都恢复出来了。
5. 查看连接情况
输入show processlist;即可查看当前连接MySQL的用户:
- Id列:一个标识,可以在MySQL中通过kill id杀死指定id的线程。
- User列:显示当前用户,如果不是root,这个命令就只显示你权限范围内的SQL语句。
- Host列:显示这个语句是从哪个IP的哪个端口上发出的,可用来追踪出问题语句的用户。
- db列:当前执行的命令是在哪一个数据库上,如果没有指定数据库,则该值为NULL。
- Command列:显示当前连接执行的命令,一般就是休眠(Sleep)、查询(Query)和连接(Connect)。
- Time列:表示该线程处于当前状态的时间,单位是秒。
- State列:显示使用当前连接的SQL语句的状态。
- Info列:一般记录的是线程执行的语句,默认只显示前100个字符,如果要看全部信息,需要使用show full processlist。
show processlist可以告诉我们当前有哪些用户连接到我们的MySQL,如果查出某个用户不是你正常登录的,那么很有可能你的数据库被人入侵了,以后如果发现自己的数据库比较慢时,可以用这个SQL来查看数据库连接情况。
6. 表的增删查改DDL
表操作至少会涉及如下两类SQL语句:
DDL(Data Definition Language)数据定义语言:比如建表、删表、该表、新增列、删除列等。DML(Data Manipulation Language)数据操作语言:比如插入记录、删除记录、修改记录等。
这里讲的是表的DDL操作,也就是操作表结构的SQL语句。
6.1 创建表
创建表的SQL如下:
create table [if not exists] table_name(
field1 datatype1 [comment '注释信息'],
field2 datatype2 [comment '注释信息'],
field3 datatype3 [comment '注释信息']
)[charset=charset_name] [collate=collation_name] [engine=engine_name];
- [ ]中代表的是可选项,可不加。
- field表示列名,datatype表示列的类型。
- charset用于指定表所采用的编码格式,如果没有指定则以所在数据库的编码格式为准。
- collate用于指定表所采用的校验规则,如果没有指定则以所在数据库的校验规则为准。
- engine用于指定表所采用的存储引擎。
- comment用于对指定列添加注释信息。
输入show engines;可以查看当前MySQL支持的存储引擎:
可以看到当前的MySQL默认使用的是InnoDB存储引擎,如果建表时没有指定使用哪种存储引擎,那么就会默认使用InnoDB存储引擎。
在创建表之前需要先选中一个数据库,然后在数据库中创建表,这里我们先创建一个数据库。如下:
数据库创建完毕后选中数据库,在该数据库中创建一个user表,并在建表时指定采用MyISAM存储引擎。如下:
注意:
- 采用不同的存储引擎,创建表时所产生的文件不一样。
- 采用InnoDB存储引擎建表,会产生对应的xxx.frm(表结构)和xxx.ibd(表数据+表索引)文件。
- 采用MyISAM存储引擎建表,会产生对应的xxx.frm(表结构)、xxx.MYD(表数据)和xxx.MYI(表索引)文件。
6.2 查看表
输入desc 表名可以查看表的结构:
- Field表示该字段的名字。
- Type表示该字段的类型。
- Null表示该字段是否允许为空。
- Key表示索引类型,比如主键索引为PRI。
- Default表示该字段的默认值。
- Extra表示该字段的额外信息说明。
6.3 修改表
修改表的SQL如下:
alter table table_name add 新增列名 新增列的属性;
alter table table_name modify 列名 修改后的列属性;
alter table table_name drop 列名;
alter table table_name rename [TO] 新表名;
alter table table_name change 列名 新列名 新列属性;
修改表的过程中可能会影响到表中的数据,为了演示这个过程,我们在修改表之前先在user表中插入两条数据:
6.3.1 新增列
在user表中新增一列用于保存用户的照片路径:
新增列SQL中的after表示将该列新增到哪一列之后,如果想要将新增的列放到第一列,可以将after及其之后的SQL换成not null first。
新增列后可以通过desc命令确认新增成功,这时再插入一条用户记录后查看表中信息:
可以看到在新增列之前插入表中的两条记录对应的path值为NULL,因此新增列后可能还需要对原来插入的记录进行修改。
6.3.2 修改列类型
将user表中password列的类型由char(30)改成char(50):
6.3.3 修改列名
将user表中password列的列名改成passwd:
6.3.4 修改表名
将user表的表名改成employee:
6.3.5 删除列
将employee表中的path列删除:
需要注意的是删除列后,该列对应的所有数据都没有了。
6.4 删除表
删除表的SQL如下:
drop [temporary] table [if exists] table_name;
- 在创建表语句中加上TEMPORARY关键字,那么服务器将创建出一个临时表,该表会在你与服务器的会话终止时自动消失。
- TEMPORARY表的名字可以与某个已有的永久表相同,当有TEMPORARY表存在时,对应的永久表会隐藏起来(即无法访问)。
- 为了避免重新连接后(TEMPORARY已经不存在),在未做检测的情况下调用DROP误删了对应永久表,因此在使用DROP删除临时表时需要带上TEMPORARY关键字。
这里演示一下直接删除(很多情况都不建议直接删除,可以先看一下删除语句和结果,然后看表的备份和恢复自己操作一下):
7. 表的备份和恢复
演示删除前,先把库备份一下,然后删除,然后演示恢复。
7.1 备份表
使用如下命令即可对指定表进行备份:
mysqldump -P 端口号 -u 用户名 -p 密码 数据库名 表名1 表名2 ... > 表备份存储的文件路径
比如用备份库的test3库演示:
再创建一个person表:
如果只想备份数据库中的student表和teacher表,这时就可以在命令行中执行如下命令,并指定将备份后产生的文件存放在当前目录下:
这时历史上与student和teacher表相关的SQL语句,就会被保存到备份文件当中:
7.2 恢复表
表恢复之前需要先选中一个数据库,表明需要将表恢复到哪一个数据库中,为了防止恢复出来的表与该数据库中已有的表的表名重复,一般在恢复表时会选择创建一个空的数据库,然后在该数据库中进行表的恢复。
在数据库中使用如下命令即可对指定表进行恢复:
source 表备份存储的文件路径
为了演示表恢复,直接test3数据库删除。如下:
这时创建一个空的数据库并在该数据库中执行如下命令即可对表进行恢复。如下:
当备份文件中的SQL语句执行完毕后,该数据库下就恢复出了student和teacher表,并且表当中的数据也都恢复出来了:
(数据和创建test3数据库插入的表一模一样)
本篇完。
下一篇是MySQL的数据类型。(穿越回来复习顺便贴个下篇链接):