MySQL数据库(6)—— 表的增删查改

目录

一,表的CRUD

二,Create新增

2.1 SQL介绍

2.2 按行和列插入

2.3 插入否则更新

2.4 插入替换

三,Retrieve查找

3.1 SQL介绍

3.2 按列查询

3.3 查询字段为表达式

3.4 结果去重

3.5 where关键字

3.6 对结果排序

3.7 分页显示

四,update修改

五,Delete删除

5.1 常规删除

5.2 删除整张表数据

5.3 截断表

六,其它操作

6.1 去重表数据

6.2 聚合统计

6.3 分组聚合

6.3.1 生成测试内容

 6.3.2 演示

6.3.3 having条件

6.4 SQL中各语句执行顺序


一,表的CRUD

表的增删查改简称CRUD:

  • Create(新增),对应SQL为insert
  • Retrieve(查找),对应SQL为select
  • Update(修改),对应SQL为update
  • Delete(删除),对应SQL为delete

 CRUD的操作对象是表中的数据,是典型的数据操作语言(Data Manipulation Language)

二,Create新增

2.1 SQL介绍

INSERT [INTO] table_name [(column1 [, column2] ...)] VALUES (value_list1) [, (value_list2)] ...;
  • 上面SQL中的每个value_list都表示插入的一条记录,每个value_list都由若干待插入的列值组成
  • column用于指定每个value_list里的值分别插入到表中的哪一列 

为了方便后续演示,我们先建一个表,如下:

2.2 按行和列插入

①首先是基本插入,我们前面的博客已经演示过很多次了,如下:

②我们还可以一次插入多条数据

2.3 插入否则更新

  • 当插入的数据中有列值与已有的主键列值冲突,则会插入失败
  • 那么我们可以让插入的主键相同时,更新其它列值,如下演示

如果主键不冲突,那么就会正常插入

  • 0 rows affected:表中有冲突数据,但冲突数据的值和指定更新的值相同。
  • 1 row affected:表中没有冲突数据,数据直接被插入。
  • 2 rows affected:表中有冲突数据,并且数据已经被更新。

2.4 插入替换

替换数据的效果和上面的插入否则更新其实很像:

  • 如果表中没有冲突数据,则直接插入数据
  • 如果有冲突数据,先将冲突数据删除,再插入新数据

只要把SQL中的insert替换成replace即可:

三,Retrieve查找

3.1 SQL介绍

SELECT [DISTINCT] {* | {column1 [, column2] ...}} FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...];
  • { }中的 | 代表可以选择左侧的语句或右侧的语句。

为了方便后续演示,我们先创建一个成绩表,并往里面预先插入一些数据:

3.2 按列查询

我们前面用的select * from就是全列查询,其实我们可以把 * 换成指定列的字段名,实现按需求指定列查询,如下:

3.3 查询字段为表达式

select这个语句非常特殊,后面接的是表达式,我们可以把表达式计算,然后显示出来

所以我们可以用这个特性计算表中每位同学的总分,如下:

as关键字也可以省略,如下:

3.4 结果去重

我们可以在select关键字的后面加上distinct对查询结果进行去重:

3.5 where关键字

前面说过select这个关键字很特殊,它后面跟的是一个表达式,其中where关键字就是表达式中一个非常重要的成员:

  • 如果在查询数据时没有指定where子句,那么会直接将表中所有的记录作为数据源来依次执行select语句
  • 如果在查询数据时指定了where子句,那么在查询数据时会先根据where子句筛选出符合条件的记录,然后将符合条件的记录作为数据源来依次执行select语句。

where子句中可以指明一个或多个筛选条件,各个筛选条件之间用逻辑运算符AND或OR进行关联,常用的运算符如下:

比较运算符:

比较运算符解释
>、>=、<、<=和C/C++一样
=等于。但是NULL不安全,例如NULL=NULL的结果是NULL而不是TRUE(1)
<=>等于。NULL安全,例如NULL<=>NULL的结果就是TRUE(1)
!=、<>不等于
between a0 and a1范围匹配。如果a0 <= value <= a1,则返回TRUE(1)
in(option1, option2, ......)如果是括号中的任意一个option,则返回TRUE(1)
is null如果是NULL,则返回TRUE(1)
is not null如果不是NULL,则返回TRUE(1)
like模糊匹配。表示任意多个字符(包括0个),表示任意一个字符

逻辑运算符:

