MYSQL的基本查询

1 .insert替换


就是插入相同的东西,你就想插入,你就可以使用后面的语句把前面的替换了。


这时候是没有发生冲突,跟插入语句差不多。

此时出现了2行受到影响,此时说明冲突了。
是先删除原来的,然后再删除。

SELECT


这个就是可以自己加一行,筛选出来。





模糊查询,%表示后面是多个字符,_代表的是就是一个字符。

为什么报错??
首先需要知道sql的执行顺序,先执行from,然后where,最后才是select,所以先执行where,此时where不知道你把这个列重命名了,因为并没有执行你,所以只能是下面这样子写。



这三个成绩升序降序的前提是前面的成绩需要相等才会排后面的,如果前面的直接大于或者小于了,此时不管后面了。


因为是先把数据通过where筛选出来,然后再进行排序的,这里没有这个where,所以就是全部数据,此时select拿到全部数据,然后再排序显示出来。所以这里是可以使用别名的。

limit

主要三种用法,第三种和第二种差不多一样,off'set后面表示从哪个位置开始筛选,这个limit后面表示筛选几个。

第一个就是回显前三条数据的意思,第二个是从第三个数据开始下标为2,到第六个数据,下标是5,最后一个是从第一个数据开始,就是前五个数据。

这个limit执行是在这个order by之后。

update

我们的这个操作是把后三名的数学成绩加30分。

我们上面如果不加where条件的话,此时就直接把这一列全部改变了。

Delete

这里也是如果不加where的话,此时就直接把全部删除了。

配合order by使用,这个个语句的作用就是删除最后一名的成绩。

再看一个需要注意的点,我们此时创建一个表,表中存在自增字段,我们也插入了内容,此时你的自增计数器的结果是4,表示我们下次插入就是4,但是此时你把表中的内容全部删除,此时这个计数器的结果还是不变的。下次插入自增字段的结果是4.

截断表

注意:这个操作慎用

  1. 只能对整表操作,不能像 DELETE 一样针对部分数据操作;

  2. 实际上 MySQL 不对数据操作,所以比 DELETE 更快,但是TRUNCATE在删除数据的时候,并不经过真正的事物,所以无法回滚

  3. 会重置 AUTO_INCREMENT 选项

看一下下面的例子。

此时你截断这个表,这个表中将无数据,此时你再次插入的话,这个自增计数还是从1开始的。

这个语句就能创建相同的表结构。

通过这两个语句的结合,我们此时就把这个进行了去重的操作,此时我们只需要通过语句修改表明即可。

再通过这个操作,我们就把表明修改了,把原来的数据保存了起来。

为什么要使用rename呢??不适用mv呢??

因为rename一次可以修改多个文件名,这个mv一次只能改一个文件名。

还有就是从原子性角度来看原子性:整个改名操作要么一次性全部成功,要么完全失败,不会出现中间脏状态

Linux 内核 rename(oldpath, newpath) 系统调用特性:

  1. 全程加文件系统锁
  2. 不拆分 "删旧名、建新名" 两步
  3. 中间不会被进程调度打断
  4. 断电、崩溃只会两种结果:
    • 改名完全成功
    • 改名完全没发生 绝对不会出现:旧文件没删、新文件已存在 的错乱中间态。

你如果使用循环mv修改,此时不是原子性的,有的可能修改正确,有的可能会由于某种原因出现错误,可能有正确的有错误的,你也不知道,或者使用cp+rm的方式,这个也不是原子的,也会出现有的正确有的错误的现象,但是使用rename不会出现这个问题,要么全对,要么全错。

聚合函数

这个就是统计我们数学成绩存在多少行,如果是count(*)表示总共多少行。

不同的数学成绩有多少个。

一个是数学总分,一个是平均分。

  1. COUNT(*)

统计:表中所有总行数,不管空值 NULL

  • 忽略行是否为空

  • 只要这一行存在,就算 1 行

  • 最快、最常用

  • 不会过滤 NULL

  1. COUNT (列名)

统计:该字段不为 NULL 的数据行数

  • 自动过滤掉字段值是 NULL 的行

  • 空字符串''不算 NULL,会被统计

  • 只数有值

例子:count(name)只要 name 是 null,这一行直接不计入总数

  1. COUNT(1)

效果 = COUNT (*)

  • 1 就是常量占位符

  • 不读取字段,直接数行数

  • 不计 NULL 行

  • 性能和count(*)几乎一致

group by

我们这个语句的作用就是查询每个部门的最高工资和平均工资的。

也可以把部门加上,此时就更加清晰。

这里我们是按照不同部门的不同岗位分的组,此时也能看到,我们此时需要关注的就是这个job的,虽然你的部门信息是一样的但也是不影响的,因为这个工作是不一样的,要把它们看成一个整体。

先记得就是这个聚合函数和你分组使用的字段才能在select出现。

这个只需要知道这个having就行就是给分组后的数据进行添加筛选条件的。

怎么理解这个having和where呢??

简单来说就是一个是先对表进行筛选然后再分组,having是对分组后的数据进行筛选的。

select * from 表明 where sal > 3000;此时你查询工资大于3000的,它能得到一个表信息,此时你查询出来的结果你可以看成一张新表,这是没问题的,然后select deptno ,job , max(sal) from 表明 where sal > 3000 group by deptno , job having sal < 4000;就拿这个例子理解,首先你先执行的是先看到这个表,然后where筛选出来的结果,此时你就拿到了这个工资大于3000的部门中的信息,此时这个是个新表就是工资全是大于3000的,此时你是对这个表分组,分完组之后你还是会获得一个分组之后的新表如下图所示的:

此时这个还是个新表,你的having是对这个表进行条件筛选的,作用的点不一样。

就是这个顺序。

相关推荐
2301_808414381 小时前
MySQL中的复合查询和索引
数据库·mysql
czhc11400756631 小时前
数据库517 数据注入
数据库
六月雨滴1 小时前
Oracle 数据库安全审计
数据库·oracle·dba
小江的记录本1 小时前
【MySQL】MySQL日志体系:redo log/undo log/binlog 三者区别、两阶段提交、如何保证数据一致性
java·数据库·后端·python·sql·mysql·面试
BD_Marathon1 小时前
mysql8.0启动报错
mysql
CC城子1 小时前
EtherCAT研究之物理层PHY(一)
linux·运维·数据库
yyuuuzz2 小时前
国际云服务器的技术特点与使用经验
运维·服务器·网络·数据库·云计算·aws
TDengine (老段)2 小时前
TDengine VNode 生命周期 — 从创建到销毁的完整旅程
大数据·数据库·重构·系统架构·负载均衡·tdengine·涛思数据
2301_783848652 小时前
JavaScript中利用Symbol实现单例模式的属性锁定
jvm·数据库·python