MySQL数据库基础 === 多表查询

目录

什么是多表查询?

多表查询的基本语法

多表关系

测试数据准备

一对多

多对多

一对一

查询

内连接查询

外连接查询

自连接查询

联合查询 union, union all

子查询

标量子查询

列子查询

行子查询

表子查询

DISTINCT  去重

单列去重

多列去重

注意事项

练习

查询研发部所有的员工信息以及工资等级 三表查询讲解

为什么 AVG(e.salary) 不能直接与 e.* 一起使用?

 查询低于本部门平均工资的员工信息 

总结


什么是多表查询?

在关系型数据库中,数据通常分散在多个表中,而不是存储在单个表中。多表查询是指从一个以上的表中检索数据并将其组合以满足特定需求的操作。通过多表查询,您可以执行以下操作:

  • 检索与多个表关联的数据。
  • 在多个表之间建立关联,以便于数据分析。
  • 聚合和计算多个表中的数据。
  • 更新和删除多个表中的数据。

多表查询通常涉及使用 JOIN 子句将不同的表连接在一起,以创建一个包含所需数据的结果集。

多表查询的基本语法

在 MySQL 中,使用 JOIN 子句来执行多表查询。JOIN 子句用于将两个或多个表中的行组合在一起,以创建一个包含来自这些表的数据的结果集。基本的 JOIN 子句语法如下:

SELECT 列名
FROM 表1
JOIN 表2
ON 表1.列 = 表2.列;

其中:

  • SELECT 语句指定要检索的列。
  • 表1表2 是要连接的表。
  • ON 子句指定连接条件,即哪些列应该匹配以创建连接。

多表关系

  • 一对多(多对一)
  • 多对多
  • 一对一

测试数据准备

员工表  && 部门表

CREATE TABLE dept(id INT PRIMARY KEY AUTO_INCREMENT COMMENT "主键",name  VARCHAR ( 50 ) NOT NULL  COMMENT "年龄"
) COMMENT "部门表"-- 插入数据
INSERT INTO dept(name) VALUES ("研发部"),("市场部"),("财务部"),("销售部"),("总裁办")CREATE TABLE emp (id INT AUTO_INCREMENT COMMENT 'ID' PRIMARY KEY,name VARCHAR ( 50 ) NOT NULL COMMENT '姓名',age INT COMMENT '年龄',job VARCHAR ( 20 ) COMMENT '职位',salary INT COMMENT '薪资',entrydate DATE COMMENT '入职时间',managerid INT COMMENT '直属领导ID',dept_id INT COMMENT '部门ID' ) COMMENT '员工表';
-- 	添加数据INSERT INTO emp (name, age, job, salary, entrydate, managerid, dept_id) VALUES
('金庸', 66, '总裁', 20000, '2000-01-01', NULL, 5),
('张无忌', 20, '项目经理', 12500, '2005-12-05', 1, 1),
('杨逍', 33, '开发', 8400, '2000-11-03', 2, 1),
('韦一笑', 48, '开发', 11000, '2002-02-05', 2, 1),
('常遇春', 43, '开发', 10500, '2004-09-07', 3, 1),
('小昭', 19, '程序员鼓励师', 6600, '2004-10-12', 2, 1);

一对多

案例:部门与员工
关系:一个部门对应多个员工,一个员工对应一个部门
实现:在多的一方建立外键,指向一的一方的主键

多对多

案例:学生与课程
关系:一个学生可以选多门课程,一门课程也可以供多个学生选修
实现:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键

一对一

案例:用户与用户详情
关系:一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另一张表中,以提升操作效率
实现:在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE)

查询

合并查询(笛卡尔积,会展示所有组合结果):
select * from employee, dept;

笛卡尔积:两个集合A集合和B集合的所有组合情况(在多表查询时,需要消除无效的笛卡尔积)

消除无效笛卡尔积:
select * from employee, dept where employee.dept = dept.id;

-- 多表查询 
SELECT * FROM  emp,dept 
-- 隐式内连接
SELECT * FROM emp,dept WHERE emp.dept_id = dept.id 

内连接查询

内连接查询的是两张表交集的部分

隐式内连接:
SELECT 字段列表 FROM 表1, 表2 WHERE 条件 ...;

