MySQL | CRUD

目录

1. Create

2. Retrieve

2.1. SELECT列

2.1.1. 全列查询

2.1.2. 指定列查询

2.1.3. 查询字段为表达式

2.1.4. 为查询结果指定别名

2.1.5. 结果去重

2.2. WHERE条件

2.2.1. 年龄小于19的同学

2.2.2. id在2~3的同学

2.2.3. id为1和4的同学

2.2.4. 姓张的同学及张某的同学

2.3. 结果排序

2.3.1. 年龄按照升序

2.3.2. 年龄按照降序

2.3.3. 查询同学信息,依次按照年龄降序,id升序的方式显示

2.4. 筛选分页结果

2.4.1. 按 id 进行分页

3. Update

3.1. 将id为1的同学name改为麻子

3.2. 将所有同学的年龄+2

4. Delete

4.1. 删除麻子同学的信息

4.2. 删除整张表

4.3. 截断表

4.4. 插入查询结果

5. 聚合函数

5.1. 统计班级共有多少同学

5.2. 统计年龄的总和

5.3. 统计平均年龄

5.4. 返回年龄最大值和最小值

6. GROUP BY子句的使用

6.1. 显示每个订单编号中的最高销售数量

6.2. 显示销售数量低于5的订单信息


表的增删查改也叫做CRUD:CREATE 创建,RETRIEVE读取,UPDATE更新,DELETE函数。

1. Create

创建一张学生表:

CREATE TABLE students (id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,sn INT NOT NULL UNIQUE,name VARCHAR(20) NOT NULL,qq VARCHAR(20)
);

单行数据 + 全列插入。

全列插入的时候,必须按照创建表的顺序来插入数据.
INSERT INTO students VALUES(1,101,'a',NULL);

多行数据 + 指定列插入

指定列插入可以在表明后面跟上要插入的列.
INSERT INTO students(id, sn, name) VALUES(2,102, 'b'),(3, 103,'c');

插入否则更新

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

INSERT INTO students VALUES(1,104,'d',NULL);

INSERT INTO students VALUES(4,101,'d',NULL);

对于这种情况,可以选择性的进行同步更新操作语法:

INSERT ... ON DUPLICATE KEY UPDATE
column = value [, column = value] ...
INSERT INTO students VALUES (3,103,'d','123456') ON DUPLICATE
KEY UPDATE sn = 103, name = 'd';

这条数据已经存在过了,会产生冲突,在添加了同步更新之后,新数据会把旧数据给覆盖。

-- 0 row affected:
-- 1 row affected:
-- 2 row affected:

表中有冲突数据,但冲突数据的值和 update 的值相等
表中没有冲突数据,数据被插入
表中有冲突数据,并且数据已经被更新


替换

-- 主键 或者 唯一键 没有冲突,则直接插入;
-- 主键 或者 唯一键 如果冲突,则删除后再插入;

REPLACE INTO students (sn, name) VALUES(102, '13462');

-- 1 row affected:
-- 2 row affected:

表中没有冲突数据,数据被插入
表中有冲突数据,删除后重新插入

2. Retrieve

语法:

SELECT[DISTINCT] {* | {column [, column] ...}[FROM table_name][WHERE ...][ORDER BY column [ASC | DESC], ...]LIMIT ...
在进行查询的时候,是不建议使用*号来进行全查询的。

案例:

创建表结构
CREATE TABLE students (id INT NOT NULL AUTO_INCREMENT,name VARCHAR(100) NOT NULL,age INT NOT NULL,class VARCHAR(100) NOT NULL,PRIMARY KEY (id)
);
插入测试数据
INSERT INTO students (name, age, class) VALUES ('张三', 18, '一年级');
INSERT INTO students (name, age, class) VALUES ('李四', 19, '二年级');
INSERT INTO students (name, age, class) VALUES ('王五', 20, '三年级');

2.1. SELECT列

2.1.1. 全列查询

通常情况下不建议使用*进行全列查询,查询的列越多,意味着需要传输的数据量越大,并且可能会影响到索引的使用。---- 不建议规不建议,在日常学习的时候还是可以用的。

SELECT * FROM students;

2.1.2. 指定列查询

指定列查询的顺序不需要按照创建表的时候设定字段的顺序查询。

SELECT name FROM students;

2.1.3. 查询字段为表达式

表达式不包含字段

SELECT id, name, 10 FROM students;


表达式包含字段

SELECT id, name, age + 10 FROM students;


表达式包含多个字段

SELECT id, name, age + 10 + class FROM students;

2.1.4. 为查询结果指定别名

语法:

SELECT column [AS] alias_name [...] FROM table_name;
SELECT id, name, age + 10 AS 年龄加10 FROM students;

2.1.5. 结果去重

SELECT age FROM students;

SELECT DISTINCT age FROM students;

2.2. WHERE条件

比较运算符:

运算符

说明

>, >=, <, <=

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

=

等于,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 个)任意字符;_ 表示任意一个字符

逻辑运算符:

运算符

说明

AND

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

OR

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

NOT

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

2.2.1. 年龄小于19的同学

SELECT name ,age FROM students WHERE age <= 19;

2.2.2. id在2~3的同学

使用AND进行连接

SELECT id, name FROM students WHERE id >= 2 AND id <= 3;

'


使用BETWEEN……AND……条件

SELECT id, name FROM students WHERE id BETWEEN 2 AND 3;

2.2.3. id为1和4的同学

SELECT id, name FROM students WHERE id IN (1, 4);
SELECT id, name FROM students WHERE id = 1 OR id = 4;

2.2.4. 姓张的同学及张某的同学

INSERT INTO students (name, age, class) VALUES ('张三丰', 20, '三年级');
匹配任意多个(包括0个)任意字符
SELECT name FROM students WHERE name LIKE '张%';


严格匹配一个字符
SELECT name FROM students WHERE name LIKE '张_';

2.3. 结果排序

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

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

2.3.1. 年龄按照升序

SELECT name, age FROM students ORDER BY age;
SELECT name, age FROM students ORDER BY age ASC;

2.3.2. 年龄按照降序

SELECT name, age FROM students ORDER BY age DESC;

2.3.3. 查询同学信息,依次按照年龄降序,id升序的方式显示

SELECT id, name, age FROM students ORDER BY age DESC , id ASC ;

2.4. 筛选分页结果

语法:

-- 起始下标为 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;

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

2.4.1. 按 id 进行分页

SELECT id, name, age FROM students ORDER BY id LIMIT 3 OFFSET 0;

3. Update

语法:

UPDATE table_name SET column = expr [, column = expr ...]
[WHERE ...] [ORDER BY ...] [LIMIT ...]

对查询到的结果进行列值更新

3.1. 将id为1的同学name改为麻子

UPDATE students SET name = '麻子' WHERE id = 1;

3.2. 将所有同学的年龄+2

没有WHERE子句,则更新全表
UPDATE students SET age = age + 2;

4. Delete

语法:

DELETE FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...]

4.1. 删除麻子同学的信息

DELETE FROM students WHERE name = '麻子';

4.2. 删除整张表

DELETE FROM TABLE_NAME
使用这个命令可以把表中的所有内容都给删除。

再插入新的数据

INSERT INTO students (name, age, class) VALUES ('赵六', 21, '四年级');
INSERT INTO students (name, age, class) VALUES ('孙七', 22, '五年级');
INSERT INTO students (name, age, class) VALUES ('周八', 23, '六年级');
INSERT INTO students (name, age, class) VALUES ('吴九', 24, '七年级');
INSERT INTO students (name, age, class) VALUES ('郑十', 25, '八年级');

插入数据之后发现,自增id是在原值上增长的。

查看表结构,发现存在一个AUTO_INCREMENT = 11。

SHOW CREATE TABLE students;

4.3. 截断表

语法:

TRUNCATE [TABLE] table_name

