使用说明

更新时间: 2023-08-14 11:54:58

为了让不熟悉SQL语言的用户能方便地从数据库中取数分析,PolarDB for AI联合达摩院推出自研的自然语言到数据库查询语言转义(Nature Language To SQL,简称NL2SQL)解决方案。PolarDB for AI会将用户输入的自然语言(中文或英文)自动转化成所需要的SQL语句,用户只需要执行生成的SQL语句,即可完成一系列查询操作。

说明

目前,NL2SQL处于公测阶段。公测结束日期为2023年9月30日。

前提条件

使用限制

  • SQL语句限制:

    目前只支持DML语句(基本查询、聚合、分组、排序、谓词、嵌套、集合、JOIN、计算等)。

    支持的SQL语法如下:

    QUERY  → AQUERY | AQUERY INTERSECT QUERY | AQUERY UNION QUERY | AQUERY EXCEPT QUERY
    AQUERY → SELECT TERM+ FROM [table_name|QUERY]+ (WHERE COND (CON COND)*)?
             (GROUP BY TERM+)? (HAVING COND (CON COND)*)? (ORDER BY TERM+)?
             (LIMIT number_value)?
    COND   → TERM OP VALUE
    TERM   → AGG? DISTINCT? [*|column_name] (COP column_name)?
    VALUE  → text_value | number_value | QUERY
    AGG    → MAX | MIN | SUM | AVG | COUNT
    OP     → BETWEEN | = | > | < | >= | <= | != | IN | LIKE | NOT IN | NOT LIKE | EXISTS | IS
    COP    → + | - | * | /
    CON    → AND | OR

    参数说明见下表:

    参数名称

    参数说明

    QUERY

    SQL语句。

    AQUERY

    原子粒度、不可再分的子查询语句(不包含嵌套、集合操作等)。

    COND

    查询条件。

    VALUE

    条件值。

    AGG

    聚合函数。

    OP

    条件操作符。

    COP

    列运算符。

    CON

    逻辑运算符。

    table_name

    表名。

    column_name

    列名。

    text_value

    字符串类型的值。

    number_value

    数值类型的值。

  • 数据库中表的列数限制:

    • 中文环境下,数据库中表的总列数不超过300列。

    • 英文环境下,数据库中表的总列数不超过100列。

  • 地域限制:仅支持在中国内地使用NL2SQL。

  • COMMENT限制:

    • 中文环境下,表名和列名的COMMENT为中文。

    • 英文环境下,表名和列名的COMMENT为英文。

注意事项

  • 少量NL2SQL结果会不准确,且并发过高的情况下会引发NL2SQL可用性问题。

  • 为了提高NL2SQL结果的准确性,使得查询结果达到预期效果,在使用NL2SQL前,需要针对性规范化配置表信息和问句

配置项

为了适配不同行业的个性化需求,NL2SQL提供了一系列配置项,来帮助用户获得更好的使用体验。

配置方式

根据如下建表语句,在数据库中建立polar4ai_nl2sql_config表,添加配置项。

CREATE TABLE `polar4ai_nl2sql_config` (
  `config_type` int(11) NOT NULL,
  `config_key` varchar(1024) NOT NULL,
  `config_value` text NOT NULL
)

其中涉及的配置参数说明如下表:

配置参数说明

参数名称

参数说明

config_type

配置类型。取值如下:

  • 0:表示此行为基础配置,具体由config_key确定。

  • 1:表示此行为领域术语。

config_key

配置项的key。取值如下:

  • 当config_type为0时,可取值time_format_type、time_format_str等,具体见下表

  • 当config_type为1时,可填写领域术语的key值。

config_value

配置项的value。取值需要为JSON字符串格式。

说明

当config_key为领域术语的key值时,config_value是config_key对应的替换词,取值必须是以英文分号拼接成的字符串,具体说明见下表

具体配置示例如下表:

config_type

config_key

config_value取值说明

config_value样例

0

time_format_type

  • 0:不做任何操作。

  • 1:将时间识别为日期:yyyy年mm月dd日。

  • 2:将时间识别为完整时间:yyyy年mm月dd日HH点MM分SS秒。

  • 3:将日期和时间分开,时间部分只支持小时级别,日期部分只支持固定日期。

0

0

time_format_str

需要按Python的格式标准指定时间格式。

