PostgreSQL-02-入门篇-查询数据

news2024/12/23 19:06:44

文章目录

      • 1 简单查询
        • SELECT 语句简介
        • SELECT 语句语法
        • SELECT 示例
          • 1) 使用 SELECT 语句查询一列数据的示例
          • 2) 使用 SELECT 语句查询多列数据的示例
          • 3) 使用 SELECT 语句查询表所有列数据的示例
          • 4) 使用带有表达式的 SELECT 语句的示例
          • 5) 使用带有表达式的 SELECT 语句的示例
      • 2 列别名
        • 列别名简介
        • 列别名示例
          • 1) 为列分配列别名的示例
          • 2) 为表达式分配列别名的示例
          • 3) 包含空格的列别名
        • 概括
      • 3 排序
        • 排序简介
        • ORDER BY 示例
          • 1) 使用 ORDER BY 子句按一列对行进行排序
          • 2) 使用 ORDER BY 子句按一列对行进行降序排序
          • 3) 使用 ORDER BY 子句按多列对行进行排序
          • 4) 使用 ORDER BY 子句按表达式对行进行排序
        • ORDER BY 子句和 NULL
        • 概括
      • 4 去重查询
        • 去重简介
        • SELECT DISTINCT 示例
          • DISTINCT 单列示例
          • DISTINCT 多列示例
          • DISTINCT ON 示例
      • 5 分页查询
        • 背景
        • 键集分页
        • 示例
        • 总结

1 简单查询

SELECT 语句简介

使用数据库时最常见的任务之一是使用SELECT语句从表中查询数据。

SELECT语句是 PostgreSQL 中最复杂的语句之一。它有许多子句,您可以使用它们来形成灵活的查询。

由于其复杂性,我们将其分解为许多简短且易于理解的教程,以便您可以更快地了解每个子句。

SELECT语句有以下子句:

  • 使用DISTINCT运算符选择不同的行。
  • 使用ORDER BY子句对行进行排序。
  • 使用WHERE子句过滤行。
  • 使用LIMITFETCH子句从表中选择行的子集。
  • 使用GROUP BY子句将行分组。
  • 使用HAVING子句过滤分组。
  • 使用INNER JOIN, LEFT JOIN, FULL OUTER JOIN, CROSS JOIN等连接子句与其他表连接。
  • 使用UNIONINTERSECTEXCEPT执行集合运算。
SELECT 语句语法

让我们从从单个表中检索数据的SELECT语句的基本形式开始。

下面说明了SELECT语句的语法:


SELECT
   select_list
FROM
   table_name;

让我们更详细地观察该SELECT语句:

  • 首先,指定一个选择列表,该列表可以是要从中检索数据的表中的一列或多列的列表。如果指定多列列表,则需要在两列之间放置逗号 (,) 来分隔它们。如果要从表的所有列中检索数据,可以使用星号 (*) 简写,而不用指定所有列名。选择列表还可以包含表达式或文字值。
  • 其次,在FROM关键字后指定要从中查询数据的表的名称。

其中FROM子句是可选的。如果不从任何表查询数据,则可以在SELECT语句中省略FROM子句。

PostgreSQL 在SELECT语句中SELECT列表子句之前计算FROM子句:

在这里插入图片描述

请注意,SQL 关键字不区分大小写。这意味着SELECT等价于selectSelect。按照惯例,我们将以大写方式使用所有 SQL 关键字,以使查询更易于阅读。

SELECT 示例

让我们看一下使用 PostgreSQL 的SELECT语句的一些示例。

在这里插入图片描述

1) 使用 SELECT 语句查询一列数据的示例

此示例使用以下SELECT语句从customer表中查找所有客户的名字:

SELECT first_name FROM customer;

请注意,我们在SELECT语句末尾添加了一个分号 (;)。分号不是 SQL 语句的一部分。它用于向 PostgreSQL 发出 SQL 语句结束的标记。分号还用于分隔两个 SQL 语句。

2) 使用 SELECT 语句查询多列数据的示例

假设您只想知道客户的名字、姓氏和电子邮件,您可以在SELECT列表子句中指定这些列名称,如以下查询所示:

SELECT
   first_name,
   last_name,
   email
FROM
   customer;
3) 使用 SELECT 语句查询表所有列数据的示例

以下查询使用SELECT语句从customer表的所有列中检索数据:

SELECT * FROM customer;

在此示例中,我们在SELECT列表子句中使用了星号 (*),它是所有列的简写。我们没有在SELECT子句中列出所有列,而是使用星号 (*) 来简化查询语句。

但是,当您在python、java、Node.js 或 PHP 等应用程序代码中嵌入 SQL 语句时,在SELECT语句中使用星号 (*) 并不是一个好的做法,原因如下:

  1. 数据库性能。假设您有一个包含许多列和大量数据的表,带有星号 (*) 简写的SELECT语句将从表的所有列中选择数据,这对于应用程序来说可能不是必需的。
  2. 应用性能。从数据库中检索不必要的数据会增加数据库服务器和应用程序服务器之间的流量。因此,您的应用程序可能响应速度较慢且可扩展性较差。

由于这些原因,只要有可能,最好在SELECT列表子句中显式指定列名,以便仅从数据库获取必要的数据。

对于检查数据库数据的临时查询,您可以使用星号 (*) 简写。

4) 使用带有表达式的 SELECT 语句的示例

以下示例使用SELECT语句返回所有客户的全名和电子邮件:

SELECT 
   first_name || ' ' || last_name,
   email
FROM 
   customer;

输出:

在这里插入图片描述

在此示例中,我们使用串联运算符 ||来串联每个客户的名字、空格和姓氏。

5) 使用带有表达式的 SELECT 语句的示例

以下示例使用带有表达式的SELECT语句。它省略了FROM子句:

SELECT 5 * 3;

2 列别名

列别名简介

列别名允许您为SELECT语句的查询列表中的列或表达式分配临时名称。列别名只在查询执行期间临时性的存在。

下面说明了使用列别名的语法:

SELECT column_name AS alias_name
FROM table_name;

在此语法中,column_name被分配了一个别名alias_name。其中AS关键字是可选的,因此您可以像这样省略它:

SELECT column_name alias_name
FROM table_name;

以下语法说明了如何为SELECT子句中的表达式设置别名:

SELECT expression AS alias_name
FROM table_name;

列别名的主要目的是使查询输出的标题更有意义。

列别名示例
1) 为列分配列别名的示例

以下查询返回customer表中所有客户的名字和姓氏:

SELECT 
   first_name, 
   last_name
FROM customer;

如果要重命名last_name标题,可以使用列别名为其指定一个新名称,如下所示:

SELECT 
   first_name, 
   last_name AS surname
FROM customer;

此查询将surname指定为last_name列的别名:

或者您可以通过删除AS关键字来缩短它,如下所示:

SELECT 
   first_name, 
   last_name surname
FROM customer;
2) 为表达式分配列别名的示例

以下查询返回所有客户的全名。它通过连接名字、空格和姓氏来构造全名:

SELECT 
   first_name || ' ' || last_name 
FROM 
   customer;

请注意,在 PostgreSQL 中,您使用||用作连接运算符,将一个或多个字符串连接成一个字符串。

从输出中可以清楚地看到,该列的标题?column?没有意义。

要解决此问题,您可以为表达式first_name || ' ' || last_name分配一个列别名,例如full_name

SELECT
    first_name || ' ' || last_name AS full_name
FROM
    customer;
3) 包含空格的列别名

如果列别名包含一个或多个空格,则需要用双引号将其引起来,如下所示:

column_name AS "column alias"

例如:

SELECT
    first_name || ' ' || last_name "full name"
FROM
    customer;

在这里插入图片描述

