当前位置: 首页 > news >正文

MySQL表的基础操作(crud)

1. 新增(Create)

insert into 表名 values (值, 值…);
此处列出的这些值,的数目和类型要和表的列相匹配。

-- 在student 表中插入学号1,姓名zhangsan的数据
insert into student values(1, 'zhangsan');
-- 指定列插入
insert into student (name) values('王五');
-- 插入多个数据
insert into student values('2','李四'),('3','赵六'),('4','刘七');

2. 查询(Retrieve)

查询语句让我们能看到表中包含的数据内容。

1) 全列查询

这个操作,就是查询出当前数据库中所有的行,和所有的列。

select * from 表名

符号 * 是通配符。 * 就能够代指任意的列。

-- 全列查询 student 表  
select * from student;

MySQL 是一个 客户端 服务器 结构的程序。
客户端 发送 select * from student请求。服务器解析 sql 并执行就会读取硬盘中 student 表的每一条记录把所有的记录都通过网络返回给客户端。然后客户端再把收到的服务器返回的数据显示到界面上。

select * 是一个非常危险的操作。如果,当前 select*查询的这个表,里面的数据非常非常多(比如,几十亿条)。这就会使服务器无法给外面的普通用户提供服务了,此时服务器就像"卡死”了一样,导致这个服务器一瞬间硬盘的带宽和网卡的带宽就都被吃满了。

2) 指定列查询

手动指定要查询的某一列或者某几列。服务器返回的结果,就只包含想要的数据。

select 列名,列名… from 表名;

-- 创建一个成绩表
create table  exam_result(id int,name varchar(20),chinese decimal(3,1),math decimal(3,1),english decimal(3,1)
);
-- 插入测试数据
INSERT INTO exam_result (id,name, chinese, math, english) VALUES
(1,'唐三藏', 67, 98, 56),
(2,'孙悟空', 87.5, 78, 77),
(3,'猪悟能', 88, 98.5, 90),
(4,'曹孟德', 82, 84, 67),
(5,'刘玄德', 55.5, 85, 45),
(6,'孙权', 70, 73, 78.5),
(7,'宋公明', 75, 65, 30),
(8,'诸葛孔明',80.0,80.0,80.0),
(9,'孙行者',null,null,null),
(10,'者行孙',null,null,null),
(11,'行者孙',null,null,null);
 -- 查询语文成绩select name,chinese from exam_result;

未来实际开发中,一张表有十几列都是很正常的. 通常就得按需查询。数据库的增删改查,都是比较慢的,也是比较吃硬件资源的能省点尽量省点)。

3) 查询字段为表达式

查询的同时,可以进行计算.

-- 查询所有同学,数学成绩加10分后的效果
select name ,math + 10 from  exam_result;

MySQL 是一个 客户端 服务器 结构的程序。查询字段为表达式的时候,看到的客户端中显示的结果其实是一个“临时表select 操作不管怎么写,都不会影响到数据库服务器硬盘上存储的原始数据。

也可以使用两个列/多个列进行运算:

-- 查询总成绩
select name,chinese + math + english from exam_result;

查询结果临时表的列名和咱们当前表达式是一致的。万一查询的表达式非常复杂,就会导致列名也同样复杂不利于用户来阅读。

为了解决上面的问题,可以指定别名

4) 查询的时候给列/表达式 指定别名

select 列名 as 别名 from 表名

  • 别名会最终显示在查询结果的临时表中
  • as 关键字,可以省略.但是不建议省略
-- 查询总成绩起total别名
select name,chinese + math + english as total  from exam_result;

SQL 中,列名 和 表名 都时可以起别名的也都是使用 as

5) 查询时去重

把重复的行去掉,只保留一份。
select distinct 列名 from 表名;

-- 查询数学成绩去重
select distinct math from exam_result;

distinct 后面的列名,也可以是多个则要求必须所有的列的值都相同,才算“重复“。

6) 排序查询

针对查询到的结果进行排序.
mysql 是一个客户端-服务器结构的程序。因此这里的排序,也只是针对临时表进行的对于数据库服务器上原始的数据没有任何的顺序上的影响。

select 列名 from 表名 order by 列名 [asc | desc];

列名:排序的时候,依据什么来进行排的。这个是我们在排序的时候要明确的

