> 文章列表 > 【MySQL】数据库基础

【MySQL】数据库基础

【MySQL】数据库基础


目录

1、什么是数据库

2、 数据库基本操作

2.1 查看当前数据库

2.2 创建一个数据库

2.3 选中数据库

2.4 删除数据库 

3、常见的数据类型

3.1 数值类型 

3.2 字符串类型

3.3 日期类型 

4、表的操作

4.1 创建表

4.2 查看指定数据库下的所有表

4.3 查看表的结构

4.4 删除表


1、什么是数据库

数据库其实是一类软件,这样的软件就能够对数据进行操作,比如增删改查。前面我们学习过的数据结构也是来管理数据的,数据库呢也是基于数据结构实现出来的软件。

数据库大概可以分为两类:

关系型数据库:MySQL,Oracle,SQLServer,SQLite...

非关系型数据库:Redis,MongoDB,HBase...

上述所说的呢,都是软件,本专栏主要讲解 SQL 这门编程语言,去操作 MySQL 数据库。

一条 SQL 指令是可以换行的,以分号结尾即可。


2、 数据库基本操作

数据库的操作不区分大小写! 

2.1 查看当前数据库

MySQL中其实自带了很多系统库,使用 show databases; 就能查看当前所有的数据库了:

show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
-- 5 rows in set (0.00 sec)

上面显示的除了 test 是博主创建的,其他的就是系统自带的数据库了,系统带的库可不要随便乱动哦!

2.2 创建一个数据库

create database 数据库名;

比如说这里我们要创建一个 demo 数据库,直接执行上述的 SQL 语句即可:

create database demo;
-- Query OK, 1 row affected (0.00 sec)show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| demo               |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
-- 6 rows in set (0.00 sec)

这里有个小细节不知道大家发现了没有,创建数据库的时候是 database,显示所有数据库是 databases,这里为啥,自然就不用博主解释了吧,后续查看数据库中所有表的操作也是类似的哦!

在创建数据库的时候,也是可以指定字符集的:

create database 数据库名 charset 字符集名;

如果创建数据库名重复了会咋样?

create database demo;
-- ERROR 1007 (HY000): Can't create database 'demo'; database exists

有一个办法,可以解决报错:

create database if not exists demo;
-- Query OK, 1 row affected, 1 warning (0.00 sec)

这样写就没问题了,也就是不会报错了,但是有一个警告,学习Java阶段,我们知道一个程序中允许有 warning 但不允许有 error。

这样写的意思就是,如果存在了 demo 这个数据库,那么就不创建了,没有存在才创建 demo 数据库,有小伙伴可能会问,这有啥用呢?不就是把 error 变成了 warning 吗?

很多时候 SQL 是写在文件中的,进行批量执行,如果执行过程中,某个操作报错了,那么后续的代码是无法执行的,而 warning 是不影响的!

注意:数据库的名字不能是 SQL 的关键字。 

2.3 选中数据库

一个 MySQL 服务器上,数据库是可以有多个的,要对数据库进行操作,就需要先明确我们要操作的是哪个数据库。

use demo;
-- Database changed

那么选中数据库后,我们后面的操作都是针对这个 demo 数据库来执行的。

2.4 删除数据库 

drop database demo; -- drop database 数据库名;
-- Query OK, 0 rows affected (0.01 sec)

注意:删除数据库是非常危险的一个操作,如果你删的是测试环境的那还好,如果你删的是生产环境的数据库,那就可能会出问题了,可能有的人想到,反正有备份,但是虽然有备份,但是仍然是需要耗费大量时间的,一个公司的数据量可想而知。 


3、常见的数据类型

3.1 数值类型 

数据类型 大小 说明
BIT[ (M) ] M指定位 数,默认 为1 二进制数,M范围从1到64, 存储数值范围从0到2^M-1
TINYINT 1字节
SMALLINT 2字节
INT 4字节
BIGINT 8字节
FLOAT(M,D) 4字节 单精度,M指定长度,D指定小数位数,会发生精度丢失
DOUBLE(M,D) 8字节
DECIMAL(M,D) M/D最大 值+2 双精度,M指定长度,D表示 小数点位数。精确数值
NUMERIC(M, D) M/D最大 值+2 和DECIMAL一样

数值类型可以定义成无符号(unsigned),表示不取负数,但是没这个必要,就比如对于 int 类型可能放不下的数据 int unsigned 也可能放不下,不如直接采用 bigint 来的实在。

上述常用类型:int,double,decimal,bigint 

3.2 字符串类型

数据类型 大小 说明
VARCHAR(SIZE) 0-65,535字节 可变长度字符串
TEXT 0-65,535字节 长文本数据
MEDIUMTEXT 0-16 777 215字节 中等长度文本数据
BLOB 0-65,535字节 二进制形式的长文本数据

