[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 UPDATE
    column = 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 可以进行分页。就比如数据多就可以这样进行分页读

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言:代码运行的底层奥秘,编译和链接

目录 翻译环境和运行环境编译环境预编译&#xff08;预处理&#xff09;编译词法分析语法分析语义分析 汇编 链接运行环境 翻译环境和运行环境 在ANSI C的任何⼀种实现中&#xff0c;存在两个不同的环境。 第1种是翻译环境&#xff0c;在这个环境中源代码被转换为可执行的机器…

2024 FinTechathon 校园行:助力高校学生探索金融科技创新

在金融科技蓬勃发展的当下&#xff0c;人才培养成为推动行业前行的关键。为推进深圳市金融科技人才高地建设&#xff0c;向高校学子提供一个展示自身知识、能力和创意的平台&#xff0c;2024 FinTechathon 深圳国际金融科技大赛——西丽湖金融科技大学生挑战赛重磅开启&#xf…

第7章 内容共享

第 7 章 内容共享 bilibili学习地址 github代码地址 本章介绍Android不同应用之间共享内容的具体方式&#xff0c;主要包括&#xff1a;如何利用内容组件在应用之间共享数据&#xff0c;如何使用内容组件获取系统的通讯信息&#xff0c;如何借助文件提供器在应用之间共享文件…

控制台安全内部:创新如何塑造未来的硬件保护

在 Help Net Security 的采访中&#xff0c;安全研究人员 Specter 和 ChendoChap 讨论了游戏机独特的安全模型&#xff0c;并强调了它与其他消费设备的不同之处。 他们还分享了对游戏机安全性的进步将如何影响未来消费者和企业硬件设计的看法。 斯佩克特 (Specter) 是本周在阿…

开源项目-投票管理系统

哈喽&#xff0c;大家好&#xff0c;今天主要给大家带来一个开源项目-投票管理系统 投票管理系统主要有首页&#xff0c;发起投票&#xff0c;管理投票&#xff0c;参与投票&#xff0c;查看投票等功能 首页 为用户提供了一键导航到各个功能模块的便捷途径。 新增投票 用户…

Unity 两篇文章熟悉所有编辑器拓展关键类 (上)

本专栏基础资源来自唐老狮和siki学院&#xff0c;仅作学习交流使用&#xff0c;不作任何商业用途&#xff0c;吃水不忘打井人&#xff0c;谨遵教诲 编辑器扩展内容实在是太多太多了&#xff08;本篇就有五千字&#xff09; 所以分为两个篇章而且只用一些常用api举例&#xff0c…

rnn/lstm

tip&#xff1a;本人比较小白&#xff0c;看到july大佬的文章受益匪浅&#xff0c;现在其文章基础上加上自己的归纳、理解&#xff0c;以及gpt的答疑&#xff0c;如果有侵权会删。 july大佬文章来源&#xff1a;如何从RNN起步&#xff0c;一步一步通俗理解LSTM_rnn lstm-CSDN博…

【Docker大揭秘】

Docker 调试一天的血与泪的教训&#xff1a;设备条件&#xff1a;对应的build preparation相应的报错以及修改 作为记录 构建FASTLIO2启动docker获取镜像列出镜像运行containerdocker中实现宿主机与container中的文件互传 调试一天的血与泪的教训&#xff1a; 在DOCKER中跑通F…

APISQL企业版离线部署教程

针对政务、国企、医院、军工等内网物理隔离的客户&#xff0c;有时需要多次摆渡才能到达要安装软件的服务器。本教程将指导您使用Linux和Docker Compose编排服务&#xff0c;实现APISQL的离线部署。 准备 准备一台Linux(x86_64)服务器。 安装Docker Engine&#xff08;推荐版本…

音视频入门基础:AAC专题(11)——AudioSpecificConfig简介

音视频入门基础&#xff1a;AAC专题系列文章&#xff1a; 音视频入门基础&#xff1a;AAC专题&#xff08;1&#xff09;——AAC官方文档下载 音视频入门基础&#xff1a;AAC专题&#xff08;2&#xff09;——使用FFmpeg命令生成AAC裸流文件 音视频入门基础&#xff1a;AAC…

docker 可用镜像服务地址(2024.10.25亲测可用)

1.错误 Error response from daemon: Get “https://registry-1.docker.io/v2/” 原因&#xff1a;镜像服务器地址不可用。 2.可用地址 编辑daemon.json&#xff1a; vi /etc/docker/daemon.json内容修改如下&#xff1a; {"registry-mirrors": ["https://…

【AI应用落地实战】智能文档处理本地部署——可视化文档解析前端TextIn ParseX实践

湘江之畔&#xff0c;秋风送爽。前不久&#xff0c;2024长沙中国1024程序员节在长沙盛大举行。今年的程序员节主题为“智能应用新生态”&#xff0c;以科技为纽带&#xff0c;搭建起了一个共筑智能应用新生态的交流平台&#xff0c;众多技术大咖齐聚一堂&#xff0c;探讨智能应…

echarts实现 水库高程模拟图表

需求背景解决思路解决效果index.vue 需求背景 需要做一个水库高程模拟的图表&#xff0c;x轴是水平距离&#xff0c;y轴是高程&#xff0c;需要模拟改水库的形状 echarts 图表集链接 解决思路 配合ui切图&#xff0c;模拟水库形状 解决效果 index.vue <!--/*** author:…

Kubeadm搭建k8s

一、架构 节点名称规格IP地址安装组件master012C/4G&#xff0c;cpu核心数要求大于2192.168.88.76docker、kubeadm、kubelet、kubectl、flannelnode012C/2G192.168.88.20docker、kubeadm、kubelet、kubectl、flannelnode022C/2G192.168.88.21docker、kubeadm、kubelet、kubect…

transformers和bert实现微博情感分类模型提升

项目源码获取方式见文章末尾&#xff01; 600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【LSTM模型实现光伏发电功率的预测】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模…

【Apache Zookeeper】

一、简介 1、场景 如何让⼀个应⽤中多个独⽴的程序协同⼯作是⼀件⾮常困难的事情。开发这样的应⽤&#xff0c;很容易让很多开发⼈员陷⼊如何使多个程序协同⼯作的逻辑中&#xff0c;最后导致没有时间更好地思考和实现他们⾃⼰的应⽤程序逻辑&#xff1b;又或者开发⼈员对协同…

了解lwip

lwIP是一个小型的开源的TCP/IP协议栈&#xff08;精简版的TCP/IP协议&#xff09;&#xff0c;博客借用了其他博客的内容在此声明。 TCP/IP协议栈结构 应用层&#xff1a;HTTP,MQTT,NTP、FTP....... 传输层:TCP协议&#xff08;用于不可靠设备可靠传输&#xff09;&#xff…

基于Springboot+微信小程序的房产交易租赁服务平台设计与实现 (含源码数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 该系统…

《Linux运维总结:基于ARM64+X86_64架构CPU使用docker-compose一键离线部署redis 6.2.14容器版哨兵集群》

总结&#xff1a;整理不易&#xff0c;如果对你有帮助&#xff0c;可否点赞关注一下&#xff1f; 更多详细内容请参考&#xff1a;《Linux运维篇&#xff1a;Linux系统运维指南》 一、部署背景 由于业务系统的特殊性&#xff0c;我们需要面向不通的客户安装我们的业务系统&…

【计算机网络 - 基础问题】每日 3 题(五十九)

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?typeblog &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞…