MySQL创建数据库(CREATE DATABASE语句)
数据库可以看作是一个专门存储数据对象的容器,这里的数据对象包括表、视图、触发器、存储过程等,其中表是最基本的数据对象。在 MySQL 数据库中创建数据对象之前,先要创建好数据库。
在 MySQL 中,可以使用 CREATE DATABASE 语句创建数据库,语法格式如下:
CREATE DATABASE [IF NOT EXISTS] <数据库名>
[[DEFAULT] CHARACTER SET <字符集名>] [[DEFAULT] COLLATE <校对规则名>];
[ ]中的内容是可选的。语法说明如下:
<数据库名>:创建数据库的名称。MySQL 的数据存储区将以目录方式表示 MySQL 数据库,因此数据库名称必须符合操作系统的文件夹命名规则,注意在 MySQL 中不区分大小写。
IF NOT EXISTS:在创建数据库之前进行判断,只有该数据库目前尚不存在时才能执行操作。此选项可以用来避免数据库已经存在而重复创建的错误。
[DEFAULT] CHARACTER SET:指定数据库的默认字符集。
[DEFAULT] COLLATE:指定字符集的默认校对规则。
MySQL 的字符集(CHARACTER)和校对规则(COLLATION)两个不同的概念:字符集是用来定义 MySQL 存储字符串的方式,校对规则定义了比较字符串的方式,解决排序和字符分组的问题。
实例1:最简单的创建 MySQL 数据库的语句
在 MySQL 中创建一个名为 test_db 的数据库。在 MySQL 命令行客户端输入 SQL 语句CREATE DATABASE test_db;即可创建一个数据库,输入的 SQL 语句与执行结果如下。
mysql> CREATE DATABASE test_db;
Query OK, 1 row affected (0.12 sec)
若再次输入上述语句,则系统会给出错误提示信息,如下所示:
mysql> CREATE DATABASE test_db;
ERROR 1007 (HY000): Can't create database 'test_db'; database exists
MySQL 不允许在同一系统创建两个相同名称的数据库。
如果加上IF NOT EXISTS从句,则可以避免类似错误,如下所示:
mysql> CREATE DATABASE IF NOT EXISTS test_db;
Query OK, 1 row affected (0.12 sec)
实例2:创建 MySQL 数据库时指定字符集和校对规则
使用 MySQL 命令行工具创建一个测试数据库,命名为 test_db_char,指定其默认字符集为 utf8,默认校对规则为 utf8_chinese_ci(简体中文,不区分大小写),输入的 SQL 语句与执行结果如下所示:
mysql> CREATE DATABASE IF NOT EXISTS test_db_char
-> DEFAULT CHARACTER SET utf8
-> DEFAULT COLLATE utf8_chinese_ci;
Query OK, 1 row affected (0.03 sec)
这时,可以使用SHOW CREATE DATABASE查看 test_db_char 数据库的定义声明,发现该数据库的指定字符集为 utf8,运行结果如下所示:
mysql> SHOW CREATE DATABASE test_db_char;
+--------------+-----------------------------------------------------+
| Database | Create Database |
+--------------+-----------------------------------------------------+
| test_db_char | CREATE DATABASE `test_db_char` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+--------------+-----------------------------------------------------+
1 row in set (0.05 sec)
为防止字符混乱的情况发生,MySQL 有时需要在创建数据库时明确指定字符集;在中国大陆地区,常用的字符集有 utf8 和 gbk。
utf8 能够存储全球的所有字符,在任何国家都可以使用,默认的校对规则为 utf8_general_ci,对于中文可以使用 utf8_general_ci。
gbk 只能存储汉语涉及到的字符,不具有全球通用性,默认的校对规则为 gbk_chinese_ci。
MySQL查看或显示数据库(SHOW DATABASES语句)
在 MySQL 中,可使用 SHOW DATABASES 语句来查看或显示当前用户权限范围以内的数据库。查看数据库的语法格式为:
SHOW DATABASES [LIKE '数据库名'];
语法说明如下:
LIKE 从句是可选项,用于匹配指定的数据库名称。LIKE 从句可以部分匹配,也可以完全匹配。
数据库名由单引号' '包围。
实例1:查看所有数据库
列出当前用户可查看的所有数据库:
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sakila |
| sys |
| world |
+--------------------+
6 row in set (0.22 sec)
实例2:创建并查看数据库
先创建一个名为 test_db 的数据库:
mysql> CREATE DATABASE test_db;
Query OK, 1 row affected (0.12 sec)
再使用 SHOW DATABASES 语句显示权限范围内的所有数据库名,如下所示:
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sakila |
| sys |
| test_db |
| world |
+--------------------+
7 row in set (0.22 sec)
你看,刚才创建的数据库已经被显示出来了。
实例3:使用 LIKE 从句
先创建三个数据库,名字分别为 test_db、db_test、db_test_db。
- 使用 LIKE 从句,查看与 test_db 完全匹配的数据库:
mysql> SHOW DATABASES LIKE 'test_db';
+--------------------+
| Database (test_db) |
+--------------------+
| test_db |
+--------------------+
1 row in set (0.03 sec)
- 使用 LIKE 从句,查看名字中包含 test 的数据库:
mysql> SHOW DATABASES LIKE '%test%';
+--------------------+
| Database (%test%) |
+--------------------+
| db_test |
+--------------------+
| db_test_db |
+--------------------+
| test_db |
+--------------------+
3 row in set (0.03 sec)
- 使用 LIKE 从句,查看名字以 db 开头的数据库:
mysql> SHOW DATABASES LIKE 'db%';
+----------------+
| Database (db%) |
+----------------+
| db_test |
+----------------+
| db_test_db |
+----------------+
2 row in set (0.03 sec)
- 使用 LIKE 从句,查看名字以 db 结尾的数据库:
mysql> SHOW DATABASES LIKE '%db';
+----------------+
| Database (%db) |
+----------------+
| db_test_db |
+----------------+
| test_db |
+----------------+
2 row in set (0.03 sec)
MySQL选择数据库(MySQL USE语句)
在 MySQL 中,USE 语句用来完成一个数据库到另一个数据库的跳转。
当用 CREATE DATABASE 语句创建数据库之后,该数据库不会自动成为当前数据库,需要用 USE 来指定当前数据库。其语法格式为:
USE <数据库名>
该语句可以通知 MySQL 把<数据库名>所指示的数据库作为当前数据库。该数据库保持为默认数据库,直到语段的结尾,或者直到遇见一个不同的 USE 语句。
只有使用 USE 语句来指定某个数据库作为当前数据库之后,才能对该数据库及其存储的数据对象执行操作。
【实例】使用命令行工具将数据库 test_db 设置为默认数据库,输入的 SQL 语句与执行结果如下所示:
mysql> USE test_db;
Database changed
MySQL创建用户(CREATE USER)
在对 MySQL 的日常管理和实际操作中,为了避免用户恶意冒名使用 root 账号控制数据库,通常需要创建一系列具备适当权限的账号,应该尽可能地不用或少用 root 账号登录系统,以此来确保数据的安全访问。
创建用户
可以使用 CREATE USER 语句来创建一个或多个 MySQL 账户,并设置相应的口令。
语法格式:
CREATE USER <用户名> [ IDENTIFIED ] BY [ PASSWORD ] <口令>
语法说明如下:
- <用户名>
指定创建用户账号,格式为 'user_name'@'host_name'。这里user_name是用户名,host_name为主机名,即用户连接 MySQL 时所在主机的名字。若在创建的过程中,只给出了账户的用户名,而没指定主机名,则主机名默认为“%”,表示一组主机。- PASSWORD
可选项,用于指定散列口令,即若使用明文设置口令,则需忽略PASSWORD关键字;若不想以明文设置口令,且知道 PASSWORD() 函数返回给密码的散列值,则可以在口令设置语句中指定此散列值,但需要加上关键字PASSWORD。- IDENTIFIED BY子句
用于指定用户账号对应的口令,若该用户账号无口令,则可省略此子句。- <口令>
指定用户账号的口令,在IDENTIFIED BY关键字或PASSWOED关键字之后。给定的口令值可以是只由字母和数字组成的明文,也可以是通过 PASSWORD() 函数得到的散列值。
使用 CREATE USER 语句应该注意以下几点:
如果使用 CREATE USER 语句时没有为用户指定口令,那么 MySQL 允许该用户可以不使用口令登录系统,然而从安全的角度而言,不推荐这种做法。
使用 CREATE USER 语句必须拥有 MySQL 中 MySQL 数据库的 INSERT 权限或全局 CREATE USER 权限。
使用 CREATE USER 语句创建一个用户账号后,会在系统自身的 MySQL 数据库的 user 表中添加一条新记录。若创建的账户已经存在,则语句执行时会出现错误。
新创建的用户拥有的权限很少。他们可以登录 MySQL,只允许进行不需要权限的操作,如使用 SHOW 语句查询所有存储引擎和字符集的列表等。
如果两个用户具有相同的用户名和不同的主机名,MySQL 会将他们视为不同的用户,并允许为这两个用户分配不同的权限集合。
【实例 1】使用 CREATE USER 创建一个用户,用户名是 james,密码是 tiger,主机是 localhost。输入的 SQL 语句和执行过程如下所示。
mysql> CREATE USER 'james'@'localhost'
-> IDENTIFIED BY 'tiger';
Query OK, 0 rows affected (0.12 sec)
MySQL用户授权(GRANT)
当成功创建用户账户后,还不能执行任何操作,需要为该用户分配适当的访问权限。可以使用 SHOW GRANT FOR 语句来查询用户的权限。
注意:新创建的用户只有登录 MySQL 服务器的权限,没有任何其他权限,不能进行其他操作。
USAGE ON. 表示该用户对任何数据库和任何表都没有权限。
授予用户权限
对于新建的 MySQL 用户,必须给它授权,可以用 GRANT 语句来实现对新建用户的授权。
语法格式:
GRANT
<权限类型> [ ( <列名> ) ] [ , <权限类型> [ ( <列名> ) ] ]
ON <对象> <权限级别> TO <用户>
其中<用户>的格式:
<用户名> [ IDENTIFIED ] BY [ PASSWORD ] <口令>
[ WITH GRANT OPTION]
| MAX_QUERIES_PER_HOUR <次数>
| MAX_UPDATES_PER_HOUR <次数>
| MAX_CONNECTIONS_PER_HOUR <次数>
| MAX_USER_CONNECTIONS <次数>