显式内连接:
SELECT 字段列表 FROM 表1 [ INNER ] JOIN 表2 ON 连接条件 ...;

显式性能比隐式高

-- 查询员工姓名,及关联的部门的名称 
-- 隐式
SELECT e.name,d.name  FROM emp AS e, dept AS d WHERE e.dept_id = d.id
-- 显式
SELECT e.name ,d.name FROM emp AS e INNER JOIN dept AS d  ON e.dept_id = d.id

外连接查询

左外连接:
查询左表所有数据,以及两张表交集部分数据
SELECT 字段列表 FROM 表1 LEFT [ OUTER ] JOIN 表2 ON 条件 ...;
相当于查询表1的所有数据,包含表1和表2交集部分数据

右外连接:
查询右表所有数据,以及两张表交集部分数据
SELECT 字段列表 FROM 表1 RIGHT [ OUTER ] JOIN 表2 ON 条件 ...;

-- 左外连接 (相当于查询表1的所有数据,包含表1和表2交集部分数据) emp的所有数据&&对应的部门
SELECT e.*, d.name FROM emp AS e LEFT OUTER JOIN dept AS d ON e.dept_id=d.id-- 右外连接 (查询右表所有数据,以及两张表交集部分数据)dept的所有数据&&对应员工的名称
SELECT d.*, e.name FROM emp AS e RIGHT OUTER JOIN dept AS d ON e.dept_id=d.id
-- 同样可以达成右外
SELECT d.*, e.name FROM dept AS d LEFT OUTER JOIN emp AS e  ON e.dept_id=d.id

自连接查询

当前表与自身的连接查询,自连接必须使用表别名

语法:
SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件 ...;

自连接查询,可以是内连接查询,也可以是外连接查询

-- 查询员工及其所属领导的名字 (员工的 managerid 等于 领导的id)
SELECT e.name AS emp_name,m.name AS manage_name FROM emp AS e  INNER JOIN emp AS m ON  e.managerid=m.id-- 没有领导的也查询出来
SELECT e.name AS emp_name,m.name AS manage_name FROM emp AS e LEFT OUTER JOIN emp AS m ON e.managerid = m.id

联合查询 union, union all

把多次查询的结果合并,形成一个新的查询集

SELECT 字段列表 FROM 表A ...
UNION [ALL]
SELECT 字段列表 FROM 表B ...

注意事项

  • UNION ALL 会有重复结果,UNION 不会
  • 联合查询比使用or效率高,不会使索引失效
  • 对于联合表查询的多张表的列数必须一致,字段类型也需要一致
-- 将薪资大于 8000 的员工,和年龄大于50岁的员工查出来
SELECT * FROM emp WHERE salary > 8000
UNION ALL
SELECT * FROM emp WHERE age > 50-- 合并之后去重
SELECT * FROM emp WHERE salary > 8000
UNION
SELECT * FROM emp WHERE age > 50

子查询

SQL语句中嵌套SELECT语句,称谓嵌套查询,又称子查询。
SELECT * FROM t1 WHERE column1 = ( SELECT column1 FROM t2);
子查询外部的语句可以是 INSERT / UPDATE / DELETE / SELECT 的任何一个

根据子查询结果可以分为:

  • 标量子查询(子查询结果为单个值)
  • 列子查询(子查询结果为一列)
  • 行子查询(子查询结果为一行)
  • 表子查询(子查询结果为多行多列)

根据子查询位置可分为:

  • WHERE 之后
  • FROM 之后
  • SELECT 之后

标量子查询

子查询返回的结果是单个值(数字、字符串、日期等)。
常用操作符:- < > > >= < <=

-- 查询研发部所有员工
SELECT id FROM dept WHERE name = "研发部"
-- 根据研发部ID,查询员工信息
SELECT * FROM emp WHERE dept_id = 1;
-- 合并
SELECT * FROM emp WHERE dept_id = (SELECT id FROM dept WHERE name = "研发部")
-- 查询 小昭 入职之后的员工信息
SELECT * FROM emp WHERE entrydate > (SELECT entrydate FROM emp WHERE name='小昭')

列子查询

子查询 返回的结果是一列(可以是多行)。

常用操作符:

操作符描述
IN在指定的集合范围内
NOT IN不在指定的集合范围内
ANY子查询返回列表中,有任意一个满足即可
SOME与ANY等同,使用SOME的地方都可以使用ANY
ALL子查询返回列表的所有值都必须满足
-- 查询比研发部所有人工资都高的员工信息
-- 1.查询所有 研发部 工资
SELECT  id  FROM dept WHERE name = '研发部'
SELECT  salary  FROM emp WHERE dept_id = 1
-- 查询比研发部所有人工资都高的员工信息 (比最大的大)
SELECT * FROM emp WHERE salary > all(SELECT  salary  FROM emp WHERE dept_id = (SELECT  id  FROM dept WHERE name = '研发部'))
-- 查询比研发部任意一人工资高的员工信息 (比最小的大)
SELECT * FROM emp WHERE salary > ANY(SELECT  salary  FROM emp WHERE dept_id = (SELECT  id  FROM dept WHERE name = '研发部'))

行子查询

返回的结果是一行(可以是多列)。
常用操作符:=, <, >, IN, NOT IN

INSERT INTO emp (name, age, job, salary, entrydate, managerid, dept_id) VALUES
('小王', 25, '程序员鼓励师', 6600, '2024-10-03', 2, NULL)-- 查询与小王的薪资及直属领导相同的员工信息
SELECT * FROM emp WHERE salary = 6600 AND managerid = 2
-- 等价于上边的写法
select * from emp where (salary,managerid)=(6600,2)SELECT salary, managerid FROM emp WHERE name = "小王"
select * from emp where (salary,managerid)=(SELECT salary, managerid FROM emp WHERE name = "小王")

表子查询

返回的结果是多行多列
常用操作符:IN

-- 查询小王,杨逍的职位和薪资相同的员工
-- 1.查询职位和薪资
SELECT job,salary FROM emp WHERE name="小王" OR name="杨逍"
-- 查询小王,杨逍的职位和薪资相同的员工
SELECT * FROM emp WHERE (job,salary) IN (SELECT job,salary FROM emp WHERE name="小王" OR name="杨逍")
-- 查询入职日期是2005-01-01之后的员工,及其部门信息
-- 1.查询入职日期是2005-01-01之后的员工
SELECT * FROM emp WHERE entrydate > '2005-01-01'
-- 2.查询这部分员工对应的部门信息
SELECT e.*,d.* FROM (SELECT * FROM emp WHERE entrydate > '2005-01-01') AS e LEFT OUTER JOIN dept AS d ON e.dept_id=d.id

查询入职日期是2005-01-01之后的员工 的 查询步骤

  1. 子查询

    • (SELECT * FROM emp WHERE entrydate > '2005-01-01') AS e
    • 这个子查询从员工表 emp 中筛选出入职日期在 2005 年 1 月 1 日之后的所有员工记录,并将结果集别名为 e。这个别名 e 用于后续的连接操作。
  2. 左连接(LEFT JOIN)

    • LEFT JOIN dept AS d ON e.dept_id = d.id
    • 这个连接操作将子查询结果 e 与部门表 dept 进行左连接。连接条件是员工表中的 dept_id 与部门表中的 id 相等。
    • 左连接的特点:左连接会返回左表(子查询结果 e)中的所有记录,即使这些记录在右表(部门表 dept)中没有匹配的记录。对于没有匹配的记录,右表的列值将显示为 NULL
  3. 选择列

    • SELECT e.*, d.*
    • 这个部分表示选择左表(子查询结果 e)和右表(部门表 dept)中的所有列。e.* 表示选择子查询结果中的所有列,d.* 表示选择部门表中的所有列。

DISTINCT  去重

DISTINCT 是 SQL 语句中的一个关键字,用于去除查询结果中的重复行,确保每一行都是唯一的。它通常用于 SELECT 语句中,可以对单个列或多个列进行去重操作。以下是 DISTINCT 的一些常见用法和示例:

单列去重

如果你只想选择某一列的唯一值,可以使用 DISTINCT 关键字。例如,假设有一个员工表 emp,你想查询所有不同的职位:

SELECT DISTINCT job FROM emp;

这条语句会返回员工表中所有不同的职位,每个职位只出现一次,即使表中有多个员工拥有相同的职位。

结果:

job
程序员
产品经理
测试工程师

多列去重

DISTINCT 也可以用于多个列,它会根据这些列的组合值来去除重复行。例如,如果你想查询所有不同的部门和职位组合:

SELECT DISTINCT dept_id, job FROM emp;

结果:

dept_idjob
1程序员
2产品经理
1测试工程师

 

这条语句会返回员工表中所有不同的部门和职位组合,每个组合只出现一次。

注意事项

  1. 性能影响:使用 DISTINCT 会增加查询的复杂度,特别是当数据量较大时。数据库需要对结果进行排序和去重操作,这可能会导致性能下降。如果可能,尽量避免在大数据集上使用 DISTINCT
  2. 索引优化:如果经常需要对某些列进行去重操作,可以考虑在这些列上创建索引,以提高查询效率。
  3. 组合列去重:当使用多个列进行去重时,数据库会根据这些列的组合值来判断是否重复。这意味着即使某些列的值相同,但只要组合值不同,这些行就不会被去重。

练习

准备薪资等级表

CREATE TABLE salgrade ( grade INT, losal INT, hisal INT ) COMMENT '薪资等级表';
INSERT INTO salgrade
VALUES( 1, 0, 3000 );
INSERT INTO salgrade
VALUES( 2, 3001, 5000 );
INSERT INTO salgrade
VALUES( 3, 5001, 8000 );
INSERT INTO salgrade
VALUES( 4, 8001, 10000 );
INSERT INTO salgrade
VALUES( 5, 10001, 15000 );
INSERT INTO salgrade
VALUES( 6, 15001, 20000 );
INSERT INTO salgrade
VALUES( 7, 20001, 25000 );
INSERT INTO salgrade
VALUES( 8, 25001, 30000 );

--  1.查询员工的,姓名 年龄 职位 部门信息,(隐式内连接)
SELECT e.name,e.age,e.job,d.name FROM emp AS e,dept AS d WHERE e.dept_id=d.id 
-- 	2.查询 年龄 小于30岁的员工的姓名,年龄 职位 部门信息,(显式内连接)
SELECT e.name,e.age,e.job,d.name FROM emp AS e INNER JOIN dept AS d ON e.dept_id=d.id  WHERE  e.age<30
-- 	3.查询拥有员工的部门id 部门名称
SELECT DISTINCT d.id,d.name FROM emp AS e INNER JOIN dept AS d ON e.dept_id=d.id
-- 	4.查询所有年龄大于40的员工,及其归属的部门名称,如果员工没有分配部门,也需要展示出来
SELECT e.*,d.name FROM emp AS e LEFT OUTER JOIN dept AS d ON e.dept_id=d.id WHERE e.age>40
-- 	5.查询所有员工的工资等级
SELECT * FROM  emp  AS e INNER JOIN salgrade AS s ON e.salary BETWEEN s.losal AND s.hisal
--  6.查询研发部所有的员工信息以及工资等级
SELECTe.*,s.grade 
FROMemp AS eINNER JOIN dept AS d ON e.dept_id = d.idINNER JOIN salgrade AS s ON e.salary BETWEEN s.losal AND s.hisal 
WHEREd.NAME = "研发部"--  7.查询研发部的平均工资
SELECT AVG(e.salary) FROM emp AS e INNER JOIN dept AS d ON e.dept_id = d.id  WHERE d.name="研发部"--  8 查询比小王工资都高的员工信息 (标量子查询,子查询返回的结果是单个值(数字、字符串、日期等))
SELECT salary FROM emp WHERE name="小王"
SELECT * FROM emp WHERE salary > (SELECT salary FROM emp WHERE name="小王")--  9.查询比平均薪资高的员工信息 (标量子查询)
SELECT AVG(salary) FROM emp
SELECT * FROM emp WHERE salary>(SELECT AVG(salary) FROM emp)-- 10. 查询低于本部门平均工资的员工信息
-- 查询某个部门的平均薪资
SELECT AVG(salary) FROM emp AS e1 WHERE e1.dept_id =1 
SELECT * FROM emp AS e2 WHERE e2.salary < (SELECT AVG(salary) FROM emp AS e1 WHERE e1.dept_id = e2.dept_id )--  11.查询 所有的部门信息,并统计 部门员工人数
SELECT * FROM dept
SELECT COUNT(*) FROM emp WHERE dept_id =1SELECT d.id,d.name,(SELECT COUNT(*) FROM emp AS e WHERE e.dept_id =d.id) AS "人数" FROM dept AS d

