【MySQL】复合查询 | 内外连接

news2025/2/4 7:44:34

文章目录

  • 一、MySQL复合查询
    • 基本查询回顾
    • 多表查询
    • 自连接
    • 子查询
      • 单行子查询
      • 多行子查询
      • 多列子查询
      • 在from子句中使用子查询
      • 合并查询
  • 二、MySQL内外连接
    • 内连接
    • 外连接
      • 左外连接
      • 右外连接


一、MySQL复合查询

基本查询回顾

准备测试表

下面给出三张表,员工表(emp)、部门表(dept)和工资等级表(salgrade)。

员工表(emp) 包含如下字段:

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

在这里插入图片描述

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

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

在这里插入图片描述

工资等级表(salgrade) 中包含如下字段:

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

在这里插入图片描述


查询工资高于500或岗位为MANAGER的员工,同时要求员工姓名的首字母为大写的J

select ename,sal,job from emp where (sal>500 or ename='MANAGER') and ename like 'J%';

在这里插入图片描述

查询员工信息,按照部门号升序而雇员的工资降序排序

select ename,deptno,sal from emp order by deptno asc,sal desc;

在这里插入图片描述

查询员工信息,按年薪降序显示

select ename,sal*12+ifnull(comm,0) 年薪 from emp order by 年薪 desc;

在这里插入图片描述

注意:

  • 由于NULL与任何值做计算得到的结果都是NULL,因此在计算年薪时不能直接用月薪的12倍加上每个员工的奖金,这样可能导致得到的年薪为NULL值。
  • 在计算每个员工的年薪时,应该通过ifnull函数判断员工的奖金是否为NULL,如果不为NULL则ifnull函数返回员工的奖金,如果为NULL则ifnull函数返回0,避免让NULL值参与计算。

查询工资最高的员工的姓名和岗位

select ename,job from emp where sal=(select max(sal) from emp);

在这里插入图片描述

查询工资高于平均工资的员工信息

select ename,sal from emp where sal > (select avg(sal) from emp);

在这里插入图片描述

查询每个部门的平均工资和最高工资

select deptno,avg(sal) 平均工资,max(sal) 最高工资 from emp group by deptno;

在这里插入图片描述

查询平均工资低于2000的部门和它的平均工资

select deptno,avg(sal) 平均工资 from emp group by deptno having 平均工资<2000;

在这里插入图片描述

查询每种岗位的雇员总数和平均工资

select job,count(*) 雇员总数,avg(sal) 平均工资 from emp group by job;

在这里插入图片描述


多表查询

上面的基础查询都是在一张表的基础上进行的查询,而实际开发中往往需要将多张表关联起来进行查询,这就叫做 多表查询

  • 在进行多表查询时,只需要将多张表的表名依次放到from子句之后,用逗号隔开即可,这时MySQL将会对给定的这多张表取笛卡尔积,作为多表查询的初始数据源。
  • 多表查询的本质,就是对给定的多张表取笛卡尔积,然后在笛卡尔积中进行查询。

所谓的对多张表取笛卡尔积,就是得到这多张表的记录的所有可能有序对组成的集合,比如下面对员工表和部门表进行多表查询,由于查询语句中没有指明筛选条件,因此最终得到的结果便是员工表和部门表的笛卡尔积。

在这里插入图片描述

对部门表和工资等级表取笛卡尔积时,会先从部门表中选出一条记录与工资等级表中的所有记录进行组合,然后再从部门表中选出一条记录与工资等级表中的所有记录进行组合,以此类推,最终得到的就是这两张表的笛卡尔积。

需要注意的是,对多张表取笛卡尔积后得到的数据并不都是有意义的,比如对员工表和部门表取笛卡尔积时,员工表中的每一个员工信息都会和部门表中的每一个部门信息进行组合,而实际一个员工只有和自己所在的部门信息进行组合才是有意义的,因此需要从笛卡尔积中筛选出员工的部门号和部门的编号相等记录。

这里说明一下,当进行笛卡尔积的多张表中可能会存在相同的列名,这时在选中列名时需要通过 表明.列名 的方式进行指明。


显示部门号为10的部门名、员工名和员工工资

