MySQL 数据库表的增删改查(基础版)

目录

  • 1 前言(CRUD)
  • 2 新增(Create)
    • 2.1 全列插入
    • 2.2 指定列插入
    • 2.3 关于日期和时间的插入
  • 3 查询(Retrieve)
    • 3.1 全列查询
    • 3.2 指定列查询
    • 3.3 查询字段为表达式
    • 3.4 取别名
    • 3.5 去重
    • 3.6 排序
    • 3.7 条件查询
    • 3.8 分页查询
  • 4 更新(Update)
  • 5 删除(Delete)

1 前言(CRUD)

CRUD : 即增加(Create)、查询(Retrieve)、更新(Update)、删除(Delete)四个单词的首字母缩写。
在了解数据库表的增删改查之前,我们需要先进行一些准备工作,即在选中的数据库中准备两张表:

-- 创建一张学生表
DROP TABLE IF EXISTS student;
CREATE TABLE student (id INT,sn INT comment '学号',name VARCHAR(20) comment '姓名',qq_mail VARCHAR(20) comment 'QQ邮箱';-- 创建考试成绩表
DROP TABLE IF EXISTS exam_result;
CREATE TABLE exam_result (id INT,name VARCHAR(20),chinese DECIMAL(3,1),math DECIMAL(3,1),english DECIMAL(3,1)
);

对于类来说:每一行就是一个学生,每一列就是一个学生的某个属性。

class student{private int id;private int sn;private String name;private String qq_mail;
}

等后面了解到MyBatis等框架的时候就可以用到了。

2 新增(Create)

2.1 全列插入

插入两条记录,VALUES后面括号里的数量必须和定义表的列的数量及顺序一致。例如:

INSERT INTO student VALUES (100, 10000, '唐三藏', NULL);
INSERT INTO student VALUES (101, 10001, '孙悟空', '11111');

2.2 指定列插入

插入两条记录,VALUES后面括号里的数量必须和指定列数量及顺序一致。例如:

INSERT INTO student (id, sn, name) VALUES (102, 20001, '曹孟德'),(103, 20002, '孙仲谋');

如果没有指定某个字段的值,那么默认是NULL,但是注意,后期会了解到约束。

2.3 关于日期和时间的插入

假如我们想对timestamp这个数据类型进行插入操作,则插入的格式必须写为
'2024-01-25'2024-01-25 18:55:42

3 查询(Retrieve)

我们需要先在前面创建的exam_result表中插入一些数据,具体插入操作如下所示:

INSERT INTO exam_result (id,name, chinese, math, english) VALUES(1,'唐三藏', 67, 98, 56),(2,'孙悟空', 87.5, 78, 77),(3,'猪悟能', 88, 98, 90),(4,'曹孟德', 82, 84, 67),(5,'刘玄德', 55.5, 85, 45),(6,'孙权', 70, 73, 78.5),(7,'宋公明', 75, 65, 30);

3.1 全列查询

SELECT * FROM 表名;
*代表当前表当中的所有字段。通常情况下不建议使用* 进行全列查询。因为:

  1. 查询的列越多,意味着需要传输的数据量越大;
  2. 可能会影响到索引的使用。(索引待后面进行了解)

3.2 指定列查询

指定列的顺序不需要按定义表的顺序来。例如:
SELECT id, name, english FROM exam_result;

3.3 查询字段为表达式

  1. 表达式不包含字段。例如:
    SELECT id, name, 10 FROM exam_result;
    注:此时第三列列名、内容统一都为10。
  2. 表达式包含一个字段。例如:
    SELECT id, name, english + 10 FROM exam_result;
    注:此时第三列列名为 english + 10,列的内容为各学生的英语成绩加10。
  3. 表达式包含多个字段。例如:
    SELECT id, name, chinese + math + english FROM exam_result;
    注:此时第三列则代表了查询总成绩,列名为chinese + math + english,列的内容为各学生的三门总成绩和。

3.4 取别名

取别名的作用: 就是当列名或者表名太复杂了,比如太长了,其此时就可以用别名代替!例如:

  1. 给上面总成绩的示例的第三列取一个统一的列名为总分。意思是取之前第三列的名字为 chinese + math + english,取别名后第三列的名字为:总分。
    SELECT id, name, chinese + math + english as 总分 FROM exam_result;
  2. 或者给表取个别名。
    SELECT id, name, chinese + math + english as 总分 FROM exam_result as exam;

当然 as 也可以省略!即上面两个示例可以修改为:

  1. SELECT id, name, chinese + math + english 总分 FROM exam_result;
  2. SELECT id, name, chinese + math + english 总分 FROM exam_result exam;

3.5 去重

使用 DISTINCT 关键字对某列数据进行去重。例如:

  1. 针对我们前面在exam_result表中插入的数据,可以发现math数学成绩那一列有两个98,我们可以先进行数学成绩那一列的查询,再进行一下去重操作。
    SELECT math FROM exam_result;
    SELECT DISTINCT math FROM exam_result;
  2. 但是疑问SELECT id,name, DISTINCT math FROM exam_result;这样的SQL语句是否可以去重?运行之后你会发现,不可以!
    原因:以上这条语句位置不对!需要把去重放在第一位!!
  3. 但是你会发现将示例2中的语句修改为SELECT DISTINCT math,id,name FROM exam_result;这样以后,运行结果并没有把两个数学成绩为98去掉一个,而是都选择了保留。那么为什么会发生这种现象呢?去重的原理又到底是什么?
    因此,我们需要记住:去重针对的是所有的字段!只有当SELECT DISTINCT math,id,name FROM exam_result;中的三个字段同时重复的时候,才会去重!

3.6 排序

  1. 将查询结果根据数学成绩进行从低到高(升序)的排序:
    select * from exam_result order by math;select * from exam_result order by math asc;
    因此我们可以知道order by 默认情况下为升序(从小到大)。
  2. 将查询结果根据数学成绩进行从高到低(降序)的排序:
    select * from exam_result order by math desc;
    我们会发现desc这个词见了2次了,一次是前面显示表结构的时候desc 表名;,另一次就是现在表降序。
    desc实际上是一个关键字,但要注意关键字不要瞎用。假设你要创建一个表,这个表表名叫做desc,按照正常所学应该是先drop table if exists desc;,然后再create table desc(id int,name varchar(10));。但是你运行之后发现会报错,不能运行通过。
    因此,你的变量名要是为MySQL当中的关键字,需要这样写才能运行通过:
drop table if exists `desc`;
create table `desc`(id int,name varchar(10)
);
  1. 使用表达式及别名排序:
    查询同学及总分,由高到低排序:SELECT name, chinese + english + math FROM exam_result ORDER BY chinese + english + math DESC;
    然后我们把chinese + english + math这一列起个别名为total进行排序:SELECT name, chinese + english + math total FROM exam_result ORDER BY chinese + english + math DESC;,运行之后我们发现是可以的,成功了!
    但此时我们想着要是SELECT name, total FROM exam_result ORDER BY chinese + english + math total DESC;这样写能成功吗?这时我们发现不可以!错误原因:查询的顺序问题,它会首先执行SELECT name, total FROM exam_result;,但是此时并不认识total是啥,因此会报错。
    因此我们修改为SELECT name, chinese + english + math total FROM exam_result ORDER BY total DESC;则也是可以成功的!
  2. 可以对多个字段进行排序,排序优先级随书写顺序:
    查询同学各门成绩,依次按 数学降序,英语升序,语文升序的方式显示:
    SELECT name, math, english, chinese FROM exam_result ORDER BY math DESC, english, chinese;

总结:

  1. order by asc 和 order by 默认是从低到高进行排序的。
  2. order by desc是从高到低进行排序的。
  3. 对于MySQL的关键字在用作变量名的时候一定要加符号:``。
  4. NULL 数据排序,视为比任何值都小,升序出现在最上面,降序出现在最下面。
  5. 没有 ORDER BY 子句的查询,返回的顺序是未定义的,永远不要依赖这个顺序。

3.7 条件查询

  1. 查询英语不及格的同学及英语成绩 ( < 60 ):
    SELECT name, english FROM exam_result WHERE english < 60;
  2. 查询英语不及格的同学及英语成绩 ( < 60 ),并按升序进行排序:
    SELECT name, english FROM exam_result WHERE english < 60 order by english;
    但要注意:SELECT name, english FROM exam_result order by english WHERE english < 60;这样写是不可以的,会报错!
  3. 查询数学成绩是 58 或者 59 或者 98 或者 99 分的同学及数学成绩:
    SELECT name, math FROM exam_result WHERE math IN (58, 59, 98, 99);

    SELECT name, math FROM exam_result WHERE math = 58 OR math = 59 OR math = 98 OR math = 99;
  4. 查询数学成绩不是 58 或者 59 或者 98 或者 99 分的同学及数学成绩:
    SELECT name, math FROM exam_result WHERE math not IN (58, 59, 98, 99);
  5. 模糊查询:
    (1) 匹配任意多个(包括 0 个)字符,例如:
    SELECT name FROM exam_result WHERE name LIKE '孙%';这条SQL语句所匹配的数据一定是以 孙 这个字开始的,将匹配到孙悟空、孙权。
    SELECT name FROM exam_result WHERE name LIKE '%孙%';这条SQL语句将匹配的数据一定是以 孙 这个字在中间的。
    SELECT name FROM exam_result WHERE name LIKE '%孙';这条SQL语句所匹配的数据一定是以 孙 这个字结尾的。
    (2)匹配严格的一个任意字符,例如:
    SELECT name FROM exam_result WHERE name LIKE '孙_';这条SQL语句所匹配的数据一定是以 孙 这个字开始的,且记住一个下划线仅对应一个模糊匹配的字,将匹配到孙权。
    SELECT name FROM exam_result WHERE name LIKE '孙__';这条SQL语句所匹配的数据一定是以 孙 这个字开始的,且记住一个下划线仅对应一个模糊匹配的字。所以这条语句将只会找到以孙开头且有3个字的,后两个字是模糊匹配的,将匹配到孙悟空。

比较运算符:

运算符说明
>, >=, <, <=大于,大于等于,小于,小于等于
=等于,NULL 不安全,例如 NULL = NULL 的结果是 NULL
<=>等于,NULL 安全,例如 NULL <=> NULL 的结果是含有NULL的,数据NULL不会被忽略
!=、<>不等于,NULL 不安全,例如 NULL = NULL 的结果是 NULL
BETWEEN a0 AND a1范围匹配,[a0, a1],如果 a0 <= value <= a1,返回数据
IN(option,…)如果是 option 中的任意一个,返回数据
IS NULL是 NULL
IS NOT NULL不是 NULL
LIKE模糊匹配,% 表示任意多个(包括 0 个)任意字符;_ 表示任意一个字符

逻辑运算符:

运算符说明
AND多个条件必须都为 TRUE(1),结果才是 TRUE(1)
OR任意一个条件为 TRUE(1), 结果为 TRUE(1)
NOT条件为 TRUE(1),结果为 FALSE(0)}

