目录
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 删除表
数据库其实是一类软件,这样的软件就能够对数据进行操作,比如增删改查。前面我们学习过的数据结构也是来管理数据的,数据库呢也是基于数据结构实现出来的软件。
数据库大概可以分为两类:
关系型数据库:MySQL,Oracle,SQLServer,SQLite...
非关系型数据库:Redis,MongoDB,HBase...
上述所说的呢,都是软件,本专栏主要讲解 SQL 这门编程语言,去操作 MySQL 数据库。
一条 SQL 指令是可以换行的,以分号结尾即可。
数据库的操作不区分大小写!
MySQL中其实自带了很多系统库,使用 show databases; 就能查看当前所有的数据库了:
show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
-- 5 rows in set (0.00 sec)
上面显示的除了 test 是博主创建的,其他的就是系统自带的数据库了,系统带的库可不要随便乱动哦!
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 的关键字。
一个 MySQL 服务器上,数据库是可以有多个的,要对数据库进行操作,就需要先明确我们要操作的是哪个数据库。
use demo;
-- Database changed
那么选中数据库后,我们后面的操作都是针对这个 demo 数据库来执行的。
drop database demo; -- drop database 数据库名;
-- Query OK, 0 rows affected (0.01 sec)
注意:删除数据库是非常危险的一个操作,如果你删的是测试环境的那还好,如果你删的是生产环境的数据库,那就可能会出问题了,可能有的人想到,反正有备份,但是虽然有备份,但是仍然是需要耗费大量时间的,一个公司的数据量可想而知。
数据类型 | 大小 | 说明 |
---|---|---|
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
数据类型 | 大小 | 说明 |
---|---|---|
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 主要是存二进制数据的。
数据类型 | 大小 | 说明 |
---|---|---|
DATETIME | 8字节 | 范围从1000到9999年,不会进行时区的 检索及转换。 |
TIMESTAMP | 4字节 | 范围从1970到2038年,自动检索当前时 区并进行转换。 |
第二个目前就不推荐使用了,毕竟时间戳到 2038 年就用尽了。
当我们要创建表的时候,要明确是哪个数据库中创建,所以创建表的前提是,我们要选中需要操作的数据库。
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 中不允许创建没有任何列的表,这样的表是没有无意义的。
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
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 额外的描述,这些内容在后续都会介绍到,这里简单看一下即可。
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】增删改操作(基础篇)