文章目录
- 一、数据库操作
-
- [SQL 分类](#SQL 分类)
- [1.1 查看数据库](#1.1 查看数据库)
- [1.2 创建数据库](#1.2 创建数据库)
- [1.3 查看创建数据库](#1.3 查看创建数据库)
- [1.4 选择数据库](#1.4 选择数据库)
- [1.5 修改数据库](#1.5 修改数据库)
- [1.6 删除数据库](#1.6 删除数据库)
- 二、数据类型
-
- [2.1 数值类型](#2.1 数值类型)
- [2.2 字符串类型](#2.2 字符串类型)
- [2.3 日期类型](#2.3 日期类型)
一、数据库操作
数据库是用来存储数据的,我们使用 SQL 来操作数据库。SQL 是一个标准,是一个针对数据库操作的语言,我们只需要掌握 增删查改 即可。
SQL 分类
- DDL(Data Definition Language)数据定义语言,用来维护存储数据的结构,代表指令有
create,drop,alter - DML(Data Manipulation Language)数据操纵语言,用来对数据进行操作,代表指令有
insert,delete,update -
- DML 中又单独分了一个 DQL(Data Query Language)数据查询语言,代表指令有
select
- DML 中又单独分了一个 DQL(Data Query Language)数据查询语言,代表指令有
- DCL(Data Control Language)数据控制语言,主要负责权限管理和事务,代表指令有
grant,revoke,commit
1.1 查看数据库
查看该设备中的所有数据库,用 show 语句,这个语句可以列出当前用户权限范围内的所有数据库。
语法
sql
SHOW DATABASES;
show databases;
- 注意,这里的 databases 是复数形式。
- 大小写不敏感,因此大写或者小写都可以。
大写
sql
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
小写
sql
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
在上面的数据库中,information_schema、mysql、performance_schema、sys 是在安装 MySQL 时自动创建的系统数据库。
使用 LIKE 子句
如果想要查找特定名称的数据库 ,可以使用 LIKE 子句来查找。例如,如果想要查询含有 "info" 的数据库,可以这样:
sql
show databases like '%info%';
在 info 首尾的 % 符号表示模糊查询,会自动匹配若干个字符。
sql
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test_info_database |
+--------------------+
5 rows in set (0.00 sec)
// 只想查找含有"info"的数据库
mysql> show databases like '%info%';
+--------------------+
| Database (%info%) |
+--------------------+
| information_schema |
| test_info_database |
+--------------------+
2 rows in set (0.00 sec)
1.2 创建数据库
使用 create 语句创建数据库,语法如下:
sql
create database database_name;
/*
database_name:表示自定义的数据库名
*/
例如,创建一个名为 "test" 的数据库的过程如下:
sql
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
mysql> create database test;
Query OK, 1 row affected (0.01 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
5 rows in set (0.00 sec)
如果想要创建一个名为 "create" 或者 "database" 的数据库,能够成功创建吗?
sql
mysql> create database create;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'create' at line 1
mysql> create database database;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'database' at line 1
可以看到,是不能成功创建数据库的,为什么呢?
因为 "create" 和 "database" 都是关键字,那么用户就无法创建一个名称和关键字一样的数据库了吗?
答案是否定的,用户创建数据库的时候将数据库名用反引号括起来就可以避免报错了。
sql
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
5 rows in set (0.00 sec)
mysql> create database `create`;
Query OK, 1 row affected (0.01 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| create |
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
6 rows in set (0.00 sec)
mysql> create database `database`;
Query OK, 1 row affected (0.01 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| create |
| database |
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
7 rows in set (0.00 sec)
更详细的创建数据库的语法如下:
sql
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] database_name
[CHARACTER SET charset_name]
[COLLATE collation_name];
/*
大写部分表示关键字
database_name:表示自定义的数据库名
{}大括号表示必选项
| 表示任选其中⼀个
[]中括号表示是可选项
CHARACTER SET:指定数据库采用的字符集编码
COLLATE:指定数据库字符集的校验规则
*/
其中,为了避免因数据库已存在而导致创建数据库失败,我们可以加上 if not exists进行校验。
我们也可以通过 CHARACTER 指定数据库的字符集、通过 COLLATE 指定数据库的排序规则,如:
sql
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
// 创建数据库test并指定字符集和排序规则
mysql> create database if not exists test character set utf8mb4 collate utf8mb4_0900_ai_ci;
Query OK, 1 row affected (0.01 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
5 rows in set (0.00 sec)
如果想要查看数据库支持的字符集或者排序规则,也可以使用 show 语句来查看:
sql
// 查看字符集
mysql> show charset;
+----------+---------------------------------+---------------------+--------+
| Charset | Description | Default collation | Maxlen |
+----------+---------------------------------+---------------------+--------+
| armscii8 | ARMSCII-8 Armenian | armscii8_general_ci | 1 |
| ascii | US ASCII | ascii_general_ci | 1 |
| big5 | Big5 Traditional Chinese | big5_chinese_ci | 2 |
| binary | Binary pseudo charset | binary | 1 |
| cp1250 | Windows Central European | cp1250_general_ci | 1 |
| cp1251 | Windows Cyrillic | cp1251_general_ci | 1 |
| cp1256 | Windows Arabic | cp1256_general_ci | 1 |
| cp1257 | Windows Baltic | cp1257_general_ci | 1 |
......
+----------+---------------------------------+---------------------+--------+
41 rows in set (0.00 sec)
// 查看排序规则
mysql> show collation;
+-----------------------------+----------+-----+---------+----------+---------+---------------+
| Collation | Charset | Id | Default | Compiled | Sortlen | Pad_attribute |
+-----------------------------+----------+-----+---------+----------+---------+---------------+
| armscii8_bin | armscii8 | 64 | | Yes | 1 | PAD SPACE |
| armscii8_general_ci | armscii8 | 32 | Yes | Yes | 1 | PAD SPACE |
| ascii_bin | ascii | 65 | | Yes | 1 | PAD SPACE |
| ascii_general_ci | ascii | 11 | Yes | Yes | 1 | PAD SPACE |
| big5_bin | big5 | 84 | | Yes | 1 | PAD SPACE |
| big5_chinese_ci | big5 | 1 | Yes | Yes | 1 | PAD SPACE |
| binary | binary | 63 | Yes | Yes | 1 | NO PAD |
| cp1250_bin | cp1250 | 66 | | Yes | 1 | PAD SPACE |
......
+-----------------------------+----------+-----+---------+----------+---------+---------------+
286 rows in set (0.01 sec)
- MySQL8.0 默认的字符集是 utf8mb4,MySQL5.7 默认的字符集是 latin1
- MySQL8.0 默认的排序规则是 utf8mb4_0900_ai_ci, MySQL5.7 默认排序规则是 utf8mb4_general_ci
不同字符集与排序规则对数据库的影响
utf8mb4_0900_ai_ci 是 MySQL8.0 引入的新规则,在这之前的版本是不能识别的。
utf8mb4 编码是对 Unicode 字符集的⼀种实现,用 1 到 4 个字节表示⼀个字符,可以表示世界上几乎所有的字符,而且更节省空间。
0900 是基于 UCA 9.0.0算法,UCA 是 Unicode Collation Algorithm 的缩写。
- ai是 Accent-insensitive 的缩写,表示口音不敏感
- ci是 Case-insensitive 的缩写,表示大小写不敏感
- as是 Accent-sensitive 的缩写,表示口音敏感
- cs是 Case-sensitive 的缩写,表示大小写敏感
我们可以查看系统的默认字符集和排序规则:
sql
// 查看默认字符集
mysql> show variables like '%character%';
+--------------------------+---------------------------------------------------------+
| Variable_name | Value |
+--------------------------+---------------------------------------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8mb3 |
| character_sets_dir | C:\Program Files\MySQL\MySQL Server 8.0\share\charsets\ |
+--------------------------+---------------------------------------------------------+
8 rows in set, 6 warnings (0.00 sec)
// 查看默认排序规则
mysql> show variables like '%collation%';
+-------------------------------+--------------------+
| Variable_name | Value |
+-------------------------------+--------------------+
| collation_connection | utf8mb4_0900_ai_ci |
| collation_database | utf8mb4_0900_ai_ci |
| collation_server | utf8mb4_0900_ai_ci |
| default_collation_for_utf8mb4 | utf8mb4_0900_ai_ci |
+-------------------------------+--------------------+
4 rows in set, 6 warnings (0.00 sec)
1.3 查看创建数据库
可以通过 show create 语句查看创建数据库时的语句。语法如下:
sql
show create database database_name;
查看数据库 test:
sql
mysql> show create database test;
+----------+--------------------------------------------------------------------------------------------------------------------------------+
| Database | Create Database |
+----------+--------------------------------------------------------------------------------------------------------------------------------+
| test | CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */ |
+----------+--------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
例如,创建一个定义字符集为 ASCII 的数据库 test_show_create,通过查看创建数据库语句查看创建数据库时的语句:
sql
mysql> create database if not exists test_show_create character set ascii;
Query OK, 1 row affected (0.01 sec)
mysql> show create database test_show_create;
+------------------+---------------------------------------------------------------------------------------------------------------+
| Database | Create Database |
+------------------+---------------------------------------------------------------------------------------------------------------+
| test_show_create | CREATE DATABASE `test_show_create` /*!40100 DEFAULT CHARACTER SET ascii */ /*!80016 DEFAULT ENCRYPTION='N' */ |
+------------------+---------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
- 数据库名字的反引号 `` 是为了避免使用的数据库名刚好是关键字的情况
- /*!40100 DEFAULT... */ 和 /!80016 DEFAULT.../ 并不是注释,表示当前 mysql 版本大于 4.01 和 8.0.16 时,分别执行对应的语句
1.4 选择数据库
使用 use 语句选择要操作的数据库:
sql
use database_name [;]
/*
database_name:表示自定义的数据库名
[]中括号表示是可选项
*/
接下来我们选择操作数据库 "test":
sql
mysql> use test
Database changed
这样就表示已经选择成功,接下来的所有操作都是针对 "test" 数据库的。
那我们怎么查看当前选择的数据库呢?可以使用 MySQL 的一个内置函数来查看(后面细讲)。
如果没有选择数据库,就如以下所示:
sql
mysql> select database();
+------------+
| database() |
+------------+
| NULL |
+------------+
1 row in set (0.00 sec)
如果选择了数据库 "test",就如以下所示:
sql
mysql> use test
Database changed
mysql> select database();
+------------+
| database() |
+------------+
| test |
+------------+
1 row in set (0.00 sec)
1.5 修改数据库
使用 alter 语句对数据库进行修改,具体语法如下:
sql
ALTER {DATABASE | SCHEMA} [database_name] alter_option ...
alter_option: {
[DEFAULT] CHARACTER SET [=] charset_name
| [DEFAULT] COLLATE [=] collation_name
| [DEFAULT] ENCRYPTION [=] {'Y' | 'N'}
| READ ONLY [=] {DEFAULT | 0 | 1}
}
/*
大写部分表示关键字
database_name:表示自定义的数据库名
{}大括号表示必选项
| 表示任选其中⼀个
[]中括号表示是可选项
CHARACTER SET:指定数据库采用的字符集编码
COLLATE:指定数据库字符集的校验规则
ENCRYPTION:表示数据库是否加密,MySQL 8.0.16 中引⼊的新选项
*/
修改操作主要是对已有数据库的字符集或者排序规则进行修改。
例如,我们对数据库 test 修改字符集,将字符集修改为 gbk:
sql
mysql> show create database test;
+----------+--------------------------------------------------------------------------------------------------------------------------------+
| Database | Create Database |
+----------+--------------------------------------------------------------------------------------------------------------------------------+
| test | CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */ |
+----------+--------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> alter database test character set gbk;
Query OK, 1 row affected (0.01 sec)
mysql> show create database test;
+----------+-------------------------------------------------------------------------------------------------+
| Database | Create Database |
+----------+-------------------------------------------------------------------------------------------------+
| test | CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET gbk */ /*!80016 DEFAULT ENCRYPTION='N' */ |
+----------+-------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
1.6 删除数据库
使用 drop 语句将数据库删除,具体语法如下:
sql
DROP {DATABASE | SCHEMA} [IF EXISTS] database_name
/*
大写部分表示关键字
database_name:表示自定义的数据库名
{}大括号表示必选项
| 表示任选其中⼀个
[]中括号表示是可选项
CHARACTER SET:指定数据库采用的字符集编码
COLLATE:指定数据库字符集的校验规则
*/
接下来我们删除数据库 test_show_create,过程如下:
sql
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
| test_show_create |
+--------------------+
6 rows in set (0.00 sec)
// 删除test_show_create
mysql> drop database test_show_create;
Query OK, 0 rows affected (0.02 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
5 rows in set (0.00 sec)
注意!删除数据库是一个
非常危险的操作,不要随意删除数据库。
- 删除数据库之后,数据库对应的目录及目录中的所有文件也会被删除
- 删除数据库之后,使用 show databases 语句就查看不到对应的数据库了
二、数据类型
用户创建数据库 ,是为了能够存储表 ,因此我们也需要学习对表进行操作。
在学习对表进行操作之前,首先要学习的是数据类型,因为设计表的时候每一个字段都是数据,我们需要根据不同的需求选择不同的数据类型。
2.1 数值类型
| 数据类型 | 大小 | 说明 | 对应 Java 类型 |
|---|---|---|---|
BIT[(M)] |
由 M 指定位数,无指定 M 时默认为1 | 二进制数,M 范围 [ 1, 64 ],所存储的数据范围 [ 0, 2ᴹ - 1 ] | 常用 Boolean 对应 BIT,此时默认1位,只能存 0 和 1 |
TINYINT |
1字节 | 无 | Byte |
| SMALLINT | 2字节 | 无 | Short |
| INT | 4字节 | 无 | Integer |
BIGINT |
8字节 | 常用于编号字段 | Long |
| FLOAT(M, D) | 4字节 | 单精度浮点数,M 指定长度,D 指定小数位数,会发生精度丢失 | Float |
| DOUBLE(M, D) | 8字节 | 双精度浮点数,M 指定长度,D 指定小数位数,会发生精度丢失 | Double |
DECIMAL(M, D) |
M/D 的最大值 + 2 | 双精度,M 指定长度,D 指定小数位数,精确数值,一般用于表示金额 | BigDecimal |
| NUMERIC(M, D) | M/D 的最大值 + 2 | 双精度,M 指定长度,D 指定小数位数,精确数值,一般用于表示金额 | BigDecimal |
注意:
- M 是不计算小数和负数的,如果 D 为 0,则具体的值不会保存小数部分,即保存一个整数。
- DECIMAL 的最大位数 M 为 65,支持的最大小数 D 为 30。如果省略 D 则默认为 0,如果省略 M 则默认为 10。
数值类型可以指定为无符号 unsigned,表示不取负数。对于整数类型,有符号范围:[ - 2^(类型字节数8 - 1)^ , 2^(类型字节数 8 - 1)^ - 1 ],如 int 类型是 4 字节,则数据范围为 [ -231, 231 - 1 ];无符号范围:[ 0, 2(类型字节数*8) - 1 ],如 int 类型的范围为 [ 0, 232 - 1 ]。
2.2 字符串类型
| 数据类型 | 大小 | 说明 | 对应 Java 类型 |
|---|---|---|---|
VARCHAR(SIZE) |
[ 0, 65535 ] 字节 | 可变长度字符串,是最常用的字符串类型,通过 SIZE 指定长度(字符个数) | String |
TEXT |
[ 0, 65535 ] 字节 | 长文本数据类型 | String |
| MEDIUMTEXT | [ 0, 16777215 ] 字节 | 中等长度文本数据类型 | String |
| BLOB | [ 0, 65535 ] 字节 | 二进制形式的长文本数据类型 | byte[] |
- 文本文件:人类可以直接看懂的文件,比如有记事本里面写的日记、配置文件或者 Java 源代码
- 二进制文件:我们用文本编辑器打开的文件,里面是一堆乱码,这些文件只有机器可以读的懂,一般称之为二进制文件
- 一般在数据库中,不建议存文件,而是把文件存在磁盘上 ,在数据库相应的字段 中保存文件路径。在查询文件的时候,先从数据库中找到文件路径,再去根据文件路径在磁盘上加载或是返回具体的真实文件
2.3 日期类型
| 数据类型 | 大小 | 说明 | 对应 Java 类型 |
|---|---|---|---|
DATETIME |
8字节 | 范围 [ 1000, 9999 ],不会进行时区的检索及转换 | java.util.Date、java.sql.Timestamp |
| TIMESTAMP | 4字节 | 范围 [ 1970, 2038 ],自动检索当前时区并进行转换 | java.util.Date、java.sql.Timestamp |
TIMESTAMP 数据类型就是时间戳,表示 从 1970 年到现在的时间,单位是毫秒,一旦超过 2038年,就溢出了。
文章到这里就告一段落啦,若有错误请尽管指出~
完