MySQL第二讲 - 数据表简单操作 与 “增删查改的开头部分- 增”- 细节狂魔

回顾上篇博客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和1 char[]
tinyint 1字节 Byte signed char
smallint 2字节 Short short int
int 4字节 Integer int
bigint 8字节 Long long long int
float(M, D) 4字节 单精度,M指定有效数字长度,D指定小数位数。会发生精度丢失 Float float
double(M,D) 8字节 Double double
declmal(M,D) M/D最大值+2 双精度,M指定长度,D表示小数点位数。精确数值 (更精确) BigDecimal char[]
numeric(M,D) M/D最大值+2 和DECIMAL一样 BigDecimal char[]

扩展资料:
数值类型可以指定为无符号(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字节 可变长度字符串 String char[]
test 0-65,535字节 长文本数据 String char[]
mediumtest 0-16 777 215字节 中等长度文本数据 String char[]
blob 0-65,535字节 二进制形式的长文本数据 byte[] char[]

介绍

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


日期类型

数据类型 大小 说明 对应java类型
datetime 8 字 节 范围从1000到9999年,不会进行时区的检索及转换。 java.util.Date、java.sql.Timestamp
timestamp 4 字 节 范围从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 配置文件的方式来进行处理。

在这里插入图片描述


这篇博客就写到这里,在下一篇博客MySQL - 对数据表进行“增删查改”的基础操作 - 细节狂魔

正文到此结束
评论插件初始化中...
Loading...