【MySQL】6.表的增删查改(CURD)

表的增删查改

  • 一.Create
    • 1.单行数据,全列插入
    • 2.单行数据,指定列插入
    • 3.多行数据插入
    • 4.插入,若冲突则更新
    • 5.替换
  • 二.Retrieve
    • 1.select 列
    • 2.where 子句
      • 运算符
    • 3.order by 子句
    • 4.筛选分页结果
  • 三.Update
  • 四.Delete
    • 1.删除条目
    • 2.截断表
  • 五.插入查询的数据
  • 六.聚合函数
  • 七.分组查询——group by 子句
  • 八.SQL 查询中各个关键词的执行先后顺序

一.Create

create table students(
id int unsigned primary key auto_increment,
sn int unsigned unique key,
name varchar(20) not null,
qq varchar(32) unique key
);

1.单行数据,全列插入

insert into students values(1, 123, '张飞', '45678');

2.单行数据,指定列插入

insert into students (sn, name, qq) values(234, '关羽', '23456');

3.多行数据插入

insert into students values (12, 126, '曹操', '12345'), (13, 127, '许攸', '34567');
insert into students (sn, name, qq) values (128, '孙权', '66666'), (129, '许攸', '88888');

4.插入,若冲突则更新

insert into students values (13, 130, '曹操', '111111')  on duplicate key update sn=130, name='曹操', qq='111111'
  • – 0 row affected: 表中有冲突数据,但冲突数据的值和 update 的值相等
  • – 1 row affected: 表中没有冲突数据,数据被插入
  • – 2 row affected: 表中有冲突数据,并且数据已经被更新

5.替换

//主键或者唯一键没有冲突,则直接插入; 
//主键或者唯一键如果冲突,则删除后再插入
replace into students (sn, name, qq) vlaues (20001, '曹阿瞒', '111222');
  • 1 row affected: 表中没有冲突数据,数据被插入
  • 2 row affected: 表中有冲突数据,删除后重新插入

二.Retrieve

create table exam_result(
id int unsigned primary key auto_increment,
name varchar(20) not null,
chinese float default 0.0,
math float default 0.0,
english float default 0.0
);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);

1.select 列

//全列查询
select * from exam_result;//指定列查询
select id from exam_result;
select id, math, name from exam_result;//查询字段为表达式
select id, name, math+chinese+english as total;+-----------+-------+
| name      | total |
+-----------+-------+
| 唐三藏    |   221 |
| 孙悟空    |   242 |
| 猪悟能    |   276 |
| 曹孟德    |   233 |
| 刘玄德    |   185 |
| 孙权      |   221 |
| 宋公明    |   170 |
+-----------+-------+
7 rows in set (0.00 sec)//结果去重
select distinct math from exam_result;

2.where 子句

运算符

比较运算符说明
>, >=, <, <=大于,大于等于,小于,小于等于
=等于,NULL 不安全,例如 NULL = NULL 的结果是 NULL,无法比较
<=>等于,NULL 安全,例如 NULL <=> NULL 的结果是 TRUE(1)
!=, <>不等于,NULL 不安全,例如 NULL != NULL 和 NULL<>NULL 的结果都是 NULL
between a0 and a1范围匹配,[a0, a1],如果 a0 <= value <= a1,返回 TRUE(1)
in(option, …)如果是 option 中的任意一个,返回 TRUE(1)
is NULL是 NULL
is not NULL不是 NULL
is not NULL模糊匹配。% 表示任意多个(包括 0 个)任意字符;_ 表示任意一个字符
逻辑运算符说明
and多个条件必须都为 TRUE(1),结果才是 TRUE(1)
or任何一个条件为 TRUE(1),结果就是 TRUE(1)
not条件真假取反
//1.查找英语成绩小于60的同学名字和英语成绩
select name, english from exam_result where english<60;//2.查找语文成绩在[80,90]的同学名字和语文成绩
select name, chinese from exam_result where chinese>=80 and chinese<=90;//3.查找数学成绩是58或者59或者98或者99的同学名字和数学成绩
select name, math from exam_result where math=58 or math=59 or math=98 or math=99;
//更优雅的写法
select name, math from exam_result where math in (58, 59, 98, 99);//4.查找姓孙的同学的名字
select name from exam_result where where name like '孙%';+-----------+
| name      |
+-----------+
| 孙悟空    |
| 孙权      |
+-----------+//5.查找孙某同学的名字
select name from exam_result where name like '孙_';+--------+
| name   |
+--------+
| 孙权   |
+--------+//6.查找总分在200以下的同学的名字,总分
select name, chinese+math+english as total from exam_result where chinese+math+english<200;
//这样写可以吗?不可以!!!因为先执行where子句,然后才执行select,对总分重命名
//select name, chinese+math+english as total from exam_result where total<200;//7.查找语文成绩大于80并且不姓孙的同学的名字,语文成绩
select name, chinese from exam_result where chinese>80 and name not like '孙%';//8.查找孙某同学,否则要求总成绩>200并且语文成绩<数学成绩并且英语成绩>80,
//这些同学的名字,各科成绩和总成绩
select name, chinese, math, english, chinese+math+english as total from esam_result
where (name like '孙_') or (chinese+math+english>200 and chinese<math and english>80);