上述的 VARCHAR(128) 表示这个列最多存 128 个字符,但是这里也不是你写了 128 就真的固定分配了这么多内存,也会动态适应,但最大的内存不会超过这个 128.

TEXT 和 MEDIUMTEXT 更适合于更长的字符串。BLOB 主要是存二进制数据的。

3.3 日期类型 

数据类型 大小 说明
DATETIME 8字节 范围从1000到9999年,不会进行时区的 检索及转换。
TIMESTAMP 4字节 范围从1970到2038年,自动检索当前时 区并进行转换。

第二个目前就不推荐使用了,毕竟时间戳到 2038 年就用尽了。


4、表的操作

4.1 创建表

当我们要创建表的时候,要明确是哪个数据库中创建,所以创建表的前提是,我们要选中需要操作的数据库。

use demo;
-- Database changed
create table student(id int, name varchar(10));
-- Query OK, 0 rows affected (0.02 sec)

这里我们的学生表就创建完成了,创建表采用 create 这个命令,与创建数据库是类似的,这里值得注意的是,我们定义字段是 字段名在前 字段类型在后,中间用空格隔开,每列中间用逗号隔开。

这里 varchar(10),这里面的10并不是表示10个字节,而是表示10个字符,具体大小取决于你数据库设定的字符集,要知道不同的字符集设定的每个字符大小可是不一样的!这里在JavaSE有讲到过。

同一个表中是不能存在两张名字相同的表的:

create table student(id int);
-- ERROR 1050 (42S01): Table 'student' already exists

而且如上代码可只,与列无关,纯属是表明不能相同!

表名和列名,不能和 SQL 关键字相同:

create table table (val int);
-- 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 'table (val int)' at line 1

这里发现报错了,如果实在要表名或列名与关键字相同怎么办呢?可以把表名或列名使用反引号引起来就行了,但是不推荐:

create table `table`(val int);
-- Query OK, 0 rows affected (0.02 sec)

英文千千万,你何必非要跟关键字过意不去呢?

在创建表的时候也可以对字段增加说明,使用 comment 关键字:

create table student (id int comment '学号', name varchar(10) comment '姓名');
-- Query OK, 0 rows affected (0.02 sec)

使用如下指令就能查看已有表所有字段的注释了:

show full columns from student;
+-------+-------------+-----------------+------+-----+---------+-------+---------------------------------+---------+
| Field | Type        | Collation       | Null | Key | Default | Extra | Privileges                      | Comment |
+-------+-------------+-----------------+------+-----+---------+-------+---------------------------------+---------+
| id    | int(11)     | NULL            | YES  |     | NULL    |       | select,insert,update,references | 学号    |
| name  | varchar(10) | utf8_general_ci | YES  |     | NULL    |       | select,insert,update,references | 姓名    |
+-------+-------------+-----------------+------+-----+---------+-------+---------------------------------+---------+
-- 2 rows in set (0.00 sec)

注意:MySQL 中不允许创建没有任何列的表,这样的表是没有无意义的。

4.2 查看指定数据库下的所有表

show tables;
+----------------+
| Tables_in_demo |
+----------------+
| student        |
+----------------+
-- 1 row in set (0.00 sec)

那个跟 SQL 关键字重名的 table 表的我已经删了,所以这里能看见只存在一张前面刚创建的学生表,这里还是要注意,这里 tables,相比 table 是多了个 s 的,跟显示所有数据库是一样的。

由于前面操作我已经选中的 demo 数据库,所以显示指定数据库下所有表的操作是不会出错的,但是有的小伙伴可能一登录就开始查看所有的表,在没选中数据库的情况下,是会报错的:

show tables;
-- ERROR 1046 (3D000): No database selected

4.3 查看表的结构

desc student;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  |     | NULL    |       |
| name  | varchar(10) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
-- 2 rows in set (0.00 sec)

int(11) 这个只是显示的宽度,不会影响数据的存储,Null这一列表示该列能否为空,这个后续文章也会介绍到,key 与表的约束有关,Default 指的是该列没有插入数据默认是啥数据,Extra 额外的描述,这些内容在后续都会介绍到,这里简单看一下即可。

4.4 删除表

drop table student;
-- Query OK, 0 rows affected (0.00 sec)

跟删除库一样,仍然是个特别危险的操作,这里需要注意。

那如果没有要删除的表则会报错:

drop table hello;
-- ERROR 1051 (42S02): Unknown table 'demo.hello'

这里一样的 ERROR,能不能不让报错呢?像我们前面讲到过,报错是不好的,跟创建数据库时如果重名是一样的:

drop table if exists hello;
-- Query OK, 0 rows affected, 1 warning (0.00 sec)

下期预告:【MySQL】增删改操作(基础篇)