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

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发送消息流程

这是本人学习的总结&#xff0c;主要学习资料如下 马士兵教育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 协程库中&#xff0c;collect 和 collectLatest 都是用于收集 Flow 中发射的数据的方法&#xff0c;但它们在处理数据和响应新数据的方式上有所不同。 collect collect 是一个挂起函数&#xff0c;用于收集 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、什么是消息队列 消息&#xff08;Message&#xff09;是指在应用间传送的数据。消息可以非常简单&#xff0c;比如只包含文本字符串&#xff0c;也可以更复杂&#xff0c;可能包含嵌入对象。 消息队列&#xff08;MessageQueue&#xff09;是一种在软件系统中用…...

LLM_入门指南(零基础搭建大模型)

本文主要介绍大模型的prompt&#xff0c;并且给出实战教程。即使零基础也可以实现大模型的搭建。 内容&#xff1a;初级阶段的修炼心法&#xff0c;帮助凝聚和提升内力&#xff0c;为后续修炼打下基础。 1、prompt 1.1含义和作用 prompt就是提示工程的意思。在大型语言模型中…...

Element Plus 与 Vue 3:构建现代化 Web 应用的完美搭档

引言 Element Plus是基于Vue 3的组件库&#xff0c;它继承了Element UI的优秀基因&#xff0c;为Vue 3应用提供了丰富的界面组件。Element Plus不仅拥有与Element UI相同的高质量组件&#xff0c;还针对Vue 3进行了优化和更新&#xff0c;确保了与Vue 3的无缝集成。 环境准备…...

线程间通信与变量修改感知:几种常用方法

线程间通信与变量修改感知&#xff1a;几种常用方法 1. 使用volatile关键字2. 使用synchronized关键字3. 使用wait/notify/notifyAll机制4. 使用轮询&#xff08;Polling&#xff09; &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java…...

前后端通信 —— HTTP/HTTPS

目录 一、HTTP/HTTPS 简介 1、HTTP 2、HTTPS 二、HTTP 工作过程 三、HTTP 消息 1、HTTP消息结构 2、HTTP消息示例 四、HTTP 方法&#xff08;常用&#xff09; 1、GET 2、POST 3、PUT 4、DELETE 5、GET与POST对比 五、HTTP 状态码&#xff08;常用&#xff09; …...

人工智能 (AI) 应用:一个高精度ASD 诊断和照护支持系统

自闭症谱系障碍&#xff08;ASD&#xff09;是一种多方面的神经发育状况&#xff0c;影响全球大约1/100的儿童&#xff0c;而在中国&#xff0c;这一比例高达1.8%&#xff08;引用自《中国0&#xff5e;6岁儿童孤独症谱系障碍筛查患病现状》&#xff09;&#xff0c;男童为2.6%…...

C# 1.方法

方法组成&#xff1a; 1.修饰符&#xff1a;public一般定义共有的 2.方法返回值&#xff1a;void 无返回值; 非void&#xff0c;可以写成其他类型例如int&#xff0c;float&#xff0c;string,string[]等 3.方法名&#xff1a;Add 大驼峰命名法&#xff0c;每一个首字符大写。…...

【C++进阶学习】第七弹——AVL树——树形结构存储数据的经典模块

二叉搜索树&#xff1a;【C进阶学习】第五弹——二叉搜索树——二叉树进阶及set和map的铺垫-CSDN博客 目录 一、AVL树的概念 二、AVL树的原理与实现 AVL树的节点 AVL树的插入 AVL树的旋转 AVL树的打印 AVL树的检查 三、实现AVL树的完整代码 四、总结 前言&#xff1a…...

px,em,rem之间的关系换算

px,em,rem之间的换算 px&#xff1a;普通大小 em&#xff1a;相对单位&#xff0c;相对于父元素的字体大小 rem&#xff1a;相对单位&#xff0c;相对于根元素&#xff08;html&#xff09;的字体大小 <!DOCTYPE html> <html lang"en"> <head>…...

HTTP——POST请求详情