概括
  • 使用语法column_name AS alias_name为列分配列别名,或使用expression AS alias_name为表达式分配列别名。

  • 关键字AS是可选的。

  • 使用双引号 (") 括住包含空格的列别名。

3 排序

排序简介

当您从表中查询数据时,SELECT语句以未指定的顺序返回行。要对结果集的行进行排序,请在SELECT语句中使用ORDER BY子句。

ORDER BY子句允许您根据排序表达式按升序或降序对SELECT语句返回的行进行排序。

下面说明了ORDER BY子句的语法:

SELECT
select_list
FROM
table_name
ORDER BY
sort_expression1 [ASC | DESC],
        ...
sort_expressionN [ASC | DESC];

在这个语法中:

  • 首先,指定一个排序表达式,可以是要在ORDER BY关键字之后排序的列或表达式。如果要根据多个列或表达式对结果集进行排序,则需要在两个列或表达式之间放置逗号 (,) 来分隔它们。
  • 其次,您可以使用ASC选项对行进行升序排序,以及DESC选项对行进行降序排序。如果省略ASCDESC选项,则ORDER BY默认使用ASC

PostgreSQL 按以下顺序执行SELECT语句中的子句: FROMSELECTORDER BY

按照执行的顺序,如果SELECT语句中有列别名,则可以在ORDER BY子句中使用它。

让我们看一些使用 PostgreSQL 的ORDER BY子句的示例。

ORDER BY 示例
1) 使用 ORDER BY 子句按一列对行进行排序

以下查询使用ORDER BY子句按客户的名字对客户进行升序排序:

SELECT
first_name,
last_name
FROM
customer
ORDER BY
first_name ASC;

由于ASC选项是默认选项,因此您可以在ORDER BY子句中省略它,如下所示:

SELECT
first_name,
last_name
FROM
customer
ORDER BY
first_name;
2) 使用 ORDER BY 子句按一列对行进行降序排序

以下语句从customer表中查询名字和姓氏,并按姓氏列中的值对行进行降序排序:

SELECT
       first_name,
       last_name
FROM
       customer
ORDER BY
       last_name DESC;
3) 使用 ORDER BY 子句按多列对行进行排序

以下语句从客户表中查询名字和姓氏,并按名字升序和姓氏降序对行进行排序:

SELECT
first_name,
last_name
FROM
customer
ORDER BY
first_name ASC,
last_name DESC;

在此示例中,ORDER BY 子句首先按名字列中的值对行进行排序。然后它按姓氏列中的值对已排序的行进行排序。

从输出中可以清楚地看到,两个具有相同名字Kelly的客户的按姓氏降序排列。

4) 使用 ORDER BY 子句按表达式对行进行排序

LENGTH()函数接受一个字符串并返回该字符串的长度。

以下语句查询名字及其长度。它按名字的长度对行进行排序:

SELECT 
first_name,
LENGTH(first_name) len
FROM
customer
ORDER BY 
len DESC;

在这里插入图片描述

由于ORDER BY子句是在SELECT列表之后求值的,因此列别名len可用并且可以在ORDER BY子句中使用。

ORDER BY 子句和 NULL

在数据库世界中,NULL是一个标记,指示丢失的数据或数据在记录时未知。

对包含NULL的行进行排序时,可以使用ORDER BY子句的NULLS FIRSTNULLS LAST选项,指定NULL与其他非空值的顺序:

ORDER BY sort_expresssion [ASC | DESC] [NULLS FIRST | NULLS LAST]

NULLS FIRST选项将NULL放置在其他非空值之前,NULL LAST选项将NULL放置在其他非空值之后。

让我们创建一个表来进行演示。

-- create a new table
CREATE TABLE sort_demo(
num INT
);

-- insert some data
INSERT INTO sort_demo(num)
VALUES(1),(2),(3),(null);

以下查询返回sort_demo表中的数据:

SELECT num
FROM sort_demo
ORDER BY num;

在这里插入图片描述

在此示例中,ORDER BY子句按升序对sort_demo表的num列中的值进行排序。它将NULL置于其他值之后。

因此,如果您使用ASC选项,ORDER BY子句默认使用NULLS LAST选项。因此,以下查询返回相同的结果:

SELECT num
FROM sort_demo
ORDER BY num NULLS LAST;

要放置NULL在其他非空值之前,可以使用NULLS FIRST选项:

SELECT num
FROM sort_demo
ORDER BY num NULLS FIRST;

在这里插入图片描述

以下语句对sort_demo表的num列中的值进行降序排序:

SELECT num
FROM sort_demo
ORDER BY num DESC;

在这里插入图片描述