例如:

  • "%Y-%m-%d %H:%M:%S":2016-03-20 11:45:39

  • "%a %b %d %H:%M:%S %Y":Sat Mar 28 22:24:24 2016

%Y-%m-%d %H:%M:%S

0

datetime_columns

指示分区表里的时间,默认分别为日期和时间段,date和time_period各对应一个长度为2的列表: ["描述名", “表名.列名”]。

  • 当时间类型参数time_format_type为1或2时,使用date对应描述。

  • 当时间类型参数time_format_type为3时,同时使用date结合time_period的描述。

说明
  • 可将默认描述替换成其他表述,例如:将“时间段”替换成“小时区间”。

  • 表名.列名可以是null,表示由NL2SQL的底层模型推算涉及时间的列。

[

"date": ["日期","table.date"],

"time_period":

["时间段", null]

]

0

time_now

表示当前问题中提出的时间。默认是当前时间,也可以用来指定日期。

2023-06-14: 00:00:00

0

default_conds

表示用户问题的默认条件,以列表形式呈现,每个值是一个条件。

例如:

店家问店铺销量,默认条件是自己的店铺,那么条件应该是"shop.shop_name = ''ABC"。

[

"table_name.column_name = ''ABC"

]

0

integrated

表示是否需要将生成的SQL进行合并。

  • 1:表示自动将多条SQL合并为一条SQL语句。

  • 0:表示以列表形式返回每条SQL。

0

1

进销存

领域术语配置。config_key列中表示专有的领域词汇,如“销冠”“进销存”等,config_value写入标准化的描述,对应的是表的相关列说明。如果在用户问题中出现了config_key的词,会替换成相应的config_value中的词。

例如:

  • config_key=销冠,config_value=总销售金额排名最高的店员。

  • config_key=进销存,config_value=进货情况;销售情况;存货情况。

进货情况;

销售情况;

存货情况

说明
  • 当具体取值在上述取值范围外时,所取值将被无视。

  • 当config_value设置有误时,将会报出错误提示。

完整配置示例

  • 场景一:假设用户指定日期是2023年8月1号,则可进行如下配置:

    config_type

    config_type

    config_value

    0

    time_now

    2023-08-01: 00:00:00

    按照如上配置,那么用户问题中“今天”就是指2023年的8月1号。

  • 场景二:假设用户问店铺销量,默认条件是自己的店铺(店铺名:shop_name="ABC"),则可进行如下配置:

    config_type

    config_type

    config_value

    0

    default_conds

    "shop.shop_name = ''ABC"

    按照如上配置,那么用户问题的默认条件就变成自己的店铺名“ABC”。

  • 场景三:假设用户会通过自然语言去筛选店里的销冠,则可进行如下配置:

    config_type

    config_type

    config_value

    1

    销冠

    销售量排名最高的店员;总销售金额排名最高的店员

    按照如上配置,如果在用户问题中出现了“销冠”,会替换成“销售量排名最高的店员;总销售金额排名最高的店员”。

  • 场景四:假设用户会通过自然语言去筛选订单的销售情况,则可进行如下配置:

    config_type

    config_type

    config_value

    1

    孖单

    销售量超过1的订单

    按照如上配置,如果在用户问题中出现“孖单”,会替换成“销售量超过1的订单”。

示例

中文环境

