【MySQL】MySQL表的增删改查(进阶篇)——之查询操作(超级详解)

news2024/11/9 4:43:57

前言:

🌟🌟本期讲解关于MySQL表增删查改进阶篇,希望能帮到屏幕前的你。

🌈上期博客在这里:http://t.csdnimg.cn/8SiWF

🌈感兴趣的小伙伴看一看小编主页:http://t.csdnimg.cn/8SiWF

 

目录

📚️1.引言

📚️2.查询搭配插入

📚️3.聚合查询

        3.1 聚合函数

  1.count函数

  2.sum函数

  3.avg函数,max函数,min函数

3.2GROUP BY子句

3.3having条件函数

📚️4.联合查询

4.1内连接

  1.创建笛卡尔积:

  2建立链接条件,筛选有效数据:

  3.结合需求,添加条件:

  4.精简表:

  5.笛卡尔积总结:

4.2外连接

  1.左外连接

  2.右外连接

4.3自连接

4.4子查询

  1.单行子查询

  2.多行子查询

4.5合并查询

  1.在一个表中

  2.在两个表中

📚️5.总结


📚️1.引言

       Hello!!!家人们,小编上期期讲解了关于增删查改的进阶之约束条件,关于数据库表的增删查改有了一定的认知,小编这期就将深入讲解另一部分内容,即关于数据库增删查改的进阶操作之查询进阶,大家准备好了吗~~~🥳🥳🥳;

 且听小编进行讲解,包你学会!!! 


📚️2.查询搭配插入

SQL执行语句:insert into 表名1 select * from 表名2

当然这里的意思是将表2的所有值插入到表1当中去;

代码如下:

mysql> insert into student values(1,'孙悟空'),(2,'猪八戒'),(3,'沙悟净');


mysql> create table student2(student2_id int,name varchar(10));


mysql> insert into student2 select * from student;

 此时就将表student的所有值插入到了表student2当中去;

注意:此时的被插入的表和插入的表的列数,和类型都要匹配,否则会报错;

📚️3.聚合查询

由于我们之前所说的表达式查询是针对表达式进行列和列的操作,所以在行和行之间我们就要用到聚合查询,所以聚合查询是针对行和行之间的运算;

3.1 聚合函数

1.count函数

SQL执行语句:select count(*) from 表名

代码实例如下:

mysql> insert into student values(1,'孙悟空'),(2,'猪八戒'),(3,'沙悟净');
mysql> select count(*) from student;
+----------+
| count(*) |
+----------+
|        3 |
+----------+

注意:这里的count计算的是有多少行,并且也会把null算进行数;但是当指定列的时候,如果存在null则null不算入行数中;并且在指定列的时候可以通过distinct进行去重操作;

2.sum函数

SQL执行语句:select sum(int类型的列名) from 表名

代码实例如下:

mysql> select sum(student_id) from student;
+-----------------+
| sum(student_id) |
+-----------------+
|               6 |
+-----------------+

 注意:这里的sum代表的是每行指定列的数值相加,这里会自动排除掉NULL,若这里的指定的列不为整型,那么输出为0,并发出警告;

如下:

mysql> select sum(name) from student;
+-----------+
| sum(name) |
+-----------+
|         0 |
+-----------+
1 row in set, 4 warnings (0.00 sec)

 这时候,进入警告查看,可以了解到MySQL会自动将指定列转为double类型的数据,如果转失败了,就会报错,即发出警告;

3.avg函数,max函数,min函数

这里的三个函数的操作基本和上述的写法基本一致

SQL执行语句:select avg(整数类型的列) from 表名;

SQL执行语句:select max(整数类型的列) from 表名;

SQL执行语句:select min(整数类型的列) from 表名;

注意:这里的函数分别代表求平均值,最大值,最小值;这里的类型要求都为数字类型,不要搞错了,否则这里的函数就没有意义了;

 3.2GROUP BY子句

这里的group by代表的是分组查询,一般来搭配聚合查询函数来使用;

SQL执行语句:select  列名,列名 from 表名 group by 列名;

 代码实现如下:

mysql> select * from emp;
+------+-----------------+--------------+--------+
| id   | name            | role         | salary |
+------+-----------------+--------------+--------+
|    1 | 孙悟空          | 程序猿       |  10000 |
|    2 | 猪八戒          | 程序猿       |  11000 |
|    3 | 沙悟净          | 程序猿       |  14000 |
|    4 | 唐三藏          | 老板         | 100000 |
|    5 | 白龙马          | 产品经理     |   9000 |
|    6 | 女儿国国王      | 产品经理     |  10000 |
+------+-----------------+--------------+--------+