从输出中可以清楚地看到,带有DESC选项的ORDER BY子句默认使用NULLS FIRST

要反转顺序,您可以使用NULLS LAST选项:

SELECT num
FROM sort_demo
ORDER BY num DESC NULLS LAST;

在这里插入图片描述

概括
  • 使用SELECT语句中的ORDER BY子句对行进行排序。

  • 使用ASC选项对行进行升序排序和DESC选项对行进行降序排序。ORDER BY子句默认使用ASC选项。

  • 使用NULLS FIRSTNULLS LAST选项显式指定NULL与其他非空值的顺序。

4 去重查询

去重简介

DISTINCT子句在SELECT语句中用于从结果集中删除重复行。DISTINCT子句为每组重复项保留一行。DISTINCT子句可以应用于SELECT语句的选择列表中的一列或多列。

下面说明了DISTINCT子句的语法:

SELECT
   DISTINCT column1
FROM
   table_name;

在此语句中,column1列中的值用于计算重复项。

如果指定多个列,DISTINCT子句将根据这些列值的组合计算重复项。

SELECT
   DISTINCT column1, column2
FROM
   table_name;

在这种情况下,column1column2列中的值的组合将用于计算重复项。

PostgreSQL 还提供了DISTINCT ON (expression)来保留每组重复项的第一行的功能,使用以下语法:

SELECT
   DISTINCT ON (column1) column_alias,
   column2
FROM
   table_name
ORDER BY
   column1,
   column2;

SELECT语句返回的行的顺序是未指定的,因此每组重复项的第一行也是未指定的。

最好始终使用带有DISTINCT ON(expression)的ORDER BY子句,以使结果集可预测。

请注意,DISTINCT ON表达式必须与ORDER BY子句中最左边的表达式匹配。

SELECT DISTINCT 示例

让我们创建一个新表,名为distinct_demo,并向其中插入数据来练习DISTINCT子句。

CREATE TABLE distinct_demo (
id serial NOT NULL PRIMARY KEY,
bcolor VARCHAR,
fcolor VARCHAR
);

INSERT INTO distinct_demo (bcolor, fcolor)
VALUES
('red', 'red'),
('red', 'red'),
('red', NULL),
(NULL, 'red'),
('red', 'green'),
('red', 'blue'),
('green', 'red'),
('green', 'blue'),
('green', 'green'),
('blue', 'red'),
('blue', 'green'),
('blue', 'blue');

SELECT
id,
bcolor,
fcolor
FROM
distinct_demo ;
DISTINCT 单列示例
SELECT
DISTINCT bcolor
FROM
distinct_demo
ORDER BY
bcolor;
DISTINCT 多列示例

以下语句演示了如何在多个列上使用DISTINCT子句:

SELECT
DISTINCT bcolor,
fcolor
FROM
distinct_demo
ORDER BY
bcolor,
fcolor;

因为我们在SELECT DISTINCT 子句中指定了bcolorfcolor列,所以 PostgreSQL 组合了bcolorfcolor列中的值来计算行的唯一性。

该查询返回distinct_demo表中bcolorfcolor的唯一组合。请注意,distinct_demo表有两行,并且bcolorfcolor列中都有red值 。当我们将DISTINCT应用于两列时,一行被从结果集中删除,因为它是重复的。

DISTINCT ON 示例

以下语句按bcolorfcolor对结果集进行排序,然后对于每组重复项,它保留返回结果集中的第一行。

SELECT
DISTINCT ON (bcolor) bcolor,
fcolor
FROM
distinct_demo 
ORDER BY
bcolor,
fcolor;

5 分页查询

背景

在分页查询中,传统的做法是使用 LIMITOFFSET 来获取特定页的数据。例如,要获取第一页的数据,可以使用以下 SQL 语句:

SELECT * FROM transactions
ORDER BY created_at DESC
LIMIT 10 OFFSET 0;

对于第二页,可以使用:

SELECT * FROM transactions
ORDER BY created_at DESC
LIMIT 10 OFFSET 10;

这种方式的问题在于,随着偏移量(OFFSET)的增加,查询性能会逐渐下降。这是因为 PostgreSQL 必须扫描并跳过前面的所有行才能到达所需的行,这对于大数据集来说是非常低效的。

