第五章 简单的数据查询
5.1 查询的基本结构
SELECT [DISTINCT] {* | column [alias],...}
FROM table
[WHERE condition]
[OPDER BYcolumn];
5.2投影操作
投影操作值在SQL查询中,使用SELECT子句,选择将对表中的那些列进行操作,这些列将出现结果中。
其语法形式为:
SELECT 列名列表 FRPM 表名;
表名前缀:
在列表前包含表名的信息也相当有用的,如:
SELECR Professor.Name FROM Professor;
列别名:
在列名或表名用AS关键字来提供别名,语法如下:
SELECT 列A AS A, 列B AS B, 列C AS C FROM 表名 AS T;
当使用表的别名时,可以在同一SQL语句中的列名中使用别名,例如:
SELECT T.列A AS A, T.列B AS B,T.列C AS C FROM 表 AS T;
计算列:
我们一Intant数据库的SudentExam表作为列。在下面的SQL查询中,从Mark(分数)和IfPassed(是否通过)两个列中组合数据,如果考试通过则给出实际分数,如果没有通过则输入为零:
SELECT StudentID, ExamID,Mark * IfPassed AS MarkIfPassed FROM StudentExam;
排除重复数据:
在SELECT子句中使用DISTINCT关键字可以过滤重复的行数据。首先我们从单列中返回的数据行的简单着手。
如果我们想要返回某列唯一的行值,我们可以使用如下查询:
SELECT DISTINCT 列A FEOM 表;
5.3 选择操作
选择(SELECTION)操作就是在SQL查询中,通过WHERE子句指定查询条件,只从表中提取或显示满足条件的查询。
带WHERE子句的SQL查询语法为:
SELECT 列名列表 FROM 表 WHERE 条件;
单条件选择操作
SELECT 列A ,列B FROM 表 WHERE 列C = 值;
比较运算符
运算符 含义
= 用于检测值是否于另一个值相等
!= 用于检测值是否不等于另一个值
> 如果第一个操作数大于第二个操作数则为真
>= 用于检测第一个操作数是否大于或者等于第二个操作
< 如果第一个操作数小于第二个操作数则为真
<= 用于检测第一个操作数是否小于或者等于第二个操作
多条件选择操作
有时WHERE子句单个的条件不足以将查询限定到足够窄的范围。
比如,我们仅想获取既满足一个列的指定条件,又满足另一个列的指定条件的行数据。这时候,我们就需要将多个条件组合起来,如下所示:
SELECT 列A,列B FROM 表 WHERE 条件1 LIKE 条件2
连接关键字
连接关键字 含义
AND 同时满足两个条件
OR 至少满足两个条件中的一个
执行范围测试(BETWEEN)
组合两个比较运算符条件可以查询在指定范围内的数据。例如:
SELECT ExamID, SustinedOn, Comments FEOM Exam
WHERE SustainedOn >='2003-03-02'
AND SustinedOn <= '2003-03-04';
但是使用SQL关键字BETWEEN使范围测试更具可读性:
SELECT 列A,列B FROM 表
WHERE 列C BETWEEN 下限 AND 上限;
定义集合关系(IN)
检测值是否是个几个可能值中的一个:
SELECT 列A,列B FROM 表
WHERE 列C = Value1 OR 列C = Value2 OR 列C = Value3;
然而,在WHERE子句中使用IN关键字加上一系列可选值看起来更优美:
SELECT 列A,列B FROM 表
WHERE 列C IN ('Value1', 'Value2', 'Value3');
也可以是完全独立的SELECT查询,例如:
SELECT 列A,列B FROM 表
WHERE 列C IN (SELECT 列D FROM 表2);
IN与NOT一起组合使用,可以查询不在值集合中的数据:
SELECT 列A,列B FROM 表
WHERE 列C NOT IN ('Value1', 'Value2', 'Value3');
模糊查询
行过滤中最强大的功能之一是使用模糊查询模糊查询搜索列数据中的文本值。
列如,我们可以在行中查找包含某个字或者更复杂的字符模糊的数据。SQL中使用LIKE关键字(也可以指定NOT LIKE)提供模式匹配:
SELECT 列A,列B FROM 表 WHERE 列C LIKE 模式;
模式匹配通配符含义
通配符 含义 支持的RDBMS
% 包含零个或者更多字符任意字符串 所有RDBMS
_(下划线) 任何单个字符 所有RDBMS
下划线通配符“_”表示匹配任意单个字符,并且可以使用做前缀或后缀。
例如,查询教授姓名,要求姓名以五个字符开始,后面跟一个空格,可以使用如下的SQL语句:
SELECT name FROM profesor WHERE name LIKE '__%';
处理空值数据
SELECT 列A,列B FROM 表 WHERE 列C IS NOT NULL; --测试列C不为空值的情况
SELECT 列A,列B FROM 表 WHERE 列C IS NULL; --测试列C为空值的情况
5.4 排序操作
SELECT 列A,列B,列C FROM 表 ORDER BY 列A,列B ,列C...;
单行排序
SELECT 列A,列B,列C FROM 表 ORDER BY 列A;
多行排序
SELECT 列A,列B,列C FROM 表 ORDER BY 列A,列B,列C;
5.1 查询的基本结构
SELECT [DISTINCT] {* | column [alias],...}
FROM table
[WHERE condition]
[OPDER BYcolumn];
5.2投影操作
投影操作值在SQL查询中,使用SELECT子句,选择将对表中的那些列进行操作,这些列将出现结果中。
其语法形式为:
SELECT 列名列表 FRPM 表名;
表名前缀:
在列表前包含表名的信息也相当有用的,如:
SELECR Professor.Name FROM Professor;
列别名:
在列名或表名用AS关键字来提供别名,语法如下:
SELECT 列A AS A, 列B AS B, 列C AS C FROM 表名 AS T;
当使用表的别名时,可以在同一SQL语句中的列名中使用别名,例如:
SELECT T.列A AS A, T.列B AS B,T.列C AS C FROM 表 AS T;
计算列:
我们一Intant数据库的SudentExam表作为列。在下面的SQL查询中,从Mark(分数)和IfPassed(是否通过)两个列中组合数据,如果考试通过则给出实际分数,如果没有通过则输入为零:
SELECT StudentID, ExamID,Mark * IfPassed AS MarkIfPassed FROM StudentExam;
排除重复数据:
在SELECT子句中使用DISTINCT关键字可以过滤重复的行数据。首先我们从单列中返回的数据行的简单着手。
如果我们想要返回某列唯一的行值,我们可以使用如下查询:
SELECT DISTINCT 列A FEOM 表;
5.3 选择操作
选择(SELECTION)操作就是在SQL查询中,通过WHERE子句指定查询条件,只从表中提取或显示满足条件的查询。
带WHERE子句的SQL查询语法为:
SELECT 列名列表 FROM 表 WHERE 条件;
单条件选择操作
SELECT 列A ,列B FROM 表 WHERE 列C = 值;
比较运算符
运算符 含义
= 用于检测值是否于另一个值相等
!= 用于检测值是否不等于另一个值
> 如果第一个操作数大于第二个操作数则为真
>= 用于检测第一个操作数是否大于或者等于第二个操作
< 如果第一个操作数小于第二个操作数则为真
<= 用于检测第一个操作数是否小于或者等于第二个操作
多条件选择操作
有时WHERE子句单个的条件不足以将查询限定到足够窄的范围。
比如,我们仅想获取既满足一个列的指定条件,又满足另一个列的指定条件的行数据。这时候,我们就需要将多个条件组合起来,如下所示:
SELECT 列A,列B FROM 表 WHERE 条件1 LIKE 条件2
连接关键字
连接关键字 含义
AND 同时满足两个条件
OR 至少满足两个条件中的一个
执行范围测试(BETWEEN)
组合两个比较运算符条件可以查询在指定范围内的数据。例如:
SELECT ExamID, SustinedOn, Comments FEOM Exam
WHERE SustainedOn >='2003-03-02'
AND SustinedOn <= '2003-03-04';
但是使用SQL关键字BETWEEN使范围测试更具可读性:
SELECT 列A,列B FROM 表
WHERE 列C BETWEEN 下限 AND 上限;
定义集合关系(IN)
检测值是否是个几个可能值中的一个:
SELECT 列A,列B FROM 表
WHERE 列C = Value1 OR 列C = Value2 OR 列C = Value3;
然而,在WHERE子句中使用IN关键字加上一系列可选值看起来更优美:
SELECT 列A,列B FROM 表
WHERE 列C IN ('Value1', 'Value2', 'Value3');
也可以是完全独立的SELECT查询,例如:
SELECT 列A,列B FROM 表
WHERE 列C IN (SELECT 列D FROM 表2);
IN与NOT一起组合使用,可以查询不在值集合中的数据:
SELECT 列A,列B FROM 表
WHERE 列C NOT IN ('Value1', 'Value2', 'Value3');
模糊查询
行过滤中最强大的功能之一是使用模糊查询模糊查询搜索列数据中的文本值。
列如,我们可以在行中查找包含某个字或者更复杂的字符模糊的数据。SQL中使用LIKE关键字(也可以指定NOT LIKE)提供模式匹配:
SELECT 列A,列B FROM 表 WHERE 列C LIKE 模式;
模式匹配通配符含义
通配符 含义 支持的RDBMS
% 包含零个或者更多字符任意字符串 所有RDBMS
_(下划线) 任何单个字符 所有RDBMS
下划线通配符“_”表示匹配任意单个字符,并且可以使用做前缀或后缀。
例如,查询教授姓名,要求姓名以五个字符开始,后面跟一个空格,可以使用如下的SQL语句:
SELECT name FROM profesor WHERE name LIKE '__%';
处理空值数据
SELECT 列A,列B FROM 表 WHERE 列C IS NOT NULL; --测试列C不为空值的情况
SELECT 列A,列B FROM 表 WHERE 列C IS NULL; --测试列C为空值的情况
5.4 排序操作
SELECT 列A,列B,列C FROM 表 ORDER BY 列A,列B ,列C...;
单行排序
SELECT 列A,列B,列C FROM 表 ORDER BY 列A;
多行排序
SELECT 列A,列B,列C FROM 表 ORDER BY 列A,列B,列C;