3.order by 子句

order by 子句用于对查询到的结果排序,如果没有 order by 子句,结果的顺序是未定义的,永远不要依赖于这个顺序
顺序选择:
asc(ascdending)——升序
desc(descending)——降序
默认是 asc

注意:NULL 无法和其它值比较,升序会排在最前面,降序会排在最后面

//1.查找所有同学的名字和数学成绩,结果按数学成绩升序显示
select name, math from exam_result order by math asc;//2.查询所有同学的名字和各门成绩,依次按数学降序,英语升序,英语升序显示(若前面条件相等则依次往后比较)
select name, math, chinese, english from exam_result 
order by math desc, english asc, chinese asc;//3.查询所有同学的名字和总分,结果按总分升序显示
select name, math+chinese+english as total from exam_result order by math+chinese+english asc;
//可以这么写吗?可以!!!因为是先把结果select出来,然后再执行order by排序
select name, math+chinese+english as total from exam_result order by total asc;//4.查询姓孙或姓曹的同学的名字和数学成绩,结果按数学成绩降序显示
select name, math from exam_result where name like '孙%' or name like '曹_' order by math desc;

4.筛选分页结果

按照需求显示部分的结果

select * from exam_result limit 3; //从起始行开始,连续显示3行select * from exam_result limit 2, 4; //从第2行(第0行是起始行),连续显示4行select * from exam_result limit 4 offset 2; //从第2行(第0行是起始行),连续显示4行

三.Update

update tb_name set column=expr [, column=expr …] [where …] [order by …] [limit …]
一般来说,update 通常要搭配 where 子句使用,否则就是对所有条目都更新。也就是说,update 的前置动作是查找

//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 asc limit 3;//4.将所有同学的语文成绩更新为原来的两倍
update exam_result set chinese=chinese*2;

四.Delete

1.删除条目

delete from tb_name [where …] [order by …] [limit …]
和 update 一样,delete 的通常查找的前置动作

//1.删除孙悟空同学的考试信息
delete from exam_result where name='孙悟空';//2.删除总分最低同学的考试信息
delete from exam_result order by math+chinese+english asc limit 1;//清空表(删除所有条目)
delete from exam_result;

2.截断表

truncate exam_result;

delete 和 truncate 都会清空表,但是 truncate 会将 auto_increment 计数器重置。(还有其它方面区别,后面讲事务时再提)

五.插入查询的数据

案例:将表 duplicate_table 去重

//第一步:创建一个和duplicate_table结构一样的表no_duplicate_table
create table no_duplicate_table like duplicate_table;//第二步:将去重查询duplicate_table的结果插入到no_duplicate_table中
insert into no_duplicate_table select distinct * from duplicate_table;//第三步:将duplicate_table改成其它名字,将no_duplicate_table重命名为duplicate_table
alter table duplicate_table rename to old_duplicate_table;
alter table no_duplicate_table rename to duplicate_table;

六.聚合函数

所谓的聚合,就是把查询到的多行数据聚在一起,形成一行

函数说明
count返回查询到的数据的数量
sum返回查询到的数据的总和,只对数字有意义
avg返回查询到的数据的平均数,只对数字有意义
max返回查询到的数据的平均数,只对数字有意义
min返回查询到的数据的最小值,只对数字有意义
//1.统计班级有多少名同学
select count(*) from exam_result; //相当于统计条目的个数+----------+
| count(*) |
+----------+
|        7 |
+----------+//也可以像下面这样写
select count(1) from exam_result;+----------+
| count(1) |
+----------+
|        7 |
+----------+//原因在于执行select 1 from exam_result, 效果如下:
+---+
| 1 |
+---+
| 1 |
| 1 |
| 1 |
| 1 |
| 1 |
| 1 |
| 1 |
+---+//2.统计数学成绩有多少个
select count(math) from exam_result;+-------------+
| count(math) |
+-------------+
|           7 |
+-------------+//3.统计有多少个不同的数学成绩
select count(distinct math) from exam_result;//4.统计数学成绩的总分
select sum(math) from exam_result;//5.统计数学成绩平均分
select sum(math)/count(*) from exam_result;
或者
select avg(math) from exam_result;//6.统计英语成绩不及格的人数
select count(*) from exam_result where english<60;//7.统计总成绩的平均分
select avg(math+chinese+english) from exam_result;//可以这样写吗?不能!!!max(math)是math这一列综合计算得出的结果,而每个条目的name都不同,不能压缩成1个
//语法上不允许将它们放一起
//select name, max(math) from exam_result;
select max(math), min(math) form exam_result; //这样写是可以的,

