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 个表这样的操作,才会触发一次报错...... 指不定又过了多久,这样的报错积累到一定程度,才触发报警.....

相关推荐
月光水岸New1 小时前
Ubuntu 中建的mysql数据库使用Navicat for MySQL连接不上
数据库·mysql·ubuntu
狄加山6751 小时前
数据库基础1
数据库
我爱松子鱼1 小时前
mysql之规则优化器RBO
数据库·mysql
chengooooooo2 小时前
苍穹外卖day8 地址上传 用户下单 订单支付
java·服务器·数据库
Rverdoser3 小时前
【SQL】多表查询案例
数据库·sql
Galeoto3 小时前
how to export a table in sqlite, and import into another
数据库·sqlite
人间打气筒(Ada)3 小时前
MySQL主从架构
服务器·数据库·mysql
leegong231113 小时前
学习PostgreSQL专家认证
数据库·学习·postgresql
喝醉酒的小白3 小时前
PostgreSQL:更新字段慢
数据库·postgresql
敲敲敲-敲代码3 小时前
【SQL实验】触发器
数据库·笔记·sql