select dname,ename,sal from emp,dept where emp.deptno=dept.deptno and emp.deptno=10;

在这里插入图片描述

这里我们需要注意的是,第一个筛选条件已经筛选出员工的部门号和部门编号相同的的记录,因此在筛选部门号等于10的部门时,可以使用员工表中的部门号,也可以使用部门表中的部门编号。

select ename,sal,grade from emp,salgrade where sal between losal and hisal;

在这里插入图片描述

说明一下,员工表和工资等级表的笛卡尔积中,将每一个员工的信息和每一个工资等级的信息都进行了组合,而实际一个员工只有和自己的工资对应的工资等级信息进行组合才是有意义的。因此需要根据各个工资等级的最低工资和最高工资判断一个员工是否属于该工资等级,进而筛选出有意义的记录。


自连接

自连接 是指在同一张表进行连接查询,也就是说我们不仅可以取不同表的笛卡尔积,也可以对同一张表取笛卡尔积。

如果一张表中的某个字段能够将表中的多条记录关联起来,那么就可以通过自连接将表中通过该字段关联的记录组合起来。

显示员工FORD的上级领导的编号和姓名

我们可以使用子查询,先对员工表进行查询得到FORD的领导的编号,然后再根据领导的编号进对员工表进行查询得到FORD领导的姓名。

select empno,ename from emp where empno=(select mgr from emp where ename='FORD');

在这里插入图片描述

当然,解决该问题,也可以使用自连接,因为员工表中的mgr字段可以将表中员工的信息和员工领导的信息关联起来。

对员工表进行自连接后,在where子句中指明筛选条件为员工的领导编号等于领导的编号,这时就能筛选出每个员工信息与其领导信息组合形成的记录,进一步指明筛选条件为员工的姓名为FORD,这时便能筛选出员工FORD的信息和他的领导的信息组成的记录。

mysql> select leader.empno,leader.ename from emp worker,emp leader 
    -> where worker.ename='FORD' and worker.mgr=leader.empno;

在这里插入图片描述

这里说明一下,由于自连接是对同一张表取笛卡尔积,因此在自连接时至少需要给一张表取别名,否则无法区分这两张表中的列。


子查询

子查询 是指嵌入在其他SQL语句中的查询语句,也叫嵌套查询。它可以分为单行子查询、多行子查询、多列子查询,以及在 from子句 中使用的子查询。

单行子查询

单行子查询,是指返回单行单列数据的子查询。

显示SMITH同一部门的员工

在子查询中查询SMITH所在的部门号,在where子句中指明筛选条件为员工部门号等于子查询返回的部门号,并且员工的姓名不为SMITH。

select * from emp where deptno=(select deptno from emp where ename='SMITH') and ename<>'SMITH';

在这里插入图片描述

此问题当然也可以使用自连接来解决,如下:

select t2.* from emp t1,emp t2 where t1.deptno=t2.deptno and t1.ename='SMITH' and t2.ename<>'SMITH';

在这里插入图片描述


多行子查询

多行子查询 ,是指返回多行单列数据的子查询。

显示和10号部门的工作岗位相同的员工的名字、岗位、工资和部门号,但是不包含10号部门的员工。这里主要用到了 IN 关键字

先查询10号部门有哪些工作岗位,然后将上述查询作为子查询,在查询员工表时在where子句中使用in关键字,判断员工的工作岗位是子查询得到的若干岗位中的一个,如果是则符合筛选条件,由于要求筛选出来的员工不包含10号部门的,因此还需要在where子句中指明筛选条件为部门号不等于10。

mysql> select ename,job,sal,deptno from emp 
    -> where job in (select distinct job from emp where deptno=10) and deptno<>10;

在这里插入图片描述

显示工资比30号部门的所有员工的工资高的员工的姓名、工资和部门号,这里主要用到了all关键字

先查询30号部门员工的工资,这里最好对结果进行去重,然后将上述查询作为子查询,在查询员工表时在where子句中使用all关键字,判断员工的工资是否高于子查询得到的所有工资,如果是则符合筛选条件。

mysql> select ename,sal,deptno from emp 
    -> where sal > all(select distinct sal from emp where deptno=30);