注:

  1. WHERE条件可以使用表达式,但不能使用别名。
  2. AND的优先级高于OR,在同时使用时,需要使用小括号()包裹优先执行的部分。

3.8 分页查询

提问: 为何要分页?
答:主要是有的时候,数据量太大了,那么一次性查找数据的时候,系统会执行SQL语句,此时查询是需要时间的,有可能系统就会被卡住。所以,一般优化的方案就是用分页查询。
原理: 每次只查询,当前页需要显示的数据即可。也就是说,如果每页10条数据,那么只查询10条数据。每次点击下一页的时候,又会请求查询10条数据,这样效率就提高了!!!
语法:

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

注:

  1. 如果n的值过大,那么也没关系,只会查询到能查询的内容。
  2. 如果s的值过大,那么SQL不会报错,但是什么也查不到。

示例: 按 id 进行分页,每页 3 条记录,分别显示 第 1、2、3 页。

-- 第 1 页
SELECT id, name, math, english, chinese FROM exam_result ORDER BY id LIMIT 3 OFFSET 0;
-- 第 2 页
SELECT id, name, math, english, chinese FROM exam_result ORDER BY id LIMIT 3 OFFSET 3;
-- 第 3 页,如果结果不足 3 个,不会有影响
SELECT id, name, math, english, chinese FROM exam_result ORDER BY id LIMIT 3 OFFSET 6;

