选择数据库表后,您可以导入数据或生成查询。“查询生成器”可让您通过交互方式创建数据库查询,而无需编写 SQL 表达式。
选择数据库表和连接表(若有必要)后,点击生成查询以打开“查询生成器”窗口。通过选择要包含的列以及指定抽样和过滤条件,您可以继续改进查询。您也可以保存查询,以便以后再次编辑和运行。
所有数据库表中的列将显示在“可用列”列表中。诸如 t1 和 t2 的前缀(也称为别名)将每列与相应的数据库表相关联。
要跳过“查询生成器”步骤并导入所有数据,请点击立即导入。
注意:“表”菜单中的“JMP 查询生成器”提供许多相同的选项,但支持您查询和连接 JMP 数据表。请参见“使用 JMP 查询生成器查询和连接数据表”。
假设您想按电影类型、分级和人口统计数据(例如,婚姻状况和年龄)来查看电影租赁情况。
注意:“查询生成器”示例基于的数据库并未随 JMP 安装。
1. 选择文件 > 新建 > 数据库查询,连接至数据库,然后选择 SQBTest 架构。请参见连接至数据库。
2. 在“选择要查询的表”窗口中,选择 g6_Customers,然后点击主表。
3. 选择 g6_Movies 和 g6_Rentals,然后点击副表。
4. 点击生成查询以显示“查询生成器”窗口。
5. 在“可用列”框中,选择 t1.Gender、t1.Age、t1.Married、t1.KidsUnder12、t2.Rating 和 t2.Genre。
6. 在“已包括的列”选项卡上点击添加。
图 3.39 选定列
注意:
‒ 若查询中包含八个或八个以上的表,搜索框会显示在左上角附近的表名上方。要在长列表中查找一列,请在“可用列”下方的搜索框中输入名称。红色小三角菜单提供了用于区分大小写和使用正则表达式进行搜索的选项。要隐藏搜索框,请从“可用列”红色小三角菜单中取消选择显示搜索框。
‒ 引用列不再显示在“可用列”列表中,因为查询中不支持它们。
‒ 您可以更改列宽,只需从“已包括的列”列表的“格式”列表中选择一个选项即可。
7. 选择列下方的 SQL 选项卡以查看用于查询的 SQL 语句。在您运行查询后,该代码将保存为数据表属性。
8. 点击右下角的保存。
您的工作将保存为 g6_Customers.jmpquery 文件,您可以稍后打开该文件以返回至此处或运行该查询。
9. 点击运行查询以导入数据。
数据表包括以下脚本:
‒ 运行“源”脚本可重新连接至数据库并导入数据。
‒ 运行“修改查询”脚本可在“查询生成器”中打开查询。
‒ 运行“从数据库更新”脚本可重新导入并刷新数据。
提示:
• 要重命名列,请在“已包括的列”选项卡中双击“JMP 名称”并输入一个新名称。
• 要重命名别名,请在“选择要查询的表”窗口中右击该表,然后选择更改别名。别名不区分大小写。
• 查询将在后台运行,除非您在“查询生成器”的 ODBC 首选项中取消选择在后台运行查询(若可能)。您还可以通过选择视图 > 正在运行的查询来检查所有 ODBC 查询的进度。
注意:对于“SAS 查询生成器”,所有查询都在前台运行。
• 若预览加载过慢,请取消选择自动更新预览。点击“查询预览”选项卡下方的更新可更新数据视图。若您经常使用大型数据库,请考虑更改“JMP 查询生成器”首选项中的“预览”选项。考虑限制可以预览的最大行数。在“JMP 查询生成器”首选项中,更改要预览的最大行数的值。
• 要忽略数据库中的重复行,请在“已包括的列”选项卡中选择仅非重复行。
若向查询添加 JMP 17 功能,该查询将不再能在 JMP 12 中加载。若使用的是 JMP 13,但您需要创建仍能在 JMP 12 中运行的查询,请在“查询生成器”首选项中选择令该查询保持与 JMP 12 兼容。选择该选项后,导致兼容性问题的功能将在“查询生成器”中隐藏。
准备好将 JMP 12 查询移至之后的版本后,取消选择该首选项。
您可以根据现有列创建新列。您可以计算两列的均值,然后将均值存储在一个新列中。日期时间值的格式可能不正确。从“可用列”红色小三角中,选择添加计算的列,然后在公式编辑器中创建新列。
假设您想计算在租赁期内您最多可以观看多少次电影。您要查询的数据库包含每部电影的长度和该电影外借天数。本例显示了如何根据这些数据创建新的计算列。
注意:“查询生成器”示例基于的数据库并未随 JMP 安装。
1. 选择文件 > 新建 > 数据库查询,连接至数据库,然后选择 SQBTest 架构。请参见连接至数据库。
2. 在“选择要查询的表”窗口中,选择 g6_Rentals 作为主表,g6_Movies 作为副表。
3. 点击生成查询以显示“查询生成器”窗口。
4. 点击“可用列”红色小三角并选择添加计算列。
随即显示“计算列”窗口。该窗口包含“JMP 公式编辑器”。
图 3.40 包含公式编辑器的“计算列”窗口
注意:
‒ “公式编辑器”左侧的列表中提供了运算符和函数(图 3.40)。在某些实例中,您需要基于数据库更改服务器类型。
‒ “运算符”列表不提供拼接 (||) 运算符。您必须在“公式编辑器”框中键入公式。
5. 从左侧的 g6_Rentals 列表中选择 Days Out,然后点击乘号 按钮。
图 3.41 计算列
6. 选择空白框,键入 (24 * 60,然后按 Enter 键。
该公式将一小时内的分钟数乘以一天内的分钟数。请注意,当您键入第一个圆括号时,第二个圆括号将会自动插入。
图 3.42 公式的第一部分
7. 点击外部框以选择整个等式,然后点击除号 按钮。
8. 从左侧列表中选择 g6_Movies,然后选择 LengthMins。
图 3.43 公式的第二部分
9. 点击确定。
随即创建了名为 Calc1 的新列。
10. 右击该列,然后选择重命名列。
11. 键入 MaximumTimesWatched,然后点击确定。
12. 在“可用列”列表中,选择 MaximumTimesWatched,然后点击添加。
13. 选择 t2.Name,然后点击添加。
在“查询预览”选项卡中,注意到“Nanny McPhee”可在电影租借期内观看 160 次。
将数据导入 JMP 前,您可以合并常用值(或对其进行分组)。要对常用值进行分组,请选择“聚合”函数以确定如何计算常用值。
注意:聚合支持基于您的数据库。请参见数据库文档。
假设您关注特定电影的租赁次数。在本例中,将计算每一个项目编号的计数,并将常用电影值分组至单个行中。
注意:“查询生成器”示例基于的数据库并未随 JMP 安装。
1. 选择文件 > 新建 > 数据库查询,连接至数据库,然后选择 SQBTest 架构。详细信息,请参见连接至数据库。
2. 在“选择要查询的表”窗口中,选择 g6_Movies 作为主表,g6_Rentals 作为副表。
3. 点击生成查询以显示“查询生成器”窗口。
4. 在“可用列”框中,选择 t1.Name 和 t2.ItemNo,然后点击添加。
5. 选择 t2.ItemNo,然后从“聚合”列表中选择计数。
t1.Name 对应的“分组依据”复选框已选中。特定电影名称的所有实例将被分组在一行中。
图 3.44 分组列
6. 点击运行查询以导入数据。
7. 在数据表中,右击计数-ItemNo 列,然后选择排序 > 降序。
“Scarface”租借频率最高。
图 3.45 已排序的“计数-ItemNo”列的部分视图
提示:
• 要清除已分组的行,请从列的“聚合”列表中选择无。
• DISTINCT 聚合函数仅显示包含非重复值的行。包含重复值的行将被忽略。当数据库中包含很多重复值时,这些函数很有用。
对于大型数据库,考虑对数据进行抽样。抽样可返回行的子集并缩短查询时间。数据库查询运行,并且根据您在“样本”选项卡上选择的选项导入一小部分数据。
抽样方法因数据库供应商而有所不同。
• SQL 服务器默认支持分区抽样。分区样本包含一整页的行(例如第 1 页和第 5 页上的所有行)。若您选择 1,000 行,则导入约 1,000 行。
• Oracle 和其他数据库支持行抽样。若您选择 5,000 行,则每个样本通常可导入 4,800 至 5,200 行,具体取决于 Oracle 如何循环数据。
对于主要数据库供应商,JMP 可对功能进行检测,并在可能的情况下提供特定于供应商的选项。供应商不支持的功能在“样本”选项卡上不可用。
假设您想导入数据样本。在本例中,您选择 5,000 个随机行。
注意:“查询生成器”示例基于的数据库并未随 JMP 安装。
1. 选择文件 > 新建 > 数据库查询,连接至数据库,然后选择 SQBTest 架构。详细信息,请参见连接至数据库。
2. 在“选择要查询的表”窗口中,选择 g6_Rentals 作为主表,g6_Movies 作为副表。
3. 点击生成查询以显示“查询生成器”窗口。
4. 在“已包括的列”选项卡上,点击全部添加按钮。
5. 点击样本选项卡,然后选择对该结果集抽样。
6. 选择随机 N 行,然后输入 5,000。
在“抽样方式”区域中,根据数据库支持的抽样类型,“分区或页面”是唯一选项。
7. 点击运行查询以导入数据。
新的数据表包含约 5,000 行。通过分区或页面抽样,您获得的样本第一次可能包含 4,900 行,下一次可能包含 5,600 行。
提示:
• 要在每次运行查询时重新创建相同的样本集,请将“种子”值设置为不大于 64,000 的正整数。假设您想按性别查询电影租借情况。键入 1 作为“种子”值,然后运行查询。结果中男性客户的分布过低。键入 2 作为“种子”值,然后再次运行查询。重复该过程以找到生成男性和女性相似分布情况的“种子”值。
• 要在“已包括的列”选项卡中添加单个列,右击该列然后选择包括列或点击添加按钮。
添加过滤器可将选定过滤器中的值的一个子集导入数据表。若查询与 JMP 12 兼容,某些过滤器则不可用。请参见保持与 JMP 12 兼容。
简单比较
使用指定的运算符匹配值。
年龄 > 14 匹配大于 14 岁的年龄。
范围
使用指定的运算符匹配一定范围内的值。
12 ≤ 年龄 ≤ 17 匹配 12-17 岁之间的年龄。
Is NULL 或 Is Not NULL
匹配缺失值。
NULL 或 not NULL 匹配缺失值和非缺失值。
自定义表达式
支持您自行编写 SQL 表达式。
( ( ( t2.Gender IN ( 'F' ) ) AND ( (t2.Age >= 20) AND (t2.Age <= 50) ) ) )
匹配 F 性别。它还匹配 20-50 岁之间的年龄。
列表框
显示一个列表框,从中可选择一个或多个值。“列表框”是基于“查询生成器”首选项的分类列的默认过滤器。
手动列表
支持您输入列值。
复选框列表
显示复选框列表。
注意:“列表框”、“手动列表”和“复选框列表”都包括一个未在列表中选项,该选项支持您检索与选定值不匹配的行。
包含
匹配包含或不包含指定值的字符串。Contains Comedy OR Romance 匹配 Comedy 和 Romance。
对于大多数分类列,过滤器默认为一个列表框。对于包含超过 1,000 个水平的列,会自动选择“包含”过滤器。您可以在“查询生成器”首选项中更改水平数。
Like 或 Not Like
匹配与指定值相似或不相似的字符串。支持 % 通配符(0 或更多字符)和 _ 通配符(恰好一个字符)。
Genre Like %com 匹配“com”之前任意个数的字符,就像在“RomCom”中一样。若还要匹配“Comedy”,请使用 %com% 或 Contains com。
匹配列值
匹配指定的列值。先选择表,再选择列。选择非匹配选项支持您过滤除选定行之外的所有行。相关示例,请参见从现有数据表中导入匹配数据。
本例显示如何导入满足以下条件的数据:年龄为 30 岁以上(包括 30 岁)的客户,类型为 RomCom 和 Comedy 的电影。
注意:“查询生成器”示例基于的数据库并未随 JMP 安装。
1. 选择文件 > 新建 > 数据库查询,连接至数据库,然后选择 SQBTest 架构。请参见连接至数据库。
2. 在“选择要查询的表”窗口中,选择“可用表”列表中的 g6_Rentals,然后点击主表。
3. 选择 g6_Customers 和 g6_Movies,然后点击副表。
4. 点击生成查询以显示“查询生成器”窗口。
5. 在“可用列”框中,选择 t2.Gender、t2.Age 和 t3.Genre,然后点击“已包括的列”选项卡中的添加。
6. 选择“已包括的列”选项卡中的所有列,然后点击将选定项添加至过滤器 。
适用于这些列的过滤器随即出现在“过滤器”分级显示项中。
7. 将 t2.Age 过滤器设置为“≥ 30”。
8. 点击 t3.Genre 红色小三角并选择 Like,键入 %com%,然后按 Enter 键。
% 通配符与“com”之前和之后的任意字符数匹配。在“查询预览”选项卡中,注意到类型为“RomCom”和“Comedy”的电影会显示出来。
图 3.46 选择过滤器
9. 点击“过滤器”红色小三角并选择全部运行时提示。
运行查询的用户可定制这些过滤器。
10. 点击运行查询。
11. 在“查询提示”窗口中,点击确定以应用预选的过滤器并导入数据。
注意:
• 对于大多数分类列,过滤器默认为一个列表框。对于包含超过 1,000 个水平的列,会自动选择“包含”过滤器。您可以在“查询生成器”首选项中更改水平数。
• 过滤器的红色小三角菜单中的“条件”选项支持您过滤分层类别中的数据。例如,假定您有一个“州”过滤器和一个“城市”过滤器。要选择某个州,然后只显示该州中的城市,请点击“城市”红色小三角并选择“条件”。
• “过滤器”列表顶部的“反转”选项支持您为所有过滤器选择指定行以外的所有行。该选项不可用于选择所有行的过滤器。
• 过滤器列表中的“<空>”指示对于该列,数据库包含缺失值。
• 要针对大量分类数据列创建过滤器,JMP 会尝试确定表中的行数。
‒ 默认选定称为为无法确定大小的表检索类别水平的“查询生成器”首选项,以便 JMP 自动检索水平。若取消选择该首选项,则会选定“查询生成器”首选项中的“包含”备选过滤器类型。
‒ 若分类列超过一百万行,JMP 不会自动检索过滤列的唯一类别水平。称为表中将要自动检索类别水平的最大行数的“查询生成器”首选项支持最小值为 -1(无限制),最大值为 10 亿行。
• 除非选定令该查询保持与 JMP 12 兼容“查询生成器”首选项,否则分类列的默认过滤器是列表框。
您还可以从打开的数据表中选择与查询中的列相匹配的行。考虑包含航空公司数据的数据库。该数据库中包含飞行时间和机尾编号之类的数据。您还有一个包含机尾编号数据的数据表。使用“匹配列值”过滤器可以仅导入机尾编号匹配的数据。
注意:“查询生成器”示例基于的数据库并未随 JMP 安装。
1. 选择帮助 > 样本数据文件夹,然后打开 Air Traffic.jmp。
2. 选择文件 > 新建 > 数据库查询,连接至数据库,然后选择 SQBTest 架构。请参见连接至数据库。
3. 在“选择要查询的表”窗口中,选择“可用表”列表中的 g5_AIRLINE_ONTIMEPERF,然后点击主表。
4. 点击生成查询以显示“查询生成器”窗口。
5. 在“已包括的列”选项卡中,点击全部添加。
6. 选择“已包括的列”选项卡中的 t1.TailNum,然后点击将选定项添加至过滤器 。
7. 点击“过滤器”列中的 t1.TailNum 红色小三角,选择过滤器类型,然后选择匹配列值。
8. 选择匹配表中的值下方的 Air Traffic。
9. 选择机尾编号列,然后选择列表中的所有行 (38,118)。
“查询预览”选项卡中的数据视图会更新以显示已过滤的值。
10. 点击运行查询以导入数据。
数据表仅包括机尾编号列中包含的那些行的数据。
若不想通过选择所提供的过滤器来生成数据子集,您还可以编写自定义 SQL 表达式来生成数据子集。
注意:“查询生成器”示例基于的数据库并未随 JMP 安装。
1. 选择您想过滤的列(在选择过滤器以导入数据子集中有相关说明)。
2. 点击“过滤器”红色小三角并选择添加自定义表达式。
3. 在“自定义表达式”框中键入以下文本:
( ( ( t2.Gender IN ( 'F' ) ) AND ( (t2.Age >= 20) AND (t2.Age <= 50) ) ) )
4. 在“自定义表达式”框外部点击,以更新“查询预览”选项卡。
该表达式匹配 F Gender。它还匹配 20-50 岁之间的 Age。
图 3.47 编写自定义过滤器表达式
您可以将特定列中的行按值排序,以控制数据在数据表中的显示方式。在本例中,您对“Married”列按降序排序,然后先后按年龄和身高对数据进行排序。
注意:“查询生成器”示例基于的数据库并未随 JMP 安装。
1. 选择文件 > 新建 > 数据库查询,连接至数据库,然后选择 SQBTest 架构。请参见连接至数据库。
2. 在“选择要查询的表”窗口中,选择 g4_bigclass 作为主表。
3. 点击生成查询以显示“查询生成器”窗口。
4. 在“已包括的列”选项卡中,点击全部添加。
5. 选择 t1.age 和 t1.height,然后点击按选定项排序 。
这些列显示在右侧列的“排序方式”分级显示项中。
这些列首先按 age(从小到大)排序,然后按 height(从低到高)排序。
图 3.48 选择“排序方式”列
6. 在“排序方式”分级显示项中,选择 t1.height,然后点击这些列下方的将值按降序排序 。
height 列按从高到低进行排序。
7. 选择 t1.height,然后点击在列表中上移选定项 。
height 列先排序。age 列中的值在 height 的每个水平内排序。若 height 为 68,则 age 从 14 到 17 进行排序。
图 3.49 列重新排序后的结果
在“查询状态”选项卡中,查看后台运行的查询状态。显示查询名称、SQL 语句和已处理的记录数。您可以随时停止查询,仅查看已处理的记录。要从其他 JMP 窗口查看后台查询,请选择视图 > 正在运行的查询。若您从“查询生成器”首选项中取消选择在后台运行查询(若可能),则不会提供状态详细信息。
注意:对于“查询生成器”中的 SAS 连接,所有查询和查询预览都在前台运行。
在“查询后脚本”选项卡中编写 JSL 脚本,该脚本将在您运行查询后运行。例如,您可能想要导入数据,然后创建分布。
Distribution( Column( :age, :gender ) );
该脚本是最终数据表中的“源”脚本的一部分。