SQL 查询

SQL(Structured Query Language,结构化查询语言)通过简单的声明性语句管理存储在关系数据库中的数据。使用 ANSI SQL-92 标准来查询 ODBC 数据库和嵌入式数据库。

SQL 语法

自上而下的 SQL 解析器基于标准 SQL 语法的简化版本,因为:
  • FactoryTalk Optix 仅支持标准 SQL 的子集。
  • 简化的标准 SQL 语法最适合自上而下的解析器实现。
  • 简化的标准 SQL 语法有助于提高所得到的 AST 的可读性。

语句

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 Table1
    SELECT *, ROW_NUMBER() OVER (ORDER BY Timestamp) FROM DataLogger
    FactoryTalk 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 > 5
    CREATE 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
布尔
  • true
  • false
使用小写字母表示布尔值。
字符串
'string value'
使用单引号分隔文本。
在文本字符串中插入单引号 (
'
),方法是使用一个单引号对另一个单引号进行转义。例如,要编写
'string'
字符串,请在字符串中使用两个单引号
''string''
日期和时间
"2004-05-23T14:25:10.487"
使用以双引号分隔的 ISO8601 格式。
日期和时间表示法采用非标准的 ANSI SQL,可避免使用
DATE
TIME
TIMESTAMP
关键字,以防产生歧义。
常规标识符
  • Column1
  • Grüße
不使用空格。
以大写或小写字母开头。
可使用数字、字母和下划线字符
_
分隔标识符
  • "Water level"
  • "SELECT"
使用双引号 (
"
) 作为分隔符。
在标识符中,使用除
"
字符以外的所有其他字符。
标识符末尾的任何空格都将被忽略。

联接

支持任何类型(如
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
SELECT * FROM Table1 WHERE Column1 IN (10, 20, 30)
BETWEEN
SELECT * FROM Table1 WHERE Column1 BETWEEN 100 AND 200
LIKE
... WHERE column1 LIKE '%a'
... WHERE column1 LIKE '%a%'
... WHERE column1 LIKE '%bbpi!%ppo%' ESCAPE '!'
EXISTS
... WHERE EXISTS (SELECT Table1.Column1 FROM Table2)
IS
... WHERE column1 IS NULL
NOT
... WHERE column1 IS NOT NULL
... WHERE column1 NOT IS (10, 20)
... WHERE column1 NOT BETWEEN 100 AND 200
运算符
NOT
适用于所有其他运算符。
提醒事项:
ANY
ALL
运算符不受支持。

窗口函数

支持的窗口函数
功能
示例
ROW_NUMBER
ROW_NUMBER() OVER (ORDER BY Column2)
ROW_NUMBER() OVER (PARTITION ON Column1 ORDER BY Column2)
ROW_NUMBER() OVER (window_name PARTITION ON Column1 ORDER BY Column2)
RANK
RANK() OVER (PARTITION ON Column1 ORDER BY Column2)
DENSE_RANK
DENSE_RANK() OVER (PARTITION ON Column1 ORDER BY Column2)
AVG
AVG(Column1) OVER (PARTITION BY Column2)
SUM
MIN
MAX
SUM(Column1) OVER (PARTITION BY Column2)
COUNT
COUNT(Column1) OVER (PARTITION BY Column2)
COUNT(*) OVER (PARTITION BY Column2)
提醒事项:
PARTITION BY
子句仅支持列标识符。

标记

支持的标记
令牌
正则表达式
regular_identifier
[a-zA-Z][a-zA-Z0-9_]*
delimited_identifier
".*?"
real
boolean
其他零散的标记
单个字符或单字标记的正则表达式
提醒事项: 词法分析器无法将日期和时间值识别为标记:这些值将被解析为
delimited_identifier
。语义分析器根据
r
正则表达式从
delimited_identifier
中提取任何日期和时间值。
提供反馈
对本文档有问题或反馈吗? 请在这里提交您的反馈