课程安排

  1. 根据如下建表语句在数据库中创建3张表,分别为课程表、教师表和课程安排表。

    其中,COMMENT为中文,PRIMARY KEY、FOREIGN KEY等约束尽量完整,以保证NL2SQL识别的准确性。

    CREATE TABLE course (
    Course_ID int COMMENT '课程ID',
    Starting_Date text COMMENT '起始日期',
    Course text COMMENT '课程名称',
    PRIMARY KEY (Course_ID)
    ) COMMENT '课程';
    
    CREATE TABLE teacher (
    Teacher_ID int COMMENT '教师ID',
    Name text COMMENT '姓名',
    Age text COMMENT '年龄',
    Hometown text COMMENT '家乡',
    PRIMARY KEY (Teacher_ID)
    ) COMMENT '教师';
    
    CREATE TABLE course_arrange (
    Course_ID int COMMENT '课程ID',
    Teacher_ID int COMMENT '教师ID',
    Grade int COMMENT '年级',
    PRIMARY KEY (Course_ID, Teacher_ID, Grade),
    FOREIGN KEY (Course_ID) REFERENCES `course`(Course_ID),
    FOREIGN KEY (Teacher_ID) REFERENCES `teacher`(Teacher_ID)
    ) COMMENT '课程安排';
  2. 在创建的表中插入一些数据,样例数据如下表:

    course表

    Course_ID

    Starting_Date

    Course

    1

    5月5日

    语文

    2

    5月6日

    数学

    3

    5月7日

    历史

    teacher表

    Teacher_ID

    Name

    Age

    Hometown

    1

    张三

    32

    北京

    2

    李四

    29

    上海

    3

    王五

    33

    广州

    course_arrange表

    Course_ID

    Teacher_ID

    Grade

    1

    3

    1

    2

    1

    3

    3

    2

    5

  3. 在数据库中输入自然语言。

    /*polar4ai*/按照老师名字的字母升序排列,显示老师的名字和安排他们教的课程名称。

    经过NL2SQL转换后的SQL语句如下:

    SELECT course.course , teacher.name FROM teacher JOIN course_arrange ON teacher.teacher_id = course_arrange.teacher_id JOIN course ON course_arrange.course_id = course.course_id ORDER BY teacher.name ASC;

汽车制造

  1. 根据如下建表语句,在数据库中创建5张表,分别为车辆数据、汽车品牌、车型列表、制造商和国家。

    其中,COMMENT为中文,PRIMARY KEY、FOREIGN KEY等约束尽量完整,以保证NL2SQL识别的准确性。

    CREATE TABLE countries (
    	CountryId INTEGER COMMENT '国家ID', 
    	CountryName VARCHAR(30) COMMENT '国家名称', 
    	Continent VARCHAR(30) COMMENT '洲',
    	PRIMARY KEY(CountryId)
    ) comment '国家';
    
    CREATE TABLE car_makers ( 
    	ID INTEGER COMMENT '制造商ID',  
    	Maker VARCHAR(30) COMMENT '制造商名称',
      FullName VARCHAR(30) COMMENT '制造商全称',
      Country INTEGER COMMENT '国家ID',
      PRIMARY KEY(ID),
      FOREIGN KEY (Country) REFERENCES countries (CountryId)
    ) COMMENT '制造商';
    
    
    CREATE TABLE model_list ( 
    	ModelID INTEGER COMMENT '车型ID', 
    	MakerID INTEGER COMMENT '制造商ID', 
    	Model VARCHAR(30) COMMENT '汽车型号',
      PRIMARY KEY(ModelID),
      FOREIGN KEY (MakerID) REFERENCES car_makers (ID)
    ) COMMENT '车型列表';
    CREATE UNIQUE INDEX model_list_Model_uniq ON model_list(Model)
    
    CREATE TABLE car_names ( 
    	MakeId INTEGER COMMENT '品牌ID', 
    	Model VARCHAR(30) COMMENT '车辆型号', 
    	Make VARCHAR(30) COMMENT '品牌名称',
      PRIMARY KEY(MakeId),
      FOREIGN KEY (Model) REFERENCES model_list (Model)
    ) COMMENT '汽车品牌';
    
    CREATE TABLE cars_data (
      Id INTEGER COMMENT '品牌ID', 
    	MPG VARCHAR(30) COMMENT '每加仑行驶的英里数', 
    	Cylinders INTEGER COMMENT '汽缸数量',  
    	Edispl REAL COMMENT 'edispl', 
    	Horsepower VARCHAR(30) COMMENT '马力', 
    	Weight INTEGER COMMENT '重量', 
    	Accelerate REAL COMMENT '加速', 
    	MnftYear INTEGER COMMENT '制造年份',
      PRIMARY KEY(Id),
    	FOREIGN KEY (Id) REFERENCES car_names (MakeId)
    ) COMMENT '车辆数据';
  2. 在创建的表中插入一些数据,样例数据如下表:

    countries表

    CountryId

    CountryName

    Continent

    1

    美国

    美洲

    2

    德国

    欧洲

    3

    法国

    欧洲

    4

    日本

    亚洲

    5

    意大利

    欧洲

    car_makers表

    ID

    Maker

    FullName

    Country

    1

    切诺基

    American Motor Company

    1

    2

    大众

    Volkswagen

    2

    3

    宝马

    BMW

    2

    4

    通用汽车

    General Motors

    1

    5

    福特

    Ford Motor Company

    1

    8

    日产

    Nissan Motors

    4

    9

    菲亚特

    Fiat

    5

    model_list表

    ModelID

    MakerID

    Model

    1

    1

    切诺基

    2

    2

    奥迪

    3

    3

    宝马

    4

    4

    别克

    12

    9

    菲亚特

    13

    5

    福特

    20

    8

    日产

    car_names表

    MakeId

    Model

    Make

    4

    切诺基

    amc rebel sst

    5

    福特

    ford torino

    6

    福特

    ford galaxie 500

    28

    奥迪

    audi 100 ls

    30

    宝马

    bmw 2002

    389

    日产

    nissan stanza xe

    cars_data表

    Id

    MPG

    Cylinders

    Edispl

    Horsepower

    Weight

    Accelerate

    MnftYear

    4

    16

    8

    304

    150

    3433

    12

    1970

    5

    17

    8

    302

    140

    3449

    10.5

    1970

    6

    15

    8

    429

    198

    4341

    10

    1970

    28

    24

    4

    107

    90

    2430

    14.5

    1970

    30

    26

    4

    121

    113

    2234

    12.5

    1971

    389

    36

    4

    120

    88

    2160

    14.5

    1982

  3. 在数据库中输入自然语言。

    /*polar4ai*/哪个国家的汽车制造商最多?

    经过NL2SQL转换后的SQL语句如下:

    SELECT countries.countryname FROM car_makers JOIN countries ON car_makers.country = countries.countryid GROUP BY car_makers.country ORDER BY count(*) DESC LIMIT 1;