POST请求 【传输实体文本】向指定资源提交数据进行处理请求&#xff08;例如提交表单或者上传文件&#xff09;。数据被包含在POST请求体中。POST 请求可能会导致新的资源的建立或已有资源的修改。 场景&#xff1a; 1. 提交用户注册信息。 2. 提交修改的用户信息。 常见的…...

外包干了1个月,技术明显退步。。。

有一种打工人的羡慕&#xff0c;叫做“大厂”。 真是年少不知大厂香&#xff0c;错把青春插稻秧。 但是&#xff0c;在深圳有一群比大厂员工更庞大的群体&#xff0c;他们顶着大厂的“名”&#xff0c;做着大厂的工作&#xff0c;还可以享受大厂的伙食&#xff0c;却没有大厂…...

LeetCode加油站(贪心算法/暴力,分析其时间和空间复杂度)

题目描述 一.原本暴力算法 最初的想法是&#xff1a;先比较gas数组和cost数组的大小&#xff0c;找到可以作为起始点的站点(因为如果你起始点的油还不能到达下一个站点&#xff0c;就不能作为起始点)。当找到过后&#xff0c;再去依次顺序跑一圈&#xff0c;如果剩余的油为负数…...

5.1 软件工程基础知识-软件工程概述

软件工程诞生原因 软件工程基本原理&#xff08;容易被考到&#xff09; 软件生存周期 能力成熟度模型 - CMM 能力成熟度模型 - CMMI 真题...

HttpUtil工具

http工具 用到的依赖 <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</version></dependency><dependency><groupId>org.apache.httpcomponent…...

并发编程-锁的分类

锁的分类 可重入锁&不可重入锁 可重入&#xff1a;当一个线程获取某个锁后&#xff0c;再次获取这个锁的时候是可以直接拿到的。不可重入&#xff1a;当一个线程获取某个锁之后&#xff0c;再次获取这个锁的时候拿不到&#xff0c;必须等自己先释放锁再获取。synchronized…...

K8S系列-Kubernetes基本概念及Pod、Deployment、Service的使用

一、Kubernetes 的基本概念和术语 一、资源对象 ​ Kubernetes 的基本概念和术语大多是围绕资源对象 Resource Object 来说的&#xff0c;而资源对象在总体上可分为以下两类: 1、某种资源的对象 ​ 例如节点 Node) Pod 服务 (Service) 、存储卷 (Volume&#xff09;。 2、…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化

iOS 应用的发布流程一直是开发链路中最“苹果味”的环节&#xff1a;强依赖 Xcode、必须使用 macOS、各种证书和描述文件配置……对很多跨平台开发者来说&#xff0c;这一套流程并不友好。 特别是当你的项目主要在 Windows 或 Linux 下开发&#xff08;例如 Flutter、React Na…...

Java设计模式:责任链模式

一、什么是责任链模式&#xff1f; 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09; 是一种 行为型设计模式&#xff0c;它通过将请求沿着一条处理链传递&#xff0c;直到某个对象处理它为止。这种模式的核心思想是 解耦请求的发送者和接收者&#xff0c;…...

构建Docker镜像的Dockerfile文件详解

文章目录 前言Dockerfile 案例docker build1. 基本构建2. 指定 Dockerfile 路径3. 设置构建时变量4. 不使用缓存5. 删除中间容器6. 拉取最新基础镜像7. 静默输出完整示例 docker runDockerFile 入门syntax指定构造器FROM基础镜像RUN命令注释COPY复制ENV设置环境变量EXPOSE暴露端…...

Python爬虫(52)Scrapy-Redis分布式爬虫架构实战:IP代理池深度集成与跨地域数据采集

目录 一、引言&#xff1a;当爬虫遭遇"地域封锁"二、背景解析&#xff1a;分布式爬虫的两大技术挑战1. 传统Scrapy架构的局限性2. 地域限制的三种典型表现 三、架构设计&#xff1a;Scrapy-Redis 代理池的协同机制1. 分布式架构拓扑图2. 核心组件协同流程 四、技术实…...