MySQL - 对数据表进行“增删查改”的基础操作 - 细节狂魔

疑问时刻:当插入 N 行数据,insert 插入命令 : 一次插入一行(需要插入N次) 与 一次插入多行数据,有什么区别吗?

首先,从数据的角度来看,同时插入两行相等数据,分别对其进行一次插入一行 与 一次插入多行数据操作,两者存储数据不会存在差异,是一样的。

但是从插入数据的效率上看,一次插入多行数据 比 一次插入一行数据 要高出不少。【一次多行插入数据 速度是 一次一行的 好几倍】

在这里插入图片描述

通过上面的分析:我们很容明白,当行数一多,或者列数一多的时候,服务器做出相应的时间就越长(因为数据很多)。你又是一次一行的插入,那么这个时间效率非常的低。

如果我们一次多行插入数据,一步到位,那么服务器就省去了多余响应,一次性返回总的结果。

时间效率效率大大提升!!!


查找语句(基础操作) - select关键字 - 重点!!!!!!!!


我们说是“增删查改”,但是“增删改”都非常简单!

只有 “查” 有难度。

查找语句是 SQL语句 / 命令 中 最核心,也是最复杂的操作

这么说吧:如果我们掌握了 查找语句,就基本上可以认为MySQL通关,后面也就没什么难点了。


1、最基础的查找:全列查找

全列查找:就是直接把一个数据表中的 所有列 和 所有行 的数据,全部查找出来!

命令格式: select * from 表名;

在MySQL中,* 就叫做 “通配符”,表示一个数据表中的所有列。

【博主只记得:在Java的泛型的语法中涉及通配符的概念。符号 为 ?】

可以这么理解, * 就相当于万能wlan钥匙,什么 wlan 都能连。

只不过 * 匹配的是 列/字段。


为了方便后面的功能演示,请大家创建如下面所示的数据表,并将输入插入到该数据表。

在这里插入图片描述

在这里插入图片描述


效果图

在这里插入图片描述

通过 select 关键字 的 全列查找灵敏,把一个表中所有的行与列的数据全部找到。

查找的结果以一个表的形式呈现出来,注意!这个表是一个 “临时表”

为什么说这个打印出来表 是 临时表呢?

这是因为我们都知道数据库的 表 都是存储在硬盘上的。

原理是当服务器接收到客户端的“请求”之后,进行查找数据,将找到的数据整合发送给 客户端(数据还在硬盘没有改变,你可以理解为客户端拷贝了这一份“响应”),客户端再将“响应接收“”,解析,显示(这时候数据是在内存上操作的)。当显示以后,内存中存储这些数据的空间也就被释放了。

注意!在操作的过程中,硬盘上的并没有发生变化。因为客户端此时操作数据只是一份拷贝数据,属于一次消耗品。

在这里插入图片描述


拓展 : select * from 表名; 这个操作其实是一个危险操作!

为什么说 select * from 表名; 是一个危险操作?

理由很简单,我们 上篇博客讲了 “环境”的配置。你可以想象一下:如果是生产环境中的数据,少说也有几个T吧,你这条SQL通过网络发送 服务器,服务器接收到请求就会开始操作起来。

由于数据量庞大,服务器疯狂读取硬盘的数据,而一个机械硬盘的读取速度也就是几百兆左右,也就是说会把硬盘的IO 瞬间吃满,同时MySQL服务器又会立即返回找到数据作为响应给客户端。

【注意MySQL服务器 是找到符合条件的数据,就将其返回。不是说全部找到后,打包给客户端。】

因为 客户端 与 服务器是通过网络来交互的,再结合上面所述:服务器返回数据量也是非常大的。

这就会造成另外一个结果:把你的网速吃干净。专业术语来说:把网卡的带宽吃满。

【网卡的访问速度跟机械硬盘差不多。好的网卡 上 万兆的都有,比如王思聪家的电脑。但是呢,数据量还是很大的】

简单来说:对生存环境的数据,进行select * from 表名; 这个操作,我们的硬盘和 网卡都会被瞬间吃满,导致服务器卡死(繁忙),此时如果有客户想提出的任何“请求”,或者只是想链接服务器,服务器都没有那个时间去处理。

这就跟 LOL 战斗之夜的一区艾欧里亚 登录排队是一个效果。每一个人的账号数据都存储在服务器中。登进去肯定是要访问自己的账号信息的,但是呢,登录的人是在太多,服务器需要处理很多的数据,此时别说玩,你连登录都是一个问题。


得出结论:一旦 服务器的硬盘和网络被吃满,此时我们的数据库服务器就难以对其它客户端的请求作出响应。

而生产环境的服务器,无时不刻要向 普通用户提供响应。这就导致客户进不去,或者说网络不响应,再者就是响应时间太长等问题。

