MySQL第二讲 - 数据表(上)- 细节狂魔

x33g5p2x  于2022-03-06 转载在 Mysql  
字(7.6k)|赞(0)|评价(0)|浏览(1110)

前文知识点回顾

回顾上篇博客MySQL的 初步认识的知识点。
1、数据库是一类软件
2、数据库是管理数据的软件,往往把数据存储在硬盘上(持久化存储)
3、数据库主要功能还是增删查改
4、数据库软件三巨头:MySQL、Oracle、SQLServer
5、MySQL 是 客户端 - 服务器 结构的软件。
6、在控制台的任何一个命令,本质上都是通过网络的方式。和服务器进行了交互。
7、客户端:主动发起请求的一方;服务器:被动接受请求的一方。
8、客户端给服务器发的数据称为“请求”,服务器给客户端反馈的数据称为“响应”。

关于“数据库”的操作 ---- 此处所提到的数据库,指的是一些逻辑上的数据集合。
一个 MySQL 服务器,可以同时管理多个这样的数据集合。

SQL语句 》》操作指令 (不区分大小写)
1、显示数据库:show databases;
2、创建数据库:create database 数据库名;
【如果你的数据库名,存在SQL语句的关键字,需要反双引号``括起来】

3、选中数据库:use 数据库名;
4、删除数据库:drop database 数据库名; (危险操作,一旦删除,数据基本上是回不来了)

基于 第 4 个操作,这种删除操作,尤其对于将来工作的地方,也就是公司中一些重要的数据(生产环境的数据)是万万不能进行删除操作的。

说到生产环境,我们稍微拓展一下:以后在某公司工作的时候,涉及到几种环境(也就是电脑)。

1、办公环境:一般就是我们入职了,公司给我们配电脑(笔记本,台式,甚至是mac),也有少数公司让我们自己带电脑。说白了就是 一台用于工作的电脑。
【我也了解了一下:大概就是 8核CPU,16G内存,512G硬盘 这样的配置】

2、开发环境/测试环境:一般就是以服务器的形式来提供的。
办公电脑 可以通过网络远程连接到你的服务器。【一般服务器的配置要高不少:16核 CPU,64G内存,4T硬盘】
通过 开发/测试环境,来开发/'测试代码。
有些项目程序跑起来是非常吃资源的,一启动内存就会被吃到几十个G 甚至上百G。
这时候用自己的办公电脑肯定是跑不动的,这时候就需要一个专业的开发环境。
(如果开发的程序比较小,这个时候有可能就没有开发环境了。那么就直接使用办公电脑来开发。具体要看是什么项目)

3、线上环境/ 生产环境
也是以服务器的形式来提供的,办公电脑也可以通过网络远程连接上去。
【这个机器一般是最好的!大概 就是 56核CPU、256/512G内存,若干T的键盘】
有的朋友会惊讶到 512G的内存?这要说了,CPU虽然贵,但是不代表它不能做大。
尤其是服务器的主板上它有很多的内存接口,全部插满的话,内存可以达到上T 级。
如果你们不差钱,完全可以怼出这样一个高内存的电脑。
这机器的主要作用:运行程序,然后给外面的用户提供服务。
说白了,生产/线上 环境 就是直接用来给 客户 提供 访问的环境。
如果生产环境挂了,用户可能就直接访问不了了。
注意!生产环境万万不能挂的!!每挂一分钟,都可能给公司带来非常大的损失!!
我们作为程序员的核心任务:保障生产环境的机器能够稳定运行。

举个例子:
我们要是把生产环境的数据给删除了,会有什么后果呢?
比如我们现在处理的是一个游戏的服务器,里面存有玩家信息。
比如:dnf 玩家仓库的装备。
只听趴的一声,你把数据一删!完蛋,玩家要拿着刀来砍你。
对于用户的体验肯定是非常差的!!

那么,问题来了,既然 生产/线上 环境的数据这么重要!万一被误删了,麻烦大大滴。那么,有什么办法来处理这样的问题?
1、权限控制。【就是说你没权限,你就动不了这个数据。类似电脑的管理员权限一样】
2、备份【多弄几份】,一旦被删除,还有备份数据库。做到损失最小化。
【有朋友可能会有想法:有没有可能在删除数据库的时候,将备份的数据也全删除了】
答案:肯定也是有可能的!但一定不可能是“误删的”!只可能是 “故意的”。
那么,这个朋友就可以直接入狱,包吃包住,做公益劳动。至少 包个几年。

至此,上篇博客的回顾到此为止。

正文 :数据表的操作

什么是数据表?

谈到数据表,我们就不得不说到:MySQL 管理数据的方式。

描述数据表中列的信息

为了描述这个数据表中列的信息,我们需要在创建数据表的时候,指定 “表头”。
这个所谓的“表头”,就是一个表格中 第一行的描述信息。