英文环境

课程安排

  1. 根据如下建表语句在数据库中创建3张表,分别为课程表、教师表和课程安排表。

    其中,COMMENT为英文,PRIMARY KEY、FOREIGN KEY等约束尽量完整,以保证NL2SQL识别的准确性。

    CREATE TABLE course (
    Course_ID int COMMENT 'course id',
    Starting_Date text COMMENT 'starting date',
    Course text COMMENT 'course',
    PRIMARY KEY (Course_ID)
    ) COMMENT 'course';
    
    CREATE TABLE teacher (
    Teacher_ID int COMMENT 'teacher id',
    Name text COMMENT 'name',
    Age text COMMENT 'age',
    Hometown text COMMENT 'hometown',
    PRIMARY KEY (Teacher_ID)
    ) COMMENT 'teacher';
    
    CREATE TABLE course_arrange (
    Course_ID int COMMENT 'course id',
    Teacher_ID int COMMENT 'teacher id',
    Grade int COMMENT 'grade',
    PRIMARY KEY (Course_ID, Teacher_ID, Grade),
    FOREIGN KEY (Course_ID) REFERENCES `course`(Course_ID),
    FOREIGN KEY (Teacher_ID) REFERENCES `teacher`(Teacher_ID)
    ) COMMENT 'course arrange';
  2. 在创建的表中插入一些数据,样例数据如下表:

    course表

    Course_ID

    Starting_Date

    Course

    1

    5 May

    Language Arts

    2

    6 May

    Math

    3

    7 May

    History

    teacher表

    Teacher_ID

    Name

    Age

    Hometown

    1

    Joseph Huts

    32

    Blackrod Urban District

    2

    Gustaaf Deloor

    29

    Bolton County Borough

    3

    Vicente Carretero

    33

    Farnworth Municipal Borough

    course_arrange表

    Course_ID

    Teacher_ID

    Grade

    1

    3

    1

    2

    1

    3

    3

    2

    5

  3. 在数据库中输入自然语言。

    /*polar4ai*/Display the names of the teachers and the courses they teach, sorted in alphabetical order based on the teachers names.

    经过NL2SQL转换后的SQL语句如下:

    SELECT teacher.name , course.course FROM course_arrange JOIN course ON course_arrange.course_id = course.course_id JOIN teacher ON course_arrange.teacher_id = teacher.teacher_id ORDER BY teacher.name ASC

