MySQL之基本查询(上)-表的增删查改
目录
Create(创建)
案例建表
插入
单行数据 + 指定列插入
单行数据 + 全列插入
多行数据 + 全列插入
插入是否更新
插入时更新
替换
Retrieve(读取)
建表插入
select列
全列查询
指定列查询
查询字段为表达式
为查询结果指定别名
结果去重
where条件
比较运算符
逻辑运算符
案例
结果排序
筛选分页结果
表的增删查改:CRUD : Create(创建), Retrieve(读取),Update(更新),Delete(删除)
Create(创建)
案例建表
mysql> create table if not exists students(
-> id int unsigned primary key auto_increment,
-> sn int not null unique key comment '学号',
-> name varchar(20) not null,
-> qq varchar(32)
-> );
插入
语法:INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...), (value1, value2, ...), ...;
INSERT INTO table_name
: 指定要插入数据的目标表名。(INTO可省略)(column1, column2, ...)
: 可选项,指定要插入数据的列名。如果省略列名,则假定将为所有列提供值。VALUES (value1, value2, ...), (value1, value2, ...), ...
: 指定要插入的值列表。每个value_list
都对应一个要插入的行,每个值按照与列的顺序匹配。(几个小括号就是几行插入)
可以理解为values左边是列属性,右边是列属性的内容 ;相当于扁担
单行数据 + 指定列插入
指定列单行插入:insert into students (sn,name,qq) values (123,'张飞','123456')
单行数据 + 全列插入
因为忽略了列属性所以不知道向哪里插入所以要每个列都插入即全列插入;
单行全列:insert into students values (2,124,'关于','123457');
多行数据 + 全列插入
多行插入:你可以单行重复多次插入,也可以直接多行插入;
多行全列插入 :insert into students values (3,125,'刘备','123458'),(4,126,'许褚','123459'),(5,127,'曹操','1234560');//用逗号分开表示多行
如果多行指定列插入的话:那么忽略的列必须要有默认值(default值)或者它是自增长;
插入是否更新
由于主键或者唯一键对应的值已经存在而导致插入失败
主键冲突:mysql> insert into students values (1,128,'关于','123457');
报错:ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
唯一键冲突:mysql> insert into students values (6,124,'关于','123457');
报错:ERROR 1062 (23000): Duplicate entry '124' for key 'sn'
插入时更新
可以选择性的进行同步更新操作
插入:insert into students values (4,127,'xuyou','123123123') on duplicate key update sn=127,name='xuyou',qq='123123123';//如果碰到冲突了就执行update后面的语句
报错:ERROR 1062 (23000): Duplicate entry '127' for key 'sn'//因为sn唯一键冲突了
正确插入更新:insert into students values (4,128,'xuyou','123123123') on duplicate key update sn=128,name='xuyou',qq='123123123';
//on duplicate key update可以理解为如果冲突了就执行后续更新操作否则就不执行
如果遇到冲突了,那么执行update的数据,前提是update的值也不能冲突;当然也可以修改冲突的值:
mysql> insert into students values (4,128,'xuyou','123123123') on duplicate key update id=6,sn=128,name='xuyou',qq='123123123';
那么冲突的也修改了;
但是这条操作就不行,因为更新语句主键不冲突但是唯一键冲突:mysql> insert into students values (6,128,'xuyou','123123123') on duplicate key update id=4,sn=123,name='xuyou',qq='123123123';//sn与id=1的sn数据冲突
正确:mysql> insert into students values (6,128,'xuyou','123123123') on duplicate key update id=4,sn=128,name='xuyou',qq='123123123';
所以更新的唯一键要么不变要么不与其他冲突;
当然也可以这样:
老数据与新数据一样,虽然冲突了但是没变;也是可以的;
插入成功后有提示:
当然也可以用函数查找受影响的行数(是上一个语句执行后受影响的行数) row_count()
错误语句:没有受影响(-1)
查数据:没有行受影响(-1)
插入冲突数据:显示影响行数
替换
对于replace:主键或者唯一键没有冲突,则直接插入;主键或者唯一键如果冲突,则删除后再插入;
插入不冲突的:replace into students (sn,name,qq) values (129,'霸王','123');
插入冲突:replace into students (sn,name,qq) values (131,'霸王2','123');
可以看到是先删除冲突的数据后再添加,由id的自增长可以看到;原来的10没了
Retrieve(读取)
建表插入
mysql> CREATE TABLE exam_result (
-> id INT UNSIGNED PRIMARY KEY 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 '英语成绩'
-> );
mysql> 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);
select列
全列查询
通 常 情 况 下 不 建 议 使 用 * 进 行 全 列 查 询:
- - 1 . 查 询 的 列 越 多 , 意 味 着 需 要 传 输 的 数 据 量 越 大 ;
- - 2 . 可 能 会 影 响 到 索 引 的 使 用 。
未来我们的数据库服务是在远端的服务器上的;
select * from exam_result;//默认整张表的信息
指定列查询
select id from exam_result;//指定id列
select id,math,english from exam_result;//指定多个列
查询字段为表达式
mysql> select 1+1;
mysql> select 7*9;
mysql> select id,math,english,10 from exam_result;
mysql> select id,math+english,10 from exam_result;
为查询结果指定别名
mysql> select id,math+english as total from exam_result;
mysql> select id,math+english total from exam_result;//省略as也是可以的,一样结果
mysql> select name 姓名,math+english 总分 from exam_result;//多个别名,用逗号分隔
mysql> select 1+1 假发;
对哪一列起别名就在哪一列后面加别名;
结果去重
distinct:只能进行单列的去重挑选唯一值;
mysql> select distinct math from exam_result;//对那一列去重就在那一列前加distinct
错误多列去重:select distinct math,distinct english from exam_result;//不能多列去重
where条件
比较运算符
在MySQL中比较两个数字或者字符串是否相等用的是一个等号 ;
在使用=时,不能使用NULL=NULL;不安全
正常情况下比较后是true(1)或者false(0),但是NULL=NULL不是而是NULL当然你可以这样:mysql> select NULL<=>NULL;//这样安全
<=>也可以使用数字或者字符串比较;
!=和<>同样无法比较NULL,可以比较数字与字符串
NULL不参与任何计算 ,任何数与null计算都是null
IS NULL
IS NOT NULL
逻辑运算符
案例
英语不及格的同学及英语成绩 ( < 60 ):
mysql> select english from exam_result where english<60;//使用比较运算符
语文成绩在 [80, 90] 分的同学及语文成绩
mysql> select name,chinese from exam_result where chinese>=80 and chinese<=90;
//使用逻辑运算符与比较运算符
mysql> select name,chinese from exam_result where chinese between 80 and 90;使用between x and xx;本身就是闭区域
数学成绩是 58 或者 59 或者 98 或者 99 分的同学及数学成绩
mysql> select name,math from exam_result where math=58 or math=59 or math=98 or math=99;//使用比较和逻辑运算符
mysql> select name,math from exam_result where math in(58,59,98,99);//使用in只要满足in里面任意一个就为真;
姓孙的同学及孙某同学:模糊匹配 (姓孙可以是孙某也可以是孙某某或者孙某某某等)
% 表示任意多个(包括 0 个)任意字符;_ 表示任意一个字符
姓孙:mysql> select name from exam_result where name like '孙%';
孙某:mysql> select name from exam_result where name like '孙_';
语文成绩好于英语成绩的同学
mysql> select name,chinese,english from exam_result where chinese > english;
总分在 200 分以下的同学
错误:mysql> select name,chinese+math+english total from exam_result where total <200;
ERROR 1054 (42S22): Unknown column 'total' in 'where clause'//别名不能用在 WHERE 条件中是先执行from exam_result然后执行where total <200语句最后执行select name,chinese+math+english total;但是在第二步就错了因为表中没有total列
正确:mysql> select name,chinese+math+english total from exam_result where chinese+math+english <200;
语文成绩 > 80 并且不姓孙的同学
mysql> select name,chinese total from exam_result where chinese>80 and name not like '孙%';
孙某同学,否则要求总成绩 > 200 并且 语文成绩 < 数学成绩 并且 英语成绩 > 80
mysql> select name,chinese,math,english,chinese+math+english total from exam_result where name like '孙_' or (chinese+math+english>200 and chinese<math and english>80);加小括号更准确
看name中是否有NULL
mysql> select name from exam_result where name is null;
where可以理解为条件
结果排序
--ASC 为升序(从小到大)
-- DESC 为降序(从大到小)
-- 默认为 ASC
SELECT ... FROM table_name [WHERE ...] ORDER BY column [ASC|DESC], [...];
注意:没有 ORDER BY 子句的查询,返回的顺序是未定义的,永远不要依赖这个顺序
降序:mysql> select name,math from exam_result order by math desc;
升序:mysql> select name,math from exam_result order by math asc;
NULL 视为比任何值都小,升序出现在最上面 ;
NULL 视为比任何值都小,降序出现在最下面;
查询同学各门成绩,依次按 数学降序,英语升序,语文升序的方式显示
(多字段排序,排序优先级随书写顺序)
mysql> select name,math,english,chinese from exam_result order by math desc,english,chinese;//不写的话默认asc
如果数学成绩每个人都相等,那么就按照英语成绩的升序来完成,以此类推;
就比如唐三藏和猪悟能的数学成绩一样,那么就按照英语的升序排序比较;
查询同学及总分,由高到低
ORDER BY 中可以使用表达式
mysql> select name,math+english+chinese total from exam_result order by math+english+chinese desc;
mysql> select name,math+english+chinese total from exam_result order by total desc;//可以使用别名为什么这里可以使用呢?因为先from exam_result然后条件where再选出select name,math+english+chinese total最后比较order by 四步操作顺序进行,所以能用别名
查询姓孙的同学或者姓曹的同学数学成绩,结果按数学成绩由高到低显示
mysql> select name,math from exam_result where name like '孙%' or name like '曹%' order by math desc;
order by是有数据才能排序,先把数据按照条件筛选出来我才拍;
筛选分页结果
起始下标为 0;
从 0 开始,筛选 n 条结果:SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n;
从 s 开始,筛选n条结果 SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT s, n;
从 s 开始,筛选 n 条结果,比第二种用法更明确,建议使用 SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n OFFSET s;
n相当于步长;
从 0 开始,筛选 n 条结果:
mysql> select * from exam_result limit 5;//下标是0的位置是id=1,连续5个
mysql> select * from exam_result limit 3;//下标是0的位置是id=1,连续3个
从表开始(0)连续n行
从 s 开始,筛选n条结果:s指的是下标,这里id=1的下标是0
mysql> select * from exam_result limit 1,3;//下标是1的位置是id=2,连续3个
mysql> select * from exam_result limit 2,3;//下标是2的位置是id=3,连续3个
从 s 开始,筛选 n 条结果:
mysql> select * from exam_result limit 5 offset 0;
相当于mysql> select * from exam_result limit 5;
建议:对未知表进行查询时,最好加一条 LIMIT 1,避免因为表中数据过大,查询全表数据导致数据库卡死 按 id 进行分页,每页 3 条记录,分别显示 第 1、2、3 页
第一页
mysql> select id,name,math,english,chinese from exam_result order by id limit 3 offset 0;
第二页
mysql> select id,name,math,english,chinese from exam_result order by id limit 3 offset 3;
第三页
mysql> select id,name,math,english,chinese from exam_result order by id limit 3 offset 6;
当然也可以结合where:
mysql> select id,name,math+english+chinese total from exam_result where math+english+chinese>200 order by total limit 3 offset 0;
limit 就是你把数据准备好,按照条件筛选出再排序给我,我在"显示",limit执行靠后;
相关文章:

