[MySQL#6] 表的CRUD (1) | Create | Retrieve(查) | where

目录

1. 插入

1.1 单行数据 - 全列插入 + 指定列插入

1.2 多行数据 - 全列插入 + 指定列插入

1.3 更新

1.4 替换

2. 查找

2.1 select 列

2.2 where 条件

具体案例

2.3 结果排序

总结关键字执行顺序

2.4 筛选分页结果


CRUD : Create(创建),Retrieve(读取),Update(更新),Delete(删除)

1. 插入

语法:

INSERT [INTO] table_name[(column [, column] ...)] #列字段VALUES (value_list) [, (value_list)] ... #列字段的内容value_list: value, [, value] ...

案例:

-- 创建一张学生表
CREATE TABLE students (id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,sn INT NOT NULL UNIQUE COMMENT '学号',name VARCHAR(20) NOT NULL,qq VARCHAR(20)
);

1.1 单行数据 - 全列插入 + 指定列插入

  • 指定列插入列字段和列字段的内容一定要一一匹配
insert into student (sn, name, qq) values (123, '张飞', '12345');
  • 全列插入全列插入有两种方式,一个是省略 values 左侧字段名,一个是都指定
insert into students values (10, 124, '关羽', '13245');
insert into students (id, sn, name, qq) values (14, 125, '刘备', '14525');

可以省略 into

insert students (sn, name, qq) values (126, '诸葛亮', '12525');

1.2 多行数据 - 全列插入 + 指定列插入

  • 指定列多行插入
insert students (sn, name, qq) values (127, '曹操', '15256'), (128, '许攸', '23445');
  • 全列多行插入
insert students values (20, 129, '孙权', '12256'), (21, 130, '吕布', '33445');

1.3 更新

由于主键或者唯一键对应的值已经存在而导致插入失败。

但我就是想让它先确认是不是在数据库中存在,不存在就插入,存在不要拦我然后执行后面的修改语句。

选择性的进行同步更新操作 语法:

INSERT ... ON DUPLICATE KEY UPDATEcolumn = value [, column = value] ...

如果不存在就插入,存在发生主键或者唯一键冲突不要报错,接着执行后面的修改语句。

insert into students values (14, 111, '周瑜', '56321') on duplicate key update sn=111, name='周瑜', qq=56321;
  • on duplicate key update

注意更新的值不能和其他的主键和唯一键冲突,否则不能更新。

  • 0 row affected: 表中有冲突数据,但冲突数据的值和 update 的值相等
  • 1 row affected: 表中没有冲突数据,数据被插入
  • 2 row affected: 表中有冲突数据,并且数据已经被更新

通过 MySQL 函数获取受到影响的数据行数

select row_count();

1.4 替换

  • 主键或者唯一键没有冲突,则直接插入
  • 如果冲突,则删除后再插入。
REPLACE INTO students (sn, name, qq) values (131, '孙悟空', '98752');
  • 1 row affected: 表中没有冲突数据,数据被插入
  • 2 row affected: 表中有冲突数据,删除后重新插入

这里从 id 就可以看到是删除后插入的,因为 id 是自增的,刚才是 22,现在是 23 了。


2. 查找

语法:

SELECT[DISTINCT] {* | {column [, column] ...}[FROM table_name] # 从那个表筛选[WHERE ...] # 筛选条件[ORDER BY column [ASC | DESC], ...] # 对筛选结果排序LIMIT ... # 限定筛选出来的条数

distinct:对内容进行去重
*:全列查询
column,column…:指定列查询

案例:

-- 创建表结构
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 '英语成绩'
);-- 插入测试数据
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);

2.1 select 列

  • 全列查询通常情况下不建议使用 * 进行全列查询查询的列越多,意味着需要传输的数据量越大;可能会影响到索引的使用。(索引后面再说)
select * from exam_result;
  • 指定列查询指定列的顺序不需要按定义表的顺序来
select id, name, chinese from exam_result;
  • 查询字段为表达式select 非常特殊,后面可以跟 select 自带的子句,筛选条件等,也可以跟表达式
  • 为查询结果指定别名语法:
SELECT column [AS] alias_name [...] FROM table_name;

可带 as,可不带

结果去重

select distinct math from exam_result;

测试:

2.2 where 条件

  • 刚刚是对表的整体信息做筛选,但是实际在做查询的时候一定有筛选条件。
  • 按条件筛选影响的是未来显示出来信息的条目数或者说是行数,以前是按列位单位把全部行都拿出来了。
  • 如果一列想拿那些行由where条件来决定。

where是筛选子句,后面可以跟特定的比较运算符来决策我们应该如何进行筛选,

where就有点像C/C++里面的if语句,根据后面条件进行判断。

比较运算符

运算符

说明

