SQL 查询
SQL(Structured Query Language,结构化查询语言)通过简单的声明性语句管理存储在关系数据库中的数据。使用 ANSI SQL-92 标准来查询 ODBC 数据库和嵌入式数据库。
SQL 语法
自上而下的 SQL 解析器基于标准 SQL 语法的简化版本,因为:
- FactoryTalk Optix 仅支持标准 SQL 的子集。
- 简化的标准 SQL 语法最适合自上而下的解析器实现。
- 简化的标准 SQL 语法有助于提高所得到的 AST 的可读性。
语句
小贴士:
按以下方式对包含特殊字符的列名称进行转义:
SELECT MAX(
"/Variable1"
) FROM mystore.recipeschema1;FactoryTalk Optix Studio
在 SQL 查询中支持以下语句:- 使用SELECT语句从数据库中选择数据。此语句支持列名和值表达式,以及ALL和DISTINCT集合量词。示例:SELECT *, FROM Table1 SELECT *, Timestamp AS T FROM Table1 SELECT Column1 FROM Table1 SELECT *, 10 FROM Table1 SELECT 10, * FROM Table1 SELECT *, 'text value' FROM Table1 SELECT COUNT(*) FROM Table1 SELECT DINSTINCT Column1 FROM Table1提醒事项:CASE和WHEN表达式不受支持。重要提示:SQL 标准不允许将*与派生列组合。SELECT *, Timestamp FROM Table1SELECT *, ROW_NUMBER() OVER (ORDER BY Timestamp) FROM DataLoggerFactoryTalk Optix支持此标准,以允许对迷你图进行任何查询操作。
- 使用DELETE语句删除表中的任何现有记录。示例:SELECT * FROM Table1 WHERE ... DELETE FROM Table1 WHERE ... UPDATE Table1 SET column1 = 10 WHERE column2 > 20 ...
- 使用UPDATE语句修改表中的任何现有记录。示例:SELECT * FROM Table1 WHERE ... DELETE FROM Table1 WHERE ... UPDATE Table1 SET column1 = 10 WHERE column2 > 20 ...
FactoryTalk Optix Studio
在 SQL 查询中对以下语句提供部分支持:- 使用CREATE语句在数据库中创建表。此语句部分支持TABLE和INDEX。示例:CREATE UNIQUE INDEX Table_Index ON Table1 (Column1) CREATE INDEX IF NOT EXISTS Table_Index ON Table1 (Column1)CREATE TABLE TempTable AS SELECT Column1 FROM MyTable WHERE Column1 > 5 CREATE TEMPORARY TABLE TempTable AS SELECT Column1 FROM MyTable WHERE Column1 > 5CREATE TEMPORARY TABLE Table2 AS SELECT Column1 FROM Table1 WHERE Column1 > 5 CREATE UNIQUE INDEX Column1_Index ON Table1 (Column1) DROP TABLE Table1
- DROP语句可删除任何现有数据库或数据库中的表。示例:DROP TABLE TemporaryTable DROP TABLE Table1
文本值
文本值类型 | 示例 | 注释 |
---|---|---|
整数 | 1520 | 不使用千位分隔符。 使用 Int32 类型。 |
实数 | 15.025 | 将 . 用作小数分隔符。使用双精度型。 |
实数科学 | 2.7000001072883606E-1 | |
布尔 |
| 使用小写字母表示布尔值。 |
字符串 | 'string value' | 使用单引号分隔文本。 在文本字符串中插入单引号 ( ' ),方法是使用一个单引号对另一个单引号进行转义。例如,要编写 'string' 字符串,请在字符串中使用两个单引号 ''string'' 。 |
日期和时间 | "2004-05-23T14:25:10.487" | 使用以双引号分隔的 ISO8601 格式。 日期和时间表示法采用非标准的 ANSI SQL,可避免使用 DATE 、TIME 和 TIMESTAMP 关键字,以防产生歧义。 |
常规标识符 |
| 不使用空格。 以大写或小写字母开头。 可使用数字、字母和下划线字符 _ 。 |
分隔标识符 |
| 使用双引号 ( " ) 作为分隔符。在标识符中,使用除 " 字符以外的所有其他字符。标识符末尾的任何空格都将被忽略。 |
联接
支持任何类型(如
INNER
、UNION
、LEFT
、RIGHT
、FULL
、NATURAL
和 CROSS
)的联接。
提醒事项:
对于某些联接,并非每个 DBMS 都完全支持它们。
别名
可以在标识符、派生的列子查询和表中使用别名。
以下是具有别名的查询示例:
SELECT Timestamp AS T FROM Table1 WHERE ...
SELECT * FROM Table1 AS T WHERE ...
SELECT * FROM (SELECT * FROM Table1) AS SubQuery WHERE ...
CREATE TABLE Table1 AS SELECT Timestamp, Column1 FROM Table2
表引用
FROM
子句支持下面的表引用。引用 | 示例 |
---|---|
完全限定参考 | ... FROM table_name ... FROM schema_name.table_name ... FROM database_name.schema.name.table_name |
子查询 | ... FROM (SELECT * FROM Table2) WHERE ... |
提醒事项:
还支持将完全限定名称作为列引用。
示例:
... WHERE Table1.Column1 > 10... WHERE Table1."order id" > 10 SELECT * FROM Table1 AS T WHERE T."order id" > 10 ... WHERE "my table"."order id" > 10
运算符
运算符 | 示例 |
---|---|
IN |
|
BETWEEN |
|
LIKE |
|
EXISTS |
|
IS |
|
NOT |
运算符 NOT 适用于所有其他运算符。 |
提醒事项:
ANY
和 ALL
运算符不受支持。窗口函数
功能 | 示例 |
---|---|
ROW_NUMBER |
|
RANK |
|
DENSE_RANK |
|
AVG |
|
SUM 、MIN 、MAX |
|
COUNT |
|
提醒事项:
PARTITION BY
子句仅支持列标识符。标记
标记 | 正则表达式 |
---|---|
regular_identifier | [a-zA-Z][a-zA-Z0-9_]* |
delimited_identifier | ".*?" |
real | |
boolean | |
其他零散的标记 | 单个字符或单字标记的正则表达式 |
提醒事项:
词法分析器无法将日期和时间值识别为标记:这些值将被解析为
delimited_identifier
。语义分析器根据 r
正则表达式从 delimited_identifier
中提取任何日期和时间值。SQL
查询
提供反馈