-- 对英语成绩进行排序(默认升序排序)
select * from exam_result order by english;
-- 对英语成绩进行降序排序
select * from exam_result order by english desc;

desc 表名; 描述一个表

order by desc; 表示降序 descend

如果 SQL 中,没有指定 order by, 此时我们的代码中就不应该依赖结果集合(临时表)的顺序。mysql 并不承诺,这个不带order by 的查询结果是带有一定顺序的。

order by 还能指定多个列排序(order by 后面可以写多个列)

-- 优先数学升序,次之英语
select * from exam_result order by math, english;

7) 指定一个筛选条件

把符合条件的结果保留下来.不符合的就剔除掉。

条件查询需要有运算符来表述。

比较运算符:

运算符说明
>, >=, <, <=大于,大于等于,小于,小于等于
=等于,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 个)任意字符;_ 表示任意一个字 符

最开始,= 在数学上就是表示相等。咱们开始学编程了之后,费了老大劲,把 = 的含义纠正过来,= 表示赋值
现在在 SQL 里 = 又是表示比较相等了。
= 和 <=> 的差别:有些列是可以不填的(不填就相当于是 NULL),NULL 参与各种运算,的结果还是 NULL。

  • NULL = NULL => NULL(相当于 false,条件不成立了)
  • NULL <=> NULL => true(条件成立)

逻辑运算符:

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

条件比较的时候,并不只是使用列名和常量比较也可以使用列名和其他列名比较。也可以结合一些更复杂的表达式。

  • 基本查询
-- 查询英语不及格的同学及英语成绩 ( < 60 )select name,english from exam_result where english < 60;-- 查询语文成绩好于英语成绩的同学select * from exam_result where chinese > english;-- 查询总分在 200 分以下的同学
select name,chinese + english + math as total from exam_result where  chinese + english + math < 200;
-- 条件里的内容,和查询的这个列,没啥关系

注意理解查询语句执行的过程:
1.服务器需要先遍历表中的每一个记录
2.针对当前记录,带入条件,看是否成立
3.如果条件成立,则这一条记录加入结果集,并返回给客户端如果条件不成立,则这一条记录跳过.

-- 下面的查询总分在 200 分以下的同学语句是错误的
select name,chinese + english + math as total from exam_result where total < 200;
-- 当我们在条件中,尝试使用别名的时候,这个别名不能被正确识别出来。
-- mysql的 where 条件中,无法使用列的别名。

站在 sql 的执行顺序上,也能一定程度的解释上述现象
select 语句执行顺序:

  1. 遍历到某个指定的行
  2. 带入条件筛选
  3. 条件为 true,被筛选成功之后, 再计算 select 列务这里的表达式

这种说法是比较牵强的,实现 SQL 解析是完全可以做到,先把别名定义出来,再执行条件的。

  • AND与OR:
-- 查询语文成绩大于80分,且英语成绩大于80分的同学
select name,chinese,english from exam_result where chinese > 80 and english > 80;
-- 查询语文成绩大于80分,或英语成绩大于80分的同学
select name,chinese,english from exam_result where chinese > 80 or english > 80;

在 SQL 中,and 的优先级比 or 更高。但是没啥卵用建议大家忘记这个规则,而是使用()手动的明确优先级。

  • 范围查询:

计算机中谈到区间,大部分都是前闭后开。但是也有例外: between and 是闭区间:

  1. between … and …
-- 查询语文成绩在 [80, 90] 分的同学及语文成绩select * from exam_result where chinese >= 80 and chinese <= 90;
-- 用 between ... and ... 
select * from exam_result where chinese between 80 and 90;
  1. IN
-- 查询数学成绩是 58 或者 80 或者 98 或者 99 分的同学及数学成绩
select * from exam_result where math = 58 or math = 80 or math = 98 or math = 99;
-- 用 in 
select * from exam_result where math in(58,80,98,99);
  • 模糊查询:LIKE

mysql 提供的模糊查询,相对比较简单的

  • % 匹配 0个或者任意个任意字符
  • _ 匹配 1个任意字符
