mysql的增删查改(进阶)

news2024/10/6 6:49:15

一.  更复杂的新增

将从表名查询到的结果插入到表名2中

insert into 表名2 select .. from 表名1 ...;

创建一个学生表:

创建一个学生表2, 将学生表中的数据加到学生表2中:

 注意: 列的类型可以匹配即可插入, 列名和列的类型不一定要完全一致

 二. 查询

2.1 聚合查询

前面谈到的"表达式查询", 是针对列和列之间的运算, 聚合查询, 就是针对行和行之间的运算

对于行之间的运算, sql中提供了"聚合函数" 来完成这里的运算, 相当于是"库函数"

COUNT

存在这样的表:

此时, 得到了表的全部行的数量

当前这个写法, 就相当于先执行了select * from exam_result, 再对结果进行count聚合

如果写具体的列, 就是针对这一列的结果进行聚合:

 发现结果不同, 因为chinese有个空行

结论: 针对某一列进行聚合的时候, 只关注这一列有多少非NULL的结果 而针对*进行聚合时, 则不再是否非NULL, 全部都记录

如果在count和( )之间加个空格, 就会报错

SQL语言大部分情况下对于空格和换行都是很有好的, 但是聚合函数的函数名和括号之间, 不能有空格

SUM

相当于先执行了select chinese from exam_result, 再对结果进行sum聚合

括号中写表达式也可以:

 相当于先执行了select chinese+math+english from exam_result, 再对结果进行sum聚合

也可以进行带有别名:

但不能把别名写在括号中:

能用sum(*) 吗?

显然不可以

聚合函数中count(*) 其实是一种特殊情况, 只是单纯的统计行数

sum和其他的聚合函数, 涉及到相加或其他计算, 语义上没有明确定义, 不能用sum(*)

针对非数值的列, 进行加和, 虽然不会报错, 但是结果是不正确的, 会报警告:

使用show warnings;  可以查看警告

数据库试图将name转换成double类型(因为SQL是弱类型语言), 但是失败了

但是如果虽然是varchar类型, 但是你赋值为'1''2''3', 那也是可以相加的, 因为可以进行类型转换

AVG

MAX

 MIN

2.1.2 分组查询  group by 子句

指定某个列, 针对这个列, 把值相同的行, 分到同一个组中, 在针对每个组, 分别进行聚合查询 

添加一个表:

查询每个角色下有几个人:

 执行顺序:

  1.  先执行 select role,id from emp
  2.  再根据group by role 设定, 按照role这一列的值, 针对上述查询结果, 进行分组
    分成服务员一组, 游戏陪玩一组, 游戏角色一组, 董事长一组
  3.  针对上面的组, 分别执行count聚合操作
  4.  将上面的结果整理成临时表, 返回给客户端即可

最终结果的临时表, 这几个分组的顺序谁先谁后可不一定!!

可以针对聚合后的结果进行排序, 而不是干预每个分组中数据的先后顺序:

注意: 使用 GROUP BY 进行分组查询时,SELECT 指定的字段必须是分组依据字段,即group by 后面的列, 其他字段若想出现在SELECT 中则必须包含在聚合函数中。

如果这么写:

每个显示的结果, 都是每个分组中的其中一条记录, 但是由于分组之后, 顺序是不确定的, 当前你这里显示的是哪行, 是不确定的, 存在一定的"随机性", 因此就没有意义

 2.1.3 HAVING

给聚合查询指定条件:

1) 聚合之前的条件

查询每个岗位的平均工资, 但是刨除"马云"

where写在group by 前面

2) 聚合之后的条件

查询每个岗位的平均工资, 但刨除平均工资超过10000的数据

此时, 筛选聚合之后的条件, 就不能用where, 需要用having:

此时having放在group by 后面 

当然, 一个sql中, 上述两种条件, 都可以存在:

计算每个岗位的平均工资, 刨除"马云", 也刨除平均工资超过10000的:

 2.2 联合查询/多表查询

上面介绍的都是单表查询

想要学习多表查询, 我们先要了解一下"笛卡尔积"的概念

笛卡尔积, 就是得到了一个更大的表, 列数, 是原来两个表列数的和, 行数, 是原来两个表列数的积

在sql中, 我们很方便通过select 完成笛卡尔积:

先创建两个表student 和 class

笛卡尔积:

但是, 笛卡尔积是全排列的过程, 穷举出了所有的可能性, 自然就会产生以下不符合实际的情况的数据, 例如上述笛卡尔积中, classId只有一个, 只有相同的才是有效数据

那么我们可以加上条件: 

这样写, 会产生二义性, 因为两个列名是相等的, 那么我们可以通过 表名. 列名 的方式访问各自的列

 这个就是多表查询/联合查询的sql

像 where student.classId = class.classId 这种专门用来筛选出有效数据的条件, 也称为"连接条件", 上述多表查询的操作, 也可以称为"连接操作".

创建四张表:

1) 查询'许仙'同学的成绩

第一步: 先确定要查询的信息来自哪些表

许仙同学的名字在学生表中, 成绩在分数表中, 所以要针对学生表和分数表进行联合查询

第二步: 针对这两个表进行笛卡尔积

学生表是8条记录, 分数表是20条记录, 笛卡尔积应该有160条记录

第三步: 加上连接条件, 去掉无效数据

第四步: 再根据题目, 补充其他的条件

第五步: 去掉不必要的列

因为题目要求只要许仙的成绩

2) 使用join ... on  多表查询的另一种写法

第一步: 确认信息来自学生表和分数表

第二步: 笛卡尔积(用join实现笛卡尔积)

第三步: 指定连接条件(用on 代替where)

 第四步: 补充其他条件

第五步: 保留必要列, 去掉其他列

3) 查询所有同学的总成绩

第一步: 信息出自学生表 分数表

第二步: 学生表和分数表进行笛卡尔积

第三步: 指定连接条件

第四步: 添加其他条件, 此处需要添加聚合操作, 按照学生的姓名进行分组

 4) 列出同学的成绩, 课程的名字, 课程的成绩

第一步: 信息来自三个表, 学生表, 课程表, 分数表

第二步: 笛卡尔积

第三步: 指定连接条件

第四步: 对列进行精简

针对多张表查询, 使用join on 可读性更好

 2.2.1 内连接

上述我们所有的链接都是内连接 

select * from 表1,表2 where 连接条件

select * from 表1 (inner) join 表2 on 连接条件

2.2.2 外连接

select * from 表1 left/right join 表2 on 条件....;

注意: 只能使用join ..on.., 在join的前面加上left / right 关键字, 表示"左外连接" 和 "右外连接"

 外连接和内连接一样, 也是基于笛卡尔积的方式来计算的, 但是对于空值/不存在的值, 处理方式是存在区别的

1)对于数据"一一对应"的情况

对于学生表和分数表,
任何一个学生数据, 都能在分数表中找到分数结果
任何一个分数结果, 也能在学生表中找到名字信息

此时, 进行内连接和外连接, 效果是一样的

  简单创建两张表:

内连接:

外连接:

2)对于数据"非一一对应"的情况 

 如果我们对上述数据进行调整:

此时, wangwu的分数信息, 在分数表中不存在了
分数表中, id为4的信息, 在学生表中也不存在

内连接:

此时, 得到的结果, 是包含在两个表中都有的数据

左外连接:

对于左外连接, 以左侧的表为基准, (写作student left join score, 此时student就是左侧表, score就是右侧表), 保证左侧表中的每一个数据, 都会存在, 左侧表数据在右侧表不存在的列, 会用null填充

右外连接:

右外连接与左外连接类似, 以右侧表为基准, 使右表中的每个数据都存在, 对应坐标中不存在的数据都用null填充

2.2.3 全外连接

结合左连接和右连接

站在集合的角度看待上述几种链接:

2.2.4 自连接

同一个表, 自己和自己计算笛卡尔积

例:
还是使用上面的表

显示所有"计算机原理"成绩比"java"成绩高的成绩信息


我们想要比较的是同一个学生的3号课程比1号课程成绩高的数据, 发现我们要比较的score在不同的行中, 之前我们进行的各种条件查询, 都是基于列和列之间的比较, 聚合函数时行和行之间的运算, 没法进行行和行之间的比较, 这时我们就要想办法将行和行之间的关系, 转化成列和列之间的关系, 此时, 自连接就出现了

当我们直接进行自连接时, 发现会报错:

此时我们要给表起个别名:

继续添加条件:

 2.2.5 子查询

把多个sql嵌套成了一个sql

1) 单行子查询: 返回一行记录的查询

查询"不想毕业"同学的同班同学:

先知道"不想毕业"同学的班级, 再去找同班同学

子查询:

将得出的单条记录直接用sql语句代替