逻辑运算符解释
and当多个条件同时为TRUE(1)时,结果为TRUE(1),否则为FALSE(0)
or任意一个个条件为TRUE(1)时,结果为TRUE(1),否则为FALSE(0)
not条件为TRUE(1)时,结果为TRUE(1);条件为FALSE(0)时,结果为FALSE(0),就是取反

 下面我们将通过部分例子来熟悉where的使用方法:

①找出英语成绩不及格的同学名字和英语成绩

②找出语文成绩在  [80, 90] 之间的同学名字和语文成绩 

③找数学成绩是58或者59或者98或者99分的同学姓名和数学成绩

④找姓孙的同学

有时候我们并不能确定字段具体的细节含义,所以可以采用模糊搜索:

⑤找语文成绩好于英语成绩的同学

⑥找总分在200分以下的同学

错误分析:

  • 我们的原意是将三科成绩加起来然后重命名为total,然后根据where判断total小于200的结果,但是结果报错
  • 因为SQL语句是有执行顺序的,最先执行from语句,指明我要在哪个表里面查
  • 然后执行where语句,表明少选条件是什么,再去表里面查
  • 最后就是执行as语句修改列名,并且as只是在显示层面上进行修改
  • 所以报错显示total不存在,就是因为它是先执行的where语句再执行的as语句

下面是正确示范:

 ⑦找出语文成绩大于80分且不姓孙的同学

⑧找孙某同学,或者要求总成绩>200并且语文成绩<数学成绩并且英语成绩>80

3.6 对结果排序

排序有三种:ASC升序,DESC降序,如果加了order by但是不写什么顺序,则默认是ASC排升序

①找同学数学成绩,按升序显示

 ②找同学总分,由高到低显示(降序)

③找姓孙或姓曹的同学的数学成绩,结果按照数学成绩由高到低显示

注意:如果字段是NULL,则order by对于NULL是作为最小值处理 

3.7 分页显示

 ①显示成绩表的前五行

 ②limit n1, n2;  默认从n1的下一行开始显示 n2 行

 

③找总分第一的同学 

④找总分第二名和第三名的同学

四,update修改

我们直接通过例子来学习修改的步骤

①将孙悟空同学的数学成绩修改成80分

 ②将曹孟德的数学成绩变为60,语文成绩变为70

③将总成绩倒数前三的3位同学的数学成绩加上30分

④将所有同学的语文成绩翻倍

五,Delete删除

5.1 常规删除

注意:任何删除都要考虑再考虑,确认万无一失再进行删除 

①删除孙悟空同学的考试成绩 

②删除总分最低同学的成绩 

5.2 删除整张表数据

为了方便测试我们创建一个测试表并提前插入些数据:

①在delete语句中只指明表名,没有任何where等筛选条件,这时会删除整张表的数据,注意只是删除数据,表结构不受影响

②此时再插入数据时,如果不指明自增长字段的值,那么后续插入的数据的自增长的值是在之前的基础上继续增长的:

这是因为我们创建表时添加了自增长字段,该字段不会随着delete的执行而删除或重置,会在原来自增长数的基础上继续增长:

5.3 截断表

截断表的SQL如下:

TRUNCATE [TABLE] table_name;

  • truncate只能对整表操作,不能像delete一样针对部分数据操作。

  • truncate实际上不对数据操作,所以比delete更快。

  • truncate在删除数据时不经过真正的事务,所以无法回滚。

  • truncate会重置AUTO_INCREMENT字段

我们仍然创建一个测试表,并预先插入一些数据方便演示:

①truncate语句只指明要删除数据的表名,和delete一样,也是会删除整张表的数据;但是truncate是对表做操作,所以truncate语句执行后看到影响行数为0

②截断表也会重置自增长字段 

六,其它操作

6.1 去重表数据

创建测试表并插入数据,包含重复数据:

在select后面加上distinct即可进行去重,但是只是对查询结果进行去重,不影响表原数据

 所以我们要对表数据进行去重,需要进行下面的步骤:

①先查数据,然后去重,就是上面的图片一样

 ②建一个新表,把上面做去重的数据插入

③最后重命名旧表,把新表的名字改成旧表的,即可完成表数据去重 

6.2 聚合统计

简单来说就是统计相关的函数,如下演示:

①统计成绩表学生个数

②也可以总计综合,比如数学总分 

③也可以求数学平均分

④求总分平均分

⑤也有聚合函数可以求最大或最小值

注意:聚合是有条件的,要保证数据列是可被聚合的,只属于一个人的信息是无法聚合的,比如张三和平均值无法聚合

6.3 分组聚合

6.3.1 生成测试内容