>, >=, <, <=

大于,大于等于,小于,小于等于

=

等于,NULL 不安全,例如 NULL = NULL 的结果是 NULL

<=>

等于,NULL 安全,例如 NULL <=> NULL 的结果是 TRUE(1)

!=, <>

不等于

BETWEEN a0 AND a1

范围匹配,[a0, a1],如果 a0 <= value <= a1,返回 TRUE(1)

IN (option, …)

如果是 option 中的任意一个,返回 TRUE(1)

IS NULL

是 NULL

IS NOT NULL

不是 NULL

LIKE

模糊匹配。% 表示任意多个(包括 0 个)任意字符;_ 表示任意一个字符

  • = 时两侧进行null值比较,是不能参与运算的
  • 如果想判断null是否相等 使用 <=>
  • 不过一般也不这样去判断,一般更喜欢用 IS NULL 去判断一个值是否是null

逻辑运算符

运算符

说明

AND

多个条件必须都为 TRUE(1),结果才是 TRUE(1)

OR

任意一个条件为 TRUE(1), 结果为 TRUE(1)

NOT

条件为 TRUE(1),结果为 FALSE(0)

具体案例

1. 英语不及格的同学及英语成绩 ( < 60 )

select name, english from exam_result where english < 60;

2. 语文成绩在 [80, 90] 分的同学及语文成绩使用 AND 进行条件连接

select name, chinese from exam_result where chinese >= 80 and chinese <= 90;

使用 BETWEEN … AND … 条件

select name, chinese from exam_result where chinese between 80 and 90;

3. 数学成绩是 58 或者 59 或者 98 或者 99 分的同学及数学成绩使用 OR 进行条件连接,满足任意一个就为真

select name, math from exam_result where math = 58 or math = 59 or math = 98 or math = 99;

使用 IN 条件,满足 () 里任意一个就为真

select name, math from exam_result where math in (58, 59, 98, 99);
  • 姓孙的同学 及 孙某同学有时候匹配并不给具体值的更细节的字段含义,可能就只给一个模糊搜索的关键字。就如上面。反正条件不给全就给一个模糊的条件。
  • 我们就可以用 LIKE 模糊匹配% 匹配任意多个(包括 0 个)任意字符注意 MySQL 可以用 ‘ ’ 或者 “ ” 表示字符串
select name from exam_result where name like '孙%';

_ 匹配严格的一个任意字符

select name from exam_result where name like '孙_';

4. 语文成绩好于英语成绩的同学

select name, chinese, english from exam_result where chinese > english;

5. 总分在 200 分以下的同学

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

可以看到where后面也有跟表达式,曾经不是说过可以对列进行重命名吗,那where后面还用写这么一大堆吗?

我们发现它报错了,未知列total,我们不是做过重命名吗。这个total不是已经有了吗,怎么这里报不知道total呢?

这里我们就需要讨论一些东西了
❓:from这个表,where这个条件判断和select指明要显示的列,整个sql语句的执行顺序是什么?

  • 很简单,我们一定是先执行from,在执行where,然后在执行select。
  • 筛选后再执行从1中带着2去3中筛选
  • 原因:只把小于 操作 2 的相加后再打印,更节省空间
  • 所以不可以在 where 中使用重命名

6. 语文成绩 > 80 并且不姓孙的同学

AND 与 NOT 的使用

select name, chinese from exam_result where chinese > 80 and name not like '孙%';

7. 孙某同学,否则要求总成绩 > 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);

NULL 的查询

select name from test where name is null;
select name from test where name is not null;

null 和 ’ ’ 不是一个东西


2.3 结果排序

语法:

SELECT ... FROM table_name [WHERE ...]ORDER BY column [ASC|DESC], [...];
  • ASC 为升序(从小到大)(ascending)
  • DESC 为降序(从大到小)(descding)
  • 默认为 ASC

注意:没有 ORDER BY 子句的查询,返回的顺序是未定义的,永远不要依赖这个顺序

同学及数学成绩,按数学成绩升序显示

select name, math from exam_result order by math asc;

NULL 视为比任何值都小,升序出现在最上面

查询同学各门成绩,依次按 数学降序,英语升序,语文升序的方式显示

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

每个同学的各门成绩都要查,首先按照数学降序排序,如果数学成绩相同就按英语升序排序,如果数学和英语成绩都相同就按语文升序排序。

查询同学及总分,由高到低

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

❓ 为什么在order by这里可以使用别名进行排序,而where后面没有办法使用别名?

