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 为降序(从大到小)
-- 默认为 ASC

SELECT ... 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

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

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

相关文章

Android启动优化

文章目录 一、启动分析1.1 启动过程分析1.2 启动问题分析 二、优化工具三、业务梳理3.1 方法论3.2 案例 四、其他优化方式4.1 布局优化4.2 线程优化4.3 GC优化4.4 系统调用优化 五、防劣化5.1 性能监控和测试5.2 代码审查 六、总结 一、启动分析 1.1 启动过程分析 Android应用…

【C语言】linux内核pci_save_state

一、中文注释 //include\linux\pci.h /* 电源管理相关的例程 */ int pci_save_state(struct pci_dev *dev);//drivers\pci\pci.c /*** pci_save_state - 在挂起前保存PCI设备的配置空间* dev: - 我们正在处理的PCI设备*/ int pci_save_state(struct pci_dev *dev) {int i;/* X…

R语言:microeco:一个用于微生物群落生态学数据挖掘的R包:第七:trans_network class

# 网络是研究微生物生态共现模式的常用方法。在这一部分中&#xff0c;我们描述了trans_network类的所有核心内容。 # 网络构建方法可分为基于关联的和非基于关联的两种。有几种方法可以用来计算相关性和显著性。 #我们首先介绍了基于关联的网络。trans_network中的cal_cor参数…

mybatis项目中配置sql提示

2023版的idea好像内置了这个功能。 第一步&#xff1a; 第二步&#xff1a;第一步完成后user会爆红&#xff0c;这时我们需要连接数据库。

个人简历主页搭建系列-03:Hexo+Github Pages 介绍,框架配置

今天的更新内容主要是了解为什么选择这个网站搭建方案&#xff0c;以及一些前置软件的安装。 Why Hexo? 首先我们了解一下几种简单的网站框架搭建方案&#xff0c;看看对于搭建简历网站的需求哪个更合适。 在 BuiltWith&#xff08;网站技术分析工具&#xff09;上我们可以…

Leetcode 1. 两数之和

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

如何使用代理IP进行口子查和渠道查?

在进行问卷调查时&#xff0c;为了避免被限制访问或被封禁IP&#xff0c;使用代理IP已经成为了必要的选择。 其中&#xff0c;口子查和渠道查也不例外。 使用代理IP可以隐藏本机IP地址&#xff0c;模拟不同的IP地址&#xff0c;从而规避被封禁的风险。但是&#xff0c;对于很…

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

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

怎么使用阵列?——AutoCAD

一、具体步骤 这次我们通过一个任务来学习这个功能&#xff1a; 下面是规则结构图形&#xff0c;我们要给用它来定位元器件&#xff0c;但是由于它是不闭合图形&#xff0c;致使导入PCB Editor里面之后不能通过Shape>> Compose shape转化成可以用软件捕捉的Shape属性的图…

孙宇晨接受Bankless专访:相信波场TRON将长存

在近期的Bankless专访中,波场TRON创始人、火币HTX全球顾问委员会委员孙宇晨分享了他对加密货币世界的深刻见解以及对波场TRON平台未来的展望。 作为加密领域的先锋,孙宇晨从早年的比特币交易员转变为领先的区块链平台创始人,见证了加密货币从边缘到主流的演变。他深信,随着技术…

uniapp使用Echarts图表H5显示正常 打包app显示异常

uniapp使用Echarts在H5页面调试 调试完在H5正常显示 然后通过安卓机调试的时候 发现直接空白了 还有这个爆错 Initialize failed: invalid dom 我有多个图表、图表是通过v-for循环出来的 解决方案 原来是yarn直接安装Echarts 然后改成本地JS文件引入 gitbub文件地址 — dist/…

031—pandas 读取解析实验室数据至DataFrame

前言 某个科研实验室在进行一项物理实现&#xff0c;实验仪器会输出一个 txt 文本的数据&#xff0c;研究人员需要从这个文本中将数据结构化才能进行进行统计分析。 在为个解析和分析过程中&#xff0c;他们选择了 Python 的 pandas 库来完成这些操作。我们今天来完成这这个 t…

【MyBatis-Plus】逻辑删除、乐观锁、防全表更新和删除实现 MyBatisX插件 高级扩展

文章目录 一、逻辑删除实现二、乐观锁实现2.1 悲观锁和乐观锁场景和介绍2.2 具体技术和方案:2.3 版本号乐观锁技术的实现流程2.4 使用mybatis-plus数据使用乐观锁 三、防全表更新和删除实现三、代码生成器(MyBatisX插件) 一、逻辑删除实现 物理删除&#xff1a;真实删除&#…

【漏洞复现】F-logic DataCube3 任意文件上传漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

【管理咨询宝藏42】某大型银行风险预警体系规划报告

本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 【管理咨询宝藏42】某大型银行风险预警体系规划报告 【格式】PDF版本 【关键词】战略规划、预警体系、管理咨询 【文件核心观点】 - 华信银行的风险预警在五个…

任务栏通知区域

在 Windows 操作系统中&#xff0c;任务栏底部右侧的区域被称为 "System Tray" 或者 "Notification Area" Notification Area - Win32 apps | Microsoft Learn The notification area provides notifications and status. Well-designed programs use the …

【Stable Diffusion】入门-03:图生图基本步骤+参数解读

目录 1 图生图原理2 基本步骤2.1 导入图片2.2 书写提示词2.3 参数调整 3 随机种子的含义4 拓展应用 1 图生图原理 当提示词不足以表达你的想法&#xff0c;或者你希望以一个更为简单清晰的方式传递一些要求的时候&#xff0c;可以给AI输入一张图片&#xff0c;此时图片和文字是…

动态规划:4种遍历方向图解+Python实现

前言 动态规划类题型在遍历过程中&#xff0c;根据状态转移函数的不同&#xff0c;代码实现时遍历的方向也会有所差异。总的来说&#xff0c;一共可以总结为下图四种模式&#xff1a; 红色五角星表示当前要计算的状态值&#xff1b;白底箭头代表哪些状态要提前算出来&#xf…

opengl程序错误,无法定位程序输入点 glewGetErrorString@4 于动态链接库

使用mingw编译器编译运行opengl程序&#xff0c;编译通过运行时崩溃 怀疑是之前的mingw版本编译的glew库版本不对&#xff0c;又重新编译一遍&#xff0c;还是这个错误 之后检查环境变量配置&#xff0c;发现有两个glew的路径&#xff0c;一个是msvc版的&#xff0c;另一个是m…

【python】flask框架的生命周期,多种查询参数的获取方式

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…