七.分组查询——group by 子句

分组的目的方便聚合统计。
在 select 中使用 group by 子句,按照指定列分组,然后查询。
格式:select column1, column2, … from table group by column;

案例:
准备工作,创建一个雇员信息表(来自 oracle 9i 的经典测试表)

  • EMP 员工表
  • DEPT 部门表
  • SALGRADE 工资等级表
//1.显示每个部门的平均工资和最高工资
select deptno, avg(sal), max(sal) from EMP group by deptno; 
//deptno相同的条目会分成一组
//这里deptno和聚合函数能放在一起,因为同一组内的deptno是相同的,可以压缩成1个//2.显示每个部门每种岗位的平均工资和最低工资
select deptno, job, avg(sal), min(sal) group by deptno, job;
//deptno, job相同的条目会分成一组//3.显示平均工资低于2000的部门和它的平均工资
select deptno, avg(sal) as deptavg from EMP group by deptno having deptavg < 2000;//说明:having是对聚合后的统计数据,进行条件筛选,通常和group by搭配使用

having VS where
having 和 where 都能做条件筛选,但它们的应用场景完全不同:

  1. where 对具体的任意列进行条件筛选
  2. having 对分组之后的结果进行条件筛选
    本质是因为他们条件筛选的阶段不同。

八.SQL 查询中各个关键词的执行先后顺序

SQL 查询中各个关键字的执行先后顺序:
from > on> join > where > group by > with > having > select > distinct > order by > limit

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

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

相关文章

react hooks antd 父组件取子组件form表单的值

在React中&#xff0c;父组件可以使用ref来访问子组件的方法或属性。子组件包含一个表单&#xff0c; 使用forwardRef、useImperativeHandle&#xff1a;forwardRef允许组件使用ref将 DOM 节点暴露给父组件&#xff0c;使用useImperativeHandle暴露方法给父组件。 子组件&#…

蜂窝互联网接入:连接世界的无缝体验

通过Wi—Fi&#xff0c;人们可以方便地接入互联网&#xff0c;但无线局域网的覆盖范围通常只有10&#xff5e;100m。当我们携带笔记本电脑在外面四处移动时&#xff0c;并不是在所有地方都能找到可接入互联网的Wi—Fi热点&#xff0c;这时候蜂窝移动通信系统可以为我们提供广域…

hudi数据湖万字全方位教程+应用示例

1、时间轴&#xff08;TimeLine&#xff09; Hudi的核心是维护表上在不同的即时时间&#xff08;instants&#xff09;执行的所有操作的时间轴&#xff08;timeline&#xff09;&#xff0c;这有助于提供表的即时视图 一个instant由以下三个部分组成&#xff1a; 1&#xff09;…

hnust 1964: 邻接表表示法

hnust 1964: 邻接表表示法 题目描述 输入一个图&#xff0c;用邻接表存储&#xff0c;并实现一些操作。 拷贝下面的代码&#xff0c;按要求完成其中的FirstAdjVex&#xff0c;NextAdjVex&#xff0c;sort和CreateUDG操作&#xff0c;其他地方不得改动。 //图的邻接表存储表示…

Java高级重点知识点-25-Stream流、方法引用

文章目录 Stream流流式思想概述获取流常用方法 方法引用方法引用符通过对象名引用成员方法通过类名称引用静态方法通过super引用成员方法通过this引用成员方法类的构造器引用数组的构造器引用 Stream流 通过循环遍历来讲解流的优势&#xff1b; 要求&#xff1a;筛选所有姓张的…

实现Android夜间模式主题:从入门到精通

实现Android夜间模式主题:从入门到精通 随着用户对夜间模式的需求越来越高,Android开发者需要掌握如何在应用中实现夜间模式。本文将详细介绍在Android中实现夜间模式的步骤,包括配置、实现、以及一些最佳实践,帮助开发者创建更具吸引力和用户友好的应用。 夜间模式的优势…

智能交互中意图的损失、补全与弥聚

智能交互中的“意图的损失”和“意图的补全”通常用于描述在交流过程中可能出现的信息不完整或不清晰导致的情况。意图的损失指的是在信息传递过程中&#xff0c;发送者的意图未能完全或准确地被接收者理解的情况。这种情况可能由多种因素导致&#xff0c;如信息不完整&#xf…

Redis基础教程(二十):Java使用Redis

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…

华贝甄选干细胞科技,揭秘生命修复的奥秘

