当前位置: 首页 > news >正文

MySQL:基础增删查改

MySQL:基础增删查改

    • 插入
      • 插入冲突
    • 查询
      • distinct
      • where
      • order by
      • limit
    • 删除
      • delete
      • truncate
    • 更新


插入

  • 基本插入语法:
insert [into] 表名 (1,2 ...) values (1,2 ...);
  1. into可以省略
  2. (列1, 列2 ...)与后面的(值1, 值2)一一对应
  3. 如果插入时数据完全按照表从左往右的顺序,(列1, 列2 ...)可省略

示例:

create table students(
id int unsigned primary key auto_increment,
sn int not null unique comment '学号',
name varchar(20) not null,
tel varchar(20)
);

一次性指定所有值,那么省略(列1, 列2 ...)部分:

insert into students values (100, 20240001, '张三', NULL);

插入时只指定部分值,那么就需要通过(列1, 列2 ...)来指定:

insert into students (id, sn, name) values (101, 20240006, '小明');

也可以一次性插入多行,每一行的数据用(值1, 值2 ...)表示,不同行数据之间用逗号隔开:

insert into students (id, sn, name) values 
(105, 20240052, '小张'), 
(109, 20240096, '小李');

此处换行只是为了方便展示,换行对SQL语句的效果不会造成影响。

之前的插入结果如下:

在这里插入图片描述


插入冲突

在插入数据时,有可能因为主键和唯一键的存在,导致冲突而插入失败。此时可以利用插入替换,或者直接替换。

插入替换

  • 插入替换语法:
insert ... on duplicate key update1=1,2=2 ...;

其中insert ...表示一个完整的插入语句,该语句的作用是:insert语句如果冲突,则执行后面的列1=值1, 列2=值2 ...进行值替换。

示例:

insert into students (id, sn, name) values (101, 20240066, '昊天') 
on duplicate key update sn=20240066;

之前插入时,已经插入了(101, 20240006, '小明'),所以这个插入会发生主键冲突,导致插入失败。而on duplicate key update sn=20240066的作用就是,如果插入失败,说明主键已经存在,那么修改其学号为20240066

最后该学生的sn20240006变成了20240066

在这里插入图片描述

插入替换的作用是:插入失败时,只替换部分指定的值,保留部分原先的值

直接替换

插入时,也可以直接替换,只需把insert改为replace即可:

replace [into] 表名 (1,2 ...) values (1,2 ...);

这种直接替换,如果插入时发生冲突,会直接删除原先的行,重新插入当前行。

replace into students (id,sn,name) values (109, 20240100, '小杨');

执行以上语句时,由于已经有id=109的数据存在,会发生主键冲突,此时会直接删除原先的行,插入这一行:

在这里插入图片描述

整个id=109的数据,都变成刚刚的内容了,就好像执行了一个insert语句。


查询

示例表格:

create table exam_result (
id ind unsigned primary akey auto_increment,
name varchar(20) not null comment '同学姓名',
chinese float default 0.0 comment '语文成绩',
math float default 0.0 comment '数学成绩',
english float default 0.0 comment '英语成绩'
);

示例数据:

insert into exam_result (name, chinese, math, english) values
('小明', 67, 98, 56),
('小红', 87, 78, 77),
('小翠', 88, 98, 90),
('小朱', 82, 84, 67),
('小雨', 55, 85, 45),
('小鑫', 70, 73, 78),
('小彤', 75, 65, 30),
('小朵', NULL, NULL, NULL);
  • 基本查询语法
select 表达式1, 表达式2 ... from 表名;

此处的表达式含义非常广,它可以是列名,通配符*,或者基本字面量,计算式等。

  1. 通配符*做表达式,输出所有的列

在这里插入图片描述

测试表中,有id, name, chinses, math, english列,通过*全部都查询出来了

  1. 列名做表达式,输出指定的列

在这里插入图片描述

此处的表达式为name, chinese,所以只输出这两列。

  1. 基本字面量与计算式做表达式,输出计算结果

在这里插入图片描述

此处的'name'与刚刚的name不同,此处的''name'是一个字符串,而不是列名,所以输出的是name字符串本身。而第三列用1024 + 2048做表达式,输出的就是计算结果。

在计算表达式时,如果指定了表,那么这个表有几行,表达式就计算多少次。如果表达式中没有依赖表中的列,而是单纯的计算,那么可以不指定表名:

在这里插入图片描述

这次的查询中,没有指定表名,也没有使用表的列,那么表达式默认只计算一次,输出一行。

计算的意义在于:列与列之间同样可以计算

在这里插入图片描述

第二列中,通过chinese + english + math计算出了总分。

但是这样看表的话,chinese + english + math这个整体作为列名有点长了,此时可以使用as来对列重命名。

  • 使用as对列重命名:
select 表达式1 as 新名1, 表达式2 as 新名2 ... from 表名;

as也可以省略:

select 表达式1 新名1, 表达式2 新名2 ... from 表名;

在这里插入图片描述

此处使用chinese + english + math as total将总分的整体重命名了,最后输出结果更加直观,当然也可以省略as,写为:chinese + english + math total


distinct

直接查询math列:

在这里插入图片描述

此处出现了两个98,能否对查询结果去重?

此时就需要用到distinct关键字。

  • 使用distinct对查询结果去重:
select distinct 表达式1, 表达式2 ... from 表名;

在这里插入图片描述

这次查询就只有一个98了。


where

观察一下之前的查询,会发现我们一直在对列做限制,而每次查询出来的行数目是一样的。如果说我们想对数据的值做限制,比如“数学成绩大于等于60分”,那么就需要where子句。

  • 通过where子句来查询符合要求的数据:
select 表达式1, 表达式2 ... from 表名 where 表达式;

表达式中常用的运算符如下:

运算符说明
>,>=,<,<=大于,大于等于,小于,小于等于
=等于,任何值与NULL比较结果为NULL
<=>等于,其他值与NULL比较为falseNULLNULL比较为true
!=,<>不等于
between x and y范围匹配[x, y]闭区间,如果x <= value <= y返回true
in (option1, option2 ...)如果是其中一个option返回true
is null如果是NULL返回true
is not null如果不是NULL返回true
like模糊匹配,%表示多个字符,_表示一个字符
not like反向模糊匹配,%表示多个字符,_表示一个字符
and逻辑与
or逻辑或
not逻辑取反

如果你学过任意编程语言,上表格很好理解。另外的,以上所有操作都可以通过小括号()调整优先级。

  1. 查询英语小于60分的同学:
select name, english from exam_result where english < 60;

在这里插入图片描述

  1. 查询数学成绩为临界值(58, 59, 98, 99)的学生:
select name, math from exam_result where math in (58, 59, 98, 99);

在这里插入图片描述

  1. 查询数学成绩大于成绩的同学:
select name, math, english from exam_result where math > english;

在这里插入图片描述

  1. 查询总分200以上的同学:
select name, math + english + chinese as total from exam_result 
where math + english + chinese > 200;

在这里插入图片描述

前面已经将math + english + chinese重命名为了total,那么后面的where能不能写为:where total > 200

在这里插入图片描述

查询时报错了,找不到total这个列,这是为什么,明明已经重命名了。这和SQL语句的执行顺序有关,回顾以下语句:

select name, math + english + chinese as total from exam_result where total > 200;

其执行顺序为:

  1. 确定要操作的表,执行from exam_result
  2. 确定要查询什么条件的数据,执行where total > 200
  3. 最后确定查询哪些列,执行select name, math + english + chinese as total

你会发现,在还没有重命名的时候,where就先使用了total,所以会发生报错。


order by

如果想要对查询的结果进行排序,就需要order by子句。

  • 通过order by子句对查询结果排序:
select ... from 表名 where ... order by1 asc|desc,2 asc|desc ... ;

asc表示升序,desc表示降序,如果不指定那么默认为asc升序。

  1. 以数学成绩升序展示所有成绩:
select name, math, chinese, english from exam_result order by math asc;

在这里插入图片描述

此处NULL被放在了第一列,在SQL中认为NULL比所有值都小

此处小明小翠的数学都是98分,为什么小翠的顺序更靠后呢?在查询时,我们只指定了根据math排序,如果math相同,那么顺序是不确定的。

比如根据数学降序:

select name, math, chinese, english from exam_result order by math asc;

在这里插入图片描述

你会发现降序的结果不是升序结果的逆置,小明依然比小翠更靠前。如果想要更加确切的排序,那么就需要指定多个列的排序,比如:”如果数学成绩相同,语文成绩高的更前“,此时可以通过order by指定多个列:

order by math desc, chinese desc;

以上order by的执行效果为:先根据math进行逆序排序,如果math相同,再根据chinese逆序排序。如果chinese相同,那么结果就是不确定的了,此时你可以继续往后加排序条件,比如english desc

select name, math, chinese, english from exam_result 
order by math desc, chinese desc;

在这里插入图片描述

此时结果就是确定的了,小翠小明数学成绩相同,此时触发语文成绩判断,小翠的成绩比小明高,所以小翠靠前。

  1. 以总分降序查询:
select name, chinese + math + english as total from exam_result
order by chinese + math + english desc;

在这里插入图片描述

问题来了,排序时能不能直接用别名order by total呢?

在这里插入图片描述

这次居然可以用别名total了,和之前where的查询情况不一样!这依然和SQL语句的执行顺序有关。

order by是在整个表查询结束后,也就是select name, chinese + math + english as total这个整体执行完毕,得到了所有符合条件的结果,order by才能进行排序。所以执行到order by时,as total的重命名语句已经生效了,order by可以使用这个别名。

总结一下目前的语句执行顺序:

  1. 确定要操作的表,执行from ...
  2. 确定要查询什么条件的数据,执行where ...
  3. 确定查询哪些列,执行select ...
  4. 对查询结果进行排序,执行order by ...

limit

假设已经查询好数据,排序完成了,如果只需要取用前三条数据,这要如何完成?此时就需要limit,其用于展示查询到的数据的指定部分。

  • 输出前x条数据:
select ... from 表名 where ... order by ... limit x;
  • 输出下标为[x, y]的数据(下标从0开始):
select ... from 表名 where ... order by ... limit x, y;
select ... from 表名 where ... order by ... limit x offset y;

直接查询:

在这里插入图片描述

查询前三行:

select * from exam_result limit 3;

在这里插入图片描述

查询第2到5行:

select * from exam_result limit 1, 4;

在这里插入图片描述

[2, 5]的下标是[1, 4],注意不要搞错了。

limit的执行顺序非常靠后,在整个数据查询,排序完毕后,才执行limit


删除

MySQL中,有两种删除数据的方法,分别是deletetruncate,两者功能略有差别。

delete

  • 通过delete删除数据
delete from 表名 where ... order by ... limit ...;
  1. 删除整张表的数据:
delete from exam_result;

在这里插入图片描述

执行select时查询不到任何数据,说明确实删除成功了。在show create table时,字段auto_increment=9说明delete是不会清空自增长的

在执行改代码将数据插入回去:

insert into exam_result (name, chinese, math, english) values
('小明', 67, 98, 56),
('小红', 87, 78, 77),
('小翠', 88, 98, 90),
('小朱', 82, 84, 67),
('小雨', 55, 85, 45),
('小鑫', 70, 73, 78),
('小彤', 75, 65, 30),
('小朵', NULL, NULL, NULL);

此时id9开始自增长了:

在这里插入图片描述
2. 删除小朵所在行:

delete from exam_result where name = '小朵';

在这里插入图片描述

truncate

相比于deletetruncate有以下特点:

  1. truncate只能用于删除整个表
  2. truncate不经过事务,速度更快
  3. 会重置auto_increment
  • 使用truncate清空表的所有数据:
truncate table 表名;

此处的table可以省略,直接truncate 表名

在这里插入图片描述

truncate后,auto_increment字段的值就被重置了。


更新

  • 更新表中数据
update 表名 set1 =1,2 =2 where ... order by ... limit ...
  1. 将小红的英语成绩改为100
update exam_result set english = 100 where name = '小红';

在这里插入图片描述

此处如果不加where子句,那么所有学生的英语成绩都会变成100

  1. 将数学成绩倒数的三名同学,数学成绩加上10分:
update exam_result set math = math + 10 order by math asc limit 3;

在这里插入图片描述


相关文章:

MySQL:基础增删查改

MySQL&#xff1a;基础增删查改 插入插入冲突 查询distinctwhereorder bylimit 删除deletetruncate 更新 插入 基本插入语法&#xff1a; insert [into] 表名 (列1, 列2 ...) values (值1, 值2 ...);into可以省略(列1, 列2 ...)与后面的(值1, 值2)一一对应如果插入时数据完全…...

Apache DolphinScheduler 1.3.4升级至3.1.2版本过程中的踩坑记录

因为在工作中需要推动Apache DolphinScheduler的升级&#xff0c;经过预研&#xff0c;从1.3.4到3.1.2有的体验了很大的提升&#xff0c;在性能和功能性有了很多的改善&#xff0c;推荐升级。 查看官方的升级文档&#xff0c;可知有提供升级脚本&#xff0c;如果只是跨小版本的…...

最后一块石头的重量(超级妙的背包问题)

1049. 最后一块石头的重量 II 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x < y。那么粉碎的可能结果…...

如何评估和提升审查者在前端代码审查中的专业技能?

评估和提升审查者在前端代码审查中的专业技能可以通过以下步骤&#xff1a; 技能评估&#xff1a; 定期进行技能评估&#xff0c;了解审查者在前端开发各方面的能力&#xff0c;包括但不限于HTML、CSS、JavaScript、框架使用、代码规范等。 代码审查实践&#xff1a; 通过实…...

C++(区别于C的)基础内容总结

参考&#xff1a; C 教程 | 菜鸟教程 (runoob.com) 简介 C 被认为是一种中级语言&#xff0c;它综合了高级语言和低级语言的特点。 C 是由 Bjarne Stroustrup 于 1979 年在新泽西州美利山贝尔实验室开始设计开发的。C 进一步扩充和完善了 C 语言&#xff0c;最初命名为带类的C&…...

实现代码灵活性:用Roslyn动态编译和执行存储在数据库中的C#代码

在许多现代应用程序中&#xff0c;动态编译和执行代码是提升灵活性和功能的一种强大技术。本文将介绍如何使用Roslyn编译器平台动态编译和执行存储在数据库中的C#代码&#xff0c;并结合实际公司案例来说明这些技术的应用场景。 1. 引言 在很多应用场景中&#xff0c;我们可能…...

探索哈希表:C++中的实现与操作详解【Map、Set、数据结构】

探索哈希表&#xff1a;C中的实现与操作详解 介绍 哈希表&#xff08;Hash Table&#xff09;是一种常见的数据结构&#xff0c;它提供了一种高效的键值对存储方式&#xff0c;能够快速进行插入、删除和查找操作。在这篇博客中&#xff0c;我们将详细介绍哈希表的概念、在C中的…...

Python酷库之旅-第三方库Pandas(062)

目录 一、用法精讲 241、pandas.Series.view方法 241-1、语法 241-2、参数 241-3、功能 241-4、返回值 241-5、说明 241-6、用法 241-6-1、数据准备 241-6-2、代码示例 241-6-3、结果输出 242、pandas.Series.compare方法 242-1、语法 242-2、参数 242-3、功能 …...