键集分页

为了解决这个问题,我们可以采用键集分页的方法。键集分页是基于排序键的值来定位数据,而不是基于偏移量。这种方法可以快速定位到数据集中的特定位置,只需要知道上一页的最后一个元素的排序键即可。

键集分页的核心思想是使用排序键来确定查询的起始点。通常我们会使用一个或多个列作为排序键,其中至少有一个列是唯一的,比如主键。

示例

假设我们有一个名为 transactions 的表,其中包含交易记录,我们希望按照 created_at 列降序排序,并且使用主键 id 作为唯一键来保证排序的稳定性。

要获取当前页面的数据和下一页的游标,我们可以使用以下 SQL 语句:

WITH cursor AS (
    SELECT created_at, id FROM transactions
    WHERE id = ? -- 这里的 '?' 是占位符,表示上一页最后一个元素的 id
    ORDER BY created_at DESC, id DESC
    LIMIT 1
),

current_page_and_next_cursor AS (
    SELECT *
    FROM transactions
    WHERE (created_at, id) >= (SELECT * FROM cursor)
    ORDER BY created_at DESC, id DESC
    LIMIT 10 -- 假设每页显示 10 条记录
)

SELECT * FROM current_page_and_next_cursor;

这里,cursor CTE 用来定位上一页的最后一个元素。current_page_and_next_cursor CTE 用来获取当前页面的数据和下一个游标的值。我们使用 >= 来确保从上一页的最后一个元素开始获取数据。

为了获取上一页的游标,我们可以使用类似的逻辑:

WITH cursor AS (
    SELECT created_at, id FROM transactions
    WHERE id = ? -- 这里的 '?' 是占位符,表示上一页最后一个元素的 id
    ORDER BY created_at DESC, id DESC
    LIMIT 1
),

previous_cursor AS (
    SELECT *
    FROM transactions
    WHERE (created_at, id) < (SELECT * FROM cursor)
    ORDER BY created_at DESC, id DESC
    LIMIT 10 -- 假设每页显示 10 条记录
)

SELECT * FROM previous_cursor;

这里,previous_cursor CTE 用来获取上一页的游标,我们使用 < 来确保从上一页的最后一个元素之前获取数据。

最后,我们可以将这些 CTE 结合起来,以一次性获取当前页、下一页游标和上一页游标:

WITH cursor AS (
    SELECT created_at, id FROM transactions
    WHERE id = ? -- 这里的 '?' 是占位符,表示上一页最后一个元素的 id
    ORDER BY created_at DESC, id DESC
    LIMIT 1
),

current_page_and_next_cursor AS (
    SELECT *
    FROM transactions
    WHERE (created_at, id) >= (SELECT * FROM cursor)
    ORDER BY created_at DESC, id DESC
    LIMIT 11 -- 包含当前页和下一页游标
),

previous_cursor AS (
    SELECT *
    FROM transactions
    WHERE (created_at, id) < (SELECT * FROM cursor)
    ORDER BY created_at DESC, id DESC
    LIMIT 1 -- 只获取上一页游标
)

SELECT * FROM previous_cursor
UNION ALL
SELECT * FROM current_page_and_next_cursor
LIMIT 10 -- 当前页
UNION ALL
SELECT * FROM current_page_and_next_cursor
OFFSET 10 LIMIT 1 -- 下一页游标
ORDER BY created_at DESC, id DESC;

这个查询首先获取上一页的游标,然后获取当前页的数据,最后获取下一页的游标。注意,这里使用了 UNION ALL 来合并结果,并使用 LIMITOFFSET 来选择特定的行。

总结

键集分页是一种高效的分页方法,它使用排序键来定位数据,而不是使用偏移量。这种方法可以避免随着偏移量增加而导致的性能下降问题。虽然键集分页不支持随机访问,但它在大多数应用场景中提供了更好的性能和一致性。

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

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

相关文章

大公报发表欧科云链署名文章:发行港元稳定币,建Web3.0新生态