2)多行子查询: 返回多条记录的子查询 用in关键字

查询"语文"或"英文"课程的成绩信息:

先知道"语文"或"英文"的课程id, 再去找成绩:
 

子查询:


用in()来圈定范围

2.2.6 合并查询

把多个查询结果合并到一起, 使用union关键字

查询id<3,或者名字为"英文"的课程

 另外, union允许从不同的表分别查询, 只要每个表查询的结果集合列的类型和列的个数匹配, 都能合并, 列的名字无所谓, 但是or只能针对一个表

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

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

相关文章

深度学习知识与心得

目录 深度学习简介 传统机器学习 深度学习发展 感知机 前馈神经网络 前馈神经网络&#xff08;BP网络&#xff09; 深度学习框架讲解 深度学习框架 TensorFlow 一个简单的线性函数拟合过程 卷积神经网络CNN&#xff08;计算机视觉&#xff09; 自然语言处理NLP Wo…

LabVIEW中进行步进电机的位置控制

在LabVIEW中进行步进电机的位置控制&#xff0c;通常涉及以下几个关键步骤&#xff1a;设置硬件、配置通信、编写控制算法和实施反馈控制。以下是一个详细的介绍。 硬件设置 步进电机&#xff1a;选择合适的步进电机&#xff0c;根据负载和应用需求选择适当的步数和转矩。 驱…

【力扣】1312. 让字符串成为回文串的最少插入次数

一、题目描述 二、题解 本题我们利用动态规划的思想来解决。 1、状态表示 首先创建一个dp数组&#xff0c;dp[i][j] 表示的是将字符串 s 的 [ i, j ] 区间的这一子串&#xff0c;变成回文串的最少插入次数。 2、状态转移方程 3、初始化 根据「状态转移方程」&#xff0c;没…

煤矿输送设备无人化运维巡检解决方案

一、煤矿行业目前存在的挑战和难题 煤矿行业面临着复杂的环境&#xff0c;如粉尘、潮湿、高温、高瓦斯等&#xff0c;对巡检设备和人员安全有威胁。并且设备分布广、需要长时间作业&#xff0c;全面巡检难度大、对巡检工作的耐力和持续性要求高。而煤矿输送设备无人化运维巡检…

Comfyui图片高清放大方法

在过去的两期内容中&#xff0c;我们探讨了如何安装 ComfyUI 及其在图像生成中的应用。 本期&#xff0c;我们将深入了解如何使用 ComfyUI 对图片进行高清放大. 在开始今天的主题之前&#xff0c;请确保您已经在个人电脑上安装了 ComfyUI。同时&#xff0c;确保您已将 ESRGAN_4…

ios:文本框默认的copy、past改成中文复制粘贴

问题 ios 开发&#xff0c;对于输入框的一些默认文案展示&#xff0c;如复制粘贴是英文的&#xff0c;那么如何改为中文的呢 解决 按照路径找到这个文件 ios/项目/Info.plist&#xff0c;增加 <key>CFBundleAllowMixedLocalizations</key> <true/> <…

Oracle Linux上安装ORDS

ORDS就是Oracle REST Data Services。 环境如下&#xff1a; Oracle Linux 8Oracle Database 19cIP地址为A.B.C.D 要安装最新版本的ORDS&#xff0c;当前为24.1.1。 全程参考文档&#xff1a;Installing and Configuring Oracle REST Data Services 安装ORDS 添加reposit…

固定翼飞机(固定翼飞行器)种类丰富 国家政策推动行业发展速度加快

固定翼飞机&#xff08;固定翼飞行器&#xff09;种类丰富 国家政策推动行业发展速度加快 固定翼飞机又称固定翼飞行器&#xff0c;指机翼固定于机身&#xff0c;可通过固定机翼产生升力的飞行器。固定翼飞机具有机动性强、运载量大、航程远、飞行速度快等优势&#xff0c;在农…

Redis用GEO实现附近的人功能

文章目录 ☃️概述☃️命令演示☃️API将数据库表中的数据导入到redis中去☃️实现附近功能 ☃️概述 GEO就是Geolocation的简写形式&#xff0c;代表地理坐标。Redis在3.2版本中加入了对GEO的支持&#xff0c;允许存储地理坐标信息&#xff0c;帮助我们根据经纬度来检索数据。…

排八字软件有哪些?

