本文由 伯乐在线 - 水果泡腾片 翻译自 Lukas Eder 。欢迎加入技术翻译小组。转载请参见文章末尾处的要求。
很多程序员视 SQL 为洪水猛兽。SQL 是一种为数不多的声明性语言,它的运行方式完全不同于我们所熟知的命令行语言、面向对象的程序语言、甚至是函数语言(尽管有些人认为 SQL 语言也是一种函数式语言)。
我们每天都在写 SQL 并且应用在开源软件 jOOQ 中。于是我想把 SQL 之美介绍给那些仍然对它头疼不已的朋友,所以本文是为了以下读者而特地编写的:
1、 在工作中会用到 SQL 但是对它并不完全了解的人。
2、 能够熟练使用 SQL 但是并不了解其语法逻辑的人。
3、 想要教别人 SQL 的人。
本文着重介绍 SELECT 句式,其他的 DML (Data Manipulation Language 数据操纵语言命令)将会在别的文章中进行介绍。
10个简单步骤,完全理解SQL
1、 SQL 是一种声明式语言
首先要把这个概念记在脑中:“声明”。 SQL 语言是为计算机声明了一个你想从原始数据中获得什么样的结果的一个范例,而不是告诉计算机如何能够得到结果。这是不是很棒?
(译者注:简单地说,SQL 语言声明的是结果集的属性,计算机会根据 SQL 所声明的内容来从数据库中挑选出符合声明的数据,而不是像传统编程思维去指示计算机如何操作。)
1
|
SELECT first_name, last_name FROM employees WHERE salary > 100000
|
上面的例子很容易理解,我们不关心这些雇员记录从哪里来,我们所需要的只是那些高薪者的数据(译者注: salary>100000 )。
我们从哪儿学习到这些?
如果 SQL 语言这么简单,那么是什么让人们“闻 SQL 色变”?主要的原因是:我们潜意识中的是按照命令式编程的思维方式思考问题的。就好像这样:“电脑,先执行这一步,再执行那一步,但是在那之前先检查一下是否满足条件 A 和条件 B ”。例如,用变量传参、使用循环语句、迭代、调用函数等等,都是这种命令式编程的思维惯式。
2、 SQL 的语法并不按照语法顺序执行
SQL 语句有一个让大部分人都感到困惑的特性,就是:SQL 语句的执行顺序跟其语句的语法顺序并不一致。SQL 语句的语法顺序是:
- SELECT[DISTINCT]
- FROM
- WHERE
- GROUP BY
- HAVING
- UNION
- ORDER BY
为了方便理解,上面并没有把所有的 SQL 语法结构都列出来,但是已经足以说明 SQL 语句的语法顺序和其执行顺序完全不一样,就以上述语句为例,其执行顺序为:
- FROM
- WHERE
- GROUP BY
- HAVING
- SELECT
- DISTINCT
- UNION
- ORDER BY
关于 SQL 语句的执行顺序,有三个值得我们注意的地方:
1、 FROM 才是 SQL 语句执行的第一步,并非 SELECT 。数据库在执行 SQL 语句的第一步是将数据从硬盘加载到数据缓冲区中,以便对这些数据进行操作。(译者注:原文为“The first thing that happens is loading data from the disk into memory, in order to operate on such data.”,但是并非如此,以 Oracle 等常用数据库为例,数据是从硬盘中抽取到数据缓冲区中进行操作。)
2、 SELECT 是在大部分语句执行了之后才执行的,严格的说是在 FROM 和 GROUP BY 之后执行的。理解这一点是非常重要的,这就是你不能在 WHERE 中使用在 SELECT 中设定别名的字段作为判断条件的原因。
1
2
3
|
SELECT A.x + A.y AS z
FROM A
WHERE z = 10 -- z 在此处不可用,因为SELECT是最后执行的语句!
|
如果你想重用别名z,你有两个选择。要么就重新写一遍 z 所代表的表达式:
1
2
3
|
SELECT A.x + A.y AS z
FROM A
WHERE (A.x + A.y) = 10
|
…或者求助于衍生表、通用数据表达式或者视图,以避免别名重用。请看下文中的例子。
3、 无论在语法上还是在执行顺序上, UNION 总是排在在 ORDER BY 之前。很多人认为每个 UNION 段都能使用 ORDER BY 排序,但是根据 SQL 语言标准和各个数据库 SQL 的执行差异来看,这并不是真的。尽管某些数据库允许 SQL 语句对子查询(subqueries)或者派生表(derived tables)进行排序,但是这并不说明这个排序在 UNION 操作过后仍保持排序后的顺序。
注意:并非所有的数据库对 SQL 语句使用相同的解析方式。如 MySQL、PostgreSQL和 SQLite 中就不会按照上面第二点中所说的方式执行。
我们学到了什么?
既然并不是所有的数据库都按照上述方式执行 SQL 预计,那我们的收获是什么?我们的收获是永远要记得: SQL 语句的语法顺序和其执行顺序并不一致,这样我们就能避免一般性的错误。如果你能记住 SQL 语句语法顺序和执行顺序的差异,你就能很容易的理解一些很常见的 SQL 问题。
当然,如果一种语言被设计成语法顺序直接反应其语句的执行顺序,那么这种语言对程序员是十分友好的,这种编程语言层面的设计理念已经被微软应用到了 LINQ 语言中。
3、 SQL 语言的核心是对表的引用(table references)
由于 SQL 语句语法顺序和执行顺序的不同,很多同学会认为SELECT 中的字段信息是 SQL 语句的核心。其实真正的核心在于对表的引用。
根据 SQL 标准,FROM 语句被定义为:
1
|
< from clause> ::= FROM < table reference> [ { <comma> < table reference> }... ]
|
FROM 语句的“输出”是一张联合表,来自于所有引用的表在某一维度上的联合。我们们慢慢来分析:
1
|
FROM a, b
|
上面这句 FROM 语句的输出是一张联合表,联合了表 a 和表 b 。如果 a 表有三个字段, b 表有 5 个字段,那么这个“输出表”就有 8 ( =5+3)个字段。
这个联合表里的数据是 a*b,即 a 和 b 的笛卡尔积。换句话说,也就是 a 表中的每一条数据都要跟 b 表中的每一条数据配对。如果 a 表有3 条数据, b 表有 5 条数据,那么联合表就会有 15 ( =5*3)条数据。
FROM 输出的结果被 WHERE 语句筛选后要经过 GROUP BY 语句处理,从而形成新的输出结果。我们后面还会再讨论这方面问题。
如果我们从集合论(关系代数)的角度来看,一张数据库的表就是一组数据元的关系,而每个 SQL 语句会改变一种或数种关系,从而产生出新的数据元的关系(即产生新的表)。
我们学到了什么?
思考问题的时候从表的角度来思考问题提,这样很容易理解数据如何在 SQL 语句的“流水线”上进行了什么样的变动。
4、 灵活引用表能使 SQL 语句变得更强大
灵活引用表能使 SQL 语句变得更强大。一个简单的例子就是 JOIN 的使用。严格的说 JOIN 语句并非是 SELECT 中的一部分,而是一种特殊的表引用语句。 SQL 语言标准中表的连接定义如下:
1
2
3
4
|
< table reference> ::=
< table name >
| <derived table >
| <joined table >
|
就拿之前的例子来说:
1
|
FROM a, b
|
a 可能输如下表的连接:
1
|
a1 JOIN a2 ON a1.id = a2.id
|
将它放到之前的例子中就变成了:
1
|
FROM a1 JOIN a2 ON a1.id = a2.id, b
|
尽管将一个连接表用逗号跟另一张表联合在一起并不是常用作法,但是你的确可以这么做。结果就是,最终输出的表就有了 a1+a2+b 个字段了。
(译者注:原文这里用词为 degree ,译为维度。如果把一张表视图化,我们可以想象每一张表都是由横纵两个维度组成的,横向维度即我们所说的字段或者列,英文为columns;纵向维度即代表了每条数据,英文为 record ,根据上下文,作者这里所指的应该是字段数。)
在 SQL 语句中派生表的应用甚至比表连接更加强大,下面我们就要讲到表连接。
我们学到了什么?
思考问题时,要从表引用的角度出发,这样就很容易理解数据是怎样被 SQL 语句处理的,并且能够帮助你理解那些复杂的表引用是做什么的。
更重要的是,要理解 JOIN 是构建连接表的关键词,并不是 SELECT 语句的一部分。有一些数据库允许在 INSERT 、 UPDATE 、 DELETE 中使用 JOIN 。
5、 SQL 语句中推荐使用表连接
我们先看看刚刚这句话:
1
|
FROM a, b
|
高级 SQL 程序员也许学会给你忠告:尽量不要使用逗号来代替 JOIN 进行表的连接,这样会提高你的 SQL 语句的可读性,并且可以避免一些错误。
利用逗号来简化 SQL 语句有时候会造成思维上的混乱,想一下下面的语句:
1
2
3
4
5
|
FROM a, b, c, d, e, f, g, h
WHERE a.a1 = b.bx
AND a.a2 = c.c1
AND d.d1 = b.bc
-- etc... |
我们不难看出使用 JOIN 语句的好处在于:
- 安全。 JOIN 和要连接的表离得非常近,这样就能避免错误。
- 更多连接的方式,JOIN 语句能去区分出来外连接和内连接等。
我们学到了什么?
记着要尽量使用 JOIN 进行表的连接,永远不要在 FROM 后面使用逗号连接表。
6、 SQL 语句中不同的连接操作
SQL 语句中,表连接的方式从根本上分为五种:
- EQUI JOIN
- SEMI JOIN
- ANTI JOIN
- CROSS JOIN
- DIVISION
EQUI JOIN
这是一种最普通的 JOIN 操作,它包含两种连接方式:
- INNER JOIN(或者是 JOIN )
- OUTER JOIN(包括: LEFT 、 RIGHT、 FULL OUTER JOIN)
用例子最容易说明其中区别:
1
2
3
4
5
6
7
8
9
10
|
-- This table reference contains authors and their books. -- There is one record for each book and its author. -- authors without books are NOT included author JOIN book ON author.id = book.author_id
-- This table reference contains authors and their books -- There is one record for each book and its author. -- ... OR there is an "empty" record for authors without books -- ("empty" meaning that all book columns are NULL) author LEFT OUTER JOIN book ON author.id = book.author_id
|
SEMI JOIN
这种连接关系在 SQL 中有两种表现方式:使用 IN,或者使用 EXISTS。“ SEMI ”在拉丁文中是“半”的意思。这种连接方式是只连接目标表的一部分。这是什么意思呢?再想一下上面关于作者和书名的连接。我们想象一下这样的情况:我们不需要作者 / 书名这样的组合,只是需要那些在书名表中的书的作者信息。那我们就能这么写:
1
2
3
4
5
6
7
|
-- Using IN FROM author
WHERE author.id IN ( SELECT book.author_id FROM book)
-- Using EXISTS FROM author
WHERE EXISTS ( SELECT 1 FROM book WHERE book.author_id = author.id)
|
尽管没有严格的规定说明你何时应该使用 IN ,何时应该使用 EXISTS ,但是这些事情你还是应该知道的:
- IN比 EXISTS 的可读性更好
- EXISTS 比IN 的表达性更好(更适合复杂的语句)
- 二者之间性能没有差异(但对于某些数据库来说性能差异会非常大)
因为使用 INNER JOIN 也能得到书名表中书所对应的作者信息,所以很多初学者机会认为可以通过 DISTINCT 进行去重,然后将 SEMI JOIN 语句写成这样:
1
2
3
4
|
-- Find only those authors who also have books SELECT DISTINCT first_name, last_name
FROM author
JOIN book ON author.id = book.author_id
|
这是一种很糟糕的写法,原因如下:
- SQL 语句性能低下:因为去重操作( DISTINCT )需要数据库重复从硬盘中读取数据到内存中。(译者注: DISTINCT 的确是一种很耗费资源的操作,但是每种数据库对于 DISTINCT 的操作方式可能不同)。
- 这么写并非完全正确:尽管也许现在这么写不会出现问题,但是随着 SQL 语句变得越来越复杂,你想要去重得到正确的结果就变得十分困难。
更多的关于滥用 DISTINCT 的危害可以参考这篇博文
(http://blog.jooq.org/2013/07/30/10-common-mistakes-java-developers-make-when-writing-sql/)。
ANTI JOIN
这种连接的关系跟 SEMI JOIN 刚好相反。在 IN 或者 EXISTS 前加一个 NOT 关键字就能使用这种连接。举个例子来说,我们列出书名表里没有书的作者:
1
2
3
4
5
6
7
|
-- Using IN FROM author
WHERE author.id NOT IN ( SELECT book.author_id FROM book)
-- Using EXISTS FROM author
WHERE NOT EXISTS ( SELECT 1 FROM book WHERE book.author_id = author.id)
|
关于性能、可读性、表达性等特性也完全可以参考 SEMI JOIN。
这篇博文介绍了在使用 NOT IN 时遇到 NULL 应该怎么办,因为有一点背离本篇主题,就不详细介绍,有兴趣的同学可以读一下
(http://blog.jooq.org/2012/01/27/sql-incompatibilities-not-in-and-null-values/)。
CROSS JOIN
这个连接过程就是两个连接的表的乘积:即将第一张表的每一条数据分别对应第二张表的每条数据。我们之前见过,这就是逗号在 FROM 语句中的用法。在实际的应用中,很少有地方能用到 CROSS JOIN,但是一旦用上了,你就可以用这样的 SQL语句表达:
1
2
|
-- Combine every author with every book author CROSS JOIN book
|
DIVISION
DIVISION 的确是一个怪胎。简而言之,如果 JOIN 是一个乘法运算,那么 DIVISION 就是 JOIN 的逆过程。DIVISION 的关系很难用 SQL 表达出来,介于这是一个新手指南,解释 DIVISION 已经超出了我们的目的。但是有兴趣的同学还是可以来看看这三篇文章
(http://blog.jooq.org/2012/03/30/advanced-sql-relational-division-in-jooq/)
(http://en.wikipedia.org/wiki/Relational_algebra#Division)
(https://www.simple-talk.com/sql/t-sql-programming/divided-we-stand-the-sql-of-relational-division/)。
推荐阅读 →_→ 《画图解释SQL联合语句》
我们学到了什么?
学到了很多!让我们在脑海中再回想一下。 SQL 是对表的引用, JOIN 则是一种引用表的复杂方式。但是 SQL 语言的表达方式和实际我们所需要的逻辑关系之间是有区别的,并非所有的逻辑关系都能找到对应的 JOIN 操作,所以这就要我们在平时多积累和学习关系逻辑,这样你就能在以后编写 SQL 语句中选择适当的 JOIN 操作了。
7、 SQL 中如同变量的派生表
在这之前,我们学习到过 SQL 是一种声明性的语言,并且 SQL 语句中不能包含变量。但是你能写出类似于变量的语句,这些就叫做派生表:
说白了,所谓的派生表就是在括号之中的子查询:
1
2
|
-- A derived table FROM ( SELECT * FROM author)
|
需要注意的是有些时候我们可以给派生表定义一个相关名(即我们所说的别名)。
1
2
|
-- A derived table with an alias FROM ( SELECT * FROM author) a
|
派生表可以有效的避免由于 SQL 逻辑而产生的问题。举例来说:如果你想重用一个用 SELECT 和 WHERE 语句查询出的结果,这样写就可以(以 Oracle 为例):
1
2
3
4
5
6
7
8
|
-- Get authors' first and last names, and their age in days SELECT first_name, last_name, age
FROM (
SELECT first_name, last_name, current_date - date_of_birth age
FROM author
) -- If the age is greater than 10000 days WHERE age > 10000
|
需要我们注意的是:在有些数据库,以及 SQL : 1990 标准中,派生表被归为下一级——通用表语句( common table experssion)。这就允许你在一个 SELECT 语句中对派生表多次重用。上面的例子就(几乎)等价于下面的语句:
1
2
3
4
5
6
7
|
WITH a AS (
SELECT first_name, last_name, current_date - date_of_birth age
FROM author
) SELECT *
FROM a
WHERE age > 10000
|
当然了,你也可以给“ a ”创建一个单独的视图,这样你就可以在更广泛的范围内重用这个派生表了。更多信息可以阅读下面的文章(http://en.wikipedia.org/wiki/View_%28SQL%29)。
我们学到了什么?
我们反复强调,大体上来说 SQL 语句就是对表的引用,而并非对字段的引用。要好好利用这一点,不要害怕使用派生表或者其他更复杂的语句。
8、 SQL 语句中 GROUP BY 是对表的引用进行的操作
让我们再回想一下之前的 FROM 语句:
1
|
FROM a, b
|
现在,我们将 GROUP BY 应用到上面的语句中:
1
|
GROUP BY A.x, A.y, B.z
|
上面语句的结果就是产生出了一个包含三个字段的新的表的引用。我们来仔细理解一下这句话:当你应用 GROUP BY 的时候, SELECT 后没有使用聚合函数的列,都要出现在 GROUP BY 后面。(译者注:原文大意为“当你是用 GROUP BY 的时候,你能够对其进行下一级逻辑操作的列会减少,包括在 SELECT 中的列”)。
- 需要注意的是:其他字段能够使用聚合函数:
1
2
3
|
SELECT A.x, A.y, SUM (A.z)
FROM A
GROUP BY A.x, A.y
|
- 还有一点值得留意的是: MySQL 并不坚持这个标准,这的确是令人很困惑的地方。(译者注:这并不是说 MySQL 没有 GROUP BY 的功能)但是不要被 MySQL 所迷惑。 GROUP BY 改变了对表引用的方式。你可以像这样既在 SELECT 中引用某一字段,也在 GROUP BY 中对其进行分组。
我们学到了什么?
GROUP BY,再次强调一次,是在表的引用上进行了操作,将其转换为一种新的引用方式。
9、 SQL 语句中的 SELECT 实质上是对关系的映射
我个人比较喜欢“映射”这个词,尤其是把它用在关系代数上。(译者注:原文用词为 projection ,该词有两层含义,第一种含义是预测、规划、设计,第二种意思是投射、映射,经过反复推敲,我觉得这里用映射能够更直观的表达出 SELECT 的作用)。一旦你建立起来了表的引用,经过修改、变形,你能够一步一步的将其映射到另一个模型中。 SELECT 语句就像一个“投影仪”,我们可以将其理解成一个将源表中的数据按照一定的逻辑转换成目标表数据的函数。
通过 SELECT语句,你能对每一个字段进行操作,通过复杂的表达式生成所需要的数据。
SELECT 语句有很多特殊的规则,至少你应该熟悉以下几条:
- 你仅能够使用那些能通过表引用而得来的字段;
- 如果你有 GROUP BY 语句,你只能够使用 GROUP BY 语句后面的字段或者聚合函数;
- 当你的语句中没有 GROUP BY 的时候,可以使用开窗函数代替聚合函数;
- 当你的语句中没有 GROUP BY 的时候,你不能同时使用聚合函数和其它函数;
- 有一些方法可以将普通函数封装在聚合函数中;
- ……
一些更复杂的规则多到足够写出另一篇文章了。比如:为何你不能在一个没有 GROUP BY 的 SELECT 语句中同时使用普通函数和聚合函数?(上面的第 4 条)
原因如下:
- 凭直觉,这种做法从逻辑上就讲不通。
- 如果直觉不能够说服你,那么语法肯定能。 SQL : 1999 标准引入了 GROUPING SETS,SQL: 2003 标准引入了 group sets : GROUP BY() 。无论什么时候,只要你的语句中出现了聚合函数,而且并没有明确的 GROUP BY 语句,这时一个不明确的、空的 GROUPING SET 就会被应用到这段 SQL 中。因此,原始的逻辑顺序的规则就被打破了,映射(即 SELECT )关系首先会影响到逻辑关系,其次就是语法关系。(译者注:这段话原文就比较艰涩,可以简单理解如下:在既有聚合函数又有普通函数的 SQL 语句中,如果没有 GROUP BY 进行分组,SQL 语句默认视整张表为一个分组,当聚合函数对某一字段进行聚合统计的时候,引用的表中的每一条 record 就失去了意义,全部的数据都聚合为一个统计值,你此时对每一条 record 使用其它函数是没有意义的)。
糊涂了?是的,我也是。我们再回过头来看点浅显的东西吧。
我们学到了什么?
SELECT 语句可能是 SQL 语句中最难的部分了,尽管他看上去很简单。其他语句的作用其实就是对表的不同形式的引用。而 SELECT 语句则把这些引用整合在了一起,通过逻辑规则将源表映射到目标表,而且这个过程是可逆的,我们可以清楚的知道目标表的数据是怎么来的。
想要学习好 SQL 语言,就要在使用 SELECT 语句之前弄懂其他的语句,虽然 SELECT 是语法结构中的第一个关键词,但它应该是我们最后一个掌握的。
10、 SQL 语句中的几个简单的关键词: DISTINCT , UNION , ORDER BY 和 OFFSET
在学习完复杂的 SELECT 豫剧之后,我们再来看点简单的东西:
- 集合运算( DISTINCT 和 UNION )
- 排序运算( ORDER BY,OFFSET…FETCH)
集合运算( set operation):
集合运算主要操作在于集合上,事实上指的就是对表的一种操作。从概念上来说,他们很好理解:
- DISTINCT 在映射之后对数据进行去重
- UNION 将两个子查询拼接起来并去重
- UNION ALL 将两个子查询拼接起来但不去重
- EXCEPT 将第二个字查询中的结果从第一个子查询中去掉
- INTERSECT 保留两个子查询中都有的结果并去重
排序运算( ordering operation):
排序运算跟逻辑关系无关。这是一个 SQL 特有的功能。排序运算不仅在 SQL 语句的最后,而且在 SQL 语句运行的过程中也是最后执行的。使用 ORDER BY 和 OFFSET…FETCH 是保证数据能够按照顺序排列的最有效的方式。其他所有的排序方式都有一定随机性,尽管它们得到的排序结果是可重现的。
OFFSET…SET是一个没有统一确定语法的语句,不同的数据库有不同的表达方式,如 MySQL 和 PostgreSQL 的 LIMIT…OFFSET、SQL Server 和 Sybase 的 TOP…START AT 等。具体关于 OFFSET..FETCH 的不同语法可以参考这篇文章
(http://www.jooq.org/doc/3.1/manual/sql-building/sql-statements/select-statement/limit-clause/)。
让我们在工作中尽情的使用 SQL!
正如其他语言一样,想要学好 SQL 语言就要大量的练习。上面的 10 个简单的步骤能够帮助你对你每天所写的 SQL 语句有更好的理解。另一方面来讲,从平时常见的错误中也能积累到很多经验。下面的两篇文章就是介绍一些 JAVA 和其他开发者所犯的一些常见的 SQL 错误:
相关推荐
已经使用过但没有完全理解SQL的读者 已经差不多了解SQL但从未真正考虑过它的语法的读者 想要指导他人学习SQL的读者 本教程将重点介绍SELECT 语句。其他 DML 语句将在另一个教程中在做介绍。接下来是… ...
内容概要:本文深入探讨了AMESim仿真平台在电动汽车(EV)热泵空调系统设计与优化中的应用。首先介绍了AMESim的基础建模方法,如构建制冷循环模型中的压缩机、蒸发器和冷凝器等组件,并详细解释了各部件的工作原理及其参数设定。接着重点阐述了EV热泵空调系统的特殊之处,即不仅能够制冷还可以在冬季提供高效的制热功能,这对于提高电动汽车在寒冷条件下的续航里程和乘坐舒适性非常重要。文中给出了几个具体的案例,包括通过改变压缩机运行频率来进行性能优化,以及针对低温环境下热泵系统的控制策略,如四通阀切换逻辑、电子膨胀阀开度调节等。此外,还讨论了热泵系统与其他子系统(如电池温控)之间的协同工作方式,强调了系统集成的重要性。最后分享了一些实用的经验技巧,例如如何避免仿真过程中可能出现的问题,怎样评估系统的整体性能等。 适合人群:从事汽车工程、暖通空调(HVAC)领域的研究人员和技术人员,特别是关注新能源汽车热管理系统的专业人士。 使用场景及目标:适用于希望深入了解电动汽车热泵空调系统特性的工程师们,旨在帮助他们掌握基于AMESim进行系统建模、仿真分析的方法论,以便更好地指导实际产品研发。 阅读建议:由于涉及到较多的专业术语和技术细节,建议读者具备一定的机械工程背景知识,同时配合官方文档或其他参考资料一起研读,以加深理解。
dtcwt 双树复小波的matlab工具箱。内容来源于网络分享,如有侵权请联系我删除。
基于hadoop的系统
内容概要:本文探讨了永磁同步电机(PMSM)控制系统中两种先进的控制策略:电流预测控制和广义预测控制(GPC),特别是在速度环中结合扩展状态观测器(ESO)的应用。文章首先介绍了广义预测控制的基本原理及其在速度环中的实现方式,强调了其通过滚动优化对未来系统输出进行预测的能力。接着讨论了电流环中采用的双矢量改进预测控制算法,该算法通过优化两个电压矢量的选择提高了电流控制的精度和动态响应速度。此外,文章还提供了具体的代码示例和技术细节,帮助读者更好地理解和实现这些控制策略。最后,推荐了几篇相关文献供进一步学习。 适合人群:从事电机控制领域的研究人员、工程师以及对预测控制感兴趣的高校师生。 使用场景及目标:适用于需要提高永磁同步电机控制系统性能的研究项目或工业应用场景,旨在实现更精确、高效的电机控制,增强系统的鲁棒性和稳定性。 其他说明:文中提到的方法已在实验室环境中进行了验证,并取得了显著的效果,如减小了突加负载时的速度跌落幅度,降低了电流谐波失真度等。同时,作者分享了一些实用的调试技巧和注意事项,有助于加速实际项目的开发进程。
期末作业Python实现基于图神经网络的信任评估项目源代码+使用说明(高分项目),个人经导师指导并认可通过的高分设计项目,评审分99分,代码完整确保可以运行,小白也可以亲自搞定,主要针对计算机相关专业的正在做大作业的学生和需要项目实战练习的学习者,可作为毕业设计、课程设计、期末大作业,代码资料完整,下载可用。 期末作业Python实现基于图神经网络的信任评估项目源代码+使用说明(高分项目)期末作业Python实现基于图神经网络的信任评估项目源代码+使用说明(高分项目)期末作业Python实现基于图神经网络的信任评估项目源代码+使用说明(高分项目)期末作业Python实现基于图神经网络的信任评估项目源代码+使用说明(高分项目)期末作业Python实现基于图神经网络的信任评估项目源代码+使用说明(高分项目)期末作业Python实现基于图神经网络的信任评估项目源代码+使用说明(高分项目)期末作业Python实现基于图神经网络的信任评估项目源代码+使用说明(高分项目)期末作业Python实现基于图神经网络的信任评估项目源代码+使用说明(高分项目)期末作业Python实现基于图神经网络的信任评估项目源代码+使用说明(高分项目)期末作业Python实现基于图神经网络的信任评估项目源代码+使用说明(高分项目)期末作业Python实现基于图神经网络的信任评估项目源代码+使用说明(高分项目)期末作业Python实现基于图神经网络的信任评估项目源代码+使用说明(高分项目)期末作业Python实现基于图神经网络的信任评估项目源代码+使用说明(高分项目)期末作业Python实现基于图神经网络的信任评估项目源代码+使用说明(高分项目)期末作业Python实现基于图神经网络的信任评估项目源代码+使用说明(高分项目)期末作业Python实现基于图神经网络的信任评估项目源代码+使用说明(高分项目)期末作
内容概要:本文详细介绍了开源6轴机械臂控制器SmallRobotArm AR3的功能特点和技术细节。首先,文章展示了AR3可以直接通过板载按钮进行关节和坐标运动控制,无需连接电脑,提供了便捷的操作体验。其次,深入探讨了其核心算法,包括正逆解算法、运动模式切换逻辑以及平滑处理机制。此外,还介绍了自动标定程序、G代码支持和扩展功能如手势控制等特性。最后,强调了AR3的高扩展性和易用性,使其成为机器人爱好者和专业开发者的理想选择。 适合人群:对机器人技术和机械臂感兴趣的初学者、中级开发者及研究人员。 使用场景及目标:适用于教育、科研、DIY项目等领域,旨在帮助用户快速掌握机械臂控制原理并应用于实际任务中。 其他说明:文中提供的代码片段有助于理解和实现相关功能,而详细的硬件介绍则为动手能力强的用户提供改装灵感。
内容概要:本文档提供了10道蓝桥杯Python模拟题及其详细解答过程,涵盖字符串处理、数字运算、算法设计等多个方面。题目包括数字反转、字母转换、数字分段和、质数判断、字符串统计、数独验证、最大子数组和、括号匹配、斐波那契数列和文件统计。每道题目不仅给出了详细的解题思路和分析,还附有完整的Python源代码。通过这些题目,读者可以系统地提升编程能力和算法思维,掌握常见的编程技巧和方法。 适合人群:适合有一定编程基础的Python学习者,特别是准备参加蓝桥杯或其他编程竞赛的学生和爱好者。 使用场景及目标:①作为蓝桥杯赛前训练资料,帮助参赛者熟悉比赛题型和解题思路;②作为编程练习题集,巩固Python语言的基础知识和常用算法;③通过实际编程练习,提高解决实际问题的能力和编程水平。 阅读建议:建议读者先尝试独立完成每道题目,然后再参考提供的解题思路和代码,对比自己的解法,找出差距并加以改进。同时,注意理解每道题目背后的算法思想和编程技巧,以便举一反三,灵活应用。
web_6_login.rar
脚本插件 1.Ai转PS矢量图层 2.分割线段 3.图形变换 4.圆形填充 5.文字块排版 6.多页PDF文档置入 将jsx文件复制到\Abobe Illustrator XX\Presets(在部分AI软件中可能显示为“预设”)\zh_CN\脚本 文件夹下,重新启动ai,就可以在"文件"-"脚本"下看见ai脚本菜单,运行即可。
内容概要:本文详细介绍了滑模观测器和PLL在STM32F1平台上的C代码实现。滑模观测器用于估计系统内部状态,尤其适用于电机控制领域;PLL则用于确保输出信号相位与输入信号相位保持一致。文中展示了两种滑模观测器的实现方法:一种采用符号函数进行硬切换,另一种采用饱和函数进行软化处理。此外,文章还强调了使用TI的IQmath库进行定点计算加速,以提高运算效率并减少资源占用。通过具体的代码示例和调试技巧,作者分享了如何在STM32F1平台上实现高效稳定的滑模观测器和PLL系统。 适合人群:嵌入式系统开发者、电机控制系统工程师、熟悉C语言编程的技术人员。 使用场景及目标:① 实现高效的滑模观测器和PLL系统,应用于电机控制和其他实时性要求较高的场景;② 学习如何使用IQmath库进行定点计算加速,优化嵌入式系统的性能;③ 掌握调试技巧,确保系统稳定运行。 其他说明:文章提供了详细的代码示例和调试经验,帮助读者更好地理解和实现滑模观测器和PLL系统。同时,文中提到的一些注意事项和常见问题解决方案也非常实用。
内容概要:本文探讨了利用纳什谈判理论和交替方向乘子法(ADMM)解决共享储能电站中多用户之间的利益分配问题。文中详细介绍了将复杂的利益分配问题转化为数学模型的方法,以及如何通过ADMM算法实现分布式优化,确保各参与方都能接受的最优解。同时,文章还展示了实际应用案例,证明了该方法的有效性和优越性。 适合人群:从事电力系统优化、储能技术研究的专业人士,以及对分布式优化算法感兴趣的科研人员。 使用场景及目标:适用于多个用户共同使用储能设施的场景,旨在通过科学合理的算法设计,实现储能系统的高效运行和利益的最大化分配。 其他说明:文章不仅提供了详细的算法实现步骤,还包括了一些实用的代码片段和实验结果分析,帮助读者更好地理解和应用相关技术。此外,文中提到的一些反直觉现象也为进一步的研究提供了思路。
08011车TC1车ER(A、B网)通讯故障分析报告 .docx
2025年机器人+人工智能工业应用研究报告.pdf
内容概要:本文深入探讨了麻雀搜索算法(SSA)的一种改进版本——融合差分进化和多策略的麻雀搜索算法(DEH_SSA)。文章首先介绍了反向学习初始化种群、非线性因子改进发现者策略、改进警觉性策略、融合差分算法以及精英扰动策略五大创新点。接着详细展示了这些策略的具体实现方法,如反向学习初始化通过计算反向解使初始种群分布更合理,非线性因子改进发现者策略通过动态调整搜索步长提高搜索效率等。此外,文中提供了23个基准测试函数的实验结果,证明了DEH_SSA相比传统SSA在收敛速度和最优解质量上的显著优势。最后给出了详细的调参指南,帮助初学者更好地理解和应用该算法。 适合人群:对智能优化算法感兴趣的研究人员和技术开发者,尤其是有一定编程基础并对群体智能算法有初步了解的人士。 使用场景及目标:适用于需要解决复杂优化问题的场景,如工程优化、机器学习超参数调优等领域。目标是提供一种高效的优化工具,帮助用户更快更精确地找到全局最优解。 其他说明:文章不仅提供了理论解释,还有丰富的代码实例,便于读者动手实践。同时,附带的调参指南有助于读者根据具体问题调整算法参数,获得更好的优化效果。
内容概要:本文详细介绍了西门子WinCC报表系统的多版本通用模板及其优化技术。涵盖了日报表、月报表、年报表、自由报表及班次报表等多种类型的报表模板,提供了详细的代码示例,包括VBS脚本、SQL查询语句、C脚本等。文中强调了性能优化措施,如索引建立、参数化查询、存储过程的应用等,并附有配套的视频教程帮助理解和实践。此外,还讨论了班次报表的灵活性设计、数据分页技术、错误处理机制等方面的内容。 适合人群:已经具备WinCC脚本基础和SQL语言基础的技术人员,尤其是从事工业自动化领域的工程师。 使用场景及目标:适用于需要频繁生成各类生产报表的企业,旨在提高数据查询效率,满足不同客户的定制化需求,同时确保系统的稳定性和兼容性。通过学习本文提供的模板和技术,用户能够更好地应对复杂的生产数据管理和报表生成任务。 其他说明:文中提到的所有技术手段均经过实际测试验证,可在多个版本的WinCC环境中稳定运行。配套的视频教程进一步降低了学习门槛,使用户能够更快地上手操作。
内容概要:本文详细介绍了ANPC并网逆变器的闭环仿真建模过程,涵盖了直流电压源的稳定接入、SPWM调制、电流闭环控制以及锁相环的应用。作者通过具体的代码示例和技术细节,展示了如何利用SPWM生成稳定的正弦波,通过锁相环确保电流和电压的相位一致,并采用前馈解耦提高电流控制的精度。同时,文中还讨论了一些常见的仿真问题及其解决方案,如死区效应、调制比限制和电流环PI参数的优化。 适合人群:电力电子工程师、控制系统设计师、从事逆变器研究的技术人员。 使用场景及目标:适用于希望深入了解ANPC并网逆变器控制策略的研究人员和工程师,旨在帮助他们掌握SPWM调制、电流闭环控制和锁相环的设计与实现。 其他说明:文章提供了丰富的代码片段和实践经验,有助于读者快速理解和应用相关技术。此外,文中提到的一些常见问题和解决方案也为实际项目提供了宝贵的参考。
# 压缩文件中包含: 中文文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;
# 压缩文件中包含: 中文文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;
# 压缩文件中包含: 中文-英文对照文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文-英文对照文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;