-- 查询姓孙并且名为1个字的同学
select * from exam_result where name like '孙_';
-- 查询姓孙并且名为2个字的同学
select * from exam_result where name like '孙__';
-- 查询姓孙的同学
select * from exam_result where name like '孙%';
-- %孙 匹配以 孙 结尾的
select * from exam_result where name like '%孙';
-- %孙% 则是只要包含孙即可
select * from exam_result where name like '%孙%';

mysql 进行 like 模糊查询是一个比较低效的操作。尤其是针对一些比较长的字符串,实际工作中使用模糊查询还是要慎重。

  • NULL 的查询:IS [NOT] NULL

用 = 进行比较将会一个数据也没有所以得需要用其他运算符。

-- 查询语文成绩为null的同学
-- 用 <=>
select * from exam_result where  chinese <=> null;
-- 用 IS NULL  
select * from exam_result where  chinese is null;

<=> 和 is null 的区别是什么:

  • <=> 可以拿两个列进行比较的
  • is null 只能是一个列和 null 比较

8) 分页查询limit

针对查询出来的结果进行截取,取出其中的一个部分。

语法:

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

练习:

-- 从 0 开始,筛选 4 条结果
select * from exam_result limit 4;
-- 从 4 开始,筛选 4 条结果
select * from exam_result limit 4 offset 4;
-- offset 4 描述了当前的结果,从哪一条开始算这里的 
-- offset 4 就可以当做从下标为4的记录开始获取.(下标从 0 开始算)
-- limit 4  约束了结果中最多包含几个记录-- 从 8 开始,筛选 4 条结果
select * from exam_result limit 4 offset 8;

上述这 8 种 select 的写法,都是 select 最基础的写法也是工作中最常用的写法。

3. 删除 (Delete)

delete from 表名 where 条件;直接删除符合条件的行

-- 删除数学成绩为null的数据
delete from exam_result where math is null;
-- 删除孙悟空同学的考试成绩
delete from exam_result where name = '孙悟空';

删除,是按照行来删除的.无法删除某些列(要想按照列来删除,可以通过 update,把指定条件的行的指定列,设为 null)
alter table 可以修改列,针对所有的行进行的。不能针对有些行进行删除列 (关系型数据库,所有的行的列都得是一致的)
如果在 delete 的时候,没有指定条件,就会把整个表的所有数据都删除掉,效果和删除表就差不多了,这个操作就是一个危险操作 。

4. 修改 (update)

update 表名 set 列名 = 值 where 条件…;

进行修改,要明确一些重要的信息:

  • 改哪个表?
  • 改这个表里的哪个列/哪些列,改成什么?
  • 改这个表的哪些行?
-- 将孙悟空同学的数学成绩变更为 80 分
update exam_result set math = 80 where name = '孙悟空';
-- update 也可以一次操作修改多个列
-- 将曹孟德同学的数学成绩变更为 60 分,语文成绩变更为 70 分
update exam_result set chinese = 70,math = 60 where name = '曹孟德';
-- 修改操作,也可以搭配 order by 这样的排操作
-- 将总成绩倒数前三的 3 位同学的数学成绩加上 30 分
update exam_result set math = math + 10 order by chinese + math + english limit 3;

select 中支持的 条件,排序, 分页,对于 update 来说同样生效的,update 可以理解成先查询,再修改。

update 也是一个危险操作,这个操作的危害和删库相比不遑多让,甚至还犹有过之。删库,所有的数据都没了,能做的操作就是把之前备份的给导入过来。update 修改的条件,没设定好,你也不知道,当前哪些行被改了,哪些没被改!!恢复的成本可能是更高的。

数据库中的危险操作:
drop database
drop table
select *
update
delete

基础增删查改总结

1.insert into 表名 values (,....);
2. select1) select * from 表名2) select 列名,列名... from 表名;3) select 表达式 from 表名4) select 表达式 as 别名 from 表名;5) select distinct 列名 from 表名6) select 列名 from 表名 order by 列名 asc/desc;7) select 列名 from 表名 where 条件;8) select 列名 from 表名 limit N offset M;
3.update 表名 set 列名 =where 条件/order by/limit;
4. delete from 表名 where 条件/order by/limit;

相关文章:

MySQL表的基础操作(crud)

1. 新增&#xff08;Create&#xff09; insert into 表名 values (值, 值…); 此处列出的这些值,的数目和类型要和表的列相匹配。 -- 在student 表中插入学号1&#xff0c;姓名zhangsan的数据 insert into student values(1, zhangsan); -- 指定列插入 insert into student …...