mysql> select role,avg(salary) from emp group by role;
+--------------+-------------+
| role         | avg(salary) |
+--------------+-------------+
| 产品经理     |   9500.0000 |
| 程序猿       |  11666.6667 |
| 老板         | 100000.0000 |
+--------------+-------------+

首先前面是小编创建的一张表,通过分组查询,会将指定的分组列进行分组,让后通过聚合函数将对应的角色的薪水求平均值;

注意:

📍若直接求平均值,由于老板的薪水很高,会造成很大误差,分完组后,就不会产生误差;

📍若指定了分组的列,那么在进行查找时也应该写进去,方便阅读;

📍分组查询也可以搭配where条件函数,只不过要分清条件在分组之前还是分组之后,若条件在    分组之前那么就可以使用where

3.3having条件函数

SQL执行语句:select  列名,列名 from 表名 group by 列名 having 条件

上述说到若条件在分组之后,就要用到having条件描述:

mysql> select role,avg(salary) from emp group by role having avg(salary)<20000;
+--------------+-------------+
| role         | avg(salary) |
+--------------+-------------+
| 产品经理     |   9500.0000 |
| 程序猿       |  11666.6667 |
+--------------+-------------+

注意:这里就是当进行分组查询,并求平均薪资完成后,想要得到薪水小于两万的角色,此时就可以在分组查询完成后,进行having函数描述条件;

📚️4.联合查询

4.1内连接

所谓联合查询就是多表查询,作用于非一个表数据,通过建立笛卡尔集,然后进行筛选得出有效数据,得到最终的表;

例如:

得到的笛卡尔积就是:

但是其中也包括了无效的数据(即红色的×),这就是笛卡尔积,就是每条数据的组合;

SQL执行语句:selecct * from 表名,表名;

小编创建的表如下:

班级表:

学生表:

分数表:

课程表:

那么此时我们要查询许仙同学的成绩:那么就是学生表+成绩表;

1.创建笛卡尔积:
mysql> select * from student,score;

数据过多就不展示了;

2建立链接条件,筛选有效数据:

这里的链接条件就是,两个表的学生id要相同:

mysql> select * from student,score where student.id=score.student_id;

注意:通过where来建立链接条件,这里的id区分是通过表名.id的方式;

3.结合需求,添加条件:

通过需求我们只需要名字为‘许仙’即可:

mysql> select * from student,score where student.id=score.student_id and student.name='许仙';
+------+------+--------+---------------+------------+-------+------------+------------+
| id   | sn   | name   | qq_email      | classes_id | score | student_id | classes_id |
+------+------+--------+---------------+------------+-------+------------+------------+
|    4 |   31 | 许仙   | xuxian@qq.com |          1 |    67 |          4 |          1 |
|    4 |   31 | 许仙   | xuxian@qq.com |          1 |    23 |          4 |          3 |
|    4 |   31 | 许仙   | xuxian@qq.com |          1 |    56 |          4 |          5 |
|    4 |   31 | 许仙   | xuxian@qq.com |          1 |    72 |          4 |          6 |
+------+------+--------+---------------+------------+-------+------------+------------+

此时大体的需求就已经完成了;

4.精简表:

删除不需要的列名,达到表的简化:

mysql> select name,score from student,score where student.id=score.student_id and student.name='许仙';
+--------+-------+
| name   | score |
+--------+-------+
| 许仙   |    67 |
| 许仙   |    23 |
| 许仙   |    56 |
| 许仙   |    72 |
+--------+-------+

此时我们就要通过之前讲过的指定列查询进行简化表的列的数量;

5.笛卡尔积总结:

在两张或以上的表进行操作时,先通过两张表建立笛卡尔积,然后通过特殊条件进行1条件链接,然后通过需求设置条件进行简化;

当然不同的条件对应不同的条件函数,这里的笛卡尔积还可以使用group by来进行分组,和聚合函数来完成特殊的需求。

4.2外连接

当表中的数据一一对应的时候内外连接一致,但是存在不对应的数据的时候就会有区别了:

两个表如下:

mysql> select * from stu;
+------+--------+
| id   | name   |
+------+--------+
|    1 | 张三   |
|    2 | 李四   |
|    3 | 王五   |
+------+--------+
3 rows in set (0.00 sec)