4 更新(Update)

语法: UPDATE table_name SET 更新内容 [WHERE ...] [ORDER BY ...] [LIMIT ...]
示例:

  1. 将孙悟空同学的数学成绩变更为 80 分:
    UPDATE exam_result SET math = 80 WHERE name = '孙悟空';
  2. 将曹孟德同学的数学成绩变更为 60 分,语文成绩变更为 70 分:
    UPDATE exam_result SET math = 60, chinese = 70 WHERE name = '曹孟德';
  3. 将总成绩倒数前三的 3 位同学的数学成绩加上 30 分:
    UPDATE exam_result SET math = math + 30 ORDER BY chinese + math + english LIMIT 3;
    但要注意:mysql的update语句,只支持更新前多少行,不支持从某行到某行!
    例如:将总成绩倒数第二到第五的 3 位同学的数学成绩加上 30 分:
    UPDATE exam_result SET math = math + 30 ORDER BY chinese + math + english LIMIT 1,3;这样写是不可以的,会报错。就是因为mysql的update语句,只支持更新前多少行,不支持从某行到某行!
  4. 将所有同学的语文成绩更新为原来的 2 倍:
    UPDATE exam_result SET chinese = chinese * 2;

5 删除(Delete)

delete from 表 where 条件
示例如下:

  1. 删除孙悟空同学的考试成绩。
    DELETE FROM exam_result WHERE name = '孙悟空';
  2. 删除整表数据。
    DELETE FROM exam_result;
    注意:直接删除整表数据会删除表内的所有数据,但是这张表还是存在的,只不过里面没有数据了!!!

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

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