vue中的activated和deactivated

目录 一、简介二、使用 一、简介 当页面被keep-alive缓存下来的时候&#xff0c;vue提供两个钩子函数 activated被 keep-alive 缓存的组件激活时调用。deactivated被 keep-alive 缓存的组件失活时调用。 当keepalive页面缓存&#xff0c;有activated钩子和created钩子函数时 …...

unity 发布报错 The type or namespace name `UnityEditor‘ could not be found.

引用了UnityEditor的内容&#xff0c;发布当然会报错啦 加上宏判断就好啦...

在ubuntu中将dict.txt导入到数据库sqlite3

将dict.txt导入到数据库 #include <head.h> #include <sqlite3.h> int do_insert(int i,char *str,sqlite3 *db); int main(int argc, const char *argv[]) {//创建泵打开一个数据库sqlite3 *db NULL;if(sqlite3_open("./my.db",&db) ! SQLITE_OK){…...

nginx 代理postgresql

首先&#xff0c;Nginx为我们的数据库增加了额外的安全层。Nginx提供了一整套的选项&#xff0c;这使得管理访问和保护数据库变得很容易。例如&#xff0c;我们可以配置为只有一小部分IP地址可以访问数据库。 PostgreSQL不使用HTTP或HTTPS&#xff0c;而是使用一个新块儿strea…...

小程序 CSS-in-JS 和原子化的另一种选择

小程序 CSS-in-JS 和原子化的另一种选择 小程序 CSS-in-JS 和原子化的另一种选择 介绍快速开始 pandacss 安装和配置 0. 安装和初始化 pandacss1. 配置 postcss2. 检查你的 panda.config.ts3. 修改 package.json 脚本4. 全局 css 注册 pandacss5. 配置的优化与别名 weapp-pand…...

flutter项目 环境搭建

开发flutter项目 搭建工具环境 flutter项目本身 所需开发工具环境 flutter 谷歌公司开发 系统支持库 镜像库 搭建流程&#xff1a; flutter 官网&#xff1a; https://flutter.dev/community/china //步骤1 .bash_profile touch .bash_profile pwd /Users/haijunyan open ~ e…...

PG-DBA培训12:PostgreSQL物理备份与恢复实战

一、风哥PG-DBA培训12&#xff1a;PostgreSQL物理备份与恢复实战 课程目标&#xff1a; 本课程由风哥发布的基于PostgreSQL数据库的系列课程&#xff0c;本课程属于PostgreSQL备份恢复与迁移升级阶段之PostgreSQL物理备份与恢复实战&#xff0c;学完本课程可以掌握&#xff1…...

饿了么大数据开发凉经

1 一个mapreduce进程会启动多少map进程多少reduce进程* 1&#xff09;map数量由处理的数据分成的block数量决定default_num total_size / split_size; 2&#xff09;reduce数量为job.setNumReduceTasks(x)中x 的大小。不设置的话默认为 1。 2 讲下shuffle的过程 shuffle分为…...

前端安全:XSS 与 CSRF 安全防御

在当今数字化的时代&#xff0c;前端安全性变得愈发重要。跨站脚本攻击&#xff08;XSS&#xff09;和跨站请求伪造&#xff08;CSRF&#xff09;是常见的前端安全威胁&#xff0c;但通过一些简单的防御策略&#xff0c;我们可以有效地保护我们的应用程序和用户信息。本文将为您…...

应用层读取wfp防火墙阻断记录

前言 之前的文档中&#xff0c;描写了如何对WFP防火墙进行操作[链接在此]&#xff0c;这篇文档中&#xff0c;描述如何获取WFP防火墙进行阻断的操作记录。 需要注意的坑点 使用FWPM_NET_EVENT_TYPE获取防火墙日志时&#xff0c;需要注意&#xff0c;只有丢弃和内核丢弃&…...

web基础和tomcat的安装,部署jpress应用

目录 1. 简述静态网页和动态网页的区别。 2. 简述 Webl.0 和 Web2.0 的区别。 3. 安装tomcat8&#xff0c;配置服务启动脚本&#xff0c;部署jpress应用。 1. 简述静态网页和动态网页的区别。 【1】定义区别 请求响应信息&#xff0c;发给客户端进行处理&#xff0c;由浏览…...

idea git命令使用

这个标签标识单签分支&#xff1a;&#xff08;标签图标&#xff09; 标识关联分支&#xff1a;&#xff08;五角星&#xff09; 本地切换分支&#xff1a;如当前分支是dev ,git branch 显示的是dev ,然后通过 git checkout -b release 切换到release分支 git checkout re…...

软件测试技术之单元测试—工程师 Style 的测试方法

什么是单元测试&#xff1f; Wikipedia 对单元测试的定义&#xff1a; 在计算机编程中&#xff0c;单元测试&#xff08;Unit Testing&#xff09;又称为模块测试&#xff0c;是针对程序模块&#xff08;软件设计的最小单位&#xff09;来进行正确性检验的测试工作。 在实际…...

C#学习....

1.基础 //引用命名空间using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;//项目名或者命名空间 namespace _01_MY_First_Demo {//Program类class Program{//程序的主入口或者Main函数static void Main(S…...

C语言暑假刷题冲刺篇——day2

目录 一、选择题 二、编程题 &#x1f388;个人主页&#xff1a;库库的里昂 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏✨收录专栏&#xff1a;C语言每日一练 ✨其他专栏&#xff1a;代码小游戏C语言初阶&#x1f91d;希望作者的文章能对你…...

springcloud3 hystrix实现服务降级的案例配置2

一 服务降级的说明 1.1 服务降级说明 "服务器忙&#xff0c;请稍后在试"不让客户达等待&#xff0c;立即返回一个友好的提示。 1.2 服务降级的触发情况 1.程序运行异常&#xff1b; 2.超时&#xff1b; 3.服务熔断触发服务降级&#xff1b;4 .线程池/信号量打…...

第 3 章 稀疏数组和队列(1)

3.1 稀疏 sparsearray 数组 3.1.1先看一个实际的需求 编写的五子棋程序中&#xff0c;有存盘退出和续上盘的功能。 分析问题: 因为该二维数组的很多值是默认值 0.因此记录了很多没有意义的数据.->稀疏数组 3.1.2基本介绍 当一个数组中大部分元素为 0&#xff0c;或者为同…...

7-10 奇偶分家

分数 10 全屏浏览题目 切换布局 作者 陈越 单位 浙江大学 给定N个正整数&#xff0c;请统计奇数和偶数各有多少个&#xff1f; 输入格式&#xff1a; 输入第一行给出一个正整N&#xff08;≤1000&#xff09;&#xff1b;第2行给出N个非负整数&#xff0c;以空格分隔。 输…...

使用词向量以数学方式查找具有相似含义的单词

摄影&#xff1a;Nika Charakova 一、说明 简而言之&#xff0c;词向量只不过是表示自然语言词含义的一系列实数。这项技术是有用的NLP功能的重要推动力&#xff0c;使机器能够“理解”人类语言。本文讨论如何使用词向量以编程方式计算文本的语义相似性&#xff0c;例如&#x…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...

苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会

在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...

在 Spring Boot 项目里,MYSQL中json类型字段使用

前言&#xff1a; 因为程序特殊需求导致&#xff0c;需要mysql数据库存储json类型数据&#xff0c;因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...

LangFlow技术架构分析

&#x1f527; LangFlow 的可视化技术栈 前端节点编辑器 底层框架&#xff1a;基于 &#xff08;一个现代化的 React 节点绘图库&#xff09; 功能&#xff1a; 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...

文件上传漏洞防御全攻略

要全面防范文件上传漏洞&#xff0c;需构建多层防御体系&#xff0c;结合技术验证、存储隔离与权限控制&#xff1a; &#x1f512; 一、基础防护层 前端校验&#xff08;仅辅助&#xff09; 通过JavaScript限制文件后缀名&#xff08;白名单&#xff09;和大小&#xff0c;提…...

Netty自定义协议解析

目录 自定义协议设计 实现消息解码器 实现消息编码器 自定义消息对象 配置ChannelPipeline Netty提供了强大的编解码器抽象基类,这些基类能够帮助开发者快速实现自定义协议的解析。 自定义协议设计 在实现自定义协议解析之前,需要明确协议的具体格式。例如,一个简单的…...