剑指offer:一年又二天 |
---|
创建、选择、查看、修改、删除与备份。
CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [,
create_specification] ...]
create_specification:
[DEFAULT] CHARACTER SET charset_name
[DEFAULT] COLLATE collation_name
说明:
mysql> show databases; --- 查看所有数据库,这些数据库都是默认的,我们不用管也不要动它们
+---------------------+
| Database |
+---------------------+
| information_schema |
| README_TO_RECOVER_A |
| mysql |
| performance_schema |
| sys |
+---------------------+
5 rows in set (0.00 sec)
mysql> create database db1 --- 创建数据库db1,字符集和校验规则可以不写使用默认。
-> charset=utf8
-> collate=utf8_bin;
Query OK, 1 row affected (0.00 sec)
mysql> show databases; --- 查看所有数据库
+---------------------+
| Database |
+---------------------+
| information_schema |
| README_TO_RECOVER_A |
| db1 | ---
| mysql |
| performance_schema |
| sys |
+---------------------+
6 rows in set (0.00 sec)
show variables like 'character_set_database';
show variables like 'collation_database';
show charset;
字符集主要是控制用什么语言。比如utf8就可以使用中文。
show collation;
不区分大小写
create database test1 collate utf8_general_ci; --- 创建一个数据库,校验规则使用utf8_ general_ ci[不区分大小写]
区分大小写
create database test2 collate utf8_general_ci; --- 创建一个数据库,校验规则使用utf8_ bin[区分大小写]
建表插入数据
mysql> create table stu(name char); --- 在数据库test1中建表stu,插入数据(test2同操作)
Query OK, 0 rows affected (0.04 sec)
mysql> insert into stu values('a'), ('b'), ('A'), ('B');
Query OK, 4 rows affected (0.01 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> select * from stu; --- 插入情况
+------+
| name |
+------+
| a |
| b |
| A |
| B |
+------+
4 rows in set (0.00 sec)
mysql> use test1; --- 选择数据库test1
Database changed
mysql> select * from stu where name = 'a'; --- 查询名字为a的学生
+------+
| name |
+------+
| a |
| A |
+------+
2 rows in set (0.00 sec)
mysql> use test1; --- 选择数据库test2
Database changed
mysql> select * from stu where name = 'a'; --- 查询名字为a的学生
+------+
| name |
+------+
| a |
+------+
1 rows in set (0.00 sec)
mysql> use test1; --- 选择数据库test1
Database changed
mysql> select * from stu order by name; --- 按照名字排序
+------+
| name |
+------+
| a |
| A |
| b |
| B |
+------+
4 rows in set (0.00 sec)
mysql> use test1; --- 选择数据库test2
Database changed
mysql> select * from stu order by name; --- 按照名字排序
+------+
| name |
+------+
| A |
| B |
| a |
| b |
+------+
4 rows in set (0.00 sec)
show databases;
select database();
show create database 数据库名;
mysql> show create database db1; --- 显示创建语法
+----------+-------------------------------------------------------------------------------+
| Database | Create Database |
+----------+-------------------------------------------------------------------------------+
| db1 | CREATE DATABASE `db1` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_bin */ |
+----------+-------------------------------------------------------------------------------+
1 row in set (0.01 sec)
mysql> show create database db1 \G --- 更加简洁的格式显示
*************************** 1. row ***************************
Database: db1
Create Database: CREATE DATABASE `db1` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_bin */
1 row in set (0.00 sec)
MySQL 建议我们关键字使用大写,但是不是必须的,在显示时服务器(mysqld)会将我们的语法进行规范处理。
数据库名字的反引号``,是为了防止使用的数据库名刚好是关键字。
/*!40100 default… */ 这个不是注释,表示当前mysql版本大于4.01版本,就执行这句话。
mysql> select database(); --- 查看现在所操作的数据库
+------------+
| database() |
+------------+
| NULL | --- 还没有选择数据库
+------------+
1 row in set (0.00 sec)
mysql> use db1; --- 选择数据库db1
Database changed
mysql> select database();
+------------+
| database() |
+------------+
| db1 | --- 现在在操作数据库db1
+------------+
1 row in set (0.00 sec)
ALTER DATABASE db_name
[alter_spacification [,alter_spacification]...]
alter_spacification:
[DEFAULT] CHARACTER SET charset_name
[DEFAULT] COLLATE collation_name
mysql> show create database db1 \G --- 字符集为 utf8 ,校验规则为 utf8_bin
*************************** 1. row ***************************
Database: db1
Create Database: CREATE DATABASE `db1` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_bin */
1 row in set (0.00 sec)
mysql> alter database db1 charset=gbk; --- 修改字符集为gbk
Query OK, 1 row affected (0.00 sec)
mysql> show create database db1 \G --- 修改是全部覆盖式写入,我们只指明字符集,没有指明校验规则,就改为默认
*************************** 1. row ***************************
Database: db1
Create Database: CREATE DATABASE `db1` /*!40100 DEFAULT CHARACTER SET gbk */
1 row in set (0.00 sec)
mysql并没有提供自带的修改数据库名的操作,一种常见的做法是创建一个新的数据库,然后将旧数据库中的表结构和数据逐一导入到新数据库中,最后删除旧数据库。这样可以达到“修改”数据库名的效果。
DROP DATABASE [IF EXISTS] db_ name;
执行删除之后的结果:
(慎用)
mysql> create database test; --- 创建一个数据库test
Query OK, 1 row affected (0.00 sec)
mysql> show databases like 'test'; --- 查看数据库,like:在所有结果中匹配名为test的数据库(用一下,后面会讲)
+-----------------+
| Database (test) |
+-----------------+
| test | --- 找到一个
+-----------------+
1 row in set (0.00 sec)
mysql> drop database test; --- 删除数据库 test
Query OK, 0 rows affected (0.00 sec)
mysql> show databases like 'test'; --- 再找,没找到
Empty set (0.00 sec)
[root@VM-4-11-centos ~]# mysqldump -P3306 -u root -p 密码 -B 数据库名 > 数据库备份存储的文件路径
-P3306:端口号
[root@VM-4-11-centos ~]# mysqldump -P3306 -u root -p -B db1 > ./db1_code.sql
-- 提示输入mysql中root账号的密码
这时,可以打开看看 db1_code.sql 文件里的内容,其实把我们整个创建数据库,建表,导入数据的语句都装载这个文件中。
mysql> source D:/mysql-5.7.22/mytest.sql;
[root@VM-4-11-centos ~]# mysqldump -u root -p 数据库名 表名1 表名2 > D:/mytest.sql
[root@VM-4-11-centos ~]# mysqldump -u root -p -B 数据库名1 数据库名2 ... > 数据库存放路径
如果备份一个数据库时,没有带上-B参数, 在恢复数据库时,需要先创建空数据库,然后使用数据库,再使用source来还原。
语法
show processlist;
mysql> show processlist;
+----+--------+-----------+-------+---------+------+----------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+--------+-----------+-------+---------+------+----------+------------------+
| 3 | root | localhost | db1 | Sleep | 3710 | | NULL |
| 5 | kz1111 | localhost | db1_1 | Query | 0 | starting | show processlist |
+----+--------+-----------+-------+---------+------+----------+------------------+
2 rows in set (0.00 sec)
可以告诉我们当前有哪些用户连接到我们的MySQL,如果查出某个用户不是你正常登陆的,很有可能你的数据库被人入侵了。可以用这个指令来查看数据库连接情况。
数据库不支持重命名,如果真的需要改名字,就把数据库进行备份,然后创建新库并导入即可。(一般用不到)