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、…...

在VSCode上创建Vue项目详细教程
1.前期环境准备 搭建Vue项目使用的是Vue-cli 脚手架。前期环境需要准备Node.js环境,就像Java开发要依赖JDK环境一样。 1.1 Node.js环境配置 1)具体安装步骤操作即可: npm 安装教程_如何安装npm-CSDN博客文章浏览阅读836次。本文主要在Win…...

Go语言入门之流程控制简述
Go语言入门之流程控制简述 1.if语句 if语句和其他语言一样,只不过go语言的if不需要用括号包裹 if 语句的分支代码块的左大括号与 if 关键字在同一行上,这是 go 代码风格的统一要求 简单实例: func main() {// 猜数字a : 2if a > 0 {if a…...

接口测试框架基于模板自动生成测试用例!
引言 在接口自动化测试中,生成高质量、易维护的测试用例是一个重要挑战。基于模板自动生成测试用例,可以有效减少手工编写测试用例的工作量,提高测试的效率和准确性。 自动生成测试用例的原理 为了实现测试用例数据和测试用例代码的解耦&a…...

C++ STL stable_sort用法
一:功能 对区间内元素进行排序,保证相等元素的顺序(稳定排序) 二:用法 #include <iostream>struct Record {std::string label;int rank; };int main() {std::vector<Record> data {{"q", 1},…...

YOLO v8进行目标检测的遇到的bug小结
OSError: [WinError 1455] 页面文件太小,无法完成操作。 我的python环境是放在C盘的: 在“我的电脑”点击鼠标右键,打开“属性”点击高级系统设置点击“设置”找到“高级”点击“更改”分配“虚拟内存”(这里需要重启电脑才能生…...

FastAPI -- 第二弹(响应模型、状态码、路由APIRouter、后台任务BackgroundTasks)
响应模型 添加响应模型 from typing import Anyfrom fastapi import FastAPI from pydantic import BaseModel, EmailStrapp FastAPI()class UserIn(BaseModel):username: strpassword: stremail: EmailStrfull_name: str | None Noneclass UserOut(BaseModel):username: s…...

案例 | 人大金仓助力山西政务服务核心业务系统实现全栈国产化升级改造
近日,人大金仓支撑山西涉企政策服务平台、政务服务热线联动平台、政务网、办件中心等近30个政务核心系统完成全栈国产化升级改造,推进全省通办、跨省通办、综合业务受理、智能审批、一件事一次办等业务的数字化办结进程,为我国数字政务服务提…...

如何用python写接口
如何用python写接口?具体步骤如下: 1、实例化server 2、装饰器下面的函数变为一个接口 3、启动服务 开发工具和流程: python库:flask 》实例化server:server flask.Flask(__name__) 》server.route(/index,met…...

轻量级可扩展易航网址引导系统源码V2.45
由于现在网站行业的不稳定,导致很地址频繁更换,不仅是网站,联系QQ,加群链接等需要更换时,好不容易发展的客户会因为找不到您新的网站地址而流失,有了引导页以后就可以安心地宣传无需担心客户丢失的问题。 …...

解决ESLint和Prettier冲突的问题
在配置了ESLint的项目中使用Prettier进行格式化可能会出现冲突,不如Prettier配置了使用双引号,ESLint配置了单引号,当然可以一个一个改成一样的配置,但是比较麻烦。我发现可以直接使用ESLint的规则进行格式化。在VSCode配置过程如…...