mysql的增删查改(进阶)

目录

一.  更复杂的新增

 二. 查询

2.1 聚合查询

COUNT

SUM

AVG

MAX

 MIN

2.1.2 分组查询  group by 子句

 2.1.3 HAVING

 2.2 联合查询/多表查询

 2.2.1 内连接

2.2.2 外连接

2.2.3 全外连接

2.2.4 自连接

 2.2.5 子查询

2.2.6 合并查询


一.  更复杂的新增

将从表名查询到的结果插入到表名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只能针对一个表

union在合并是会自动去重, 如果不想要去重操作, 可以使用union all

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

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

相关文章

MySQL—函数—日期函数(基础)

一、引言 接下来讨论和学习关于函数的第三个方面——日期函数。 常见的MySQL当中的日期函数。 注意&#xff1a; 1、CURDATE()&#xff1a;cur&#xff1a;current 当前的&#xff0c;返回的是当前日期。 2、CURTIME()&#xff1a;当前时间。 3、NOW&#xff1a;当前的日期和…

数据结构 实验 1

题目一&#xff1a;用线性表实现文具店的货品管理问题 问题描述&#xff1a;在文具店的日常经营过程中&#xff0c;存在对各种文具的管理问题。当库存文具不足或缺货时&#xff0c;需要进货。日常销售时需要出库。当盘点货物时&#xff0c;需要查询货物信息。请根据这些要求编…

Linux shell编程学习笔记55:hostname命令——获取或设置主机名,显示IP地址和DNS、NIS

0 前言 2024年的网络安全检查又开始了&#xff0c;对于使用基于Linux的国产电脑&#xff0c;我们可以编写一个脚本来收集系统的有关信息。其中主机名也是我们要收集的信息之一。 1. hostname命令 的功能、格式和选项说明 我们可以使用命令 hostname --help 来查看hostname命令…

Linux服务器扩容及磁盘分区(LVM和非LVM)

Linux扩容及磁盘分区&#xff08;LVM和非LVM&#xff09; 本文主要介绍了阿里云服务器centos的扩容方法&#xff1a;非LVM分区扩容方法&#xff08;系统盘&#xff09;&#xff0c;以及磁盘改LVM并分区&#xff08;数据盘&#xff09;。主要是ext4文件系统及xfs磁盘scsi MBR分…

每日一题《leetcode-- LCR 025.两数相加||》

https://leetcode.cn/problems/lMSNwu/ 分别把给定的两个链表翻转&#xff0c;然后从头开始相加。 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ //反转链表 struct ListNode* reverselist(struct ListNode*h…

虚拟现实环境下的远程教育和智能评估系统(七)

在后端代码的基础上&#xff0c;利用vue框架设计前端界面&#xff0c;至此&#xff0c;用户界面基本成型&#xff0c;后续添加其他进阶功能&#xff1b; 另&#xff0c;前后端交互相关&#xff1a; UsersVO.java package com.roncoo.education.user.feign.interfaces.vo;impor…

解决torch.cuda.is_available()一直为false的问题

一、检测脚本 import torchprint(torch.__version__) print(torch.cuda.is_available()) print(torch.version.cuda) 输出 二、解决排查 1、安装CUDA 根据驱动选择要安装的版本 安装网站&#xff1a;CUDA Toolkit Archive | NVIDIA Developer 安装成功后 2、安装cuDNN 注…

OJ1230进制的转换

答案&#xff1a; #include <bits/stdc.h> using namespace std; using lllong long; const int N10; int a[10]; char ch[]{0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F}; void solve() {int n,m;cin>>n>>m;string str;cin>>str;for(int i0;i<str.size();i)…

糖果促销【百度之星】/思维

糖果促销 思维 大佬的解法&#xff1a; #include<bits/stdc.h> using namespace std; typedef long long ll; int main() {ll t;cin>>t;for(int i0;i<t;i){ll p,k;cin>>p>>k;if(k0) cout<<0<<endl;else{k-(k-1)/p;cout<<k<…

