MySQL基础(二)

目录

[一. 数据库命令行基本操作指令](#一. 数据库命令行基本操作指令)

[1. 查看当前有哪些数据库------show databases;](#1. 查看当前有哪些数据库——show databases;)

[2. 创建数据库------create database 数据库名 charset utf8](#2. 创建数据库——create database 数据库名 charset utf8)

[3. 选中数据库------use 数据库名;](#3. 选中数据库——use 数据库名;)

[4. 删除数据库------drop database 数据库名;](#4. 删除数据库——drop database 数据库名;)

[二. 常用数据类型](#二. 常用数据类型)

[2.1 数值类型](#2.1 数值类型)

[2.2. 字符串类型](#2.2. 字符串类型)

[2.3 日期类型](#2.3 日期类型)

[三. 数据表的操作](#三. 数据表的操作)

[3.1. 查看数据库中有哪些表 ------ show tables;](#3.1. 查看数据库中有哪些表 —— show tables;)

[3.2. 创建表 ------ create table 表名 (列名 类型, 列名 类型, ....);](#3.2. 创建表 —— create table 表名 (列名 类型, 列名 类型, ....);)

[3.3. 查看表的结构(表详情)------ desc 表名;](#3.3. 查看表的结构(表详情)—— desc 表名;)

[4.4. 删除表 ------ drop table 表名;](#4.4. 删除表 —— drop table 表名;)


一. 数据库命令行基本操作指令

tips:

  1. 令行中,鼠标选中文本,按下 enter 键是复制,鼠标右键是粘贴。
  2. 命令行中的每一条语句都要以 ; 结尾。
  3. 指令不区分大小写
1. 查看当前有哪些数据库------show databases;

输入 'show databases; ' 后,就显示出 当前的数据库服务器上有哪些数据库(此处的数据库是 数据集合)

(会显示至少4个数据库,具体作用在数据库进阶中会介绍)

2. 创建数据库------create database 数据库名 charset utf8

输入'create database 数据库名;' 后,形如下面的提示就表示创建成功

(这里显示的0.00意思是创建数据库消耗的时间不足10ms)

注意事项:

  1. 创建数据库的名字,也不能和已有数据库名字重复
  2. 创建数据库的时候,数据库的名字,不能和 SQL 中的 "关键字" 重复(像create、show、database、databases......)

不过,也有办法让关键字成为数据库名------创建数据库的时候,给数据库名加上反引号:`

(比如创建一个数据库表示"订单order",order刚好也是SQL中的关键字)


创建数据库的时候,还需要指定数据库的"字符集charset",往往是开发中很关键的环节。

首先,了解一下什么是 "字符集":

一个中文汉字占几个字符?------ 取决于当前的字符集。使用不同的字符集,对应的字节数是不同的。计算机本质上存储二进制数据,就需要约定好不同的数字表示不同的字符。对于英文来说,使用 ASCII码表 就足够了;但是对于其他语言文字(比如 中文),这个表就无法表示了。因此,需要引入更大的字符表,使用不同的数字,对应到不同的语言文字。

不同的组织,提出不同的 编码方案(有不同的表格),因此,同一个汉字在不同编码方案中,对应的数字也是不一样的。但是,存在太多的编码方案 会出现兼容问题,随着时间发展,大部分的编码方案都逐渐消亡。
------目前常用的汉字编码方案有两种:

1)GBK 主要是在中国大陆使用(GBK 只能表示简体字,港澳台繁体字无法表示)

Windows 简体中文版,默认编码方式就是 GBK,此时一个汉字使用 2个字节 表示;之前使用 VS 编写代码,此时打印的一个汉字也是 2个字节。

2)UTF-8 (也可以写作 UTF8 或 utf8 或者 utf-8)属于变长编码,表示不同的符号,可能用 1-4 个字节来表示。
对于中文汉字来说,一般是 3个字节 表示。UTF8 是当前世界上最流行的编码方式,不仅仅能表示中文,也能表示世界上任何一种语言文字。
如果不能正确指定字符集,后续想保存中文,可能会出现问题。比如,mysql 5 默认的字符集是 "拉丁文",此时如果尝试插入中文数据,就会插入失败;mysql 8 的话默认就是 UTF8。


因此,在创建数据库时,还需要指定数据库的 "字符集" ------ create database 数据库名 charset utf8

但要注意,MySQL 上的 utf8 ,其实不是 "完全体",有些标准的 utf8字符 上可能是不支持的,比如 emoji表情。因此,MySQL 提供了一个方案,utf8mb4 在 MySQL上表示的是 完全体utf8。但 utf8mb4 是MySQL创造的,脱离MySQL之外的程序,都不认识这个字符。


在创建数据库的时候,可以指定一个简单的条件 ------ if not exists

( 如果不存在,就创建;如果存在,就什么都不做,执行成功,但是会有一个警告。)

如果只是通过命令行,一条一条输入 sql ,此时 if not exists 就没啥用;如果批量执行一组 sql (比如 把若干 sql 写到一个文件中),批量执行过程中,任何一个 sql 执行出错,都会使后续 sql 无法继续执行(强制终止了)。

( 通过 'show warnings;' 就可以查看警告 )


可以在创建数据库的时候,指定 collate 字符约束。 描述了字符串之间的比较规则, 比如 后续涉及到一些 字符串比较规则......(这里暂时不过多讨论,一般使用默认的即可)

3. 选中数据库------use 数据库名;

一个数据库服务器上,有很多的 "数据库"(类似于"文件夹"的感觉)。因此,就需要先选中某个数据库,接下来针对数据表/数据行等操作,就是针对这个被选中的数据库展开的。

4. 删除数据库------drop database 数据库名;

但是,删除数据库是一个非常危险的操作,在未来的工作中,一定要慎重!!! 数据库一旦删除,就恢复不了了!

未来工作中,数据库有很多种。有的数据库是用来测试的(里面的数据是假的,是程序员/测试工程师构造的虚假数据),有的数据库是真正使用的,称为 "线上数据库" / "生产环境数据库",里面存储的就是真实用户的数据了。 误删数据库,会带来极大损失......


------要怎样做 才能避免删库呢?

1. 控制权限 ------ 不是每个人都能操作

比如 限制普通的开发,只能对数据库进行 "读操作" ,不能修改,尤其是删库这样的操作。即使执行 删除语句,也不会真正的删除(报错)。如果确实要删库,要从相关的人员( DBA,即数据库管理员)进行申请,由人家进行操作。 DBA 一般也只是中大厂才有,小公司比较少(除非专门做数据库业务的)。

2. 要对数据库进行及时备份 ------ 拷贝出来,存储到别的地方

数据备份的一二三原则:一份数据,至少保存到 两个机器上,至少有三个副本(拷贝出三份)

但是,具体备份方案,要结合实际情况来定。

3. 让别人帮忙看着

二. 常用数据类型

2.1 数值类型

|--------------|------------|-------------------------------|--------------------------------|
| 数据类型 | 大小 | 说明 | 对应Java类型 |
| BIT[ (M) ] | M指定位数,默认为1 | 二进制数,M范围从1到64,存储数值范围从0到2^M-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 | 和DECIMAL一样 | BigDecimal类 |

1) BIT 就可以认为是一组 二进制 bit 位, BIT(10) 这个类型里就最多10个bit位。括号中最多写成BIT(64)。
2) 虽然 TINYINT 和 SMALLINT 更节省空间,但是还是更推荐使用 INT 和 BIGINT。因为 随着时间发展,硬件成本(内存/硬盘)成本是越来越低;相比之下,程序员开发成本(时间)更加尖锐的矛盾。如果因为使用 TINYINT ( -128 ~ +127) / SMALLINT( -32768 ~ +32767) 用处 bug ,这样的 bug 造成的损失,可能远远不是几个硬盘能比的.....
3) 浮点数:FLOAT(M,D) 单精度浮点数;DOUBLE(M,D)双精度浮点数。比如 定义类型的时候,写作 double(3, 1) ------ 数字长度3位,小数点后1位。后续如果针对数据库进行 插入/修改,此时新的数据就要遵循上述规则(10.0、99.5合法,1.00、1、123.0不合法)

MySQL遵守 IEEE754 标准,表示浮点数,类似于 科学计数法(二进制)的方式表示小数。很多时候,小数是不能精确存储和表示的,这就导致在进行某些计算的时候,会出现误差;也严禁使用两个浮点数进行比较相等。 如果针对浮点数,要比较相等,需要作差,看差值是否小于一定的误差范围(近似相等)。

工程上,很多时候对于误差的容忍度是比较大的;但是有些特殊情况(比如 算钱),对于误差非常小。这样的场景使用 float/double 就不合适了..... 因此就引入了更加精确的表示小数方式------DECIMAL(M,D) 和 NUMERIC(M,D)

4) DECIMAL(M,D) 和 NUMERIC(M,D) 这两种类型差别不大,一般使用 decimal 类型即可。这两种类型不再使用 IEEE754 这一套了,而是自己设定了一套存储格式。这个存储格式,相当于 "变长的",付出更多的空间与时间,使存储的数据更精确。(Java中,提供了 类BigDecimal来表示;而 C/C++ 标准库没有提供对应的功能 )

IEEE754 这一套标准,虽然有明显的缺陷,仍然成为 各种主流语言表示浮点数的方法。主要是因为 这一套标准,对于硬件(CPU, 内存)是最友好的,运算速度快,存储空间小。


上述谈到的类型,都是有符号类型(能表示负数);C语言中,也有一个无符号类型 unsigned 概念,其实在 MySQL 的类型中,也提供了 unsigned 类型。但在 MySQL 官方文档中,明确说明了不建议使用无符号类型,未来更高版本的 MySQL 中可能会被删掉....(Java中 就不存在 unsigned 类型)

**无符号类型 --> 弊大于利。**最大的问题 ------ 两个无符号类型做减法的时候,容易出现溢出,从而得到很大的整数。

2.2. 字符串类型

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

1)varchar(size) --> 可变长的字符串 (如果是定长字符串,设定小不够用,设定大浪费空间,可变长 就能很好的解决上述问题)。范围是 0~65535 (64kb)

varchar(50): 表示最大为 50 个字符
2) TEXT 也是可变长的字符串,不需要指定最大长度,完全根据你存储的数据自适应。虽然 TEXT 和 varchar 都是可变长的,但实际更倾向于使用 varchar。(因为 varchar 可以指定最大长度,程序员很容易预估出表里面的数据量有多少;而 TEXT 没法指定,大小难以预估,可能会很大)
**3)blob 存储的是二进制数据,前面的都是存储 文本数据。**一般 视频、音频、图片、可执行文件.....都是使用二进制数据存储。

计算机存储和表示数据 都是 二进制的方式。所谓的 "文本" 是一种特殊的情况,即 文本数据 里面的二进制内容,都可以在对应的码表上查询到对应的合法的字符。反之,"二进制" 内容无法在码表上查询到,或者查到的都是一些 "乱码" 之类的字符。

如果数据库存储的是 形如 "hello" 这样的字符串,使用 varchar / text 等类型;如果存储 图片/视频/音频 ,使用 blob。但blob 只能表示 最大 64kb,因此一般不建议 使用数据库直接存储图片/视频/音频。

2.3 日期类型

|-----------|--------|------------------------------|-----------------------------------|
| 数据类型 | 大小 | 说明 | 对应Java类型 |
| DATETIME | 8字节 | 范围从1000到9999年,不会进行时区的检索及转换。 | java.util.Date、java.sql.Timestamp |
| TIMESTAMP | 4字节 | 范围从1970到2038年,自动检索当前时区并进行转换。 | java.util.Date、java.sql.Timestamp |

三. 数据表的操作

对于数据表的操作 ,都要先 use 选中数据库,才能操作。

3.1. 查看数据库中有哪些表 ------ show tables;

数据库中进行一些查询操作,就会得到一系列结果数据,就把这些结果称为 "结果集"。

(set 此处表示集合)

3.2. 创建表 ------ create table 表名 (列名 类型, 列名 类型, ....);

在关系型数据库中,一个表有哪些列,每个列叫啥名字,是啥类型,都要提前确定好,后续往表里存储的数据,都要严格遵守上述类型要求。

(表示列的时候,列名在前,类型在后)

可以使用 comment 增加字段说明(注释),只能在建表语句中使用,用来描述每个列是什么意思。

也可以使用 -- / # 增加注释(更推荐使用 --)

3.3. 查看表的结构(表详情)------ desc 表名;

"desc 表名; " 用来查看表的结构(有哪些列,每个列是什么情况,类似于 "文件详情" 内容),不能查看表里的内容 。这样的内容也称为 "元数据"(Meta Data)

(表的特征 --> 列信息)

  • Field字段,即属性。
  • varchar(20) 意思是最大长度是20个字符
  • int(11) 意思是整数 "位宽" 11(int 在硬盘上存储仍然是4个字节,但是在控制台上显示的时候,最多显示11个字符这么宽) int 表示的范围:-21亿 ~ +21亿
  • Null列:yes意为可以不填写 (填表格有 "必填项" 和 "选填项")
    Default列:默认值
4.4. 删除表 ------ drop table 表名;

"drop table if exists 表名" 类似于 "create database if not exists 数据库名"

删表 是指删除数据库中的一个表,但保留数据库其它部分的操作。删表操作会影响到特定表的数据和结构,但不会影响到数据库中的其他表。

注意:删表 操作往往会比 删库 的危险更大 。 为什么呢?

------对于删库操作,一般都是第一时间就能发现问题,程序在操作数据库时,第一时间反馈出问题(监控报警系统...),处理的越及时,损失就越小;对于删表操作,就更隐藏了。比如 一个数据库有100个表,不小心删了其中一个,程序使用数据库的时候,绝大部分的逻辑都是正常的,在使用99个表的过程中,虽然数据库能访问,但是逻辑已经出问题了。不知道要过多久,才能触发一次访问到第 100 个表这样的操作,才会触发一次报错...... 指不定又过了多久,这样的报错积累到一定程度,才触发报警.....

相关推荐
Lojarro1 小时前
【Spring】Spring框架之-AOP
java·mysql·spring
梦想平凡1 小时前
PHP 微信棋牌开发全解析:高级教程
android·数据库·oracle
TianyaOAO2 小时前
mysql的事务控制和数据库的备份和恢复
数据库·mysql
Ewen Seong2 小时前
mysql系列5—Innodb的缓存
数据库·mysql·缓存
码农老起2 小时前
企业如何通过TDSQL实现高效数据库迁移与性能优化
数据库·性能优化
夏木~3 小时前
Oracle 中什么情况下 可以使用 EXISTS 替代 IN 提高查询效率
数据库·oracle
W21553 小时前
Liunx下MySQL:表的约束
数据库·mysql
黄名富3 小时前
Redis 附加功能(二)— 自动过期、流水线与事务及Lua脚本
java·数据库·redis·lua
言、雲3 小时前
从tryLock()源码来出发,解析Redisson的重试机制和看门狗机制
java·开发语言·数据库
一个程序员_zhangzhen4 小时前
sqlserver新建用户并分配对视图的只读权限
数据库·sqlserver