在这里插入图片描述

当然这道题也可以使用单行子查询得到30号部门的最高工资,然后判断员工工资是否高于子查询得到的最高工资即可。
在这里插入图片描述

显示工资比30号部门的任意员工的工资高的员工的姓名、工资和部门号,包含30号部门的员工。这里主要用到了 ANY 关键字

mysql> select ename,sal,deptno from emp
    -> where sal > any (select distinct sal from emp where deptno=30);

在这里插入图片描述


多列子查询

多列子查询,是指返回多列数据的子查询。

显示和SMITH的部门和岗位完全相同的员工,不包含SMITH本人

先查询SMITH所在的部门号和他的岗位,然后将上述查询作为子查询,在查询员工表时在where子句中,指明筛选条件为部门号和岗位等于子查询得到的部门号和岗位,并且员工的姓名不为SMITH即可。

mysql> select * from emp 
    -> where (deptno,job)=(select deptno,job from emp where ename='SMITH') and ename<>'SMITH';

在这里插入图片描述

说明一下:

  • 多列子查询得到的结果是多列数据,在比较多列数据时需要将待比较的多个列用圆括号括起来。
  • 多列子查询返回的如果是多行数据,在筛选数据时也可以使用in、all和any关键字。

在from子句中使用子查询

子查询不仅可以出现在 where 子句中,也可以出现在 from 子句中。子查询语句出现from子句中,其查询结果将会被当作一个临时表使用。

显示每个高于自己部门平均工资的员工的姓名、部门、工资和部门的平均工资

先查询每个部门的平均工资,由于显示信息中包含部门的平均工资,需要同时使用员工表和上述的查询结果进行多表查询,这时可以将上述查询作为子查询放在from子句中,然后对员工表和临时表取笛卡尔积,在where子句中指明筛选条件为员工的部门号等于临时表中的部门号,并且员工的工资大于临时表中的平均工资。

mysql> select ename,emp.deptno,sal,平均工资
    -> from emp,(select deptno,avg(sal) 平均工资 from emp group by deptno) tmp
    -> where emp.deptno=tmp.deptno and sal > 平均工资;

在这里插入图片描述

这里我们需要注意的是,在from子句中使用子查询时,必须给子查询得到的临时表取一个别名,否则将会出错。

显示每个部门工资最高的员工的姓名、工资、部门和部门的最高工资

mysql> select ename,sal,emp.deptno,最高工资
    -> from emp,(select deptno,max(sal) 最高工资 from emp group by deptno) tmp
    -> where emp.deptno=tmp.deptno and sal=最高工资;

在这里插入图片描述

显示每个部门的部门名、部门编号、所在地址和人员数量

在group by子句中指明按照部门号进行分组,分别查询每个部门的人员数量。

mysql> select dname,dept.deptno,loc,人员数量
    -> from dept,(select deptno,count(*) 人员数量 from emp group by deptno) tmp
    -> where dept.deptno=tmp.deptno;

在这里插入图片描述


合并查询

合并查询 是指多个查询结果进行合并,可使用的操作符有 unionunion all

  • union 用于取得两个查询结果的并集,union会自动去掉结果集中的重复行
  • union all也用于取得两个查询结果的并集,但union all 不会去掉结果集中的重复行

显示工资大于2500或职位是MANAGER的员工

在合并查询这里,可以使用union操作符将上述的两条查询SQL连接起来,这时将会得到两次查询结果的并集,并且会对合并后的结果进行去重。

mysql> select ename,sal,job from emp where sal>2500
    -> union
    -> select ename,sal,job from emp where job='MANAGER';

在这里插入图片描述

此外,也可以使用 union all 操作符将上述的两条查询SQL连接起来,这是也会得到两次查询结果的并集,但不会对合并后的结果进行去重。如下:

在这里插入图片描述

说明一下:

  • 待合并的两个查询结果的列的数量必须一致,否则无法合并。
  • 待合并的两个查询结果对应的列属性可以不一样,但不建议这样做。

二、MySQL内外连接