注意:这个操作慎用

  1. 只能对整表操作,不能像 DELETE 一样针对部分数据操作;
  2. 实际上 MySQL 不对数据操作,所以比 DELETE 更快,但是TRUNCATE在删除数据的时候,并不经过真正的事物,所以无法回滚
  3. 会重置 AUTO_INCREMENT 项
TRUNCATE students;

阶段之后查询,发现是一张空表,在插入数据。

INSERT INTO students (name, age, class) VALUES ('赵六', 21, '四年级');
INSERT INTO students (name, age, class) VALUES ('孙七', 22, '五年级');
INSERT INTO students (name, age, class) VALUES ('周八', 23, '六年级');
INSERT INTO students (name, age, class) VALUES ('吴九', 24, '七年级');
INSERT INTO students (name, age, class) VALUES ('郑十', 25, '八年级');

查询数据后发现,id不在是在原值的基础上增长的。

4.4. 插入查询结果

语法:

INSERT INTO table_name [(column [, column ...])] SELECT ...

在创建一张空表,结构和students一样。

CREATE TABLE cp_students LIKE students;

将students的数据插入到cp_students表中。

INSERT INTO cp_students SELECT DISTINCT * FROM students;

通过重命名表,实现去重操作

RENAME TABLE cp_students TO students;

5. 聚合函数

函数

说明

COUNT([DISTINCT] expr)

返回查询到的数据的 数量

SUM([DISTINCT] expr)

返回查询到的数据的 总和,不是数字没有意义

AVG([DISTINCT] expr)

返回查询到的数据的 平均值,不是数字没有意义

MAX([DISTINCT] expr)

返回查询到的数据的 最大值,不是数字没有意义

MIN([DISTINCT] expr)

返回查询到的数据的 最小值,不是数字没有意义

5.1. 统计班级共有多少同学

SELECT COUNT(*) FROM students;

5.2. 统计年龄的总和

SELECT SUM(age) FROM students;

5.3. 统计平均年龄

SELECT AVG(age) FROM students;

5.4. 返回年龄最大值和最小值

SELECT MAX(age) FROM students;
SELECT MIN(age) FROM students;

6. GROUP BY子句的使用

在SELECT中使用GROUP BY子句可以对指定列进行分组查询。

select column1, column2, .. from table group by column;

案例:

CREATE TABLE sales (order_id SERIAL PRIMARY KEY,customer_id INT,product_id INT,quantity INT,unit_price DECIMAL(10, 2),total_price DECIMAL(10, 2),order_date DATE
);
订单编号、客户编号、产品编号、销售数量、单价、总价和订单日期。
INSERT INTO sales (customer_id, product_id, quantity, unit_price, total_price, order_date)
VALUES(101, 201, 5, 10.00, 50.00, '2024-03-01'),(102, 202, 3, 15.00, 45.00, '2024-03-02'),(103, 203, 2, 20.00, 40.00, '2024-03-03'),(104, 201, 4, 10.00, 40.00, '2024-03-04'),(105, 204, 6, 8.00, 48.00, '2024-03-05'),(101, 202, 2, 15.00, 30.00, '2024-03-06'),(102, 203, 1, 20.00, 20.00, '2024-03-07'),(103, 201, 3, 10.00, 30.00, '2024-03-08'),(104, 204, 5, 8.00, 40.00, '2024-03-09'),(105, 202, 4, 15.00, 60.00, '2024-03-10');

6.1. 显示每个订单编号中的最高销售数量

SELECT order_id, MAX(quantity) AS max_quantity
FROM sales
GROUP BY order_id;

6.2. 显示销售数量低于5的订单信息

SELECT * FROM sales GROUP BY order_id
HAVING SUM(quantity) < 5;
--having经常和group by搭配使用,作用是对分组进行筛选,作用有些像where

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

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

相关文章

集成学习 | 集成学习思想:Bagging思想