MySQL之基本查询(上)-表的增删查改
目录 Create(创建) 案例建表 插入 单行数据 指定列插入 单行数据 全列插入 多行数据 全列插入 插入是否更新 插入时更新 替换 Retrieve(读取) 建表插入 select列 全列查询 指定列查询 查询字段为表达式 为查询结果指定别名 结果去重 where条件 比较运算符 逻辑运…...

RocketMQ源码学习笔记:Producer发送消息流程
这是本人学习的总结,主要学习资料如下 马士兵教育rocketMq官方文档 目录 1、Overview2、验证消息3、查找路由4、选择消息发送队列4.1、选择队列的策略4.2、源码阅读4.2.1、轮询规避4.2.2、故障延迟规避4.2.2.1、计算规避时间4.2.2.2、选择队列 4.2.3、ThreadLocal的…...
kotlin flow collect collectLatest 区别
在 Kotlin 协程库中,collect 和 collectLatest 都是用于收集 Flow 中发射的数据的方法,但它们在处理数据和响应新数据的方式上有所不同。 collect collect 是一个挂起函数,用于收集 Flow 中发射的所有数据。它会按顺序处理每一个发射的数据…...
ELK集群搭建
ELK集群搭建 文章目录 ELK集群搭建1.环境准备2.Elasticsearch环境搭建1.创建es账户并设置密码2.选择对应版本进行下载3.编辑配置文件4.设置JVM堆大小 #7.0默认为4G5.创建es数据及日志存储目录6.修改安装目录和存储目录权限 3.系统优化1.增加最大文件打开数2.增加最大进程数3.增…...

zookeeper+kafka消息队列集群部署
一.消息队列 1、什么是消息队列 消息(Message)是指在应用间传送的数据。消息可以非常简单,比如只包含文本字符串,也可以更复杂,可能包含嵌入对象。 消息队列(MessageQueue)是一种在软件系统中用…...
LLM_入门指南(零基础搭建大模型)
本文主要介绍大模型的prompt,并且给出实战教程。即使零基础也可以实现大模型的搭建。 内容:初级阶段的修炼心法,帮助凝聚和提升内力,为后续修炼打下基础。 1、prompt 1.1含义和作用 prompt就是提示工程的意思。在大型语言模型中…...
Element Plus 与 Vue 3:构建现代化 Web 应用的完美搭档
引言 Element Plus是基于Vue 3的组件库,它继承了Element UI的优秀基因,为Vue 3应用提供了丰富的界面组件。Element Plus不仅拥有与Element UI相同的高质量组件,还针对Vue 3进行了优化和更新,确保了与Vue 3的无缝集成。 环境准备…...

线程间通信与变量修改感知:几种常用方法
线程间通信与变量修改感知:几种常用方法 1. 使用volatile关键字2. 使用synchronized关键字3. 使用wait/notify/notifyAll机制4. 使用轮询(Polling) 💖The Begin💖点点关注,收藏不迷路💖 在Java…...