我们先创建一个雇员信息表,其内部包含三张表:员工表(emp)、部门表(dept)和工资等级表(salgrade)

员工表包含下面字段:

  • 雇员编号(empno)
  • 雇员姓名(ename)
  • 雇员职位(job)
  • 雇员领导编号(mgr)
  • 雇佣时间(hiredate)
  • 工资月薪(sal)
  • 奖金(comm)
  • 部门编号(deptno)

部门表(dept)中包含如下字段:

  • 部门编号(deptno)
  • 部门名称(dname)
  • 部门所在地点(loc)

工资等级表(salgrade):

  • 等级(grade)
  • 此等级最低工资(losal)
  • 此等级最高工资(hisal)

我们需要用到的SQL如下:

DROP database IF EXISTS `scott`;
CREATE database IF NOT EXISTS `scott` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;USE `scott`;DROP TABLE IF EXISTS `dept`;
CREATE TABLE `dept` (`deptno` int(2) unsigned zerofill NOT NULL COMMENT '部门编号',`dname` varchar(14) DEFAULT NULL COMMENT '部门名称',`loc` varchar(13) DEFAULT NULL COMMENT '部门所在地点'
);DROP TABLE IF EXISTS `emp`;
CREATE TABLE `emp` (`empno` int(6) unsigned zerofill NOT NULL COMMENT '雇员编号',`ename` varchar(10) DEFAULT NULL COMMENT '雇员姓名',`job` varchar(9) DEFAULT NULL COMMENT '雇员职位',`mgr` int(4) unsigned zerofill DEFAULT NULL COMMENT '雇员领导编号',`hiredate` datetime DEFAULT NULL COMMENT '雇佣时间',`sal` decimal(7,2) DEFAULT NULL COMMENT '工资月薪',`comm` decimal(7,2) DEFAULT NULL COMMENT '奖金',`deptno` int(2) unsigned zerofill DEFAULT NULL COMMENT '部门编号'
);DROP TABLE IF EXISTS `salgrade`;
CREATE TABLE `salgrade` (`grade` int(11) DEFAULT NULL COMMENT '等级',`losal` int(11) DEFAULT NULL COMMENT '此等级最低工资',`hisal` int(11) DEFAULT NULL COMMENT '此等级最高工资'
);insert into dept (deptno, dname, loc)
values (10, 'ACCOUNTING', 'NEW YORK');
insert into dept (deptno, dname, loc)
values (20, 'RESEARCH', 'DALLAS');
insert into dept (deptno, dname, loc)
values (30, 'SALES', 'CHICAGO');
insert into dept (deptno, dname, loc)
values (40, 'OPERATIONS', 'BOSTON');insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800, null, 20);insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600, 300, 30);insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250, 500, 30);insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975, null, 20);insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250, 1400, 30);insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850, null, 30);insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450, null, 10);insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7788, 'SCOTT', 'ANALYST', 7566, '1987-04-19', 3000, null, 20);insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7839, 'KING', 'PRESIDENT', null, '1981-11-17', 5000, null, 10);insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7844, 'TURNER', 'SALESMAN', 7698,'1981-09-08', 1500, 0, 30);insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7876, 'ADAMS', 'CLERK', 7788, '1987-05-23', 1100, null, 20);insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950, null, 30);insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000, null, 20);insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300, null, 10);insert into salgrade (grade, losal, hisal) values (1, 700, 1200);
insert into salgrade (grade, losal, hisal) values (2, 1201, 1400);
insert into salgrade (grade, losal, hisal) values (3, 1401, 2000);
insert into salgrade (grade, losal, hisal) values (4, 2001, 3000);
insert into salgrade (grade, losal, hisal) values (5, 3001, 9999);

上述SQL是先创建了一个名为scott的库,然后创建了三张表并插入了部分数据,我们可以将上述内容保存在Linux一个目录中,然后再MySQL中使用source命令就可以一键执行文件中的SQL:

部门表的结构和内容如下:

员工表的内容如下:

工资等级表内容如下:

 6.3.2 演示

分组聚合我们用到的关键字是group by,具体用法直接看后面演示:

①显示每个部门的每种岗位的平均工资和最高工资

②显示每个部门的每种岗位的平均工资和最低工资

  •  group by的子句中可以指明多个字段进行分组,各个字段之间使用逗号隔开,分组优先级与书写顺序相同。

6.3.3 having条件

having可以指明一个或多个筛选条件

