【MySQL】数据库基础

news/2024/11/8 14:57:46/


 

目录

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
TINYINT1字节
SMALLINT2字节
INT4字节
BIGINT8字节
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字节可变长度字符串
TEXT0-65,535字节长文本数据
MEDIUMTEXT0-16 777 215字节中等长度文本数据
BLOB0-65,535字节二进制形式的长文本数据

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

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

3.3 日期类型 

数据类型大小说明
DATETIME8字节范围从1000到9999年,不会进行时区的 检索及转换。
TIMESTAMP4字节范围从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】增删改操作(基础篇)


http://www.ppmy.cn/news/25710.html

相关文章

【MT7628】固件开发-SDK4320添加MT7612E WiFi驱动操作说明

解压5G WiFi MT7612E驱动1.1解压指令 tar -xvf MT76x2E_MT7620_LinuxAP_V3.0.4.0_P2_DPA_20160308.tar.bz2 1.2解压之后会出现以下两个目录 rlt_wifi rlt_wifi_ap 1.3将解压后的文件拷贝到系统下 拷贝路径 RT288x_SDK/source/linux-2.6.36.x/drivers/net/wireless 内核中打开驱…

极验3代 加密分析

目标链接 aHR0cHM6Ly93d3cuZ2VldGVzdC5jb20vZGVtby9zbGlkZS1mbG9hdC5odG1s接口分析 极验参数重要信息 gt和challenge;gt是固定的,但是challenge每次请求会产生不同的,这里的请求的并没有什么加密参数。 下一个请求 gettype.php&#xff0c…

element-ui中el-table点击其他自定义按钮展开table中某一行

element-ui中el-table点击其他自定义按钮展开table中某一行 在日常开发中,我们遇见了会有点击某些按钮,使得表格行展开的需求,这时候去查看文档 element-ui(table) 这里官方提供了示例为在行最左侧有一个展开合并ico…

深入理解MySQLⅢ -- 锁与InnoDB引擎

文章目录锁概述全局锁表级锁表锁元数据锁意向锁行级锁行锁间隙锁&临键锁InnoDB引擎逻辑存储结构架构内存结构磁盘结构后台线程事务原理redo logundo logMVCC锁 概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源&#x…

MySQL 派生表产生关联索引auto_key0导致SQL非常的慢

相同的SQL在maridb运行0.5秒,在MySQL8.0.26中运行要19秒 官方MySQL在处理子查时,优化器有个优化参数derived_merge,MySQL7开启添加,默认on.很多情况可以自动优化派生表,避免创建临时索引auto_key0和生成临时表数据做…

图文详解Ansible中的变量及加密

文章目录一、变量命名二、变量级别三、.变量设定和使用方式1.在playbook中直接定义变量2.在文件中定义变量3.使用变量4.设定主机变量和清单变量5.目录设定变量6.用命令覆盖变量7.使用数组设定变量8.注册变量9.事实变量10.魔法变量四、JINJA2模板五、 Ansible的加密控制练习1.用…

PPS文件如何转换成PPT?附两种方法

在工作中,PPS文件的使用还是很广泛的,因为作为幻灯片放映文件,点击后就能直接播放,十分方便。但如果想要修改PPS里的内容,PPS是无法编辑的,我们需要把文件转换成PPT,再进行修改。 那PPS文件如何…

数据结构---时间复杂度

专栏:数据结构 个人主页:HaiFan. 专栏简介:开学数据结构,接下来会慢慢坑新数据结构的内容!!!! 时间复杂度前言1.算法效率1.1如何衡量一个算法的好坏1.2算法的复杂度2.时间复杂度2.1大…