查询研发部所有的员工信息以及工资等级 三表查询讲解

  1. 从员工表 emp 中读取数据

    • 读取所有员工记录。
  2. 将员工表 e 与部门表 d 进行内连接

    • 连接条件:e.dept_id = d.id
    • 生成一个临时表,包含员工和部门的信息。
  3. 将临时表与薪资等级表 s 进行内连接

    • 连接条件:e.salary BETWEEN s.losal AND s.hisal
    • 生成一个新的临时表,包含员工、部门和薪资等级的信息。
  4. 应用过滤条件

    • 过滤条件:d.name = "研发部"
    • 从临时表中筛选出部门名称为“研发部”的记录。
  5. 选择最终需要的列

    • 选择员工表 e 中的所有列和薪资等级表 s 中的 grade 列。

为什么 AVG(e.salary) 不能直接与 e.* 一起使用?

当你在 SELECT 子句中同时使用 e.*AVG(e.salary) 时,会出现以下问题:

  1. 数据不一致

    • e.* 会返回每一行员工的详细信息。
    • AVG(e.salary) 会返回所有员工薪资的平均值,这是一个单一的值。
    • 如果不使用 GROUP BY 子句,数据库无法确定如何将这个单一的平均值与每一行员工信息结合起来。
  2. 分组不明确

    • 聚合函数需要明确的分组条件,以确定如何对数据进行汇总。
    • 如果不使用 GROUP BY 子句,数据库不知道如何处理每一行数据,因为每一行数据都是独立的,而聚合函数需要对一组数据进行计算。

 

 查询低于本部门平均工资的员工信息 

查询步骤

  1. 子查询

    • (SELECT AVG(salary) FROM emp AS e1 WHERE e1.dept_id = e2.dept_id)
    • 这个子查询计算每个部门的平均薪资。对于每个员工 e2,它会找到与 e2 同部门的员工 e1,并计算这些员工的平均薪资。
  2. 主查询

    • SELECT * FROM emp AS e2
    • 这个主查询选择员工表 emp 中的所有列,并将结果集别名为 e2
    • WHERE e2.salary < (SELECT AVG(salary) FROM emp AS e1 WHERE e1.dept_id = e2.dept_id)
    • 过滤条件,只选择那些薪资低于其所在部门平均薪资的员工。

执行顺序

  1. 从员工表 emp 中读取数据

    • 读取所有员工记录。
  2. 对每个员工 e2 执行子查询

    • 对于每个员工 e2,找到与 e2 同部门的员工 e1,并计算这些员工的平均薪资。
  3. 应用过滤条件

    • 只选择那些薪资低于其所在部门平均薪资的员工。

总结

一、多表查询基础

  • 基本概念:通过JOIN子句等将多个表连接,创建包含所需数据的结果集。
  • 多表关系类型:包括一对多(多对一)、多对多、一对一三种。

二、多表查询语法及类型

  • 基本语法:SELECT 列名 FROM 表1 JOIN 表2 ON 表1.列 = 表2.列;
  • 合并查询(笛卡尔积):select * from 表1, 表2; 通过添加WHERE条件可消除无效笛卡尔积。
  • 内连接查询
    隐式内连接SELECT 字段列表 FROM 表1, 表2 WHERE 条件 ...;
    显式内连接SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 连接条件 ...;
  • 外连接查询
    左外连接SELECT 字段列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON 条件 ...;
    右外连接SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 条件 ...;
  • 自连接查询:SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件 ...;
  • 联合查询:SELECT 字段列表 FROM 表A ... UNION [ALL] SELECT 字段列表 FROM 表B ...;

三、子查询

  • 定义:SQL语句中嵌套SELECT语句,外部语句可为INSERT/UPDATE/DELETE/SELECT。
  • 分类
    • 标量子查询:返回单个值,常用操作符有=、<、>等。
    • 列子查询:返回一列,常用操作符有IN、NOT IN、ANY、SOME、ALL。
    • 行子查询:返回一行,常用操作符有=、<、>、IN、NOT IN。
    • 表子查询:返回多行多列,常用操作符有IN。

四、DISTINCT去重

  • 作用:去除查询结果中的重复行,确保每一行唯一。
  • 用法:可对单个列或多列进行去重操作,但使用时需注意性能影响,尽量避免在大数据集上使用。