having和where的区别:

  •  where子句放在表名后面,而having必须搭配group by使用,放在group by子句的后面
  • where子句是对整表的数据进行筛选,having子句是对分组后的数据进行筛选
  • where子句中不能使用聚合函数和别名,而having子句中可以使用聚合函数和别名

①显示平均工资低于2000的部门和它的平均工资

  • 先统计每个部门的平均工资
  • 然后通过having筛选出低于2000的部门

6.4 SQL中各语句执行顺序

  1.  根据where筛选出符合条件的记录

  2. 根据group by对数据进行分组

  3. 将分组后的数据依次执行select语句

  4. 根据having对分组后的数据进行进一步筛选

  5. 根据order by对数据进行排序

  6. 根据limit筛选若干条记录进行显示

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

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

相关文章

【实战】用飞书多维表格+AI DeepSeeker做股票量价分析

用2万元起步资金&#xff0c;进行A股实战模拟。&#xff08;量化分析无法知晓 消息面的事宜&#xff0c;是一个不足&#xff0c;但是可以代替 哪些一般水平的 股票分析师&#xff09; https://zk4wn8rhv2.feishu.cn/base/OABmbEBa4a4zgOsw5JlcrfIPnzh?tabletblMK2bDhPW5Am9b&a…

深度学习之迁移学习resnet18模型及调用模型预测

迁移学习resnet18模型及调用模型预测 目录 迁移学习resnet18模型及调用模型预测1 迁移学习1.1 概念1.2 主要思想1.3 优点1.4 迁移学习的步骤 2 模型迁移和调整2.1 ResNet18模型2.2 新数据2.3 冻结参数2.4 微调层2.5 新增层2.6 数据预处理 3 代码测试3.1 微调模型代码测试及保存…

DeepSeek掀起推理服务器新风暴,AI应用迎来变革转折点?

AI 浪潮下&#xff0c;推理服务器崭露头角 在科技飞速发展的当下&#xff0c;AI 是耀眼明星&#xff0c;席卷各行业&#xff0c;深刻改变生活与工作模式&#xff0c;从语音助手到医疗诊断、金融风险预测&#xff0c;AI 无处不在。其发展分数据收集整理、模型训练、推理应用三个…

用openresty和lua实现壁纸投票功能

背景 之前做了一个随机壁纸接口&#xff0c;但是不知道大家喜欢对壁纸的喜好&#xff0c;所以干脆在实现一个投票功能&#xff0c;让用户给自己喜欢的壁纸进行投票。 原理说明 1.当访问http://demo.com/vote/时&#xff0c;会从/home/jobs/webs/imgs及子目录下获取图片列表&…

【保姆级教程】DeepSeek R1+RAG,基于开源三件套10分钟构建本地AI知识库

一、总体方案 目前在使用 DeepSeek 在线环境时&#xff0c;页面经常显示“服务器繁忙&#xff0c;请稍后再试”&#xff0c;以 DeepSeek R1 现在的火爆程度&#xff0c;这个状况可能还会持续一段时间&#xff0c;所以这里给大家提供了 DeepSeek R1 RAG 的本地部署方案。最后实现…

Java 常用类 10. Java System类

简介&#xff1a; 主要用于获取系统的属性数据和其他操作&#xff0c;构造方法&#xff08;私有的&#xff09;实际上 System 类是一些与系统相关属性和方法的集合&#xff0c;而且在System 类中所有的属性&#xff0c;都是静态的&#xff0c;要想引用这些属性和方法&#xff0…

从零开始构建一个语言模型中vocab_size(词汇表大小)的设定规则

从零开始构建一个语言模型就要设计一个模型框架,其中要配置很多参数。在自然语言处理任务中,vocab_size(词汇表大小) 的设定是模型设计的关键参数之一,它直接影响模型的输入输出结构、计算效率和内存消耗。 本文是在我前文的基础上讲解的:从零开始构建一个小型字符级语言…

python小项目编程-初级(5、词频统计,6、简单得闹钟)