在 MySQL 中,表的连接(Table Join) 是指通过共享一个或多个共同的列将两个或多个表中的数据联合起来的操作。这样可以根据关联列的值将数据进行关联,以便在查询结果中获得更全面的信息。表的连接是 SQL 查询中的重要操作之一,它允许我们从多个表中检索相关的数据。表的连接分为内连接和外连接。

内连接

内连接实际上就是利用 where 子句对两种表形成的笛卡儿积进行筛选,我们前面学习的查询都是内连接,也是在开发过程中使用的最多的连接查询。

内连接的SQL如下:

select 字段 from1 inner join2 on 连接条件 and 其他条件;
select 字段 from1 inner join2 on 连接条件 where 其他条件;

显示SMITH的名字和部门名称

给出一张员工表和一张部门表,员工表中的ename表示员工的姓名,deptno代表的是员工所在部门的部门号。如下:

在这里插入图片描述

部门表中的dname代表的是部门名,depno代表的是部门的部门号。如下:

在这里插入图片描述

这里按照复合查询的做法就是,取员工表和部门表的笛卡尔积,在where子句中指明筛选条件为员工的部门号等于部门的部门号,筛选出每个员工匹配的的部门信息,并指明员工姓名为SMITH,筛选出SMITH的信息和其所在的部门的信息。

select ename,dname from emp,dept where emp.deptno=dept.deptno and ename='SMITH';

在这里插入图片描述

实际上述多表查询的方式本质就是内连接,用标准的内连接SQL编写:

  • 将员工表和部门号放在from子句中并通过inner join关键字隔开。
  • 在on子句后指明内连接的条件为员工的部门号等于部门的部门号,保证筛选出来的数据是有意义的。
  • 在and之后指明筛选条件为员工的姓名为SMITH。

这样筛选出来的结果和多表查询筛选出来的结果是一样的,只不过是写法有一些不同而已。

在这里插入图片描述


外连接

左外连接

左外连接 返回左表中的所有行以及右表中与左表匹配的行。如果没有匹配的行,右表的列将显示为 NULL。

select 字段名 from 表名1 left join 表名2 on 连接条件;

先创建两张表,学生表和成绩表。学生表中的name代表的是学生的姓名,id代表的是学生的学号。

-- 建两张表
create table stu (id int, name varchar(30)); -- 学生表
insert into stu values(1,'jack'),(2,'tom'),(3,'kity'),(4,'nono');
create table exam (id int, grade int); -- 成绩表
insert into exam values(1, 56),(2,76),(11, 8);

mysql> select * from stu;
+------+------+
| id   | name |
+------+------+
|    1 | jack |
|    2 | tom  |
|    3 | kity |
|    4 | nono |
+------+------+
4 rows in set (0.00 sec)

mysql> select * from exam;
+------+-------+
| id   | grade |
+------+-------+
|    1 |    56 |
|    2 |    76 |
|   11 |     8 |
+------+-------+
3 rows in set (0.00 sec)

查询所有学生的成绩,就算这个学生没有成绩,也要将学生的个人信息显示出来

如果直接使用内连接将学生表和成绩表连接起来,然后筛选出学生学号等于考试学生学号的记录,那么只能筛选出来有考试成绩的学生信息。

在这里插入图片描述

这时我们可以在连接学生表和成绩表时将学生表放在左侧,那么就可以使用左外连接,这时如果左侧表中的某条记录根据连接条件没有找到匹配的右侧表中的记录,就会直接显示左侧表中的记录信息,而其对应的右侧表中的列信息将会用NULL值进行填充。如下:

select * from stu left join exam on stu.id=exam.id;

在这里插入图片描述


右外连接

右外连接 与左外连接相反,返回右表中的所有行以及左表中与右表匹配的行。如果没有匹配的行,左表的列将显示为 NULL。

select 字段 from 表名1 right join 表名2 on 连接条件;

查询所有的成绩,就算这个成绩没有学生与它对应,也要将学生成绩信息显示出来

select * from stu right join exam on stu.id=exam.id;

在这里插入图片描述

简单案例

列出部门名称和这些部门的员工信息,同时列出没有员工的部门

