第章。1 组合 where 子句。
1 使用 in 运算符。
1 not 运算符。
1 实现模糊查询。
本章将介绍如何使用 where 子句设置更高级的查询条件。例如,查询计算机系的所有女生;查询中文系或者外语系的所有男生等。此外,还将介绍使用 in、not、like
3 个运算符和使用通配符进行模糊查询的方法。
8.1 组合 where 子句。
本节将教会读者使用 and 和 or 运算符设置高级查询条件的具体方法。and 和 or 两个运算符可以将单独的条件表达式组合在一起,形成复杂、强大的搜索条件表达式。这种表达式将会满足用户很多的查询需求。
8.1.1 and 运算符。
如前所述,and 运算符只有当两边操作数均为 true 时,最后结果才为 true。根据 and 的这种运算规则,人们使用 and 描述“与”(而且)的关系,即既满足第一个条件且满足第二个条件时才会通过审核。下面的几个例题使用 and 完成了一些复杂的查询任务。
例 8.1】从 student 表中查询计算机系的所有女生,并将结果按学号升序排序。
分析:使用前面所学的知识,只能完成查询计算机系的所有学生或者查询所有女生,而并不能完成查询不但是计算机系的学生,而且还是女生的任务。这就需要组合这两个条件,因为这两个条件是“而且”的关系,所以使用 and 运算符连接。
具体的 select 语句如下。
select *
from student
where 所属院系='计算机系'
and 性别='女'
order by 学号。
运行结果如图 8.1 所示。
图 8.1 例 8.1 运行结果。
图 8.1 中只有两条记录,这两条记录既满足了是计算机系的学生,又满足了是女生的条件。
例 8.2】从 student 表中查询 1975 年出生的所有学生,并将结果按出生日期升序排序。
1)如果 sql 运行环境为 access,则因为日期型数据中没有时间,可以使用如下 select 语句查询。
select *
from student
where 出生日期》= ##
and 出生日期<= ##
order by 出生日期。
2)如果 sql 运行环境为 sql server,则因为日期型数据中有时间,所以应当使用如下 select
语句查询。select *
from student
where 出生日期》='01/01/1975'
and 出生日期<'01/01/1976'
order by 出生日期。
3)如果 sql 运行环境为 oracle,也因为日期型数据中有时间,所以应当使用如下 select 语句查询。
select *
from student
where 出生日期》='01/jan/1975'
and 出生日期<'01/jan/1976'
order by 出生日期。
本例运行结果如图 8.2 所示。
图 8.2 例 8.2 运行结果。
上面两个例题的搜索条件中只用了一个 and 运算符,实际上根据需要可以使用多个 and 组合条件,例如下面的例题。
例 8.3】从 student 表中查询 1975 年出生的所有女生,并将结果按出生日期升序排序。假设 sql
运行环境为 sql server。
select *
from student
where 出生日期》='01/01/1975'
and 出生日期<'01/01/1976'
and 性别='女'
order by 出生日期。
运行结果如图 8.3 所示。
图 8.3 例 8.3 运行结果。
8.1.2 or 运算符。
or 运算符只有当两边操作数均为 false 时,最后结果才为 false,只要一边是 true,则最后结果为 true。根据 or 的这种运算规则,人们使用 or 运算符描述“或”(或者)的关系,即当满足任何一个条件就可以通过审核。下面的几个例题使用 or 运算符完成了一些复杂的查询任务。
例 8.4】从 student 表中查询中文系的所有学生和外语系的所有学生,并将结果按学号升序排序。
分析:本题两个条件的关系其实是“或”,因为满足任何一个条件就可以通过审核。
select *
from student
where 所属院系='中文系' or 所属院系='外语系' order by 学号。
运行结果如图 8.4 所示。
图 8.4 例 8.4 运行结果。
查询结果中既包含了中文系的所有学生,又包含了外语系的所有学生。这是因为中文系的学生满。
足表达式:所属院系='中文系'
即为 true,所以整个条件表达式: 所属院系='中文系' or 所属院系='外语系' 变成了。
true or false
根据 or 的运算规则,最终条件表达式的值为 true,所以所有中文系的学生都进入了查询结果集中。同理,所有外语系的学生也都进入了查询结果集,而其他院系的学生都被筛选掉了。
8.1.3 and 与 or 的优先顺序问题。
where 子句中可以包含任意数量的 and 和 or 运算符,并且允许两者结合使用。下面的例题组合了 and 和 or 两个运算符,解决了一个查询任务。
例 8.5】从 student 表中查询中文系和外语系的所有女生。
分析:前面已经介绍了查询中文系和外语系的学生需要使用 or 运算符,又因为要查询这两个系的女生,所以还得使用 and 运算符。编写如下的 select 语句。
select *
from student
where 所属院系='中文系'
or 所属院系='外语系'
and 性别='女'
order by 学号。
运行结果如图 8.5 所示。
图 8.5 例 8.5 运行结果 1
查看运行结果后会发现一个男生进入了查询结果集中,导致这一错误的根源是运算符的优先级问。
题。在表达式中,如果同时出现了 and 和 or 两种运算符,则并非从左到右按顺序运算,而是优先执行 and,然后执行 or 运算符。
了解了运算符的优先级后,上面错误的原因就很容易地找到了。因为上面的条件表达式与下面的表达式等价。
所属院系='中文系' or (所属院系='外语系' and 性别='女')
而该表达式的意思是:中文系的所有学生和外语系的所有女生,因此,查询结果集**现了中文系的男生。为了让 or 运算符优先执行,可以使用括号,下面的 select 语句是正确的查询语句。
select *
from student
where (所属院系='中文系' or 所属院系='外语系')
and 性别='女'
order by 学号。
技巧:在有多种运算符的组合条件表达式中,尽量使用括号,即使计算机可能不需要这些括号,但这样会方便人们阅读和理解复杂的条件表达式,同时也会减小出错的概率。
运行结果如图 8.6 所示。
图 8.6 例 8.5 运行结果 2
8.2 使用 in 运算符。
在查询中,有时会遇到这样一种查询任务——指定的字段值只要属于某个集合,就将该记录查询出来。此时,会用到 in 运算符。
8.2.1 使用 in 运算符。
in 运算符的运算规则是:当 x 在集合中时,表达式。
x in (value1, value2,……valuen)
为 true,而 x 不在集合中时,上面的表达式为 false。例如:
8 in (2,5,8,13)
因为 8 在集合中,所以表达式的值为 true。对于。
7 in (2,5,8,13)
因为 7 不在集合中,所以表达式的值为 false。下面通过一个例题感受一下使用 in
运算符查询数据的方法。
例 8.6】从 course 表中查询学分为 的课程的信息,并按学分降序,课号升序排序。
select * from course
where 学分 in (2,3,4)
order by 学分 desc,课号。
运行结果如图 8.7 所示。
图 8.7 例 8.6 运行结果。
说明:在 in 运算符表达式中,集合必须用圆括号括住,并且各元素之间用逗号(,)分隔。
本例演示了使用 in 运算符查询数值型数据的方法,下面再看一个使用 in 运算符查询字符型数据的例题。
例 8.7】从 student 表中查询中文系、外语系和计算机系的所有学生,并按院系降序排列。
select *
from student
where 所属院系 in ('中文系','外语系','计算机系')
order by 所属院系 desc
运行结果如图 8.8 所示。
图 8.8 例 8.7 运行结果。
in 运算符还有一个反向运算符——not in。下面的例题使用 not in 运算符解决了一个查询任务。
例 8.8】从 student 表中,查询除中文系、外语系和计算机系以外的其他系的学生,并按院系降序排列。
select *
from student
where 所属院系 not in ('中文系','外语系','计算机系')
order by 所属院系 desc
运行结果如图 8.9 所示。
图 8.9 例 8.8 运行结果。
8.2.2 使用 in 运算符的优点。
通过前面几个例题的学习,读者一定会感觉到 in 运算符和 or 运算符实现的功能是相同的。那么为什么使用 in 运算符呢?因为 in 运算符有如下优点。
当条件很多时,使用 in 运算符会使语句更加简洁、清楚。例如,如果将例题 8.7,使用 or 运算符改写则其语句为:
select *
from student
where 所属院系='中文系'
or 所属院系='外语系'
or 所属院系='计算机系'
order by 所属院系 desc
很明显,此时使用 in 运算符会比 or 运算符简洁、清楚得多。
in 运算符的执行速度要比 or 运算符更快。
in 运算符最大的优点是:其后条件列表集合中,可以放置其他 select 语句,即子查询。下面通过一个例题体现该优点。
ORACLE高级查询
本章目标 多表查询。联接查询 inner join 内联接 left outer join 左外联接 right outer join 右外联接 full join 全联接 子查询。集合操作。union 联合 union all 联合所有 intersect 交集 minus 减集 一 连接类型。o...
SQL高级查询
高级查询概念。在掌握查询的基础知识后,您就可以探知查询解决方案中使用的下列高级查询概念 在选择列表中使用聚合函数。使用 group by 对多行分组。使用 union 组合结果。子查询基础知识。使用 case 处理条件数据。并行查询。汇总数据 在选择列表中使用聚合函数。聚合函数 例如 sum g c...
SQL高级查询
sql server t sql 1 基本常用查询 3 select 3 all 查询所有 3 distinct 过滤重复 3 count 统计 3 top 取前n条记录 3 alias column name 列重命名 3 alias table name 表重命名 3 column 列运算 3 ...