欧科云链研究院资深研究员蒋照生近日与香港科技大学副校长兼香港Web3.0协会首席科学顾问汪扬、零壹智库创始人兼CEO柏亮&#xff0c;在大公报发布联合署名文章 ——《Web3.0洞察 / 发行港元稳定币&#xff0c;建Web3.0新生态》&#xff0c;引发市场广泛讨论。 文章就香港稳定币…

江科大/江协科技 STM32学习笔记P24

文章目录 DMA数据转运验证存储器映像的内容什么时候需要定义常量 验证外设寄存器的地址理解ADC1->DR main.c初始化DMADMA库函数MyDMA.cmain.c DMAAD多通道AD.cmain.c DMA数据转运 验证存储器映像的内容 #include "stm32f10x.h" // Device heade…

视频号分销系统搭建教程,源代码+部署上线指南

目录 一、视频号分销是什么&#xff1f; 二、视频号分销系统怎么搭建&#xff1f; 1.系统架构设计 2.部署与上线 3.持续迭代与升级 三、部分代码展示 一、视频号分销是什么&#xff1f; 视频号分销系统是合集了视频号商家的产品&#xff0c;推广达人推广商家的产品可赚取…

【算法 04】汉诺塔递归求解和通式求解

汉诺塔问题&#xff1a;一个经典的递归问题 汉诺塔&#xff08;Tower of Hanoi&#xff09;问题是一个源自古印度传说的经典益智游戏&#xff0c;也是心理学实验研究和计算机科学中常用的任务之一。该游戏通过三根高度相同的柱子和一系列大小及颜色不同的圆盘来构成&#xff0c…

[Python学习日记-7] 初识基本数据类型(下)

简介 我们在基本数据类型&#xff08;上&#xff09;当中介绍了数据类型中的数据类型&#xff08;整数、浮点数&#xff09;、字符串和布尔值&#xff0c;那么我们还剩下列表和数组还没有介绍了&#xff0c;在 Python 中&#xff0c;列表&#xff08;List&#xff09;是一种有序…

力扣Hot100-final关键字,常量,抽象类(模板方法设计模式),接口

&#xff08;一&#xff09;final关键字 &#xff08;2&#xff09;常量 使用static final 修饰的成员变量被称为常量 作用&#xff1a;&#xff1b;通常用于记录系统的配置信息 注意&#xff1a;产量命名要求&#xff1a;单词大写&#xff0c;下划线连接多个单词 产量优势…

windows下使用vcpkg编译libcurl库并使用C++实现ftp上传下载功能

1、下载安装vcpkg git clone https://github.com/microsoft/vcpkg2、编译vcpkg 使用cmd命令 D:\Code\ThirdParty>cd vcpkg D:\Code\ThirdParty\vcpkg>bootstrap-vcpkg.bat3、使用vcpkg编译所需的库 进入vckpkg目录&#xff0c;使用vckpkg install 命令进行安装。在安…

OJ题——二叉树(最大深度/平衡二叉树/前序遍历构建)

&#x1f36c;个人主页&#xff1a;Yanni.— &#x1f308;数据结构&#xff1a;Data Structure.​​​​​​ &#x1f382;C语言笔记&#xff1a;C Language Notes &#x1f3c0;OJ题分享&#xff1a; Topic Sharing 题目一&#xff08;最大深度&#xff09; 利用分治的思想&…

饿了么新财年开门见喜:亏损减负,收入增肌

撰稿 | 行星 来源 | 贝多财经 8月15日&#xff0c;阿里巴巴对外发布2025财年一季度&#xff08;即自然年2024年二季度&#xff09;业绩。不难看出&#xff0c;受益于饿了么和高德订单的显著增长&#xff0c;以及市场营销服务收入的明显拉升&#xff0c;该季度本地生活集团成绩…

10.DMA

理论 12个通道&#xff1a;DMA1&#xff08;7&#xff09;DMA2&#xff08;5&#xff09; 方向&#xff1a;存储器和存储器间(DMA_MEMORY_TO_MEMORY)、外设到存储器(DMA_PERIPH_TO_MEMORY)、存储器到外设(DMA_MEMORY_TO_PERIPH) 闪存、 SRAM、外设的SRAM、 APB1、 APB2和AHB外…