五、练习案例

  • 涉及内连接、外连接、子查询等多种多表查询方式的应用,如查询员工信息及部门信息、查询特定条件的员工及其部门信息、查询员工工资等级、查询部门平均工资

 

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

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

相关文章

Jenkins触发器--在其他项目执行后构建

前言&#xff1a; jenkins中有多种触发器可用&#xff0c;可以方便的控制构建的启动 这里简单介绍下项目后构建的配置方法 1. 解释&#xff1a; Build after other projects are built Set up a trigger so that when some other projects finish building, a new build is…

瑞友天翼(GWT System) GetPwdPolicy Sql注入漏洞复现(附脚本)

免责申明: 本文所描述的漏洞及其复现步骤仅供网络安全研究与教育目的使用。任何人不得将本文提供的信息用于非法目的或未经授权的系统测试。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。 0x01 产品描述: ‌

4、蓝牙打印机-定时器驱动

蓝牙打印机实现打印内容&#xff0c;需要先通过定时器发送固定的节拍驱动步进电机转动&#xff0c;从而驱动打印头打印相应的内容。 因此想要实现打印&#xff0c;先要实现定时器功能。 本例采用通用定时器2完成发送节拍功能。 1、硬件 定时器总线 由上图知道TIM2是挂载在A…

安装 Jenkins 后无法访问用户名或密码且忘记这些凭证怎么办?

Jenkins 是一款功能强大的自动化服务器&#xff0c;在持续集成与交付&#xff08;CI/CD&#xff09;领域应用广泛。不过&#xff0c;用户在使用过程中&#xff0c;尤其是首次接触该系统或系统重启后&#xff0c;常常会遇到登录方面的问题。要是 Jenkins 突然要求输入用户名和密…

(纯小白教程)Mac OS中安装配置Anaconda及常用conda命令回顾

本教程介绍了如何在Mac OS系统中下载、安装、配置 Anaconda3&#xff0c;并介绍了换源的方法&#xff0c;最后介绍了常用的conda命令。本教程适用于苹果系统&#xff0c;如需要在Windows系统或者Liunx系统中安装Anaconda3&#xff0c;可移步至主页的其他博客。 &#xff08;纯…

JVM面试相关

JVM组成 什么是程序计数器 详细介绍Java堆 什么是虚拟机栈 能不能解释一下方法区&#xff1f; 直接内存相关 类加载器 什么是类加载器&#xff0c;类加载器有哪些 什么是双亲委派模型 类加载过程 垃圾回收 对象什么时候可以被垃圾回收器回收 JVM垃圾回收算法有那些 JVM的分代…

zookeeper shell操作和zookeeper 典型应用(配置中心、集群选举服务、分布式锁)

文章目录 引言I zookeeper客户端命令查看子节点 ls创建子节点 create获取节点信息 get更新节点数据 set删除节点 delete\ rmrII 监听机制node1:设置监听node3:修改监听节点node1:得到监听反馈III zookeeper 典型应用分布式锁集群选举服务数据发布/订阅(配置中心)引言 zk 的…

Netty 入门学习

前言 学习Spark源码绕不开通信&#xff0c;Spark通信是基于Netty实现的&#xff0c;所以先简单学习总结一下Netty。 Spark 通信历史 最开始: Akka Spark 1.3&#xff1a; 开始引入Netty&#xff0c;为了解决大块数据&#xff08;如Shuffle&#xff09;的传输问题 Spark 1.6&…

Microsoft Sql Server 2019 数据类型

数据类型 bigint、int、smallint、tinyint 使用整数数据的精确数字数据类型。 若要节省数据库空间,请使用能够可靠包含所有可能值的最小数 据类型。 例如,对于一个人的年龄,tinyint 就足够了,因为没人活到 255 岁以上。 但对于建筑物的 年龄,tinyint 就不再适应,因为建…

爬虫学习心得

爬虫学习心得 下面给新学者分享一些爬虫的技巧1 xpath的学习a xpath的基本用法b xpath案例 2.正则表达式学习a 基本使用b 12306提取省份成json格式 3.Bs的学习3.1基础3.3基础案例3.5基本案例 4.拿取数据技巧4.1通过标签获取4.2通过lamda表达式获取数据 下面给新学者分享一些爬虫…