相关文章

Springboot 自定义参数配置化,密钥,密码,文件保存路径

application.properties 和 application.yml 都是一样的配置方法&#xff0c;只是格式不一样 定义配置文件 server.port8080 image.save.pathE:\ #自定义文件保存路径读取配置文件 Value("${image.save.path}")private String filePath;//E:\优化配置文件 如果我参…

HashMap的扩容机制

HashMap简介 HashMap在底层数据结构上采用了数组&#xff0b;链表&#xff0b;红黑树&#xff0c;通过散列映射来存储键值对数据因为在查询上使用散列码&#xff08;通过键生成一个数字作为数组下标&#xff0c;这个数字就是hash code&#xff09;所以在查询上的访问速度比较快…

Redis实现登录的优化

目录 1 前言 2 实现步骤 2.1 软件环境准备 2.1.1 Redis的安装 2.1.2 在pom.xml中添加依赖 2.1.3 在application.yml中进行相关配置 2.2 StringRedisTemplate的常用方法 2.2.1 获取operations 2.2.2 主要方法 2.3 令牌主动失效机制 2.3.1 登录时将令牌存入Redis 2.…

分发饼干(c++题解)

题目描述 你是一位很棒的 OIer&#xff0c;想要给你的同学一些小饼干。但是&#xff0c;每个同学最多只能给一块饼干。对每个同学 &#xff0c;都有一个胃口值 &#xff0c;这是能让同学满足胃口的饼干的最小尺寸&#xff1b;并且每块饼干 &#xff0c;都有一个尺寸 。如果 &a…

备战蓝桥杯---搜索(DFS基础1)

何为深搜&#xff1f; 即不撞南墙不罢休。 话不多说&#xff0c;直接看题&#xff1a; 我们可以把这看成深搜的模板题&#xff0c;下面是AC代码&#xff1a; #include<bits/stdc.h> using namespace std; int a[15];//存值并输出 int vis[15]; int n18; void dfs(int …

Redisson看门狗机制

一、背景 网上redis分布式锁的工具方法&#xff0c;大都满足互斥、防止死锁的特性&#xff0c;有些工具方法会满足可重入特性。如果只满足上述3种特性会有哪些隐患呢&#xff1f;redis分布式锁无法自动续期&#xff0c;比如&#xff0c;一个锁设置了1分钟超时释放&#xff0c;…

✅Redis-管道技术

Redis 作为一种高性能的键值存储数据库&#xff0c;被广泛应用于缓存、会话存储、消息队列等场景。在处理大量请求时&#xff0c;性能是 Redis 最为关注的问题之一。为了提高 Redis 的性能&#xff0c;我们可以借助一些高效的技术&#xff0c;其中管道技术就是其中之一。 比如…

YOLOv5白皮书-第Y3周:yolov5s.yaml文件解读

YOLOv5白皮书-第Y3周:yolov5s.yaml文件解读 YOLOv5白皮书-第Y3周:yolov5s.yaml文件解读一、前言二、我的环境三、yolov5s.yaml源文件内容四、Parameters五、anchors配置六、backbone七、head八、总结 OLOv5-第Y2周&#xff1a;训练自己的数据集) YOLOv5白皮书-第Y3周:yolov5s.…

