MySQL库的操作
创建数据库
其实在之前认识数据库时就已经创建过数据库了,这次我们需要更深入的了解创建数据库的语句。
语法:create database [if not exists] db_name [create_secification]
create database:这是一个关键字,表示创建数据库
db_name:表示创建的数据库的名称。
[if not exists] : 这是一个可选项,表示如果 db_name 这个数据库不存在就创建,存在就不创建。
[create_secification]:表示指定 db_name 的字符集和校验集
- 字符集:表示数据库使用什么语言
- 校验集:表示数据库校验使用什么语言
- 二者必须相同,否则会出错
我们先用带 if not exists 选项的命令创建两次相同名称的数据库。
发现创建相同名字的数据库时会出现一个warning。
接着我们可以创建一个带指定字符集的数据库。
create databases db_name charset=utf8;
或者指定校验集的数据库。
create database db_name collate utf8_general_ci;
当然,我们可以同时指定字符集和校验和。
create database db_name charset=utf8 collate utf8_general_ci;
上面的三种操作指定的字符集和校验集都是 utf8 ,而字符集和校验集必须相同,否则查询数据会出错。就好像汉语必须由学了汉语的人才能认识,采用某一字符集的数据库它的校验集也必须是对应的校验集。
字符集和校验规则
我们可以通过指令查看目前系统默认的字符集和校验集。
show variables like 'character_set_database'; ——查看字符集
show variables like 'collation_database'; ——查看校验集
而数据库支持很多字符集和校验和,可以自行查看;
show charset; ————查看数据库支持的字符集;
show collation;————查看数据库支持的校验集;
查看字符集
查看校验集
mysql中有各种字符集和校验集,如果创建数据库时没指定,一般采用系统默认的字符集和校验集,并且数据库中的表也会采用和数据库相同的字符集和校验集,需要注意。
验证不同校验规则的影响
我们创建两个数据库,分别采用 utf8_general_ci(不区分大小写) 和 utf8_bin(区分大小写) 两个不同的校验规则,然后看看校验规则对数据库的影响。
我们先在通过use test1 进入到test1数据库中,然后建立一个表,并插入数据。
create table person (name varchar(20));——建表
insert into person value ('a');——插入数据
然后通过 select * from person where name='a'; 来查询数据。
我们发现,数据库查询到了 name = ‘a' 和 name = 'A' 两个数据。
因为 select 是根据校验规则来查询数据的,因此从返回的结果可知,utf8_general_ci 是不区分大小写的。
然后通过 use test2; 进入test2数据库中,后面的操作跟上面一样。
通过查询 name = ’a' 的数据,我们发现test2中返回的值只有一个。
通过这个实验我们能够知道,不同校验和会影响到我们查询数据的准确性,所以在创建数据库的时候要注意采用的校验和规则。
查看数据库
show databases;
通过该命令可以直接查看有多少数据库。
当我们进入到一个数据库后,想看看自己是什么数据库,可以通过以下命令查看;
select database();
显示创建语句
show create database db_name;
- MySQL建议我们关键字采用大写,比如CREATE,不过不是必须的。
- 数据库的 `test1` 中的 `` 是为了防止数据库名字是关键字
- /**/中的语句表示如果 数据库版本大于4.01时,就采用 DEFAULT CHARACTER SET utf8mb3,而不是注释的意思。
修改数据库
ALTER DATABASE db_name [alter_spacification];
一般修改的都是数据库的字符集和校验集。
比如:执行 alter database test1 charset=gbk;
然后通过 show create database test1;
我们发现 /**/ 中的语句变了,说明字符集更改了。
数据库的删除
DROP DATABASE [IF EXISTS] db_name;
通过该语句可以删除对应的数据库。
- 删除数据库之后在mysql内部无法看到对应的数据库
- 对应的数据库的文件夹被删除,级联被删除,里面的数据表被删除
一般来说都不用随意删除数据库,即便删除也最好备份一下里面的文件。
库的备份
一般来说删除数据库的操作不可取,若是不想用库了,可以根据需要将库保存下来。
可以在bash处使用命令来备份数据库。
命令:mysqldump -P 3306 -u root -p xxxx(密码) -B db_name > xxx路径/ db_name.sql
- -P 指这个mysqld采用的是什么端口,默认是3306
- -u 后面表示是哪个用户
- -p 指用户的密码
- -B 如果在备份时没有带上-B选项,那么在复原时,需要先创建空数据库,使用该数据库后再使用source复原
- db_name :备份的数据库名称
- > : 表示将备份的数据重定向到某个文件
- 最后跟着文件的路径和文件名即可将数据库备份到这个文件中。
比如这里,我将test1数据库备份后,在目录下多出了 test1.sql 文件。
进入文件内部查看,可以发现,该文件里面保存的是数据库创建到备份的所有操作。
然后我们再通过source 命令来复原数据库。
复原命令: source xxx路径/文件明
这样就能够复原数据库,而复原数据库就是将备份的文件内部的操作一步步再现出来从而出复原数据库。
我们还可以只备份数据库中的表,比如这里test1中的person表。
和数据库备份的不同之处是备份表不用-B选项,然后需要带上备份的表的名称。
命令: mysqldump -P 3306 -u root -p 数据库名 表名 > xxx路径/xxx文件.sql
该文件下保存的就是表创建到备份的所有操作。
前面也说过没有带-B选项就需要在表中再source;
这里我在test3中重新source这个person表。
查看连接情况
show processlist;
该命令可以查看目前使用数据库的用户的详细情况,可以了解是否有非法用户登录数据库。
以上就是MySQL库的增删查改以及备份和复原的操作了。
MySQL表的操作
创建表
命令:create table table_name(
field1 typename,
field2 typename,
field3 typename
) charset 字符集 collate 校验和 engine 存储引擎;
- field:表示列名, 可以认为是类的成员变量名,不同field之间用 ',' 隔开,只是最后一行不需要 ','
- typename: 表示列名的属性,有各种属性,后面再去了解
- charset : 设定该表采用的字符集
- collate : 设定该表采用的校验和
- engine : 设定该表采用的存储引擎
- 后面三个可以不用设定,自动采用库的默认字符集、校验和和引擎。
comment 后面表示对这个列名的注释。
这里我显式的指定这个表采用的存储引擎是 MyIsam,我们可以进到mysql对应的文件夹中看看建表所创建的文件。
发现一共创建了三个文件。
然后创建新表,用InnoDB存储引擎。
发现只创建了一个文件
这说明不同存储引擎的存储方式也是不一样的。
查看表
命令: desc 表名;
Field:字段名称
Type:字段类型
Null:是否可以为空
Key:索引类型
Default:默认值
Extra:扩充
此外,我们还可以通过命令查看表创建时的细节命令。
命令:show create table 表名 \G
也可以通过命令查看数据库中所有表
命令:show tables;
修改表
修改表的名称
命令:alter table table_name rename to new_table_name;
插入新的属性
我们先向表中插入两个数据
命令:insert into 表明 values(xxxxxxx...);
然后我们给表添加新的属性。
命令:alter table table_name add name datatype [DEFAULT expr] [column datatype]...)
- DEFAULT expr :新属性的默认值
然后我们再查看表。
我们发现在新增属性之前插入的两条数据,对应的新属性的位置都是NULL。
而且我们可以指定新属性增加的位置。
比如这里我将新增属性 name 设定在 id 之后,之后查看时发现name位置确实在id之后。
我们也可以在新增属性后添加comment,来说明该属性的作用。
而我们添加的属性在表的创建细节处也可以看到。
修改属性
如果我们发现属性的类型长度不够时,我们可以修改属性的长度。
命令:alter table table_name modify 属性名 datatype
删除列属性
命令:alter table table_name drop 属性名;
一般我们不会删除列属性,如果删除就需要保证这个属性不需要了,因为删除列属性后,这一列的数据也会删除。
删除表
命令:drop table_name tbl_name;
一般我们不轻易删除或修改表,防止上层出现bug。
总结
目前我们学习了数据库的增删查改和表的增删查改,也明白了数据库的删除和修改都是需要重点照顾的(防止出现bug),了解了DDL语句后,接下来还有其他语句需要学习,我们拭目以待。