题目要求同时列出没有员工的部门,也就是部门表当中的内容需要完全被显示出来,如果在连接部门表和员工表时将部门表放在左侧,那么就可以使用左外连接。如下:

select dname,emp.* from dept left join emp on dept.deptno=emp.deptno;

在这里插入图片描述

当然,如果要使用右外连接,那么可以在连接部门表和员工表时将部门表放在右侧。如下:

select dname,emp.* from emp right join dept on dept.deptno=emp.deptno;

在这里插入图片描述


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

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

相关文章

多重断言插件之pytest-assume的简单使用

背景&#xff1a; pytest-assume是Pytest框架的一个扩展&#xff0c;它允许在单个测试用例中多次断言。通常情况下&#xff0c;当一个断言失败时&#xff0c;测试会立即停止执行&#xff0c;而pytest-assume允许我 们继续执行剩余的断言&#xff0c;以便查看更多的失败信息。…

k8s集群通过helm部署skywalking

1、安装helm 下载脚本安装 ~# curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 ~# chmod 700 get_helm.sh ~# ./get_helm.sh或者下载包进行安装 ~# wget https://get.helm.sh/helm-canary-linux-amd64.tar.gz ~# mv helm …

使用 Jekyll 构建你的网站 - 初入门

文章目录 一、Jekyll介绍二、Jekyll安装和启动2.1 配置Ruby环境1&#xff09;Windows2&#xff09;macOS 2.2 安装 Jekyll2.3 构建Jekyll项目2.4 启动 Jekyll 服务 三、Jekyll常用命令四、目录结构4.1 主要目录4.2 其他的约定目录 五、使用GitLink构建Jekyll博客5.1 生成Jekyll…

JAVA:JDK17新特性迈向更强大的编程体验

1、简述 随着技术的不断发展&#xff0c;Java语言也在不断演进&#xff0c;为开发者提供更强大、高效的编程体验。在JDK 17中&#xff0c;我们迎来了一系列引人注目的新特性&#xff0c;这些特性不仅使得Java更现代化&#xff0c;同时也进一步提升了开发效率和代码质量。本文将…

CleanMyMac X2024免费许可证及功能详细讲解

一些用户反映自己的CleanMyMac卸载不干净&#xff1f;你的卸载方式正确码&#xff1f;当你在Mac上安装使用CleanMyMac后&#xff0c;需要将软件卸载&#xff0c;你会使用怎样方法完成操作呢&#xff1f;小编今天主要讲解如何卸载CleanMyMac以及卸载这款软件时应该注意的事项。一…

OpenGL :LearnOpenGL笔记

glfw https://github.com/JoeyDeVries/LearnOpenGL/blob/master/src/1.getting_started/1.1.hello_window/hello_window.cpp #include <glad/glad.h>// 注: GLAD的include文件包含所需的OpenGL头文件(如GL/GL.h) &#xff0c;因此确保在其他需要OpenGL的头文件 (如GLFW…

【SQL经典题目】连续日期判断、同时在线人数、会话划分、间隔日期连续、日期交叉

【1.查询至少连续3天下单的用户】 思路1&#xff08;使用lead&#xff09;&#xff1a; distinct user_id,create_date去重&#xff0c;确保每个用户每天只有一条访问记录lead(create_date,2,‘9999-12-31’) over(partition by user_id order by create_date)根据用户分区&am…

【Unity游戏制作】游戏模型导入之前需要注意的三个基本点

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

使用Dependency Walker和Process Explorer排查瑞芯微工具软件RKPQTool.exe启动报错问题

目录 1、问题说明 2、使用Dependency Walker查看工具程序的库依赖关系 3、在可以运行的电脑上使用Process Explorer查看依赖的msvcr120.dll和msvcp120.dll库的路径 4、C/C运行时库介绍 5、可以下载安装VC_redist.x86.exe或VC_redist.x64.exe解决系统库缺失问题 C软件异常排…

【如何破坏单例模式(详解)】

✅如何破坏单例模式 &#x1f4a1;典型解析✅拓展知识仓✅反射破坏单例✅反序列化破坏单例✅ObjectlnputStream ✅总结✅如何避免单例被破坏✅ 避免反射破坏单例✅ 避免反序列化破坏单例 &#x1f4a1;典型解析 单例模式主要是通过把一个类的构造方法私有化&#xff0c;来避免重…