从MySQL到TiDB:兼容性全解析

MySQL 在高并发和大数据量场景下&#xff0c;单个实例的扩展性有限。而 TiDB 作为一款分布式NewSQL数据库&#xff0c;设计之初就支持水平扩展&#xff08;Scale-Out&#xff09;&#xff0c;通过增加节点来线性提升处理能力和存储容量&#xff0c;能够很好地应对大规模数据和高…

机器学习——绪论总结

目录 一、引入 二、基本术语 三、假设空间与归纳偏 四、模型选择 一、引入 机器学习&#xff1a;通过计算手段&#xff0c;得出具有能够自我修改、完善能力的模型&#xff0c;利用经验改善系统自身性能。算法使用数据得到模型的过程即称为学习&#xff0c;或训练 流程&…

Framework - ActivityThread 应用启动UI渲染流程

一、概念 ActivityThread拥有 main(String[] agrs) 方法&#xff0c;作为程序的入口&#xff0c;是应用程序的初始化类。&#xff08;ActivityThread不是主线程&#xff0c;它在 main() 方法中实例化&#xff0c;是运行在主线程中。&#xff09;ApplicationThread是 ActivityT…

【Nginx】Ubuntu如何安装使用Nginx反向代理?

文章目录 使用Nginx反向代理2个web接口服务步骤 1&#xff1a;安装 Nginx步骤 2&#xff1a;启动 Nginx 服务步骤 3&#xff1a;配置 Nginx步骤 4&#xff1a;启用配置步骤 5&#xff1a;检查配置步骤 6&#xff1a;重启 Nginx步骤 7&#xff1a;访问网站 proxy_set_header 含义…

海外IP代理:解锁网络边界的实战利器

文章目录 引言&#xff1a;正文&#xff1a;一、Roxlabs全球IP代理服务概览特点&#xff1a;覆盖范围&#xff1a;住宅IP真实性&#xff1a;性价比&#xff1a;在网络数据采集中的重要性&#xff1a; 二、实战应用案例一&#xff1a;跨境电商竞品分析步骤介绍&#xff1a;代码示…

分公司的投标之路:探索与实践

在商海的波涛中&#xff0c;分公司作为母公司延伸的触角&#xff0c;常常在招投标的舞台上扮演着重要角色。然而&#xff0c;分公司能否独立参与投标&#xff0c;这是一个值得深入探讨的话题。 一、分公司的定义与地位 首先&#xff0c;我们需要明确什么是分公司。分公司是母公…

使用nodejs和html布局一个简单的视频播放网站,但是使用localhost:端口访问html无法加载视频

js代码&#xff1a; // app.js const express require(express); const path require(path); const app express();// 设置静态文件目录&#xff0c;这里假设你的视频文件在public/videos/目录下 app.use(express.static(path.join(__dirname, )));// 设置主页路由&#xf…

LeetCode--189

189. 轮转数组 提示 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转…

Ingress

文章目录 环境准备什么是 Ingress认识 Ingress 资源Ingress 控制器(controller)Ingress 规则pathType 路径类型多重匹配Ingress 类TLS生成证书创建密钥 环境准备 下面的 yaml 文件内容&#xff0c;是使用 sts 创建两个 web 服务&#xff0c;并配置对应的 servcie。web 服务的首…

Python进行数据分析||AIGC生成的Python-Pandas库的一些主要函数及其使用实例来进行数据分析

在Python的Pandas库中,有许多函数可以用来进行数据分析。以下是一些主要函数及其使用实例: read_csv():这个函数用于从CSV文件中读取数据。例如,如果你有一个名为"my_data.csv"的文件,你可以使用以下代码来读取它:import pandas as pd data = pd.read_csv(&quo…

微信小程序(三十三)promise异步写法

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.promise异步与普通异步的写法区别 2.promise异步的优势 源码&#xff1a; index.wxml <view class"preview" bind:tap"onChoose"><image src"{{avatar}}" mode"…

PyCharm常用快捷键和设置

Ctrl Space 基本的代码完成&#xff08;类、方法、属性&#xff09; Ctrl Alt Space 快速导入任意类 Ctrl Shift Enter 语句完成 Ctrl P 参数信息&#xff08;在方法中调用参数&#xff09; Ctrl Q 快速查看文档 F1 外部文档 Shift F1 外部文档…