所以能不能用别名,完全是取决于当前sql中子句的执行顺序!

  • 你要对表结构的数据进行排序,一定是得先有数据!
  • 有人可能说不是表结构不就天然有数据吗我直接把表结构数据全排完,然后在选行不行。
  • 但你会愿意这样浪费时间处理数据排序吗?
  • 因为你没有筛选,在排序的时候一定有大批数据其实是不需要排序的,而对这些数据排序本身就是浪费空间和时间,mysql没有这么笨!
  • 所以会先筛选 select 再排序 order by

总结关键字执行顺序

  • from > on> join > where > group by > with > having > select(含重命名) > distinct > order by > limit

2.4 筛选分页结果

什么是分页呢?

  • 如果一个表中数据量太大,这个时候如果全列查询就有一大堆,这样不便于查看分析
  • 有时候我们不想一次显示这么多,因此我们就可以对结果进行 LIMIT 分页。

limit 本身没有筛选功能,只是 按照它后面跟的数字 把要显示的结果按照起始位置和步长 给我们显示多条记录。

语法:

-- 起始下标为 0-- 从 s 开始,筛选 n 条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT s, n-- 从 0 开始,筛选 n 条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n;-- 从 s 开始,筛选 n 条结果,比第二种用法更明确,建议使用
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n OFFSET s;

建议: 对未知表进行查询时,最好加一条 LIMIT 1,避免因为表中数据过大,查询全表数据导致数据库卡死。

  • 默认从 0 下标开始,筛选多条记录。
  • limit 分页读取的执行顺序,是在最后的
  • 也可以指定下标开始筛选后面跟的是步长。从指定位置开始,连续读取多条记录。
select * from exam_result limit 4 offset 3;

LIMIT 后面跟的是筛选几行,OFFSET 后面跟的是从那行开始。

limit 可以进行分页。就比如数据多就可以这样进行分页读

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/459968.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[机器学习]集成学习

1 集成学习 强强联合、弱弱变强Bagging&#xff08;平权投票&#xff09;&#xff1a;随机森林Boosting&#xff08;加权投票&#xff09;&#xff1a;Adaboost、GBDT、XGBoost、LightGBM 2 随机森林 3 Adaboost 放大错误数据&#xff0c;缩小正确数据

第三十三篇:TCP协议如何避免/减少网络拥塞,TCP系列八

一、流量控制 一般来说&#xff0c;我们总是希望数据传输得更快一些&#xff0c;但是如果发送方把数据发送得太快&#xff0c;接收方可能来不及接收&#xff0c;造成数据的丢失&#xff0c;数据重发&#xff0c;造成网络资源的浪费甚至网络拥塞。所谓的流量控制&#xff08;fl…

在Excel中如何快速筛选非特定颜色

Excel中的自动筛选是个非常强大的工具&#xff0c;不仅可以筛选内容&#xff0c;而且可以筛选颜色&#xff0c;例如筛选A列红色单元格。但是有时希望筛选除了红色之外的单元格&#xff08;下图右侧所示&#xff09;&#xff0c;其他单元格的填充色不固定&#xff0c;有几种颜色…

数据结构---链表(一)【不带头单向非循环】

文章目录 链表概念链表的使用LinkedList 的几种遍历方式单链表的模拟实现&#xff08;不带头&#xff09;链表面试题 观察ArrayList 顺序表的源码发现&#xff0c;底层是使用数组实现的。由于其底层是一段连续空间&#xff0c;当在ArrayList任意位置插入或者删除元素时&#xf…

Pytorch(一)

一.PyTorch环境配置及安装 1.1 工具安装 1.1.1 Anaconda下载 清华大学镜像站下载&#xff0c;版本为Anaconda3-5.2.0-Windows-x86_64&#xff08;对应python3.6.5&#xff09; Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 1.1.2…

关于我的数据结构与算法——初阶第二篇(排序)

&#xff08;叠甲&#xff1a;如有侵权请联系&#xff0c;内容都是自己学习的总结&#xff0c;一定不全面&#xff0c;仅当互相交流&#xff08;轻点骂&#xff09;我也只是站在巨人肩膀上的一个小卡拉米&#xff0c;已老实&#xff0c;求放过&#xff09;。 排序的概念及其运…

AI驱动的低代码未来:加速应用开发的智能解决方案

引言 随着数字化转型的浪潮席卷全球&#xff0c;企业对快速构建应用程序的需求愈发强烈。然而&#xff0c;传统的软件开发周期冗长、成本高昂&#xff0c;往往无法满足快速变化的市场需求。在此背景下&#xff0c;低代码平台逐渐成为开发者和企业的优选方案&#xff0c;以其“低…

三周精通FastAPI:21 子依赖项和路径操作装饰器依赖项

官方文档&#xff1a;https://fastapi.tiangolo.com/zh/tutorial/dependencies/sub-dependencies/#_6 子依赖项 FastAPI 支持创建含子依赖项的依赖项。 并且&#xff0c;可以按需声明任意深度的子依赖项嵌套层级。 FastAPI 负责处理解析不同深度的子依赖项。 第一层依赖项 …