『JavaScript』全面掌握JavaScript数组的操作、方法与高级技巧

&#x1f4e3;读完这篇文章里你能收获到 学习JavaScript中数组的基本操作掌握JavaScript数组的多种内置方法了解JavaScript中的数组扩展运算符、Array.from()和Array.of()等实用技巧熟悉如何在JavaScript中使用数组方法进行数据处理 文章目录 一、基本操作1. 创建数组2. 访问和…

Python 高级(三):多线程 threading

大家好&#xff0c;我是水滴~~ 在Python中&#xff0c;threading模块提供了一种简单而强大的方式来进行多线程编程。多线程可以同时执行多个任务&#xff0c;使程序能够更有效地利用计算资源。本教程将介绍threading模块的基本概念、用法和一些常见的多线程编程模式。 文章中…

HTML---利用CSS3制作网页动画

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 本章目标 会使用transfoem 2D 变形设置网页元元素会使用transition制作过渡动画会使用animation制作网页动画 一.CSS3概述 CSS3是HTML的样式语言&#xff0c;它用于描述和控制HTML文档的外观和…

Java AQS 核心数据结构-CLH 锁及优化

Java AQS 核心数据结构-CLH 锁 什么是CLH锁 CLH 锁是对自旋锁的一种改进&#xff0c;有效的解决了以上的两个缺点。 第一个是锁饥饿问题。在锁竞争激烈的情况下&#xff0c;可能存在一个线程一直被其他线程”插队“而一直获取不到锁的情况。第二是性能问题。在实际的多处理上…

6.1810: Operating System Engineering 2023 <Lab5: cow: Copy-on-write fork>

一、本节任务 二、要点 2.1 设备驱动&#xff08;device driver&#xff09; memory-mapped I/O&#xff1a;设备拥有一个地址范围&#xff0c;软件可以使用 ld/st 指令来访存从而读写设备的寄存器。平台设计者决定设备在物理内存空间中的位置。 内核如何识别设备中断&#…

K8s出现问题时,如何排查解决!

K8s问题的排查 1. POD启动异常、部分节点无法启动pod2. 审视集群状态3. 追踪事件日志4. 聚焦Pod状态5. 检查网络连通性6. 审视存储配置7. 研究容器日志8. K8S集群网络通信9. 问题&#xff1a;Service 是否通过 DNS 工作&#xff1f;10. 总结1、POD启动异常、部分节点无法启动p…

2024年度AI大模型趋势解读

文章目录 2024年度AI大模型趋势解读写在前面大模型时代大模型未来发展趋势总结 2024年度AI大模型趋势解读 写在前面 大模型指具备超大规模预训练语料、拥有超千亿规模模型参数的深度学习模型。由美国开放人工智能研究中心&#xff08;OpenAI&#xff09;研发、基于大模型的人工…

python 面试题第一弹

1. 如何理解Python中的深浅拷贝 浅拷贝&#xff08;Shallow Copy&#xff09;创建一个新的对象&#xff0c;该对象的内容是原始对象的引用。这意味着新对象与原始对象共享相同的内存地址&#xff0c;因此对于可变对象来说&#xff0c;如果修改了其中一个对象&#xff0c;另一个…

31. Ajax

简介 AJAX 是 Asynchronous JavaScript And XML 的简称。直译为&#xff0c;异步的JS和XML。AJAX的实际意义是&#xff0c;不发生页面跳转、异步载入内容并改写页面内容的技术。AJAX也可以简单的理解为通过JS向服务器发送请求。 AJAX这门技术很早就被发明&#xff0c;但是直到…

Python 新规范 pyproject.toml 完全解析

多谢&#xff1a;thank Python从PEP 518开始引入的使用pyproject.toml管理项目元数据的方案。 该规范目前已经在很多开源项目中得以支持&#xff1a; Django 这个 Python 生态的顶级项目在 5 个月之前开始使用 pyproject.tomlPytest 这个 Python 生态测试框架的领头羊在 4 个…