[笔记] 使用 Jenkins 实现 CI/CD :从 GitLab 拉取 Java 项目并部署至 Windows Server

随着软件开发节奏的加快&#xff0c;持续集成&#xff08;CI&#xff09;和持续部署&#xff08;CD&#xff09;已经成为确保软件质量和加速产品发布的不可或缺的部分。Jenkins作为一款广泛使用的开源自动化服务器&#xff0c;为开发者提供了一个强大的平台来实施这些实践。然而…

qt QPainter setViewport setWindow viewport window

使用qt版本5.15.2 引入viewport和window目的是用于实现QPainter画出来的内容随着窗体伸缩与不伸缩两种情况&#xff0c;以及让QPainter在widget上指定的区域(viewport)进行绘制/渲染&#xff08;分别对应下方demo1&#xff0c;demo2&#xff0c;demo3&#xff09;。 setViewpo…

likeshop同城跑腿系统likeshop回收租赁系统likeshop多商户商城安装及小程序对接方法

前言&#xff1a;首先likeshop是一个开发平台&#xff0c;是一个独创的平台就像TP内核平台一样&#xff0c;你可以在这个平台上开发和衍生出很多伟大的产品&#xff0c;以likeshop为例&#xff0c;他们开发出商城系统&#xff0c;团购系统&#xff0c;外卖点餐系统&#xff0c;…

C# 与 Windows API 交互的“秘密武器”:结构体和联合体

一、引言 在 C# 的编程世界里&#xff0c;当我们想要深入挖掘 Windows 系统的底层功能&#xff0c;与 Windows API 打交道时&#xff0c;结构体和联合体就像是两把神奇的钥匙&#x1f511; 它们能够帮助我们精准地操控数据&#xff0c;实现一些高级且强大的功能。就好比搭建一…

C++实现设计模式---状态模式 (State)

状态模式 (State) 状态模式 是一种行为型设计模式&#xff0c;它允许对象在运行时根据内部状态的改变来动态改变其行为。通过将状态相关的行为封装到独立的类中&#xff0c;状态模式使得状态的切换更加清晰和灵活。 意图 将对象的行为和状态分离&#xff0c;随着状态的改变动…

202312 青少年软件编程等级考试C/C++ 一级真题答案及解析(电子学会)

第 1 题 数的输入和输出 输入一个整数和双精度浮点数,先将浮点数保留2位小数输出,然后输出整数。 时间限制:1000 内存限制:65536 输入 一行两个数,分别为整数N(不超过整型范围),双精度浮点数F,以一个空格分开。 输出 一行两个数,分别为保留2位小数输出的F,以…

信息系统项目管理-采购管理-采购清单示例

序号类别产品/服务名称规格/功能描述数量备注1硬件服务器高性能处理器&#xff0c;大容量存储10HP、DELL2网络设备高速路由器和交换机10华为3工作站多核处理器&#xff0c;高分辨率显示器25国产设备4移动检查设备手持式移动检查仪&#xff0c;可连接云平台30国产设备5打印机和扫…

继续以“实用”指导Pythonic编码(re通配表达式)(2024年终总结②)

弃现成工具手剥任务&#x1f9d0;&#xff0c;我哈哈滴就像笨笨的傻大个儿&#x1f60b;。 (笔记模板由python脚本于2025年01月12日 23:29:33创建&#xff0c;本篇笔记适合熟悉正则表达式的coder翻阅) 【学习的细节是欢悦的历程】 Python官网&#xff1a;https://www.python.or…

Mysql学习笔记之函数

1.简介 SQL提供了很多函数&#xff0c;便于在查询时能够快速的进行计算或者计数等操作&#xff0c;下文介绍一些实际场景中常用的函数。 2.字符串函数 常用的字符串函数如下表所示&#xff1a; 函数名描述LENGTH(str)返回字符串的长度&#xff0c;以字节为单位。例如LENGTH…

pytest 参数介绍

命令行参数描述常见使用案例-v / --verbose显示每个测试用例的详细信息&#xff0c;包括测试名称和状态pytest -v-s / --captureno禁用输出捕获&#xff0c;允许 print() 输出显示pytest -s-q / --quiet安静模式&#xff0c;减少输出&#xff0c;仅显示每个测试的通过/失败结果…