模具生产管理系统软件:提升制造业效率的新利器

引言 我们都知道&#xff0c;企业面临着提高生产效率、降低成本和提升产品质量的压力。模具生产作为制造过程中至关重要的一环&#xff0c;如何有效管理和优化模具生产过程&#xff0c;成为企业关注的重点。模具生产管理系统应运而生&#xff0c;能够为企业提供实时监控、流程…

MySQL中,如何定位慢查询?定位到的慢SQL如何分析?

目录 1. 慢查询发生的场景&#xff1f; 2. MySQL中&#xff0c;如何定位慢查询&#xff1f; 2.1 详细解释 3. 定位到的慢SQL如何分析&#xff1f; 3.1 详细说明 1. 慢查询发生的场景&#xff1f; 2. MySQL中&#xff0c;如何定位慢查询&#xff1f; 介绍一下当时产生问题…

「C/C++」C++ 设计模式 之 单例模式(Singleton)

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

华为云开源项目Sermant正式成为CNCF官方项目

近日&#xff0c;云原生计算基金会&#xff08;CNCF&#xff09;正式接纳由华为云发起的云原生无代理服务网格项目Sermant。Sermant的加入&#xff0c;极大地丰富了云原生微服务治理技术的探索、创新和发展&#xff0c;为CNCF社区注入了新的活力。 Sermant是华为云在微服务治理…

用sdcc给51单片机编译C程序

学习单片机大部分人用的是Keil uVision&#xff0c;虽然好用&#xff0c;可大部分人用的是盗版&#xff0c;其实单片机程序小的话&#xff0c;完全可以用文本编辑器&#xff08;推荐notepad)编写&#xff0c;然后用免费的sdcc来编译&#xff0c;下面介绍一下大致的过程。 sdcc…

Ajax:表单 模板引擎

Ajax&#xff1a;表单 & 模板引擎 form 表单form 属性 Ajax操控表单事件监听阻止默认行为收集表单数据 模板引擎art-template{{}}语法原文输出条件输出循环输出过滤器 原理 form 表单 在HTML中&#xff0c;可以通过<form>创建一个表单&#xff0c;收集用户信息。而采…

【水下生物数据集】 水下生物识别 深度学习 目标检测 机器视觉 yolo(含数据集)

一、背景意义 随着全球海洋生态环境的日益变化&#xff0c;水下生物的监测和保护变得愈发重要。水下生物种类繁多&#xff0c;包括螃蟹、鱼类、水母、虾、小鱼和海星等&#xff0c;它们在海洋生态系统中扮演着关键角色。传统的水下生物监测方法通常依赖于人工观察&#xff0c;效…

[vulnhub]Kioptrix: Level 1.2 (#3)

https://www.vulnhub.com/entry/kioptrix-level-12-3,24/ 主机发现端口扫描 使用nmap扫描网段类存活主机 因为靶机是我最后添加的&#xff0c;所以靶机IP是169 nmap -sP 192.168.75.0/24 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-10-29 13:16 CST …

TVM前端研究--Relay

文章目录 深度学习IR梳理1. IR属性2. DL前端发展3. DL编译器4. DL编程语言Relay的主要内容一、Expression in Relay1. Dataflow and Control Fragments2. 变量3. 函数3.1 闭包3.2 多态和类型关系3.3. Call4. 算子5. ADT Constructors6. Moudle和Global Function7. 常量和元组8.…

Ubuntu UFW防火墙规则与命令示例大全

在服务器安全领域&#xff0c;防火墙是守护网络安全的坚实盾牌。UFW&#xff08;Uncomplicated Firewall&#xff09;&#xff0c;即“不复杂的防火墙”&#xff0c;是一个运行在iptables之上的防火墙配置工具&#xff0c;它为Ubuntu系统默认提供了一个简洁的命令行界面&#x…

Linux高阶——1026—验证内存映射mmap函数使用

1、验证共享映射后修改文件内容&#xff0c;是否能够同步 先创建一个映射文件&#xff0c;写入数据 分为四个步骤 1、打开映射文件 设文件描述符&#xff0c;使用open函数 int fd; if((fdopen("mapfile",O_RDWR))-1) { perror("open failed");exit…

从零开始的 vue项目部署到服务器详细步骤(vue项目build打包+nginx部署+配置ssl证书)

从零开始的 vue项目部署到服务器详细步骤&#xff08;vue项目build打包nginx部署配置ssl证书&#xff09; 文章目录 从零开始的 vue项目部署到服务器详细步骤&#xff08;vue项目build打包nginx部署配置ssl证书&#xff09;一、前言二、vue项目部署前配置1、vite.config.js 增加…