在探索生命奥秘的漫漫征途中&#xff0c;华贝甄选凭借干细胞科技的神奇力量&#xff0c;为您点亮健康与活力的希望之光。 我们深知&#xff0c;细胞是生命的基石&#xff0c;而干细胞则是这基石中蕴含的无限潜能。华贝甄选精心打造的干细胞疗法&#xff0c;如同神奇的魔法&…

大模型融入云平台,信息化走向数智化

随着信息技术的飞速发展&#xff0c;我们已经见证了从数据化到信息化的转变。然而&#xff0c;随着人工智能技术的不断突破&#xff0c;我们迎来了一个全新的时代——数智化时代。在这个时代&#xff0c;大模型与云平台的融合成为了推动信息化向数智化转变的关键力量。 大型模型…

详细说一下vue中的路由拦截器的作用

在Vue中&#xff0c;路由拦截器主要用于在导航到某个路由前或者离开某个路由时进行拦截和处理。这种机制允许开发者在路由导航发生前或者发生后执行特定的逻辑&#xff0c;比如权限验证、数据加载、页面跳转等。 在Vue Router中&#xff0c;可以通过以下几种方式来实现路由拦截…

决策树算法介绍,原理与案例实现

决策树算法是一种非常受欢迎的机器学习算法&#xff0c;它能够用于分类和回归任务。以下是决策树算法的详细介绍&#xff0c;包括原理和案例实现&#xff0c;以及相应的Python代码。 决策树算法介绍 基本概念 决策树是一种树形结构&#xff0c;用于对数据进行分类或回归。它…

实现前端用户密码重置功能(有源码)

引言 密码重置功能是任何Web应用程序中至关重要的一部分。当用户忘记密码时&#xff0c;密码重置功能可以帮助他们安全地重设密码。本文将介绍如何使用HTML、CSS和JavaScript&#xff08;包括Vue.js&#xff09;来实现前端的密码重置功能。 1. 项目结构 首先&#xff0c;我们…

2024SpringCloud学习笔记

远程调用Rest Template 服务注册与发现&分布式配置管理 Consul 下载安装 官网https:/ldeveloper.hashicorp.com/consul/downloads 开发者模式启动consul agennt -dev 浏览器访问本地端口:8500 服务注册与发现 Maven引入 <!--SpringCloud consul discovery -->…

【Python实战因果推断】31_双重差分2

目录 Canonical Difference-in-Differences Diff-in-Diff with Outcome Growth Canonical Difference-in-Differences 差分法的基本思想是&#xff0c;通过使用受治疗单位的基线&#xff0c;但应用对照单位的结果&#xff08;增长&#xff09;演变&#xff0c;来估算缺失的潜…

小阿轩yx-NoSQL 之 Redis 配置与优化

小阿轩yx-NoSQL 之 Redis 配置与优化 Redis 数据库介绍 是一个非关系型数据库 关系数据库与非关系型数据库 按照数据库结构划分的 关系型数据库 是一个结构化的数据库&#xff0c;创建在关系模型基础上&#xff0c;一般面向于记录借助集合代数等数学概念和方法处理数据库…

215.Mit6.S081-实验三-page tables

在本实验室中&#xff0c;您将探索页表并对其进行修改&#xff0c;以简化将数据从用户空间复制到内核空间的函数。 一、实验准备 开始编码之前&#xff0c;请阅读xv6手册的第3章和相关文件&#xff1a; kernel/memlayout.h&#xff0c;它捕获了内存的布局。kernel/vm.c&…

Python:Python基础知识(注释、命名、数据类型、运算符)

.注释 Python有两种注释方法&#xff1a;单行注释和多行注释。单行注释以#开头&#xff0c;多行注释以三个单引号 或三个双引号 """ 开头和结尾。 2.命名规则 命名规则: 大小写字母、数字、下划线和汉字等字符及组合&#xff1b; 注意事项: 大小写敏感、首…

Linux环境下Oracle 11g的离线安装与配置历程

在成功体验了 Windows 版本的Oracle 11g 后&#xff0c;这几天心血来潮&#xff0c;决定再挑战一下Linux 环境下的安装&#xff0c;特别是在考虑到部门内部虚拟机无法联网的情况下&#xff0c;我选择了在CentOS 7上进行离线安装。这次安装之旅&#xff0c;主要参考了下面大佬的…

【深度学习】关于模型加速

模型转为半精度的会加快推理速度吗 将模型转为半精度&#xff08;通常指16位浮点数&#xff0c;即FP16&#xff09;确实可以加快推理速度&#xff0c;同时还能减少显存&#xff08;GPU内存&#xff09;的使用。以下是一些关键点&#xff1a; 加快推理速度的原因 减少计算量&a…