排八字软件有哪些&#xff1f;在市面上有很多排八字的软件可供选择&#xff0c;其中一些比较知名的有&#xff1a; 无敌八字排盘软件&#xff1a;这是一款功能强大的八字排盘软件&#xff0c;提供详细的八字解析和命理分析服务&#xff0c;且完全免费。 网易星盘&#xff1a;网…

珠宝首饰AR虚拟3D试戴增强企业商品营销效果

在西安这座古老与现代交织的城市中&#xff0c;VRAR软件开发公司相比其他城市也略多一些&#xff0c;作为专业的西安AR软件开发公司&#xff0c;我们正凭借着前沿的AR增强现实/VR虚拟现实技术&#xff0c;为客户打造独一无二的互动体验。 专业团队&#xff0c;定制开发 我们拥有…

OAK相机如何将 YOLOv9 模型转换成 blob 格式?

编辑&#xff1a;OAK中国 首发&#xff1a;oakchina.cn 喜欢的话&#xff0c;请多多&#x1f44d;⭐️✍ 内容可能会不定期更新&#xff0c;官网内容都是最新的&#xff0c;请查看首发地址链接。 Hello&#xff0c;大家好&#xff0c;这里是OAK中国&#xff0c;我是Ashely。 专…

如何做好流程优化?看这里的目的、原则和方法

流程管理的本质是通过构造卓越的业务流程让流程增值&#xff0c;为客户创造真正的价值。 但卓越的业务流程并不是一蹴而就的&#xff0c;有一个过程&#xff0c;这个过程就是业务流程和流程管理体系不断优化提升的过程&#xff08;可以参照流程成熟度评价模型&#xff09;。 …

[pdf,epub]《软件方法》2024版电子书共290页(202405更新)

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 已上传本账号CSDN资源。 或者到以下链接下载&#xff1a; http://www.umlchina.com/url/softmeth2024.html&#xff0c;或点击“阅读原文”。 如果需要提取码&#xff1a;umlc 已排…

【SpringMVC】_简单示例计算器

目录 1. 需求分析 2. 接口定义 3. 请求参数 4. 响应数据 5. 服务器代码 6. 前端页面代码 7. 运行测试 为阶段性总结与应用&#xff0c;现将以Spring MVC项目创建一个可以实现加法的计算器为例 1. 需求分析 加法计算器功能&#xff0c;对两个整数进行相加&#xff0c;需…

uniapp跨端代码编写(h5和钉钉小程序)

页面开发 差异。小程序编译机制不一样&#xff0c;我在写h5的时候&#xff0c;页面布局啥的都是用uniapp的扩展组件来修改的&#xff08;都是改的原生组件的样式&#xff09;&#xff0c;小程序编译有组件隔离&#xff0c;不能直接修改组件的原生样式&#xff0c;查了很多资料…

Golang | Leetcode Golang题解之第120题三角形最小路径和

题目&#xff1a; 题解&#xff1a; func minimumTotal(triangle [][]int) int {n : len(triangle)f : make([]int, n)f[0] triangle[0][0]for i : 1; i < n; i {f[i] f[i - 1] triangle[i][i]for j : i - 1; j > 0; j-- {f[j] min(f[j - 1], f[j]) triangle[i][j]…

[RK3588-Andoird12] 关于LED灯控芯片is31fl3216和is31fl3236调试

问题描述 RK默认dts配置中并没有issi,is31fl32xx相关的配置指导。 is31fl3236是12X3 36路RGB is31fl3216是6X3 18路RGB 解决方案&#xff1a; is31fl3236 dts配置如下&#xff1a; &i2c1 {clock-frequency <400000>;status "okay";is31fl3236: led-co…

苏州金龙新V系客车科技助力“粤”动广州

粤动活力新V系&#xff01; 5月23日&#xff0c;苏州金龙新V系智慧客车推介会在羊城广州举行。活动现场展出了4款新V系代表车型&#xff0c;来自广东省旅游客运、道路运输行业的200余位从业者齐聚一堂&#xff0c;共同品鉴、体验了苏州金龙新V系产品的“新、心、芯”魅力。苏州…

接口设计的最佳实践-下篇

大多数程序员&#xff0c;做得最多的事&#xff0c;也不过是写接口这件事而已。 今天继续总结下接口设计需要注意的点。尽量每种都给出具体的场景、案例等&#xff0c;希望大家能有所收获。 1、接口幂等 幂等性&#xff1a;是指一个操作或者一个服务&#xff0c;无论执行多少…