Simple RPC - 05 从零开始设计一个客户端(下)_ 依赖倒置和SPI

文章目录 Pre概述依赖倒置原则与解耦设计与实现1. 定义接口来隔离调用方与实现类2. 实现类DynamicStubFactory3. 调用方与实现类的解耦 依赖注入与SPI的解耦依赖注入SPI&#xff08;Service Provider Interface&#xff09; 总结 Pre Simple RPC - 01 框架原理及总体架构初探 …

一个模型,多种作物:迁移学习如何提升设施农业AI模型效能

&#xff08; 于景鑫 国家农业信息化工程技术研究中心&#xff09;设施农业是现代农业的"压舱石",但传统的经验式管理模式已难以为继。在数字经济时代,设施农业亟需向数字化、网络化、智能化转型升级。以人工智能为代表的信息技术,正在为设施农业插上腾飞的翅膀。作为…

Kafka主题(Topic/文件夹)的操作

Kafka主题&#xff08;Topic/文件夹&#xff09;的操作 1、Kafka主题&#xff08;Topic/文件夹&#xff09;2、Kafka主题&#xff08;Topic/文件夹&#xff09;的一些操作2.1、创建主题&#xff08;Topic/文件夹&#xff09;2.2、列出所有主题&#xff08;Topic/文件夹&#xf…

8路VBO转HDMI2.0支持4K60频率ITE6265芯片方案心得分享

在此之前&#xff0c;有人找到我这边询问能不能将智能电视主板改成机顶盒&#xff0c;将VBO信号转换输出位HDMI进行投屏&#xff0c;具体应用奇奇怪怪&#xff01;但是奈何是甲方大佬。认命照做。从网上也有搜索了解过这类芯片&#xff0c;发现资料很少&#xff0c;所以有了这篇…

基于免疫算法的最优物流仓储点选址方案MATLAB仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于免疫算法的最优物流仓储点选址方案MATLAB仿真。 2.测试软件版本以及运行结果展示 MATLAB2022A版本运行 &#xff08;完整程序运行后无水印&#xff09; 3…

STM32标准库学习笔记-1.基础知识

STM32介绍&#xff1a; STM32是ST公司基于ARM Cortex-M内核开发的32位微控制器。 ARM的含义&#xff1a; 公司名称&#xff1a;ARM公司成立于1990年&#xff0c;全称是Advanced RISC Machines&#xff08;RISC:Reduced Instruction Set Computer 精简指令集计算机 相对应有C…

C++票据查验、票据ocr、文字识别

现在&#xff0c;80、90后的人们逐渐过渡为职场上的主力人员&#xff0c;在工作中当然也会碰到各种各样的问题。比如&#xff0c;当你的老板给你一个艰难的任务时&#xff0c;肯定是不能直接拒绝的。那么我们该怎么做呢&#xff1f;翔云建议您先认真考虑老板说的任务的难度&…

C语言日常练习 Day17

目录 一、找出一个二维数组的鞍点 二、有一篇文章&#xff0c;共有3行文字&#xff0c;每行有80个字符。要求分别统计出其中的英文大写字母、小写字母、数字、空格以及其他字符的个数 三、有一行电文&#xff0c;已按下面规律编译成密码&#xff1a;A->Z,a->z,B->Y,…

mp3格式转换器推荐哪个?音质无损转换新选择

暑假在家&#xff0c;想要自己学着制作独一无二的彩铃吗&#xff1f;首先得解决音乐格式的难题。 面对众多mp3格式转换app&#xff0c;你是否也在犹豫“mp3格式转换app常用哪个&#xff1f;” 别担心&#xff0c;热门mp3格式转换工具大盘点来袭&#xff0c;帮你轻松搞定格式转…

《深入浅出WPF》读书笔记.5控件与布局(上)

《深入浅出WPF》读书笔记.5控件与布局(上) 背景 深入浅出WPF书籍学习笔记附代码。WPF中数据是核心是主动的,UI是数据的表达是被动的。 程序的本质是数据算法&#xff1b;控件的本质是数据行为&#xff1b; 5.控件与布局 一、6类控件派生关系 1.布局控件:可以容纳多个控件…