mysql> select * from sco;
+------+-------+
| id   | score |
+------+-------+
|    1 |    44 |
|    2 |    77 |
|    4 |    88 |
+------+-------+

这里的id为4的数据是不对应的; 

在上述的内连接中也可以写作如下:

mysql> select * from stu,sco where stu.id=sco.id;
+------+--------+------+-------+
| id   | name   | id   | score |
+------+--------+------+-------+
|    1 | 张三   |    1 |    44 |
|    2 | 李四   |    2 |    77 |
+------+--------+------+-------+
2 rows in set (0.00 sec)

mysql> select * from stu inner join sco on stu.id=sco.id;
+------+--------+------+-------+
| id   | name   | id   | score |
+------+--------+------+-------+
|    1 | 张三   |    1 |    44 |
|    2 | 李四   |    2 |    77 |
+------+--------+------+-------+

此时两种写法,代表的意思都是一致的;下面的写法是将“逗号改为join,where改为on,并且在join前加入inner(可以省却)”

1.左外连接

SQL执行语句:select * from 表名 left join 表名 on 连接条件;

代码实例如下:

mysql> select * from stu left join sco on stu.id=sco.id;
+------+--------+------+-------+
| id   | name   | id   | score |
+------+--------+------+-------+
|    1 | 张三   |    1 |    44 |
|    2 | 李四   |    2 |    77 |
|    3 | 王五   | NULL |  NULL |
+------+--------+------+-------+

注意:所谓的左外连接就是,将前一个表的所有行展示,在另一个表中没有对应的数据,那么就用NULL来代替;

2.右外连接

SQL执行语句:select * from 表名 right join 表名 on 连接条件;

代码实例如下:

mysql> select * from stu right join sco on stu.id=sco.id;
+------+--------+------+-------+
| id   | name   | id   | score |
+------+--------+------+-------+
|    1 | 张三   |    1 |    44 |
|    2 | 李四   |    2 |    77 |
| NULL | NULL   |    4 |    88 |
+------+--------+------+-------+

注意:所谓的右外连接就是,将后一个表的所有行展示,在另一个表(前一个表)中没有对应的数据,那么就用NULL来代替;

4.3自连接

 所谓的自连接就是自己和自己建立笛卡尔积,主要是通过需求进行自己表之间行和行之间的操作

SQL执行语句:select * from 表名,表名(同一个)

例如通过上述分数表中,查询谋和成绩比另一个成绩高的表时;

建立笛卡尔积:

 select * from score as s1,score as s2

注意:由于分不清哪个score,那么就需要进行别名的操作,否则就会发生报错;

然后合上述一样,建立条件连接,根据需求设置条件简化表;

4.4子查询

 所谓的自查询就是套娃,但是小编不建议这么去编写MySQL数据库;

1.单行子查询

代码实例:

假如我们要查询许仙同学的同班同学:

第一步:找到许仙同学的班级id;

第二部:根据班级id找到其他同学;

mysql> select classes_id from student where name='许仙';
+------------+
| classes_id |
+------------+
|          1 |
+------------+


mysql> select name from student where classes_id=1;
+-----------------+
| name            |
+-----------------+
| 黑旋风李逵      |
| 菩提老祖        |
| 白素贞          |
| 许仙            |
| 不想毕业        |
+-----------------+

那么此时就找到了许仙同学的同班同学;

而子查询实例:

mysql> select name from student where classes_id=(select classes_id from student where name='许仙');

注意:单行子查询就是返回一行数据;这里就是将id=1中的1换成了上述通过许仙查询班级id的过程;

2.多行子查询

查询语文和英文的成绩信息;

返回两个课程id,然后再成绩表中找到对应的成绩信息;

代码如下:

mysql> select id from course where name='语文' or name='英文';
+------+
| id   |
+------+
|    4 |
|    6 |
+------+
2 rows in set (0.00 sec)

mysql> select * from score where score.classes_id in(4,6);

两者结合后就为多行子查询;

mysql> select * from score where score.classes_id in(select id from course where name='语文' or name='英文');

注意:在多行子查询中在嵌套时要用到‘in’这个关键词;

4.5合并查询

所谓合并查询,就是通过union操作符,用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行。

1.在一个表中

SQL执行语句:select * from 表名 where 条件 union select * from 同一个表名where 条件;

代码实例:

mysql> select * from course where id<3 union select * from course where name='英文';
+------+--------------------+
| id   | name               |
+------+--------------------+
|    1 | Java               |
|    2 | 中国传统文化       |
|    6 | 英文               |
+------+--------------------+

 这里表示,取名字是英文或者课程id小于3的数据;

2.在两个表中

SQL执行语句:select * from 表名 union select * from 表名;

代码实例:


mysql> select * from stu union select * from stu2;
+------+--------+
| id   | name   |
+------+--------+
|    1 | 张三   |
|    2 | 李四   |
|    3 | 王五   |
|    4 | 赵六   |
+------+--------+

这里就是两个表的所有数据;

注意:合并查询时,会将两个表相同的数据去重,若不想去重就使用union all操作符;

📚️5.总结

💬💬小编本期讲解了数据库表的增删查改的进阶之查询,包括聚合查询的查询函数,和group by子句和针对两个表之间的联合查询包括内连接,外连接,自连接,子查询,合并查询都做了详细的解说,并且都附上了代码供小伙伴们参考。

🌅🌅🌅~~~~最后希望与诸君共勉,共同进步!!!


                                      💪💪💪以上就是本期内容了, 感兴趣的话,就关注小编吧。

                                                                 😊😊  期待你的关注~~~

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

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

相关文章

SpringBoot父子工程搭建

SpringBoot父子工程搭建 1、父工程 1.1、创建父工程 1.2、移除无用文件 1.3、修改pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XML…

循环节,CF 314B - Sereja and Periods

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 314B - Sereja and Periods 二、解题报告 1、思路分析 如果 b 个 a 中出…

【Python报错已解决】AttributeError: ‘str‘ object has no attribute ‘read‘

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 前言一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一&#xff1a;直接使用字符串2.2 步骤…

DWI扩散磁共振成像和结构连接组学指南

扩散磁共振成像和结构连接组学指南 引言流程概述扩散磁共振成像(dMRI)dMRI基础ADC&#xff08; apparent diffusion coefficient, 表观扩散系数&#xff09;MD&#xff08;mean diffusivity, 平均扩散率&#xff09;FA&#xff08; fractional anisotropy, 分数各向异性&#x…

安装FTP服务器教程

一。安装vsftpd yum install vsftpd 二。修改配置文件&#xff0c;匿名账户具有访问&#xff0c;上传和创建目录的权限 vim /etc/vsftpd/vsftpd.conf &#xff08;红色进行设置放开YES&#xff09; local_enable&#xff1a;本地登陆控制&#xff0c;no表示禁止&#xff0c;ye…

llama网络结构及源码

模型初始化 首先模型初始化&#xff0c;确定模型属性 class LLaMA(nn.Module):def __init__(self, config: LLaMAConfig) -> None:super().__init__()assert config.padded_vocab_size is not Noneself.config configself.lm_head nn.Linear(config.n_embd, config.pad…

5 模拟——59. 螺旋矩阵II ★★

5 模拟 59. 螺旋矩阵II 给你一个正整数n,生成一个包含 1 到 n2所有元素,且元素按顺时针顺序螺旋排列的nn正方形矩阵 matrix 。 示例1: 输入:n = 3 输出:[[1,2,3],[8,9,4],[7,6,5]] 示例2: 输入:n = 1 输出:[[1]] 算法设计 本题与上一题【54. 螺旋矩阵】不同,上一…

1、https的全过程

目录 一、概述二、SSL过程如何获取会话秘钥1、首先认识几个概念&#xff1a;2、没有CA机构的SSL过程&#xff1a;3、没有CA机构下的安全问题4、有CA机构下的SSL过程 一、概述 https是非对称加密和对称加密的过程&#xff0c;首先建立https链接需要经过两轮握手&#xff1a; T…

redis基本数据结构-hash

这里写自定义目录标题 1. redis的数据结构hash1.1 Hash 数据结构的特点1.2 常见命令1.3 适用示例 2. 常见业务场景2.1 用户信息存储2.1.1 场景2.1.2 优势2.1.3 解决方案2.1.4 代码实现 2.2 购物车管理2.2.1 背景2.2.2 优势2.2.3 解决方案2.2.4 代码实现 3. 注意事项&#xff1a…

使用虚拟信用卡WildCard轻松订阅POE:全面解析平台功能与订阅方式