目录 一. Bagging思想1. Bagging 算法2. 随机森林(Random Forest)算法 在正文开始之前&#xff0c;我们先来聊一聊什么是集成学习&#xff1f; 集成学习是一种算法思想&#xff1a;将若干个弱学习器分组之后&#xff0c;产生一个新的学习器 弱学习器指预测误差在50%以下的学习器…

VS Code安装Live Server插件搭建web网页结合内网穿透实现公网访问

文章目录 前言1. 编写MENJA小游戏2. 安装cpolar内网穿透3. 配置MENJA小游戏公网访问地址4. 实现公网访问MENJA小游戏5. 固定MENJA小游戏公网地址 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&…

性能测试-Jmeter常用元件基础使用

一、Jmeter元件 #线程组 添加HTTP请求 #配置元件 配置元件内的元件都是用于进行初始化的东西 #监听器 监听器主要是用来获取我们使用取样器发送请求后的响应数据相关信息 #定时器 定时器主要用来控制我们多久后执行该取样器&#xff08;发送请求&#xff09; #前置处理器 前置处…

【Python循环3/5】条件循环语句

目录 导入 条件循环 边界条件 while循环 死循环 while循环与for循环的区别 总结 知识图谱 导入 我们已经学习了如何利用for语句实现代码重复执行的循环结构。通过遍历列表&#xff0c;输出其中的每一个元素。 for循环就像是排队办事&#xff0c;一个个进入&#xff0c;轮…

爬虫逆向实战(35)-MyToken数据(MD5加盐)

一、数据接口分析 主页地址&#xff1a;MyToken 1、抓包 通过抓包可以发现数据接口是/ticker/currencyranklist 2、判断是否有加密参数 请求参数是否加密&#xff1f; 通过查看“载荷”模块可以发现有一个code参数 请求头是否加密&#xff1f; 无 响应是否加密&#xf…

HarmonyOS(鸿蒙)快速入门

一:下载开发工具 鸿蒙的开发工具叫DevEco 下载点击 其他部分都一直next 就行,这个页面出现的install 建议都点击install 然后单独选择安装目录 可能存在的问题 就是之前安装nodejs&#xff08;比如自己开发web或者RN等情况&#xff09;版本低 等情况 所以建议你单独安装一次 …

string的使用和模拟实现| 细致到strcpy ,strstr,strcmp都不放过

string的使用和模拟实现 string的成员变量string的构造方法用法无参的构造方法的实现全缺省的构造参数的实现 strcpy的模拟实现为什么这里的_size要1?为什么这里是默认传空字符串&#xff1f; 赋值运算符重载 析构函数遍历字符串operator[]使用传统c语言字符串下标遍历的缺点 …

【Linux系统编程】进程程序替换

介绍&#xff1a; 进程程序替换是指将一个进程中正在运行的程序替换为另一个全新的程序的过程&#xff0c;但替换不是创建新进程&#xff0c;只是将对应程序的代码和数据进行替换。具体来说&#xff0c;这个替换过程涉及将磁盘中的新程序加载到内存结构中&#xff0c;并重新建立…

防火墙常用功能配置

防火墙&#xff1a;为了限制不同区域之间的流量通信。默认有一条拒绝所有的策略。 现在的防火墙主要作用&#xff1a;是区域隔离和访问控制。 安全防护是核心特性 路由器&#xff1a;ACL列表&#xff0c;控制流量 入侵防御&#xff1a;网络攻击 文件过滤&#xff0c;内容过滤&…

电脑里的图片杂乱无章怎么办?使用汇帮批量重命名一键帮你解决 大量图片如何批量重命名?

当我们面临大量的图片需要重命名时&#xff0c;这无疑是一项繁琐而耗时的任务。然而&#xff0c;通过一些有效的方法和工具&#xff0c;我们可以使这个过程变得更加高效和轻松。以下介绍的这款汇帮批量重命名软件&#xff0c;能够帮助您有效地重命名大量的图片。 想要快速的进…

C++容器适配器与stack,queue,priority_queue(优先级队列)的实现以及仿函数(函数对象)与deque的简单介绍

