access的查询方法、条件以及 sql查询条件的优化
由于ACCESS数据库与SQL稍有差异,查询语句也有一定差异。本文综述ACCESS的查询语句的编写,并结合提出优化设想 。文中的方法在ASP+ACCESS 2015条件下测试通过
为说明下面的实例,先创建一个表,并录入以下数据
数据库的一般查询语句是:select * from [tab1] where c_name='周伟' order by c_id asc
where 跟的就是查询条件。常用的查询条件有:
1、“=” 等值查询
2、like 模糊查询
3、between 区间查询
4、in 多条件查询
5、函数查询
以上几项查询仅代表本文观点,主要用于分类描述。
等值查询 =
因为查询字段的属性不同,代码编写也有特定要求字符型查询:查询示例:select * from [tab1] where c_name='周伟' order by c_id asc,结果得到姓名为“周伟”的记录重点:查询值用''包围日期型查询:查询示例:select * from [tab1] where c_date=#2012-12-15# order by c_id asc,结果得到2012年-12-15入职人员的记录重点:查询值用##包围逻辑型查询:查询示例:select * from [tab1] where c_marriage=false order by c_id asc,结果得到未婚人员重点:逻辑为真时表达为c_marriage=false,可省略为 c_marriage数字型查询:查询示例:select * from [tab1] where c_age>25 order by c_id asc,结果得到25岁以上人员
重点:连接式可以为=,>,<,>=,<=
模糊查询 likelike适用于查询字段中的文本。一般配合通配符 % 使用。需要查询的文本用 ‘’包围。查询示例:select * from [tab1] where c_department like '%大%' order by c_id asc,查询结果为含有“大”的部门
%是通配符号,代表1-n个字符、数字
查询示例:select * from [tab1] where c_department like '亚%' order by c_id asc,去掉前面的%,查询结果为开头为“亚”的部门
同理,如果去年后面的%,如%亚。查询结果就是最后为“亚”的部门。如果前后通配符全部取消, like '亚' 等同于等值查询中的 =‘亚’like还可以结合[ ]使用。[ ]中的字符会逐个查询,如like '%[亚非]%' ,不是查询"[亚非]"关键词,而是分别查询 “亚”、“非”。查询结果如下:
也可以like '[亚非]%' 或like '%[亚非]' ,分别指定开头或结尾的关键词。
[ ]中关键词可结合“!”使用,表达为逻辑非。查询语句:select * from [tab1] where c_department like '[!亚非]%' order by c_id asc,将得到不是“亚”和“非”开头的部门
需要注意的是,采用“!"定义关键词只能在开头或者结尾查询, like '[!亚非]%' 或 like '%[!亚非]' 都是有效的查询,而 like '%[!亚非]%',逻辑定义是,在任何位置只要不是”亚“或者”非“,条件成立。将得到全部记录。
在like语句中使用[ ]标识关键词在单独字母字段中更为实用,还可以简写为[a-d]=[abcd],查询字段 like '[a-d]' 等同于 查询字段 in('a','b','c','d'),也等同于 ( 查询字段=’a')or ( 查询字段='b') or ( 查询字段='b') or ( 查询字段='b')网上介绍,like语句可以使用通配符 ”#“”?""*""-"在本环境下并未得到验证,应该中sql专用格式,并不适用于access。
区间查询 between
区间查询的基本格式为 between aa and bb,aa和bb必须为同一类型变量,并且与字段属性相符合。通常仅针对数字的日期进行查询
查询示例:select * from [tab1] where c_age between 25 and 40 order by c_id asc,查询的结果是
工号
姓名
部门
职位
入职日期
性别
年龄
婚否
2012002
刘胡静
欧洲区
B
2012/12/15
女
25
False
2013001
宗玉明
亚洲区
B
2013/5/1
男
33
True
2013002
杨杨
非洲区
C
2013/6/10
女
28
True
2014002
王琴
美洲区
B
2014/6/15
女
28
True
2015001
李明月
美洲区
B
2015/1/1
女
26
False
2015002
李承中
非洲区
a
2015/5/6
男
32
True
2016002
anna
美洲区
c
2016/3/15
女
30
True
2017001
ai5zhou
欧洲大区
b
2016/3/15
男
34
False
多条件查询 in
实际是等值查询的一种。同一查询条件具有多个参数时,可用in(参数1,参数2,.......)的格式实现。
因为查询字段属性的不同,查询参数也需要不同的格式。格式要求等同于等值查询。文本型参数用''包围,日期型参数用##包围。
查询示例:select * from [tab1] where year(c_date) in(2012,2013) order by c_id asc,查询的结果是入职时间为2012-2013年的人员。
函数查询
有时,我们过滤字段可能比限制查询参数更高效。这就需要用到函数。
上例中,我们需要查询入职时间为2012-2013年的人员,可以这样写:c_date>=#2012-1-1 and c_date<=#2013-12-31 。实际上, 我们用了一个函数year(),代码简化为year(c_date) in(2012,2013)就更容易理解。
需要注意的是,只能用内置函数,而不能使用自定义函数。
常用的函数有:
1、year() month() day()
可以分别从查询字段中提取年月日,将日期比较转化为数字比较
2、len()
查询示例:select * from [tab1] where len(c_name)=2 order by c_id asc,查询的结果是名字为两个字符的人员
3、left() right() mid()
可以限制查询条件的定位。
查询示例:select * from [tab1] where mid(c_department,3,1)='大' order by c_id asc,查询的结果是查询字段中第三个字符为“大”的部门。
其它的查询函数还有max()、min()、count()等,可以分别获得记录集最大值、最小值、记录数。由于主要涉及分组查询,不在本文讨论。
总结
1、不同类型的查询参数需要不同的定义。文本型参数用''包围,日期型参数用##包围。
2、查询参数为单一值的查询一般用等值查询,效率更高。
3、查询参数不是单一值的。
(1)连续性、区间性数值或日期型参数值,可以使用 between 进行查询 (2)文本型查询
等值查询的,可以用 like '[abc]',对应 a、b、c,也可以用 in('a','b','c')
包含式查询的,可以用 like'%[abc]%' ,对应 ade,kas,目录a,hhvc,jcd,b目录等
4、特定条件下,可以通过函数对查询字段进行转化过滤,最常用的就是将日期型字段转化为数字