2.高级型
在高级型查询中,是将SELECT的语句的高级应用,以及怎样使用它查询数据库中符合条件的数据,例如通过BETWEEN来限制查询的范围和条件,并将获得的结果保存到表或视图。
2.1BETWEEN 限制查询范围
使用关键字BETWEEN可以方便的限制数据的范围。BETWEEN用来指定一个范围,可以让用户对上边界值、下边界值及它们中的值进行搜索。
利用BETWEEN关键字来限定查询条件的基本语法格式为:
SELECT <select_list>
FROM <table_reference>
WHERE test_expression [NOT] BETWEEN begin_expression AND end_expression
2.1.1举例来说,利用BETWEEN关键字来限制日期,从数据库“销售关系系统”的“入库单信息”表中,查询“入库日期”从2004年8月1日至2005年9月1日期间的入库单信息。
SELECT 入库单编号,供应商编号,库存编号,商品编号,入库日期,操作员编号
FROM 入库单信息
WHERE 入库日期 BETWEEN '2004-8-1' AND '2005-9-1'
2.1.2举例来说,利用BETWEEN关键字来限制文本,从数据库“销售关系系统”的“入库单信息”表中,查询所在城市为北京市到南京市的供应商信息。
SELECT 供应商编号,供应商名称,供应商所在城市,联系人姓名,联系电话,备注
FROM 供应商信息
WHERE 供应商所在城市 BETWEEN '北京市' AND '南京市'
2.2使用WHERE的复合条件
使用WHERE子句的目的是将表中数据筛选出符合条件的行,WHERE可以限定查询的范围,提高效率。WHERE子句中的条件表达式包括算术表达式、逻辑表达式等。这里将会综合前面介绍的内容,在WHERE子句中使用复合条件来实现一些复杂的查询操作。
2.2.1在WHERE子句中使用复合条件
可以使用3种布尔连接符形成复合条件,这三种布尔连接符是:AND、OR和NOT。AND和OR将两个条件合并形成一个复合条件,重复应用这些组合就可以将许多条件组合到一个单独的复合条件中;NOT应用于单个条件,含义为取反。
AND 只有在所有条件都成立时才返回结果。即A和B都为TRUE时,语句“A AND B”才为TRUE。
OR 只要其中一个调价成立即可返回结果。即A或B为TRUE时,语句“A OR B”为TRUE。
NOT 表示否认一个表达式,表达式成立时不反悔结果。即在A为FALSE时,语句“NOT A ”为TRUE。
举例来说,从“珠宝营销系统”数据库的“顾客信息”表中,非北京且消费金额在2000以上的顾客,或北京的顾客。
SELECT 消费者姓名,消费者消费金额,消费者所在城市,联系电话,邮编
FROM 顾客信息
WHERE ((消费者消费金额 > 2000 AND NOT 消费者所在城市='北京市') OR 消费者所在城市='北京市')
2.2.2使用多个关键字
NOT可以用两种不同的方式与多个条件一起使用,包括IN、BETWEEN、LIKE和IS NULL时,此时含义完全相同。
举例来说,在本例中从“经销商”数据库中显示符合以下所有条件的商品信息,包括商品编号、供应商代号、商品名称、商品类别、单价和商品单位。
条件为:不是7、5、4、2其中任何一个的供应商代号;以10开始的商品编号;单价不在20~100之间;不属于12、13、14其中任何一个类别的商品;商品单位不能为NULL。
SELECT 商品编号,供应商代号,商品名称,商品类别,单价,商品单位
FROM 商品信息
WHERE 供应商代号NOT IN ('7','5','4','2')
AND 商品编号 LIKE '10%'
AND 单价 NOT BETWEEN 20 AND 100
AND 商品类别 NOT IN(12,13,14)
AND 商品单位 IS NOT NULL
2.3使用常数值、DISTINCT和ALL
在表的数据级别上,常数值是每一行中都有相同值得一个列。我们通常有两种方法来替代常数值。第一种方法是将一个文字值放入SELECT子句作为编码值,这种方法适用于只有少数SELECT语句时。不过当有大量SELECT语句时,这种方法就不够灵活,也不易更改代码来满足变化的需求。
第二种方法是将常数值放入一个单独的表中,我们将这个表称为“常数表”。这种表被定义为只有一行的表。在这种表中,每个不同的常数值都有一个单独的列。这些列的名字通常都是唯一的,并且与任何其他表中的表名不同。在创建后,可以使用它与任意其他表编写SELECT语句。这种方法只要在有较多使用相同常数集的SELECT语句时使用。
在数据库“经销商”中,查询出2004年所收进的货物,并列出货物的名称,价格,进货的数量及进货的日期。
SELECT TOP10 t1.商品名称,t1.单价,t2.进货数量,t2.进货时间
FROM 商品信息 AS t1,进货信息 AS t2
WHERE t2.进货时间 BETWEEN '2004-1-1' AND '2004-12-31'
AND t2.商品编号=t1.商品编号
ORDER BY t2.进货时间
当指定一个日期时,不能只给出年份。为了制定一个年份,必须将这个日期设成这一年的1月1日到12月31日之间的日期。
在SELECT子句中DISTINCT和ALL关键字可以让我们明确该如何在结果中处理重复行。ALL返回所有限定行,是默认用法。如果不明确指定ALL或DISTINCT,那就会默认设置为ALL。DISTINCT只返回唯一的行。
在前面的总结中,已经说明了两者的相关用法,在这里,不在累述。
下面我们了解一下要求:DISTINCT或者ALL在SELECT子句中只能使用一次,在SELECT列表中被看作为首词并且后面不能添加逗号。
举例来说,在“珠宝营销系统”数据库的查询消费者所在城市和邮编,要求不返回重复行。
SELECT DISTINCT 消费者所在城市,邮编 FROM 顾客信息
2.4保存SELECT结果
查询的结果是一个表,可以像处理器一样进行处理。当查询语句运行后,查询结果知识显示在屏幕上,如果关闭计算机,则这些查询结果也会消失。为了便于查看查询结果,我们一般将查询结果保存到一个新表或一个视图中。
2.4.1保存结果到表
将查询结果保存到一个新表,也就是说,从SELECT语句的查询结果中创建一个新表。一旦将查询结果保存到一个新表,用户便可以通过天剑新行、更新行或者删除行来修改表中的数据。
在SQL Server中,新行添加在SELECT语句后,然后在FROM关键字之前增加一个INTO子句,并在INTO关键字后给出这个新表的名称。除此之外,不需要对查询语句的其他子句进行修改。
举例来说,从数据库“经销商”的“销售信息”表中,查询2005年8月份的销售信息,并将查询结果保存到一个名为“销售详情 05_08”的新表中,要求该表中包含列“商品编号”、“金额”、“销售人员编号”和“售出时间”。
SELECT 商品边号,金额,销售人员编号,售出时间
INTO 销售详情 05_08
FROM 销售信息
WHERE 售出时间 BETWEEN '2005-8-1' AND '2005-8-31'
上述语句是在数据库“经销商”中,创建一个新表名为“销售详情 05_08”。通过下述SELECT语句可以查看新标的数据:
SELECT * FROM 销售详情 05_08
2.4.2保存结果到视图
还可以将查询结果保存到一个视图中,而不死保存到一个表中。视图与表非常相似。
在创建一个视图后,可以像使用基表一样使用它,可以任意的SELECT语句的FROM子句中使用视图。
举例来说,从数据库“经销商”的“商品信息”表中,查询由代号为7的供应商提供的商品信息,并将查询结果保存到一个名为“供应商 07_VIEW”的视图中,要求改视图中的列为“商品编号”、“商品名称”和“单价”。
CREATE VIEW 供应商 07_VIEW
AS
SELECT 商品编号,商品名称,单价
FROM 商品信息
WHERE 供应商代号=7
上述语句运行后,就会在数据库“经销商”中,添加一个名为“供应商 07_VIEW”的新视图。利用SELECT语句查询该视图中的数据。
SELECT *
FROM 供应商07_VIEW
ORDER BY 单价
关于数据库的查操作,未完待续......