简称: 数据库累成“狗”。


为了预防这种情况的发生。

在实际开发中,一般公司都会对 SQL 的执行时间做出监控

一旦发现出现了这种长时间执行的 ‘慢SQL’,就会强制终止这个SQL 语句的运行,并删除它。

总之:在以后工作的时候,用之前先掂量掂量,以免对公司实施毁灭性打击。同时也是对你自己的毁灭性打击。


2、指定列查询 : 只查询自己想要的那一列数据

命令格式:select 列名,列名… from 表名;

查询的时候,显式的告诉数据库要查的是那些列。

数据库就会针对性的进行返回数据。(返回的结果,还是一个 “临时表”)

简单再说明一下临时表: 在客户端内存上临时保存一个数据表,随着打印的进行,内存就会被释放。

临时表的结果对于数据库服务器中的原始数据没有任何影响。

不要看了下面的结果,就认为改动了原始的数据。

在这里插入图片描述

相比于前面的全列查找,这种指定列查询就要高效很多,

后面在工作中接触数据库中,一个表至少有十几列都是很正常的,这种 指定列查询 不仅效率高,涉及到数据传输量不是很大。

因此,,这种 指定列查询 操作,在以后的开发中是会经常用到的。


3、指定查询字段为表达式

在查询的时候,同时进行一些运算操作(列与列之间)

例如:考试结束之后,我们预估语文成绩 比实际成绩高10分。

命令格式:select 列名表达式,列名表达式… from 表名

在这里插入图片描述

这个结果还是一个临时表,意思就是 硬盘上原始数据并没有改变。改变只是临时表中的数据。

在这里插入图片描述

再次强调: select关键字的操作,不会影响到硬盘上的原始数据。


现在我们再练习一个例子,要求这些 “同学“的总成绩

在这里插入图片描述

但是,这里面还存在一些细节问题。来看下面

在这里插入图片描述

上述操作,都是针对 一列或者多列来进行的运算操作。

也就是针对指定的列中每一行的数据都进行相同的运算。

代入例子中:指定 语数外 三列的成绩相加,也就是将 每一行“同学”的 三列成绩相加。

行与行之间,数据互不影响。【你算你的,我算我的】

另外, 指定查询字段为表达式 的 运算方式,各种算术运算方式都是可以。


4、别名(关键字 as):指定查询字段为表达式,给表达式取个名字

前面计算总分的时候, 打印出的临时表,总分的表头名很长。

在这里插入图片描述

于是乎,我们就想:能不能给这个表达式换个名字,让打印出临时表看起来更舒服一些~

故,便有了别名(关键字为 as)。

它的语法格式:select 字段表达式 as 新名字 from表名;

在这里插入图片描述

另外,注意一点: as 是可省略的(表达式 与 别名 之间用空格隔开)。打印效果是一样的,但是代码的阅读性不高。

在这里插入图片描述

【ps:不要搞事情,说不写就不写。一个优秀程序员,不是说他的代码不是写得多好,多精简!而是看他代码的可读性高不高!!!!】


5、针对查重结果 去重 - 关键字 distinct

j针对查询的结果,把重复的记录去掉。【相同的数据,只能存在一个】

语法格式:select distinct 指定的列名 from 表名;

在这里插入图片描述

注意!如果是针对多个列来进行去重(上面是对单列进行去重),去重的条件:多个列的值都相同的时候,才视为重复。

在这里插入图片描述

你可以这么理解:多列去重的时候,执行去重操作的话。每个列直接就剩一个元素。


6、排序 :关键字(order by)

这里的排序针对于 查询的结果(临时表)进行排序。【不会影响到数据库服务器上的原始数据。说白了就是不会影响硬盘上的原始数据】

命令格式:select 列名… from 表名 order by 列名 asc(升序) / desc(降序);

意思就是:select选择的列,根据 order by 后面指定列,它的排序方式(sac/desc),进行排序移动。

其结果:就是 order by 后面指定列有序,其他列的数据不一定。

也就是说: order by 这种排序,只能保证至少一列有序。

在这里插入图片描述

但是!像数据库查询的结果,如果不去指定排序,此时查询结果的顺序是不可预期的。

【对应的情况是:指定的列中的 列值全部为相同的时候,无法确定谁在上,谁在下】

简单来说就是不要太过于依赖默认的顺序。


细节拓展
当指定排序的列中,含有NULL

有的数据库记录中是带有NULL值得,像这样的 NULL 认为是最小的(升序在最上面,降序在最下面)

【小拓展: NULL 和其他值进行运算,其结果还是 NULL,NULL 可以看作最小值,但和零没关系】

在这里插入图片描述