汽车制造

  1. 根据如下建表语句,在数据库中创建5张表,分别为车辆数据、汽车品牌、车型列表、制造商和国家。

    其中,COMMENT为英文,PRIMARY KEY、FOREIGN KEY等约束尽量完整,以保证NL2SQL识别的准确性。

    CREATE TABLE countries (
    	CountryId INTEGER COMMENT ' id', 
    	CountryName VARCHAR(30) COMMENT 'country name', 
    	Continent VARCHAR(30) COMMENT 'continent',
    	PRIMARY KEY(CountryId)
    ) COMMENT 'countries';
    
    CREATE TABLE car_makers ( 
    	ID INTEGER COMMENT 'maker id',  
    	Maker VARCHAR(30) COMMENT 'maker',
      FullName VARCHAR(30) COMMENT 'full name',
      Country INTEGER COMMENT 'country',
      PRIMARY KEY(ID),
      FOREIGN KEY (Country) REFERENCES countries (CountryId)
    ) COMMENT 'car makers';
    
    CREATE TABLE model_list ( 
    	ModelID INTEGER COMMENT 'model id', 
    	MakerID INTEGER COMMENT 'maker id', 
    	Model VARCHAR(30) COMMENT 'model',
      PRIMARY KEY(ModelID),
      FOREIGN KEY (MakerID) REFERENCES car_makers (ID)
    ) COMMENT 'model list';
    CREATE UNIQUE INDEX model_list_Model_uniq ON model_list(Model)
    
    CREATE TABLE car_names ( 
    	MakeID INTEGER COMMENT 'make id', 
    	Model VARCHAR(30) COMMENT 'model', 
    	Make VARCHAR(30) COMMENT 'make',
      PRIMARY KEY(MakeId),
      FOREIGN KEY (Model) REFERENCES model_list (Model)
    ) COMMENT 'car names';
    
    CREATE TABLE cars_data (
      Id INTEGER COMMENT 'id', 
    	MPG VARCHAR(30) COMMENT 'mpg', 
    	Cylinders INTEGER COMMENT 'cylinders',  
    	Edispl REAL COMMENT 'edispl', 
    	Horsepower VARCHAR(30) COMMENT 'horsepower', 
    	Weight INTEGER COMMENT 'weight', 
    	Accelerate REAL COMMENT 'accelerate', 
    	MnftYear INTEGER COMMENT 'year',
      PRIMARY KEY(Id),
    	FOREIGN KEY (Id) REFERENCES car_names (MakeId)
    ) COMMENT 'cars data';
  2. 在创建的表中插入一些数据,样例数据如下表:

    countries表

    CountryId

    CountryName

    Continent

    1

    USA

    America

    2

    Germany

    Europe

    3

    France

    Europe

    4

    Japan

    Asia

    5

    italy

    Europe

    car_makers表

    ID

    Maker

    FullName

    Country

    1

    amc

    American Motor Company

    1

    2

    volkswagen

    Volkswagen

    2

    3

    bmw

    BMW

    2

    4

    gm

    General Motors

    1

    5

    ford

    Ford Motor Company

    1

    8

    nissan

    Nissan Motors

    4

    9

    fiat

    Fiat

    5

    model_list表

    ModelID

    MakerID

    Model

    1

    1

    amc

    2

    2

    audi

    3

    3

    bmw

    4

    4

    buick

    12

    9

    fiat

    13

    5

    fold

    20

    8

    nissan

    car_names表

    MakeId

    Model

    Make

    1

    chevrolet

    chevrolet chevelle malibu

    4

    amc

    amc rebel sst

    5

    ford

    ford torino

    6

    ford

    ford galaxie 500

    28

    audi

    audi 100 ls

    30

    bmw

    bmw 2002

    389

    nissan

    nissan stanza xe

    cars_data表

    Id

    MPG

    Cylinders

    Edispl

    Horsepower

    Weight

    Accelerate

    MnftYear

    1

    18

    8

    307

    130

    3504

    12

    1970

    4

    16

    8

    304

    150

    3433

    12

    1970

    5

    17

    8

    302

    140

    3449

    10.5

    1970

    6

    15

    8

    429

    198

    4341

    10

    1970

    28

    24

    4

    107

    90

    2430

    14.5

    1970

    30

    26

    4

    121

    113

    2234

    12.5

    1971

    389

    36

    4

    120

    88

    2160

    14.5

    1982

  3. 在数据库中输入自然语言。

    /*polar4ai*/which of the countries has the most car makers? list the country name.

    经过NL2SQL转换后的SQL语句如下:

    SELECT countries.countryname FROM countries JOIN car_makers ON countries.countryid = car_makers.country GROUP BY car_makers.country ORDER BY count(*) DESC LIMIT 1
阿里云首页 云原生数据库 PolarDB 相关技术圈