2024最新 Jenkins + Docker实战教程(七)- Jenkins实现远程传输和自动部署

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

prometheus的rules配置

说明&#xff1a;本文介绍prometheus中的规则配置&#xff1b; 规则说明 groups:- name: MySQLAlertsrules:- alert: MysqlDownexpr: mysql_up 0for: 0mlabels:severity: criticalannotations:summary: MySQL down (实例&#xff1a;{{ $labels.instance }})description: &q…

Adversarial Nibbler挑战:与多元社区持续开展开放红队测试

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

11.4 插入排序

目录 11.4 插入排序 11.4.1 算法流程 11.4.2 算法特性 11.4.3 插入排序的优势 11.4 插入排序 插入排序&#xff08;insertion sort&#xff09;是一种简单的排序算法&#xff0c;它的工作原理与手动整理一副牌的过程非常相似。 具体来说&#xff0c;我们在未排…

RTOS(ENV)串口DMA接收GPS数据并解析

RTOS&#xff08;ENV&#xff09;配置STM32串口DMA接收模式 环境&#xff1a; RTOS 4.0.3Keil5ENVSTm32l475 ENV配置 使能串口&#xff1a; 2. 使能DMA&#xff0c;并设置接收缓冲区大小&#xff1a; 创建工程 scons --targetmdk工程配置 1. 创建串口设备句柄 #define SA…

LLaMA-Factory实战推理

LLaMA-Factory官网&#xff1a;https://github.com/hiyouga/LLaMA-Factory 安装环境 git clone https://github.com/hiyouga/LLaMA-Factory.git cd LLaMA-Factory/ conda create -n py310 python3.10 conda activate py310按照llama-factory要求的标准格式组织数据集&#xff…

linux tomcat版本漏洞升级

Tomcat Session 反序列化代码执行漏洞(CVE-2020-9484) Tomcat 安全限制绕过漏洞(CVE-2018-8034) Tomcat远程代码执行漏洞(CVE-2017-12615) 以上均可以升级版本处理&#xff0c;小版本升级方法 tomcat安装请查看https://blog.csdn.net/qq_42250832/article/details/139015573 1、…

数学建模 —— 人工神经网络(6)

目录 一、人工神经网络 1.1 人工神经网络结构 1.2 神经元/感知器 1.3 激活函数 1.3.1 sign函数 1.3.2 sigmoid函数&#xff08;Logistic函数&#xff09; 1.3.3 tanh双曲正切函数 1.3.4 ReLU函数 1.4 分类 二、BP人工神经网络 2.1 概述 2.2 处理过程 2.3 例题 2.…

本地安装AI大模型

使用ollmam安装llmama3等模型 1.打开ollmam下载对应系统的软件&#xff0c;安装即可 官网&#xff1a;Ollama&#xff0c; 安装直接点就就行了&#xff0c;没有其他操作 2.安装模型 在官网找到对于的模型下载命令 记录命令:ollama run llama3 打开一个cmd窗口&#xff0c;输…

272 基于matlab的形态滤波和局域值分解(LMD)的齿轮故障诊断

基于matlab的形态滤波和局域值分解&#xff08;LMD&#xff09;的齿轮故障诊断&#xff0c;GUI交互界面。通过形态滤波对一维信号进行降噪处理&#xff0c;并通过LMD局部均值分解提取故障信号&#xff0c;最后提取处故障频率。程序已调通&#xff0c;可直接运行。 272 形态滤波…

Thinkphp5响应式进销存仓库管理系统

随着企业规模的不断扩大和市场竞争的日益激烈&#xff0c;进销存管理在企业的运营中扮演着越来越重要的角色。为了提高企业的运营效率&#xff0c;降低库存成本&#xff0c;提升客户满意度&#xff0c;越来越多的企业开始引入进销存仓库管理系统。 进销存仓库管理系统是一种集…