排序也可以依靠表达式或者别名来进行排序

下面我们就以总成绩来进行排序(下面演示升序,降序就没必要了,就把 asc 改成 desc就行了)

在这里插入图片描述


排序也可以字符串类型数据库

在创建数据库:可以指定数据字符集的校验规则【命令:collate 校验规则;】

校验规则:描述字符之间的比较关系。

比如 英文之间的比较,忽略大小写,那么这个时候就不是按照字典序进行排序的。

而且字典序只是针对英文,如果你拿个中文,就没有什么作用。

而且 字符集有很多种,并不一定就是字典序。

所以说 字符串类型的数据,排是可以排序的,但不一定是字典序。

话说回来:用字符串去排序还是很少的。主要还是用数字去排序

所以,这里只要了解就行了,就不做过多的讲解。


order by 可以 指定 多个列进行排序

先根据第一个列进行排序,如果第一个列结果相同,相同结果之间再通过第二个排序,以此类推

命令格式:select 列名,列名… from 表名 order by 列名,列名;

在这里插入图片描述

指定多个列的目的:就是为了避免指定一个列时,如果这个列中所有的列值都是相同的,那么彼此之间的顺序是无法确定的。

如果指定了多个列的时候,还可以根据其它列的数值进行排序。从而就能预期到彼此之间的顺序。


知识铺垫 - 为select 的 第七种操作铺垫

比较运算符

| 运算符 | 说明 |

| — | — |

| >, >=, <, <= | 大于,大于等于,小于,小于等于 |

| = | 表示比较相等,NULL 不安全,例如 NULL = NULL 的结果是 NULL,NULL会视为是假,条件不成立 |

| <=> | 表示比较相等,NULL 安全,例如 NULL <=> NULL 的结果是 true(1),条件成立 |

| !=, <> | 不等于 |

| between a0 and a1 | 范围匹配,[a0, a1],如果 a0 <= value <= a1,返回 true(1) |

| in (option, …) | 如果是 option 中的任意一个,返回 true(1) |

| is null | 专门用来比较NULL的,是否为NULL |

| is not null | 专门用来比较NULL的,判断是否 不是 NULL |

| LIKE | 模糊匹配。% 表示任意多个(包括 0 个)任意字符;_ 表示任意一个字符 |


逻辑运算符

| 运算符 | 说明 |

| — | — |

| and (逻辑与 &&) | 多个条件必须都为 TRUE(1),结果才是 TRUE(1) |

| or (逻辑或 双竖线) | 任意一个条件为 TRUE(1), 结果为 TRUE(1) |

| not(逻辑非 !) | 条件为 TRUE(1),结果为 FALSE(0) |


注意:

1、where条件可以使用表达式,但不能使用别名。

2、 and的优先级高于or,在同时使用时,需要使用小括号()包裹优先执行的部分


7、select 中的 条件查询:关键字 where

在 select 查询语句的后面加上一个 where 语句,后面跟上一个具体的筛选条件。

命令格式:select 列名,列名… from 表名 where 筛选条件;

作用:把查询结果中满足筛选条件的记录保留,把不满足筛选条件的记录给过滤掉。


基本查询

在这里插入图片描述


and与or

在这里插入图片描述

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

最后

分享一些系统的面试题,大家可以拿去刷一刷,准备面试涨薪。

这些面试题相对应的技术点:

  • JVM
  • MySQL
  • Mybatis
  • MongoDB
  • Redis
  • Spring
  • Spring boot
  • Spring cloud
  • Kafka
  • RabbitMQ
  • Nginx

大类就是:

  • Java基础
  • 数据结构与算法
  • 并发编程
  • 数据库
  • 设计模式
  • 微服务
  • 消息中间件

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?

程序员,每个月给你发多少工资,你才会想老板想的事?
ng

  • Spring boot
  • Spring cloud
  • Kafka
  • RabbitMQ
  • Nginx

大类就是:

  • Java基础
  • 数据结构与算法
  • 并发编程
  • 数据库
  • 设计模式
  • 微服务
  • 消息中间件

[外链图片转存中…(img-E88vJt4p-1712097492342)]

[外链图片转存中…(img-Hs78UJ93-1712097492342)]

[外链图片转存中…(img-kFPIB4TI-1712097492343)]

[外链图片转存中…(img-tDvFuz3n-1712097492343)]

[外链图片转存中…(img-L7UEqbRd-1712097492343)]

[外链图片转存中…(img-gpxNNW80-1712097492344)]

[外链图片转存中…(img-0OwWvqJa-1712097492344)]

[外链图片转存中…(img-4IilKORg-1712097492344)]

[外链图片转存中…(img-0KobeeiH-1712097492345)]

  • 11
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值