表头:描述了表格一共有几列,每一列是什么意思,每一列是什么类型。
到这里,MySQL 数据库 对 数据的具体组织形式,我们讲完了。
注意!这里是MySQL对数据的组织的形式。并不意味着其它的数据库也是一样的数据组织形式。
MySQL、Oracle、SQLServer 都是数据表的组织形式,被称为“关系型数据库”。
Redis、Hbase、MongoDB 不要求按照表格方式进行组织。
它们的处理方式:类似于 文档 / 键值对,这种关系,称为“非关系类型数据库”
什么意思呢?就是所每一行的数据,可能类型不一样,参数个数不一样。关系不要表格那样严格。

MySQL 中 对于 数据的操作

知识铺垫 - MySQL 中的数据类型

创建表之前,我们需要先简单认识一下 MySQL 中的数据类型。

数值类型

SQL 出现的时间很早,所以SQL类型的写法会与我们平常的类型写法有所不同。

数据类型大小说明对应java类型对应C类型
bit[ (M) ]M指定位数,默认为1(取值0~1)二进制数,M范围从1到64,存储数值范围从0到2^M-1常用Boolean对应BIT,此时默认是1位,即只能存0和1char[]
tinyint1字节Bytesigned char
smallint2字节Shortshort int
int4字节Integerint
bigint8字节Longlong long int
float(M, D)4字节单精度,M指定有效数字长度,D指定小数位数。会发生精度丢失Floatfloat
double(M,D)8字节Doubledouble
declmal(M,D)M/D最大值+2双精度,M指定长度,D表示小数点位数。精确数值 (更精确)BigDecimalchar[]
numeric(M,D)M/D最大值+2和DECIMAL一样BigDecimalchar[]

扩展资料:
数值类型可以指定为无符号(unsigned),表示恒为正数。(C有这种类型,Java没有)
1字节(bytes)= 8bit。
对于整型类型的范围:
1、有符号范围:-2 ^ (类型字节数8-1)到 2 ^( 类型字节数 * 8-1)-1,如int是4字节,就是 - 2 ^ 31到2 ^31-1

2、 无符号范围:0到2 ^ (类型字节数
8)-1,如int就是 2 ^ 32-1
尽量不使用unsigned,对于int类型可能存放不下的数据,int unsigned同样可能存放不下,与其
如此,还不如设计时,将int类型提升为bigint类型。

decimal 类型 - 简单介绍

平时我们提到的浮点数(float,double)根据国际标准 IEEE(电气和电子工程协会) 754(IEEE 754这是一个标准,规定浮点型在内存中如何存储),任何一个二进制浮点数 V 可以表示下面的形式:
(-1) ^ S * M * 2 ^ E
(-1) ^ S 表示 符号位,当 S = 0,V 为正数;当 S = 1,V 为负数( -1 的0次方是1,-1的1次方是 -1 )
M 表示有效数字,大于等于1,小于2.
2^E 表示指数位

想要了解更多信息,可参考这篇文章data_structural(数据结构),这是很久以前写的博客,没有目前,耐心往下翻,找到浮点型就有相对应的介绍。

但是这种规则表示浮点数,最大的问题,就是对于有些数字来说,不能精确的表示一个小数。(也就是说存在误差)
对于算钱的领域,这种规则就很讨厌。
但是 decimal 类型,就可以精确的表示小数。在Java 也有对应的 BigDecimal类型 具有相对应的功能

这里面 int 和 double 类型用的最多。

字符串类型

数据类型大小说明对应java类型对应C类型
varchar (SIZE)0-65,535字节可变长度字符串Stringchar[]
test0-65,535字节长文本数据Stringchar[]
mediumtest0-16 777 215字节中等长度文本数据Stringchar[]
blob0-65,535字节二进制形式的长文本数据byte[]char[]
介绍

varchar 是我们用的最多。 varchar 可以根据需要来指定要占用多少空间, varchar括号里的size的单位是 字符(一个字符可以是由多个字节构成)。
test 跟 varchar 差不多,test 会根据我们的字符串长度,它自动确定容量和扩容。
mediumtest,就是 比 test 表示的字符串更长。
blob:对应的是二进制数据,比如 MP3文件,jpg文件…都属于二进制文件。
像txt,java,c 都属于文本文件

日期类型

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

有人会有一个想法:日期在数据中是否可以按照字符串的方式来表示?
用 varchar 表示日期,答案是可以的。但是!不好!因为用varchar表示日期,就失去了堆日期的校验功能,不会去判断当前的这个日期是否合法,比如现在我们有一个日期为 2022-01-50,它就会直接表示。
如果是用上面的两个类型,就会提示我们有错误。起了一个校验的功能。
timestamp 与 datatime 最大的区别:timestamp 能够表示的时间非常有限。
拓展:时间戳概念:以1970年1月1日 0 时 0 分 0 秒 作为基准时刻,来计算当前的时刻和基准时刻的秒数/毫秒 之差。
timestamp 可以表示时间到2038年,就不够用了。到时候要看大佬们怎么处理这个问题。
小常识:
千年虫问题 :以前计算机表示年份只有2位,90,91,92,。。。。。。到了00年,所有电脑都产生了问题。