&#x1f389;个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名乐于分享在学习道路上收获的大二在校生 &#x1f648;个人主页&#x1f389;&#xff1a;GOTXX &#x1f43c;个人WeChat&#xff1a;ILXOXVJE &#x1f43c;本文由GOTXX原创&#xff0c;首发CSDN&…

【玩转AI绘画】有奖活动火热进行中,参与赢取耳机键盘等好礼!

AI 绘画发展迅猛&#xff0c;各种创新插件如 animatediff、instantid、controlnet 、roop 等遍地开花&#xff0c;极大地激发了 StableDiffusion 的应用潜力。AI 绘画的使用场景不断扩展&#xff0c;如 AI 视频制作、Q 版头像生成、老照片修复、照片高清化等。腾讯云高性能应用…

【OceanBase诊断调优】—— 敏捷诊断工具obdiag一键分析OB集群日志设计与实践

最近总结一些诊断OCeanBase的一些经验&#xff0c;出一个【OceanBase诊断调优】专题&#xff0c;也欢迎大家贡献自己的诊断OceanBase的方法。 1. 前言 obdiag定位为OceanBase敏捷诊断工具。1.2版本的obdiag支持诊断信息的一键收集&#xff0c;光有收集信息的能力&#xff0c;…

【nnUNetv2实践】一、nnUNetv2安装

nnUNet是一个自适应的深度学习框架&#xff0c;专为医学图像分割任务设计。以下是关于nnUNet的详细解释和特点&#xff1a; 自适应框架&#xff1a;nnUNet能够根据具体的医学图像分割任务自动调整模型结构、训练参数等&#xff0c;从而避免了繁琐的手工调参过程。自动化流程&am…

提升地理空间分析效率,火山引擎ByteHouse上线GIS能力

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 在数字化时代&#xff0c;地理空间分析&#xff08;Geospatial Analytics&#xff09;成为辅助企业市场策略洞察的重要手段。无论是广告投放的精准定位&#xff0c;…

Leetcode 1. 两数之和

心路历程&#xff1a; 很简单的题&#xff0c;双层暴力就可以&#xff0c;用双指针的话快一点。暴力时间复杂度O( n 2 n^2 n2)&#xff0c;双指针时间复杂度O(nlogn) O(n) O(n) O(nlogn)。 注意的点&#xff1a; 1、题目需要返回原数组的索引&#xff0c;所以排序后还需要…

豆瓣电影信息爬取与可视化分析

目录 一、项目背景 二、代码 三、总结 一、项目背景 &#xff08;1&#xff09;利用requests库采集豆瓣网分类排行榜 (“https://movie.douban.com/chart”)中各分类类别前100部电影的相关信息并存储为csv文件。 &#xff08;2&#xff09;利用获取的13个分类类别共1300部电…

Linux:搭建ntp服务器

我准备两个centos7服务器 一个为主服务器连接着外网&#xff0c;并且搭建了ntp服务给其他主机同步 另外一个没有连接外网&#xff0c;通过第一台设备去同步时间 首先两个服务器都要安装ntp软件 yum -y install ntp 再把他俩的时间都改成别的 左侧的是主服务器&#xff0c;主…

idea项目mapper.xml中的SQL语句黄色下划线去除

问题描述 当我们使用idea开发java项目时&#xff0c;经常会与数据库打交道&#xff0c;一般在使用mybatis的时候需要写一大堆的mapper.xml以及SQL语句&#xff0c;每当写完SQL语句的时候总是有黄色下划线&#xff0c;看着很不舒服。 解决方案&#xff1a; 修改idea的配置 Edi…

服务器段的连接端口和监听端口编程实现

new ServerSocket(int)是开启监听端口&#xff0c;并不是连接端口。真正的连接端口是随机开辟的空闲端口&#xff0c;当连接创建完成后&#xff0c;监听关口可以继续等待下一次连接请求&#xff0c;处于空闲等待状态。 编程实现方式 1 、主线程一直处于阻塞等待状态&#xff0c…