前后端通信 —— HTTP/HTTPS
目录 一、HTTP/HTTPS 简介 1、HTTP 2、HTTPS 二、HTTP 工作过程 三、HTTP 消息 1、HTTP消息结构 2、HTTP消息示例 四、HTTP 方法(常用) 1、GET 2、POST 3、PUT 4、DELETE 5、GET与POST对比 五、HTTP 状态码(常用) …...

人工智能 (AI) 应用:一个高精度ASD 诊断和照护支持系统
自闭症谱系障碍(ASD)是一种多方面的神经发育状况,影响全球大约1/100的儿童,而在中国,这一比例高达1.8%(引用自《中国0~6岁儿童孤独症谱系障碍筛查患病现状》),男童为2.6%…...
C# 1.方法
方法组成: 1.修饰符:public一般定义共有的 2.方法返回值:void 无返回值; 非void,可以写成其他类型例如int,float,string,string[]等 3.方法名:Add 大驼峰命名法,每一个首字符大写。…...

【C++进阶学习】第七弹——AVL树——树形结构存储数据的经典模块
二叉搜索树:【C进阶学习】第五弹——二叉搜索树——二叉树进阶及set和map的铺垫-CSDN博客 目录 一、AVL树的概念 二、AVL树的原理与实现 AVL树的节点 AVL树的插入 AVL树的旋转 AVL树的打印 AVL树的检查 三、实现AVL树的完整代码 四、总结 前言:…...

px,em,rem之间的关系换算
px,em,rem之间的换算 px:普通大小 em:相对单位,相对于父元素的字体大小 rem:相对单位,相对于根元素(html)的字体大小 <!DOCTYPE html> <html lang"en"> <head>…...
HTTP——POST请求详情
POST请求 【传输实体文本】向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在POST请求体中。POST 请求可能会导致新的资源的建立或已有资源的修改。 场景: 1. 提交用户注册信息。 2. 提交修改的用户信息。 常见的…...

外包干了1个月,技术明显退步。。。
有一种打工人的羡慕,叫做“大厂”。 真是年少不知大厂香,错把青春插稻秧。 但是,在深圳有一群比大厂员工更庞大的群体,他们顶着大厂的“名”,做着大厂的工作,还可以享受大厂的伙食,却没有大厂…...

LeetCode加油站(贪心算法/暴力,分析其时间和空间复杂度)
题目描述 一.原本暴力算法 最初的想法是:先比较gas数组和cost数组的大小,找到可以作为起始点的站点(因为如果你起始点的油还不能到达下一个站点,就不能作为起始点)。当找到过后,再去依次顺序跑一圈,如果剩余的油为负数…...

5.1 软件工程基础知识-软件工程概述
软件工程诞生原因 软件工程基本原理(容易被考到) 软件生存周期 能力成熟度模型 - CMM 能力成熟度模型 - CMMI 真题...
HttpUtil工具
http工具 用到的依赖 <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</version></dependency><dependency><groupId>org.apache.httpcomponent…...
并发编程-锁的分类
锁的分类 可重入锁&不可重入锁 可重入:当一个线程获取某个锁后,再次获取这个锁的时候是可以直接拿到的。不可重入:当一个线程获取某个锁之后,再次获取这个锁的时候拿不到,必须等自己先释放锁再获取。synchronized…...

K8S系列-Kubernetes基本概念及Pod、Deployment、Service的使用
一、Kubernetes 的基本概念和术语 一、资源对象 Kubernetes 的基本概念和术语大多是围绕资源对象 Resource Object 来说的,而资源对象在总体上可分为以下两类: 1、某种资源的对象 例如节点 Node) Pod 服务 (Service) 、存储卷 (Volume)。 2、…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...

C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...
安卓基础(Java 和 Gradle 版本)
1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...
c# 局部函数 定义、功能与示例
C# 局部函数:定义、功能与示例 1. 定义与功能 局部函数(Local Function)是嵌套在另一个方法内部的私有方法,仅在包含它的方法内可见。 • 作用:封装仅用于当前方法的逻辑,避免污染类作用域,提升…...