第一个操作: 创建数据表

创建 数据表命令:create table 表名(列名 类型,列名 类型…)
注意,再进行表操作之前,要先选中数据库【 use 数据库名;】

第二个操作:查看选中的数据库中的数据表

命令语句:show tables; 【不要怀疑自己的想法,就是跟 查看数据库的命令 show databases; 是一样的,只是换了个查看对象】
这个操作的前提也是先选中数据库。

第三个操作:查看数据表结构

查看某个表里面有几列,每一列都是啥类型,每一列的它的表头的名字,每一列其它的补充信息。

查看数据表结构的命令:desc 表名;
【desc 是 describe 单词的缩写 》》》 是 描述、描绘、形容、描写的意思】
这个命令表达的意思很直接:就是 将我们指定的数据表 给 描述出来。

第四个操作 : 删除表

删除表 命令 : drop table 表名; 【删除库 : drop database 库名;】
跟删除库的操作是一样的,删除表也是一种危险操作。 - 谨慎对待 - 严重程度是一样的,删除了,多半是恢复不了的。

小结

数据库 和 数据表的 这 8 个 操作,都是SQL中最常用的命令。大家一定要熟练的使用。
当然,这只是一部分,还有很多命令没有讲。我们现在只是先学习简单操作。
比如说“”对于数据表其实还有一个操作:通过 alter 关键字,去修改表的结构,或者赋予一些权限。
但是这个不是现在的重点,现在的重点是 : 掌握基础操作。

拓展

拓展一 : 创建数据表的一些细节问题

1、使用comment增加字段说明

2、使用 (-- + 空格 + 注释) 增加 字段/操作 说明

– + 空格 + 注释 ,这种注释方式 的 空格是不能省略的,其实类似 我们敲 c 或者 java 代码时的 // 的作用时一样的,都是注释作用。

博主更对剑这种注释的方式,简单,阅读性 比第一种 更高。

拓展二 :练习

有一个商店的数据,记录客户及购物情况,有以下三个表组成:

商品goods(商品编号goods_id,商品名goods_name, 单价unitprice, 商品类别category, 供
应商provider)

客户customer(客户号customer_id,姓名name,住址address,邮箱email,性别sex,身份证
card_id)

购买purchase(购买订单号order_id,客户号customer_id,商品号goods_id,购买数量nums)

根据上述条件,创建三个对应的数据表。

注意事项

在 商品的表中 :单价unitprice,它肯定是用来表示钱的。
因此我们有两种方法;
1、使用 decimal 类型(java 就是 BigDecimal)
2、使用 int 类型
这里,我讲一下 为什么可以用 int 来表示 钱?
看到 int,我们脑中 的 第一个想法:一块,二块…几百块。貌似没问题。
但是 角 和 分 呢?
所以,我们要在这里讲一下:这里 的 int 其实表示 分,而不是元。
这是一个常见的用法:因为 使用 int 来表示钱,它的运算效率比 decimal 更高、
所以,一般情况下,表示钱:int 和 decimal , int 用的更多
进制 :1元 = 10 角/毛 = 100分。

另外,注意 列表的名字不能是 -(容易和运算符搞混) ,下划线是可以。通过上面的题目,你也可以发现它们用的是下划线。

结果图

细节拓展一:关于笔记本的

有些朋友先自己电脑自带的笔记本很low,不想用。
我的建议是 :下载一个 SublineTest 笔记本,比较好运,直接百度上官网下载就行了。

第二种 :用 idea 写
先打开idea,进入之后,不用管 在哪一个项目。

另外说一下,idea 最好还是使用 社区版的。免费的“zhuanye版”,自己用用倒无所谓,但是以后在公司办公的时候,就不能用了!!!
要么用公司给我们买的,要么就使用社区版。这里涉及 banquan问题。自己注意一下。【博主还在学习中,还没有参加工作,所以就。。。。。。是吧!】
idea 和 社区版 的 差别 就是 少一丢丢功能,这些功能可以通过额外的插件方式来解决。可以自己上网搜。反正博主目前没有这个想法,懒。。。。。
虽然 应 idea 写的很舒服,但是启动太慢了。
如果不是特别的代码量,还是笔记本方便一些。

还有第三种: vs - code 软件 -(注意还是 复制粘贴的方式来操作)
这软件,博主不是很会用,不知道是用了什么什么插件,反正效果可以达到 idea 一样丝滑效果。