1、词频统计 统计文本文件中每个单词出现的频率。 实现 import tkinter as tk from tkinter import filedialog, messagebox from collections import Counter import reclass WordFrequencyCounter:def __init__(self, master):self.master masterself.master.title("…

一文讲解Redis为什么读写性能高以及I/O复用相关知识点

Redis为什么读写性能高呢&#xff1f; Redis 的速度⾮常快&#xff0c;单机的 Redis 就可以⽀撑每秒十几万的并发&#xff0c;性能是 MySQL 的⼏⼗倍。原因主要有⼏点&#xff1a; ①、基于内存的数据存储&#xff0c;Redis 将数据存储在内存当中&#xff0c;使得数据的读写操…

计算机网络安全之一:网络安全概述

1.1 网络安全的内涵 随着计算机和网络技术的迅猛发展和广泛普及&#xff0c;越来越多的企业将经营的各种业务建立在Internet/Intranet环境中。于是&#xff0c;支持E-mail、文件共享、即时消息传送的消息和协作服务器成为当今商业社会中的极重要的IT基础设施。然而&#xff0…

程函方程的详细推导

以下是基于非均匀介质弹性波方程&#xff08;无纵波假设&#xff09;推导程函方程的详细过程&#xff0c;完整考虑纵波&#xff08;P 波&#xff09;和横波&#xff08;S 波&#xff09;的耦合效应&#xff1a;

【JavaEE进阶】MyBatis通过注解实现增删改查

目录 &#x1f343;前言 &#x1f340;打印日志 &#x1f334;传递参数 &#x1f38b;增(Insert) &#x1f6a9;返回主键 &#x1f384;删(Delete) &#x1f332;改(Update) &#x1f333;查(Select) &#x1f6a9;起别名 &#x1f6a9;结果映射 &#x1f6a9;开启驼…

[AHOI2018初中组] 分组---贪心算法

贪心没套路果真如此。 题目描述 小可可的学校信息组总共有 n 个队员&#xff0c;每个人都有一个实力值 ai​。现在&#xff0c;一年一度的编程大赛就要到了&#xff0c;小可可的学校获得了若干个参赛名额&#xff0c;教练决定把学校信息组的 n 个队员分成若干个小组去参加这场…

DeepSeek动画视频全攻略:从架构到本地部署

DeepSeek 本身并不直接生成动画视频,而是通过与一系列先进的 AI 工具和传统软件协作,完成动画视频的制作任务。这一独特的架构模式,使得 DeepSeek 在动画视频创作领域发挥着不可或缺的辅助作用。其核心流程主要包括脚本生成、画面设计、视频合成与后期处理这几个关键环节。 …

用deepseek学大模型08-长短时记忆网络 (LSTM)

deepseek.com 从入门到精通长短时记忆网络(LSTM),着重介绍的目标函数&#xff0c;损失函数&#xff0c;梯度下降 标量和矩阵形式的数学推导&#xff0c;pytorch真实能跑的代码案例以及模型,数据&#xff0c; 模型应用场景和优缺点&#xff0c;及如何改进解决及改进方法数据推导…

以ChatGPT为例解析大模型背后的技术

目录 1、大模型分类 2、为什么自然语言处理可计算&#xff1f; 2.1、One-hot分类编码&#xff08;传统词表示方法&#xff09; 2.2、词向量 3、Transformer架构 3.1、何为注意力机制&#xff1f; 3.2、注意力机制在 Transformer 模型中有何意义&#xff1f; 3.3、位置编…

鸿道Intewell操作系统:赋能高端装备制造,引领国产数控系统迈向新高度

在当今全球制造业竞争日益激烈的时代&#xff0c;高端装备制造作为国家核心竞争力的重要组成部分&#xff0c;其发展水平直接影响着一个国家的综合实力。而CNC数控系统&#xff0c;作为高端装备制造的“大脑”&#xff0c;对于提升装备的精度、效率和智能化水平起着关键作用。鸿…

mac开发环境配置笔记

1. 终端配置 参考&#xff1a; Mac终端配置笔记-CSDN博客 2. 下载JDK 到 oracle官网 下载jdk: oracle官网 :Java Downloads | Oraclemac的芯片为Intel系列下载 x64版本的jdk&#xff1b;为Apple Mx系列使用 Arm64版本&#xff1b;oracle官网下载时报错&#xff1a;400 Bad R…

【Python爬虫(29)】爬虫数据生命线:质量评估与监控全解

【Python爬虫】专栏简介&#xff1a;本专栏是 Python 爬虫领域的集大成之作&#xff0c;共 100 章节。从 Python 基础语法、爬虫入门知识讲起&#xff0c;深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑&#xff0c;覆盖网页、图片、音频等各类数据爬取&#xff…

大模型工具大比拼:SGLang、Ollama、VLLM、LLaMA.cpp 如何选择?

简介&#xff1a;在人工智能飞速发展的今天&#xff0c;大模型已经成为推动技术革新的核心力量。无论是智能客服、内容创作&#xff0c;还是科研辅助、代码生成&#xff0c;大模型的身影无处不在。然而&#xff0c;面对市场上琳琅满目的工具&#xff0c;如何挑选最适合自己的那…