python学习之旅(基础篇看这篇足够了!!!)

目录 前言 1.输入输出 1.1 输入 1.2 输出 2. 变量与常量 2.1 变量 2.2 常量 2.3 赋值 2.4格式化输出 3. 数据类型 4. 四则运算 5.“真与假” 5.1 布尔数 5.2 比较运算和逻辑运算 5.3 布尔表达式 6.判断语句 6.1 基本的if语句 6.2 if-else语句 6.3 if-elif-el…...

Azure OpenAI Embeddings vs OpenAI Embeddings

题意&#xff1a;Azure OpenAI 嵌入与 OpenAI 嵌入的比较 问题背景&#xff1a; Is anyone getting different results from Azure OpenAI embeddings deployment using text-embedding-ada-002 than the ones from OpenAI? Same text, same model, and the results are cons…...

重生奇迹MU职业成长三步走

在重生奇迹MU游戏中&#xff0c;转职是最重要的玩法之一。每个职业在转职后都会发生巨大的变化&#xff0c;经过三次转职后&#xff0c;你才有资格成为该游戏中最强大的冒险者。 一转&#xff0c;一切才刚刚开始 玩家完成第一次转职任务后&#xff0c;标志着我们成功度过了游…...

2024年中国数据中台行业研究报告

数据中台丨研究报告 核心摘要&#xff1a; 数据中台是企业数字化建设的重要构成&#xff0c;其通过整合企业基础设施和数据能力&#xff0c;实现数据资产化和服务复用&#xff0c;降低运营成本&#xff0c;支撑业务创新。受宏观经济影响&#xff0c;部分企业减少了对数据中台等…...

MySQL——数据表的基本操作(一)创建数据表

数据库创建成功后,就需要创建数据表。所谓创建数据表指的是在已存在的数据库中建立新表。需要注意的是&#xff0c;在操作数据表之前&#xff0c;应该使用 “ USE 数据库名 ” 指定操作是在哪个数据库中进行&#xff0c;否则会抛出 “ No database selected ” 错误。创建数据表…...

EPLAN EDZ 文件太大导入很慢如何解决?

目前各个品牌都在提供 EPLAN EDZ部件库文件,但是一般都是一个总的EDZ文件,导入过程中,因为电脑配置和其他问题,导致导入过程中EPLAN会崩溃或者长时间不动。 我们分析下EDZ文件的构成,这是个压缩文件,换了个壳而已。用压缩软件把edz打开,这里不是解压,直接右键,用解压…...

刷题——缺失的第一个正整数

缺失的第一个正整数_牛客题霸_牛客网 我选择了一个我比较能看懂的&#xff0c; int minNumberDisappeared(vector<int>& nums) {// write code heremap<int, int>hash;int n nums.size();//哈希表记录数组中出现的每个数字for(int i 0; i < n; i)hash[n…...

代理设置--一些库的代理设置

首先最好能获取一个免费代理&#xff0c;来继续下面的阅读和实验 也可以在本机设置代理&#xff0c;具体流程由于比较敏感&#xff0c;请自行搜索 代理设置成功后的测试网站是 http://www.httpbin.org/get , 访问该链接可以得到请求相关的信息&#xff0c;返回结果中的 ori…...

Debezium系列之:PostgreSQL数据库赋予账号数据采集权限的详细步骤

Debezium系列之:PostgreSQL数据库赋予账号数据采集权限的详细步骤 一、账号需要的权限二、创建账号,赋予登陆、复制权限三、赋予账号数据库权限四、赋予账号对表的权限五、创建PostgreSQL数据库复制组六、账号权限授予完整案例七、扩展——分区表设置八、扩展-撤销账号的权限…...

javascript:判断输入值是数字还是字母