细节拓展二 :赋值粘贴

从笔记本 复制粘贴到 cmd窗口很简单。
但是 cmd 窗口的复制,就有点不一样:鼠标选中你想复制的内容,然后,回车。即使赋值成功了

在 cmd 中,Ctrl + c 表示 中断当前的输入
【比如:一个 sql语句输入到一半,你不想要了,Ctrl + c ,直接清空,重新输入】

细节拓展三 : 为什么我在创建表的,关于字符类型的数据,我给的 50 个字符的空间?

那么问题来了: varchar 后面括号中的数字,我能随便改吗?
答案:如果是对于目前这个情况的代码,可以随便写。
但是如果在实际情况中,既不能轮写了。
一般情况下,像这种字符串的长度,都会有明确的规定:最长多少;最短多少。
我们需要按照它的规定,来确定我们填入的数字。

题外话: 这个规定 是由 将来公司中产品经理(PM - Product Manager)所决定的。
PM 是互联网公司中的一个重要岗位,工作的职责就是 “提出需求”。
也就是说 一个 问题的提出,具体解决什么问题,解决到什么程度,那些要解决,那些不能解决,这些都是由产品经理来统一规划和决定的。
这也是我们程序员 今后打交道最多的岗位。“名副其实的死对头,所有不合理要求的始作俑者(当然也有可能是客户提的)”。

要知道大部分的产品经理是不懂技术的,懂技术的非常少!
很多时候,她提的要求:大部分都是 xia bb的。

不知道大家有没有听说过一个新闻
大致内容:PM 要求 程序员 实现一个程序,能让app的主题颜色 随着 手机套 颜色 而改变app主题。
然后就打起来了。。。

可能有些朋友不太理解,这不能做到吗?
答案:几乎不可能的。
理由:把你的手覆盖你的一只眼,你那只眼绝对看到黑暗。 手机和手机壳也是这样的情况。
那么它还能获取到外部手机壳颜色信息吗?不能!先不谈程序能否接收到外界的颜色数据,光是获得外部颜色数据都是一个大问题!
想要实现这样的一个app,已经不能说是做app了。可以说是重新造一个手机了(硬件是关键,通过硬件获取外部数据,处理后,传给程序)。也就是说还需要为 这款app 专门造一个手机来装载这个程序。
这就很过分了 !!! 这种想法不切实际。一般公司都搞不起!

不过,如果是妹纸的话,五官非常nice,那么。。。。也是能忍忍的。私底下解决问题。

后续的一组关于 SQL 的操作 : 增添改查 - 重中之中

如果此时的你们已经打开了MySQL,在跟着敲。 先看下面最大标题的 5 :我还提示了的。(要不然可能会有意外)

增删改查 又称为 CURD.
C: create ->创建
U:updata -> 修改
R:refer -> 查询
D:delete -> 删除
如果我们以后在公司里,如果是一个 “后端开发”。
日常中很多工作都是在进行 CURD.

增 - 往数据表里插入数据

数据表里插入数据 的 命令: insert into 表名 values(列的值);

注意事项

1、values 后面的 括号中的 字段个数 和 表头列数,以及 字段类型 和 每一列的数据类型,都要匹配。

2、在 SQL 中 ,字符串 是 不区分 ’ 和 " 的

3、如果数据是 日期类型的数据,此时如何进行插入呢?

1、通过指定格式的字符串来插入一个指定时间
2、通过 now() 函数 来插入入一个当前系统的时间。
下面我们来演示一下:

4、insert 在进行插入的时候,通过指定插入的表头,就可以直插入某一列或者几列的数据(不用列值的个数 与列数相匹配)。此时其他的列将采用默认值

不要疑惑,values后面的括号中列值,确实是需要 与 列数 和 列的参数类型要匹配。
而我们现在,是指定插入的 表头 / 列。
指定插入命令: insert into 表名 (表头参数列表) values(具体要插入列值)

5、这个我特意放大标题 :先来看这个,因为如果你不看这个,在跟着我上面的步骤 敲代码的时候,会出问题。

来看问题:如果插入的数据包含中文,你们在 没有修改编码字符集的情况下,你们插入数据的操作会失败。

这是因为MySQL的默认编码方式为 拉丁文,而这种编码方式无法表示中文,从而造成了 编码的字符集 不匹配,提示错误。
解决方法:把数据库配置修改成支持中文的编码方式。
即配置成 utf8 编码方式,或者 utf4mb。
配置方法如下

配置编码方式

1、 先查看一下当前的数据库的编码方式

命令:show variables like ‘character%’;

如果你已经是 utf8 了,那么你就不用管了。

2、 通过修改 MySQL 配置文件的方式来进行处理。

这篇博客就写到这里,剩余的 “增删查改”的功能,在下一篇博客中讲。

相关文章

最新文章

更多

目录