POE&#xff08;Platform of Engagement&#xff09;是一个由Quora推出的人工智能聊天平台&#xff0c;汇集了多个强大的AI聊天机器人&#xff0c;如GPT-4、Claude、Sage等。POE提供了一个简洁、统一的界面&#xff0c;让用户能够便捷地与不同的AI聊天模型进行互动。这种平台的…

Shadertoy和desmos用来快速图像化辅助计算的好工具

Desmos适用场景解直线方程例子 Shadertoy是一个专门通过shader片段利用gpu像素着色的工具。每一帧都会执行显示区域每个像素点的着色。默认片段坐标是左下角(0,0)到右上角(像素分辨率大小)。有网页版&#xff0c;也有vscode插件版。插件版更方便.如果要验证一些图像化的计算。…

MyBatis-Plus分页查询、分组查询

目录 准备工作1. 实体类2. Mapper类3. 分页插件4. 数据 分页查询1. 使用条件构造器2. 使用自定义sql 分组查询1. 分组结果类2. 自定义sql3. 测试类 准备工作 1. 实体类 对地址字段address使用字段类型转换器&#xff0c;将List转为字符串数组保存在数据库中 package com.exa…

(web自动化测试+python)1

一.UI自动化测试介绍 1.测试化理论 UI就是指的是用户接口&#xff0c;指的是用户与电脑的接口&#xff0c;是用户界面 UI不仅仅指的是web&#xff0c;还可以指代app 我们为什么要进行自动化&#xff1f; 大量版本的回归 当新的功能出现&#xff0c;复测之间的--我们叫做回归&am…

《Diffusion Models Without Attention》CVPR2024

摘要 这篇论文探讨了在高保真图像生成领域&#xff0c;去噪扩散概率模型&#xff08;Denoising Diffusion Probabilistic Models, DDPMs&#xff09;的重要性。尽管DDPMs在捕捉复杂视觉分布方面表现出色&#xff0c;但在高分辨率图像生成上面临显著的计算挑战。现有的方法&…

动物目标检测——基于YOLOv5和树莓派4B平台

目标检测在计算机视觉领域中具有重要意义。YOLOv5&#xff08;You Only Look One-level&#xff09;是目标检测算法中的一种代表性方法&#xff0c;以其高效性和准确性备受关注&#xff0c;并且在各种目标检测任务中都表现出卓越的性能。本文将详细介绍如何在性能更强的计算机上…

java实习生第一次被分配需求——完成需求的大概流程

一、分配需求后第一步&#xff0c;首先是把项目跑起来 在我进入公司一两个星期之后&#xff08;基本熟悉了公司的框架&#xff09;&#xff0c;就被我所在的开发小组的某个大哥分派了一个需求&#xff0c;然后他给我发了一个git地址&#xff0c;以及一个git的分支&#xff08;…

知名专家曹启富主任:冠心病低龄化?早预防早受益,守护心脏从日常做起

冠心病&#xff0c;这一曾被视为中老年疾病的代表&#xff0c;如今正悄然向更年轻的人群逼近。冠心病多发生于40岁以上的年龄段&#xff0c;但近年来&#xff0c;其发病低龄化的趋势日益明显&#xff0c;根据数据显示&#xff0c;我国城市人群15岁以及15岁以上的人口&#xff0…

STM32G474之TAMPALRM输出

TAMPALRM输出源是指“RTC唤醒”、“RTC报警A”和“RTC报警B”输出&#xff0c;可以配置从RTC_OU1(PC13)或RTC_OUT2(PB2)输出&#xff0c;而OUT2EN用来决定从哪个引脚输出。 1、TAMPALRM输出原理见下表&#xff1a; 若不看CALIB输出&#xff0c;可以简化如下表&#xff1a; 2、 …

【API Testing and Development with Postman 2nd_001】关于本书

译者按 今天又淘到一本介绍 Postman 的宝藏级小册子&#xff0c;非常适合想进一步了解 API 接口测试的朋友们。本书最大的特点就是手把手教学。想当年第 1 版问世时&#xff0c;初出茅庐的我随便拣了书中一两招&#xff0c;就能轻松搞定工作中五花八门的 API 疑难杂症。只是当时…

监听键盘事件

问题&#xff1a;点击输入框弹出键盘遮挡文字 需求&#xff1a;点击输入框键盘弹起&#xff0c;点击别处键盘回收&#xff0c;输入框回到原来状态&#xff0c; 解决办法&#xff1a; 1.采用占位的思想&#xff08;隐藏&#xff09;&#xff0c;文本框控制采用焦点控制&#…