基本查询语句
在你开始前
关于本系列
本教程系列讲授从基本到高级SQL和基本的XQuery主题,并展示如何通过使用SQL查询或XQueries将常见的业务问题表达为数据库查询。 开发人员和数据库管理员可以使用本教程来增强他们的数据库查询技能。 学术计划成员可以将此教程系列用作其数据库课程的一部分。
本文档中的所有示例均基于Aroma (一个示例数据库,其中包含在美国各地商店出售的咖啡和茶产品的销售数据)。 每个示例包括三个部分:
- 用日常语言表达的业务问题
- 一个或多个用SQL或XQuery表示的示例查询
- 从数据库返回的结果表
本指南旨在让参与者学习SQL语言和XQuery。 与任何学习一样,重要的是要通过动手练习来补充它。 表定义和数据有助于此操作。
对于将其用作学术课程一部分的学生,请从您的老师那里获取连接到Aroma数据库的说明,并了解指南与本地设置之间的任何差异。
本教程是为DB2 Express-C 9 forUNIX®,Linux®和Windows®(以前称为Viper)编写的。
关于本教程
本教程使用一系列简单示例说明如何使用标准SQL SELECT语句从IBM DB2数据库检索数据。
本教程描述了如何:
- 从关系数据库表中检索行
- 从关系数据库表中检索特定的列
- 从关系数据库表中检索特定的行
- 对检索到的数据执行逻辑运算
- 在搜索条件中使用通配符
连接到数据库
您需要先连接到数据库,然后才能使用SQL语句查询或操作数据。 CONNECT语句将数据库连接与用户名相关联。
从您的教练中找出您需要连接的数据库名称。 在本系列中,数据库名称为aromadb 。
要连接到aromadb数据库,请在DB2命令行处理器中键入以下命令:
CONNECT TO aromadb USER userid USING password
将“ userid”和“ password”替换为您从讲师那里收到的用户ID和密码。 如果不需要用户标识和密码,只需使用以下命令:
CONNECT TO aromadb
以下消息告诉您您已成功建立连接:
Database Connection Information
Database server = DB2/NT 9.0.0
SQL authorization ID = USERID
Local database alias = AROMADB
连接后,即可开始使用数据库。
SELECT语句的六个子句
SQL语句中可以使用六个子句。 这六个子句是SELECT,FROM,WHERE,GROUP BY,HAVING和ORDER BY。 子句必须按特定顺序编码。 让我们在这里简要讨论一下。 在本教程后面的内容中,您将了解有关它们的更多信息。
1.选择 | 列名* |
2.来自 | 表格或视图 |
3.在哪里 | 满足条件或谓词 |
4.分组依据 | 行的子集 |
5.有 | 作为一个共同的条件 |
6.订购 | 排序方法 |
注意 : 列名更正确地称为元素 ,因为SELECT语句同时显示表中存在的列和SQL作为查询结果可能生成的列。
查询示例
SELECT perkey, sum(dollars)
FROM aroma.sales
WHERE perkey < 50
GROUP BY perkey
HAVING sum(dollars) > 8000
ORDER BY perkey;
关于查询
在SELECT子句中,您可以列出感兴趣的列。SELECT显示您在此处放置的内容。 您可以在SELECT中放入其他项目,稍后将进行说明。 在此示例中,选择了perkey列以及dollar列的总和。
FROM子句指示从中获取信息的表。 您可以列出多个表。 您可以列出的表数是特定于您的操作系统的。 在示例中,从“ 销售”表中选择了这两列。
SELECT和FROM是必需的; 这些子句的其余部分是可选的,用于过滤或限制,聚合或合并以及控制排序。
您可以在WHERE子句中指定条件。 这有助于您从结果中过滤掉不需要的数据。 WHERE为您提供表中行的子集。 在该示例中,仅选择了perkey值小于50的行。
GROUP BY使您可以对数据进行分组以获得更有意义的结果。 您可以通过按键细分销售以获取每日销售总额,而不是获得所有选定行的美元销售总额的总和。 在示例中,这通过指示GROUP BY perkey来完成 。
HAVING为您的小组设置了条件。 在该示例中,仅返回总金额大于8,000的那些日子。
ORDER BY对您的结果行进行排序。 您可以选择按ASC(升序)或DESC(降序)顺序对结果进行排序。 默认值为ASC。
SELECT语句是数据操作语言(DML)的最常用用法。 其他DML语句(UPDATE,INSERT和DELETE)以及SQL的其他两个组件(数据定义语言和控制语言)在本系列的第6部分中进行了讨论。
使用SELECT语句检索数据
题
香气数据库中定义了哪些区域,地区和市场?
解
第一步是确定包含可回答此问题的行和列的表。 在第1部分中,有一个AROMADB中的表的图表。 在该图的左下部分,有一个名为Market的表,其中包含标题为mktkey,hq_city,hq_state,region和region的列。 列出该表的内容将回答我们的问题,并且可以使用SQL SELECT语句完成。
查询示例
SELECT * FROM aroma.market;
结果
麦基 | 总部 | 总部 | 区 | 地区 |
---|---|---|---|---|
1个 | 亚特兰大 | GA | 亚特兰大 | 南 |
2 | 迈阿密 | FL | 亚特兰大 | 南 |
3 | 新奥尔良 | 洛杉矶 | 新奥尔良 | 南 |
4 | 休斯顿 | 德克萨斯州 | 新奥尔良 | 南 |
5 | 纽约 | 纽约州 | 纽约 | 北 |
6 | 费城 | 功放 | 纽约 | 北 |
7 | 波斯顿 | 嘛 | 波斯顿 | 北 |
8 | 哈特福德 | 电脑断层扫描 | 波斯顿 | 北 |
9 | 芝加哥 | 白介素 | 芝加哥 | 中央 |
10 | 底特律 | MI | 芝加哥 | 中央 |
11 | 明尼阿波利斯 | MN | 明尼阿波利斯 | 中央 |
12 | 密尔沃基 | 威斯康星州 | 明尼阿波利斯 | 中央 |
14 | 圣荷西 | 认证机构 | 旧金山 | 西方 |
15 | 旧金山 | 认证机构 | 旧金山 | 西方 |
16 | 奥克兰 | 认证机构 | 旧金山 | 西方 |
17 | 洛杉矶 | 认证机构 | 洛杉矶 | 西方 |
19 | 凤凰 | AZ | 洛杉矶 | 西方 |
检索数据:SELECT语句
您可以使用SELECT语句从数据库表中检索数据的列和行; 对数据进行算术运算; 并对数据进行分组,排序或分组和排序。 在大多数情况下,SELECT语句包含一个简单的查询表达式,该表达式以SELECT关键字开头,后跟一个或多个子句或子句。
最基本的SELECT语句包含两个关键字SELECT和FROM:
SELECT column name(s)
FROM table name(s)
列名 | 列名或SQL表达式用逗号分隔。 星号(*)也可用于列出表名称列表中出现的所有列名称 |
表格名称 | 表名称可以是表列表或SELECT语句。 表名用逗号分隔。 引用的表必须包含在SELECT关键字之后引用的列名。 在此的示例FROM语句引用AROMA.MARKET。 稍后将在第3部分“ 表名和模式”中讨论有关此命名约定的更多信息。 在这种情况下,FROM子句引用合格的表名。 第一部分是架构,第二部分是表名称。 模式对于将相似的表和其他DB2对象进行分组很有用。 在AROMADB数据库中,所有表都以AROMA作为模式设置。 |
替代选择语句
SELECT mktkey, hq_city, hq_state, district, region FROM aroma.market
上面的查询产生与SELECT * FROM aroma.market
相同的结果; 但是,不是使用星号(*)列出所有列,而是标识列名。
| 重要:SELECT和FROM(以及所有其他大写字母的单词)是保留SQL关键字。 这些词必须严格按照SQL标准的定义使用。 我们在本文档中使用大写格式,以使关键字易于查看; SQL不区分大小写,因此关键字可以大写或小写。 |
使用说明
本指南每个示例末尾的分号(;)不是SQL语法的必需部分。 按照惯例,SQL语言会忽略多余的空格,制表符和行尾指示符。 因此,分号是语句结束标记,如果仅执行一条语句,则不必使用分号。 对于创建脚本化SQL语句系列的情况,分号为每个语句提供了明确的结尾。 根据用于输入查询的交互式SQL工具,您可能需要也可能不需要指定这样的标记。 当使用命令行处理器执行多个SQL语句时,需要用分号表示每个语句的结尾。
使用SELECT列表检索特定列
题
香气数据库中定义了哪些地区和地区?
查询示例
SELECT district, region
FROM aroma.market;
结果
区 | 地区 |
---|---|
亚特兰大 | 南 |
亚特兰大 | 南 |
新奥尔良 | 南 |
新奥尔良 | 南 |
纽约 | 北 |
纽约 | 北 |
波斯顿 | 北 |
波斯顿 | 北 |
芝加哥 | 中央 |
芝加哥 | 中央 |
明尼阿波利斯 | 中央 |
明尼阿波利斯 | 中央 |
旧金山 | 西方 |
旧金山 | 西方 |
旧金山 | 西方 |
洛杉矶 | 西方 |
洛杉矶 | 西方 |
检索特定列
通过命名SELECT语句的SELECT列表中的列,您可以从任何表中检索一组特定的列。 将按照您在SELECT列表中指定的顺序返回列。
关于查询
该示例查询从市场表中请求地区及其对应区域的列表。
使用说明
尽管必须在FROM子句中引用的表中定义SELECT列表中的列名,但是其他表达式也可以在SELECT列表中出现。 这些表达式的几个示例将在本系列的后面部分讨论。
当SELECT列表未包含表中的所有列时,查询可能返回重复的行,如上一个示例查询中所示。 您可以使用DISTINCT关键字消除重复项。 例如,以下查询仅返回“ 市场”表中不同地区的名称:
SELECT DISTINCT district, region
FROM aroma.market;
区 | 地区 |
---|---|
芝加哥 | 中央 |
明尼阿波利斯 | 中央 |
波斯顿 | 北 |
纽约 | 北 |
亚特兰大 | 南 |
新奥尔良 | 南 |
洛杉矶 | 西方 |
旧金山 | 西方 |
使用WHERE子句检索特定行
题
没有包装出售什么产品?
查询示例
SELECT prod_name, pkg_type
FROM aroma.product
WHERE pkg_type = 'No pkg';
结果
产品名称 | Pkg_Type |
---|---|
韦拉克鲁萨诺 | 没有pkg |
哈拉帕·拉帕(Xalapa Lapa) | 没有pkg |
哥伦比亚 | 没有pkg |
Expresso XO | 没有pkg |
拉安提瓜岛 | 没有pkg |
洛塔拿铁 | 没有pkg |
Cafe Au Lait | 没有pkg |
NA Lite | 没有pkg |
芳香罗马 | 没有pkg |
德米塔斯女士 | 没有pkg |
大吉岭1号 | 没有pkg |
大吉岭特别 | 没有pkg |
阿萨姆邦A级 | 没有pkg |
阿萨姆邦金混纺 | 没有pkg |
格雷伯爵茶 | 没有pkg |
英式早餐 | 没有pkg |
爱尔兰早餐 | 没有pkg |
特别提示 | 没有pkg |
黄金秘诀 | 没有pkg |
早餐混合 | 没有pkg |
Ruby的五香粉 | 没有pkg |
咖啡杯 | 没有pkg |
旅行杯 | 没有pkg |
香薰T恤 | 没有pkg |
香气棒球帽 | 没有pkg |
检索特定行:WHERE子句
通过在查询中包括一组逻辑条件,您可以从表中检索一组特定的行。 逻辑条件在WHERE子句中声明。 如果一行满足条件,则查询返回该行;否则,查询返回该行。 如果不是,则丢弃该行。 逻辑条件也称为搜索条件,谓词,约束或限定条件。
WHERE子句
SELECT column name(s) FROM table name(s) [ WHERE search_condition];
搜索条件 | 此条件的评估结果为true或false。 |
方括号([])表示WHERE子句是可选的。
关于查询
示例查询检索并显示未预先包装或包装的产品名称。 IBM DB2 9为产品表的每一行评估以下条件,并仅返回满足条件的那些行:
pkg_type = 'No pkg'
使用说明
字符文字是用单引号引起来的字符串。 要用字符文字表示单引号,请使用两个单引号('')。 例如: 'Scarlet O''Hara'
字符字面量必须表示为完全存储在数据库中(大写或小写)。 例如,以下条件:
class_type = 'Bulk_beans'
当引用的列包含以下字符串时为false:
'BULK_beans'
WHERE子句中不允许使用Set函数。 有关集合函数的更多信息,请参见第3部分, 使用ORDER BY子句 。
使用AND,NOT和OR连接词创建复杂条件
题
南部或西部地区有哪些城市和地区?
查询示例
SELECT hq_city, district, region
FROM aroma.market
WHERE region = 'South' OR region = 'West';
结果
总部 | 区 | 地区 |
---|---|---|
亚特兰大 | 亚特兰大 | 南 |
迈阿密 | 亚特兰大 | 南 |
新奥尔良 | 新奥尔良 | 南 |
休斯顿 | 新奥尔良 | 南 |
圣荷西 | 旧金山 | 西方 |
旧金山 | 旧金山 | 西方 |
奥克兰 | 旧金山 | 西方 |
洛杉矶 | 洛杉矶 | 西方 |
凤凰 | 洛杉矶 | 西方 |
指定复合条件:AND,OR,NOT和括号
为了优化行的选择,可以加入搜索条件,并可以强制执行评估顺序。 搜索条件指定关于给定行的条件为“真”,“假”或“未知”。 通过将指定的逻辑运算符(AND,OR,NOT)应用于每个指定谓词的结果,可以得出搜索条件的结果。 如果未指定逻辑运算符,则搜索条件的结果为指定谓词的结果。 下表定义了AND和OR,其中P和Q是任何谓词:
AND和OR的真值表
P | 问 | P与Q | 或 |
---|---|---|---|
真正 | 真正 | 真正 | 真正 |
真正 | 假 | 假 | 真正 |
真正 | 未知 | 未知 | 真正 |
假 | 真正 | 假 | 真正 |
假 | 假 | 假 | 假 |
假 | 未知 | 假 | 未知 |
未知 | 真正 | 未知 | 真正 |
未知 | 假 | 假 | 未知 |
未知 | 未知 | 未知 | 未知 |
NOT(true)为false,NOT(false)为true,NOT(unknown)为未知。
首先评估括号内的搜索条件。 如果未通过括号指定评估顺序,则在AND之前应用NOT,在OR之前应用AND。 未定义优先级相同的运算符的评估顺序,以优化搜索条件。
在WHERE子句中使用AND,OR和括号
题
洛杉矶或圣何塞有哪些大型或小型Aroma咖啡和茶公司商店?
查询示例
SELECT store_type, store_name, city
FROM aroma.store
WHERE (store_type = 'Large' OR store_type = 'Small')AND (city = 'Los Angeles' OR city = 'San Jose');
结果
商店类型 | 商店名称 | 市 |
---|---|---|
大 | 圣何塞焙烧公司 | 圣荷西 |
大 | 海滩酿造 | 洛杉矶 |
小 | 速溶咖啡 | 圣荷西 |
指定复杂的搜索条件
搜索条件,特别是为决策支持分析而编写的条件,可能会变得复杂。 尽管由使用搜索条件AND,OR和NOT的简单条件构造而成,但复杂的条件可能难以理解。 幸运的是,SQL是自由格式的,因此可以通过使用制表符,空格和换行符来定义空白和逻辑关系来显示这些条件的逻辑结构。
关于查询
示例查询检索并显示位于洛杉矶或圣何塞的大型或小型Aroma Coffee and Tea Company商店的名称。
此查询中的括号是必不可少的,因为AND连接词的优先级高于OR连接词。 如果删除括号,查询将返回另一个结果表。
查询示例(不带括号)
SELECT store_type, store_name, city
FROM aroma.store
WHERE store_type = 'Large' OR store_type = 'Small'AND city = 'Los Angeles' OR city = 'San Jose';
结果
商店类型 | 商店名称 | 市 |
---|---|---|
大 | 圣何塞焙烧公司 | 圣荷西 |
大 | 海滩酿造 | 洛杉矶 |
小 | 速溶咖啡 | 圣荷西 |
大 | 迈阿密浓缩咖啡 | 迈阿密 |
大 | 奥林匹克咖啡公司 | 亚特兰大 |
使用说明
查询检索并显示其搜索条件未明确排除的任何数据,而只有少数一般条件的查询可以返回大量行。
每当您怀疑服务器如何评估复合条件时,请使用括号将条件显式分组以强制评估顺序。
使用大于(>)和小于或等于(<=)运算符
题
Mktkey值标识大于或小于12的哪些城市和地区?
查询示例
SELECT mktkey, hq_city, hq_state, district
FROM aroma.market
WHERE mktkey > 4
AND mktkey <= 12;
结果
麦基 | 总部城市 | 总部 | 区 |
---|---|---|---|
5 | 纽约 | 纽约州 | 纽约 |
6 | 费城 | 功放 | 纽约 |
7 | 波斯顿 | 嘛 | 波斯顿 |
8 | 哈特福德 | 电脑断层扫描 | 波斯顿 |
9 | 芝加哥 | 白介素 | 芝加哥 |
10 | 底特律 | MI | 芝加哥 |
11 | 明尼阿波利斯 | MN | 明尼阿波利斯 |
12 | 密尔沃基 | 威斯康星州 | 明尼阿波利斯 |
使用比较运算符
条件评估为真或假,可以用比较运算符或比较谓词表示。 SQL包含以下比较运算符:
操作员 | 名称 |
---|---|
= | 等于 |
< | 少于 |
> | 比...更棒 |
<> | 不相等 |
> = | 大于或等于 |
<= | 小于或等于 |
关于查询
该示例查询检索并显示其Mktkey大于4但小于或等于12的所有城市和地区。
Mktkey列包含整数值,该整数值可与其他数字值进行比较。 但是,如果将整数与字符进行比较,服务器将返回错误消息:
SELECT mktkey, hq_city, hq_state, district
FROM aroma.market
WHERE mktkey > '4';
[IBM][CLI Driver][DB2/LINUX] SQL0401N The data types of the operands
for the operation ">" are not compatible. SQLSTATE=42818
您可以使用DB2信息中心来获得解释错误消息和确定可以采取的纠正措施的帮助。 该中心在本系列的第1部分中进行了介绍。
使用说明
条件必须比较可比较数据类型的值。 如果尝试比较不同的数据类型,服务器将返回错误消息或错误结果。 比较运算符可用于将一个字符串与另一个字符串进行比较,如以下法律条件所示:
(city > 'L')
有关可比数据类型的更多信息,请参考《 SQL参考指南》 。
使用IN比较谓词
题
芝加哥,纽约和新奥尔良地区有哪些城市?
查询示例
SELECT hq_city, hq_state, district
FROM aroma.market
WHERE district IN('Chicago', 'New York', 'New Orleans');
结果
总部城市 | 总部 | 区 |
---|---|---|
新奥尔良 | 洛杉矶 | 新奥尔良 |
休斯顿 | 德克萨斯州 | 新奥尔良 |
纽约 | 纽约州 | 纽约 |
费城 | 功放 | 纽约 |
芝加哥 | 白介素 | 芝加哥 |
底特律 | MI | 芝加哥 |
使用比较谓词
一个简单的条件可以用以下SQL比较谓词表示:
谓词 |
---|
在expression1和expression2之间 |
像模式 |
IN(清单) |
一片空白 |
不为空 |
所有 |
某些或任何 |
存在 |
ALL,SOME或ANY和EXISTS谓词的示例在本系列的第5部分中介绍。
有关所有谓词的语法描述和示例,以及简单和复杂表达式的详细定义,请参阅《 SQL参考指南》 。
关于查询
示例查询列出了芝加哥,纽约和新奥尔良地区的所有城市。 也可以使用equals比较运算符(=)和一组OR条件编写:
WHERE district = 'Chicago'
OR district = 'New York'
OR district = 'New Orleans'
使用说明
力求编写简单,易于理解和易于维护的逻辑条件集。 始终用足够的空白来阐明复合条件的逻辑结构,通过缩进定义逻辑块,并在括号中强制使用评估优先级。
使用百分号(%)通配符
题
以字母Min开头的地区中的哪些城市?
查询示例
SELECT district, hq_city
FROM aroma.market
WHERE district LIKE 'Min%';
结果
区 | 总部城市 |
---|---|
明尼阿波利斯 | 明尼阿波利斯 |
明尼阿波利斯 | 密尔沃基 |
使用通配符
先前的查询已经表达了与完整字符串匹配的条件。 使用LIKE谓词和两个通配符(百分号(%)和下划线(_)),您还可以表达与字符串的一部分(子字符串)匹配的条件。
百分比(%)通配符与任何字符串匹配。 例如:
-
like 'TOT%'
对于以'TOT'开头的任何字符串都是正确的。 -
like '%ZERO%'
对于包含文本'ZERO'的任何字符串都是true。 -
like '%FRESH'
对于以'FRESH'结尾且不包含尾随空格的任何字符串都是true。 当应用LIKE约束时,字符数据中的尾随空白被认为是重要的。
百分号(%)也可用于搜索空字符串-零(0)个字符。
下划线通配符(_)与固定位置的任何一个字符匹配。 例如:
-
like '_EE_'
对于任何四个字母的两个中间字符为'EE'的字符串为true。 -
like '%LE_N%'
对于包含模式'LE_N'的任何字符串都是true。 字符串“ CLEAN”,“ KLEEN”和“ VERY KLEEN”都与此模式匹配。
关于查询
示例查询检索以字符“ Min”开头的所有地区的名称,并列出这些地区中的城市。 通配符百分号(%)允许'Min'中'n'之后的任何字符组合(包括空格),但是'n'之前的字符必须与存储的字符模式完全匹配。
使用说明
当LIKE条件的模式与列中的子字符串匹配时,则为true。 如果该模式不包含通配符,则该模式必须与列条目完全匹配。
例如,仅当列条目包含字符串APRIL而没有其他内容时,以下条件才为真:
month LIKE 'APRIL'
换句话说,此条件等效于:
month = 'APRIL'
LIKE谓词只能用于包含字符串的列。
使用AS子句命名列
题
以字母Min开头的地区中的哪些城市? 将hq_city列命名为更有意义。
查询示例
SELECT district, hq_city AS City
FROM aroma.market
WHERE district LIKE 'Min%';
结果
区 | 市 |
---|---|
明尼阿波利斯 | 明尼阿波利斯 |
明尼阿波利斯 | 密尔沃基 |
命名表达式:AS
可选的AS子句使您可以为表达式分配有意义的名称,这使引用表达式更容易。 使用AS子句时,存在有关允许名称的规则。 通常,有效名称必须以字母开头,不得超过128个字符,不能有空格,并且不能是SQL关键字。 SQL关键字为SELECT,FROM,WHERE等。有关SQL关键字的更多详细信息,请参阅《 SQL参考指南》 。
例如,以下AS子句将别名hq_city分配给City列:
hq_city AS City
您可以不使用关键字AS来分配别名,但是当您查看查询时,别名可能不太明显:
hq_city City
您将注意到,无论表达式中的大小写如何,列标题均以大写形式显示。
关于查询
示例查询返回的结果集与本章中的上一个查询相同。 但是,在这种情况下,将分配列别名来为汇总结果创建标题。
| 重要提示:如果列别名引用的列中包含的值是set函数的结果,则该值不能出现在WHERE子句中; 但是,它可能发生在HAVING子句中。 有关HAVING子句的更多信息,请参见本系列的第4部分。 |
摘要
SELECT语句
SELECT column name(s)
FROM table name(s)
[WHERE search_condition]
[GROUP BY group_list]
[HAVING search_condition]
[ORDER BY order_list];
搜索条件
() | 括号(评估力的顺序) |
不 | 否定 |
和 | 和 |
要么 | 要么 |
比较运算符
= | 等于 |
< | 少于 |
> | 比...更棒 |
<> | 不相等 |
> = | 大于或等于 |
<= | 小于或等于 |
比较谓词
之间 | expression1和expression2 |
喜欢 | 模式 |
在 | (清单) |
是 | 空值 |
是 | 非空 |
本教程讨论了如何将许多常见的业务问题表示为SELECT语句,以及如何检索,分组和订购从关系表中选择的数据。
本教程中讨论的大多数问题都可以轻松地表达为标准的SELECT语句,并且既不挑战用户,也不挑战SQL。 本系列的其余教程将解决更棘手的问题,需要顺序处理的问题,汇总值的比较,更复杂的联接规范或冗长的SELECT语句。
在继续下一部分之前,您应该转到DB2信息中心并阅读SELECT语句上的完整在线文档。 这将帮助您熟悉帮助文档的格式并查看您刚刚学到的内容。
翻译自: https://www.ibm.com/developerworks/data/tutorials/dm0608cao2/index.html
基本查询语句