1 代码示例 要判断输入值是数字还是字母&#xff0c;我们可以通过JavaScript获取输入框的值&#xff0c;然后使用isNaN函数来检查输入值是否为数字。 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title><s…...

Java-排序算法-复盘知识点

刷了24道简单排序题&#xff0c;18道中等排序题之后&#xff0c;给排序算法来个简单的复盘&#xff08;从明天开始刷动态规划咯&#xff09; 1.对于找多数元素&#xff08;出现次数超过一半的元素&#xff09;可以使用摩尔投票法。 2.HashSet的add方法非常实用&#xff1a;如…...

HarmonyOS 原生智能之语音识别实战

HarmonyOS 原生智能之语音识别实战 背景 公司很多业务场景使用到了语音识别功能&#xff0c;当时我们的语音团队自研了语音识别模型&#xff0c;方案是云端模型加端侧SDK交互&#xff0c;端侧负责做语音采集、VAD、opus编码&#xff0c;实时传输给云端&#xff0c;云端识别后…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

Golang——7、包与接口详解

包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...

Ubuntu系统复制(U盘-电脑硬盘)

所需环境 电脑自带硬盘&#xff1a;1块 (1T) U盘1&#xff1a;Ubuntu系统引导盘&#xff08;用于“U盘2”复制到“电脑自带硬盘”&#xff09; U盘2&#xff1a;Ubuntu系统盘&#xff08;1T&#xff0c;用于被复制&#xff09; &#xff01;&#xff01;&#xff01;建议“电脑…...

【若依】框架项目部署笔记

参考【SpringBoot】【Vue】项目部署_no main manifest attribute, in springboot-0.0.1-sn-CSDN博客 多一个redis安装 准备工作&#xff1a; 压缩包下载&#xff1a;http://download.redis.io/releases 1. 上传压缩包&#xff0c;并进入压缩包所在目录&#xff0c;解压到目标…...

算法刷题-回溯

今天给大家分享的还是一道关于dfs回溯的问题&#xff0c;对于这类问题大家还是要多刷和总结&#xff0c;总体难度还是偏大。 对于回溯问题有几个关键点&#xff1a; 1.首先对于这类回溯可以节点可以随机选择的问题&#xff0c;要做mian函数中循环调用dfs&#xff08;i&#x…...

Netty自定义协议解析

目录 自定义协议设计 实现消息解码器 实现消息编码器 自定义消息对象 配置ChannelPipeline Netty提供了强大的编解码器抽象基类,这些基类能够帮助开发者快速实现自定义协议的解析。 自定义协议设计 在实现自定义协议解析之前,需要明确协议的具体格式。例如,一个简单的…...

linux设备重启后时间与网络时间不同步怎么解决?

linux设备重启后时间与网络时间不同步怎么解决&#xff1f; 设备只要一重启&#xff0c;时间又错了/偏了&#xff0c;明明刚刚对时还是对的&#xff01; 这在物联网、嵌入式开发环境特别常见&#xff0c;尤其是开发板、树莓派、rk3588 这类设备。 解决方法&#xff1a; 加硬件…...

零基础在实践中学习网络安全-皮卡丘靶场(第十一期-目录遍历模块)

经过前面几期的内容我们学习了很多网络安全的知识&#xff0c;而这期内容就涉及到了前面的第六期-RCE模块&#xff0c;第七期-File inclusion模块&#xff0c;第八期-Unsafe Filedownload模块。 什么是"遍历"呢&#xff1a;对学过一些开发语言的朋友来说应该知道&…...

学习 Hooks【Plan - June - Week 2】

一、React API React 提供了丰富的核心 API&#xff0c;用于创建组件、管理状态、处理副作用、优化性能等。本文档总结 React 常用的 API 方法和组件。 1. React 核心 API React.createElement(type, props, …children) 用于创建 React 元素&#xff0c;JSX 会被编译成该函数…...