Asp教程

通过asp实例结合结合ACCESS,MSSQL来更好的深入Asp学习 - 爬坡者

« ASP整合的一个SQL语句类一个不错的ASP函数库 »

SQL语句使用精华二

刚刚采集了一个下午,突然发现发现在title字段里多采集了一些字符进来,并且这些字符都一样的.
采集的时候多采集了一个,虽说这几个字符不占多少空间,也不是非常不爽.但是生长首页的时候出了大问题,显示不了.我那就郁闷咯.
于是就想办法解决.
首先,我尝试通过直接进入dedecms一条条修改记录,但是我的天啊,3000多数据,这样一条条改下来,我还不如自己去人肉更新呢.实在太痛苦了.
实在不行,我就干脆从最根源入手,直接修改数据库.于是下载了一个phpmyadmin,开始尝试通过sql语句解决.
刚开始的时候我就用查询语句搜索.
select from 'dede_art; where title like "%%"
好多啊,
查询出1000多条数据.暗自庆幸自己没有一条条更改,否则人都死了.
后来我找来了我一个兄弟,他asp很强的,自己也能够独立使用sql2000开发程序了.他给我写了一段语句.很长,很复杂.层层嵌套.结果执行错误.这句话我就不写了.
然后我又用phpmyadmin,想写一个php短语句,可惜自己php不够精湛,没有办法,写不出来.
于是又问题,google一下(拒绝百度),搜索到一个很爽的字眼replace,于是我就尝试看能否用这个函数.
下面是我写的语句:
update `dede_art` set title=replace(title,' ','');
一下子就执行完了,也没有报错,我还以为又写错了,没有想到浏览时发现,嗨,都不见了.爽.
所以写下这篇文章,希望对大家又所帮助.
关键方法:
update '表名(比如我案例中的dede_art)' set 要修改字段名 = replace (要修改字段名,'被替换的特定字符','替换成的字符')
希望斑竹能够给个精华,想精华想了这么多年了.
这篇文章主要针对有一定asp编程经验和SQL语句基础的爱好者如何写模糊查询语句和多条件查询。
  很多网友问到如何写模糊查询语句和多条件查询,今天网友小爱又问起了这个问题,刚好前几天给一个单位写个OA涉及到多条件模糊查询,那个查询比较多、专业名词也多,这里我整理了一下,假设以姓名、性别、电话号...作为数据库中的字段名。

  通常写一个简单的模糊查询的SQL语句格式可以如下例:
sql="select * from 表名 where 字段名 like ’%" & request.form("请求变量") & "%’ "

说明:1、WHERE 关键词的后面跟着用来过滤数据的条件,百分号%是通配符,可以代表多个任何字符,若是下划线_就代表一个任意字符。
实例如下:
sql="select * from 表名 where 姓名 like ’%"&request.form("name")&"%’ and 性别 like ’%"&request.form("sex")&"%’ and 电话 like
’%"&request.form("call")&"%’ "

上面这条SQL语句使用了三个模糊查询条件:姓名、性别、电话,当然我们还可以用类似
姓名 like ’%"&request.form("name")&"%’
的方式构造更多的条件。这样我们就实现了多条件的模糊查询,实际试一试,问题出来了!!!如果数据库的查询字段都有值的化没问题,但如果是下边这样:
姓名 性别 电话
www.DeepTeach.com 87654321

当你模糊查询:"电话:5432"时将无法输出该记录,这是因为"性别"无值所以经两个and运算后结果为false/0,没有输出。 显然数据库中这三个字段的必须含有字段值,否则会漏掉正确的输出结果,
数据库中正确的输入应是这样的:
姓名 性别 电话
www.DeepTeach.com null 87654321
值的逻辑值为1,所以经两次and运算后结果为true/1,可以输出上述记录。
那么在实际中如何来实现这样的多条件模糊查询呢?我是这样来实现的:
name=Request.QueryString("name") ’姓名
sex=Request.QueryString("sex") ’性别
call=Request.QueryString("call") ’电话

Sql= "Select * from 表名 where 1=1" ’1=1 避免所有查询字段为空时出错

if name <>"" then
Sql= Sql & "and 姓名 like ’%"& name &"%’"
end if
if sex <>"" then
Sql= Sql & "and 性别 = ’"& sex &"’" ’这个不是模糊查询了
end if
if call <>"" then
Sql= Sql & "and 电话 like ’%"& call &"%’"
end if
......

在此,你要注意到姓名、性别、电话这三个字段在数据库中的类型应为“文本”类型,否则查询时会出现“数据类型不匹配”错误。
如果三个条件均无输入,点击“查询”时将显示数据库中的所有记录,可能这是你不希望的,可以应该加入一个判断:当三个条件均无输入时,显示“请输入查询条件”,并中断输出到客户浏览器(response.end)例句如下:
if request.form("name")="" and request.form("sex")="" and request.form("call")="" then
response.write("请输入查询条件(可模糊查询)")
response.end
end if

切记:sql="select * from 表名 where 姓名 ... 电话 like ... "
必须在一行内输入完,而不能用回车符分段,因为vbs多行被认为是多个语句,这是许多初写者常犯的错误。如果你想分多段写,可以用上面的方法在现有变量基础上逐步增加查询语句的各个组成部分并把它存在同一变量内实现。在封闭引号之前或者在打开引号之后你需要增加空格,这样才能保证字符串连接起来的时候你没有把几个词凑到了一块。
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。
  
  SELECT nickname,email
  FROM testtable
  WHERE name='张三'
1、选择所有列
  
例如,下面语句显示testtable表中所有列的数据:
  
  SELECT *
  FROM testtable
2、选择部分列并指定它们的显示次序
  
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。例如:
  
  SELECT nickname,email
  FROM testtable
3、更改列标题
  
在选择列表中,可重新指定列标题。定义格式为:
  
  列标题=列名
  列名 列标题
  
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列标题:
  
  SELECT 昵称=nickname,电子邮件=email
  FROM testtable
4、删除重复行
  
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。
  
5、限制返回的行数
  
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是表示一百分数,指定返回的行数等于总行数的百分之几。例如:
  
SELECT TOP 2 *FROM testtable SELECT TOP 20 PERCENT * FROM testtable



ChinaITLab收集整理

一、 简单查询
  
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的表或视图、以及搜索条件等。
  
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。
  
  SELECT nickname,email
  FROM testtable
  WHERE name='张三'
  
(一) 选择列表
  
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变量和全局变量)等构成。
  
1、选择所有列
  
例如,下面语句显示testtable表中所有列的数据:
  
  SELECT *
  FROM testtable

2、选择部分列并指定它们的显示次序
  
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。例如:
  
  SELECT nickname,email
  FROM testtable

3、更改列标题
  
在选择列表中,可重新指定列标题。定义格式为:
  
  列标题=列名
  列名 列标题
  
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列标题:
  
  SELECT 昵称=nickname,电子邮件=email
  FROM testtable
  
4、删除重复行
  
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。
  
5、限制返回的行数
  
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是表示一百分数,指定返回的行数等于总行数的百分之几。例如:
  
SELECT TOP 2 *FROM testtable SELECT TOP 20 PERCENT * FROM testtable


(二) FROM子句
  
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图,它们之间用逗号分隔。
  
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应使用下面语句格式加以限定:
  
  SELECT username,citytable.cityid
  FROM usertable,citytable
  WHERE usertable.cityid=citytable.cityid

在FROM子句中可用以下两种格式为表或视图指定别名:
  
  表名 as 别名
  表名 别名
  
例如上面语句可用表的别名格式表示为:
  
  SELECT username,b.cityid
  FROM usertable a,citytable b
  WHERE a.cityid=b.cityid

SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。例如:
  
  SELECT a.au_fname+a.au_lname
  FROM authors a,titleauthor ta
  (SELECT title_id,title
  FROM titles
  WHERE ytd_sales>10000
  ) AS t
  WHERE a.au_id=ta.au_id
  AND ta.title_id=t.title_id

此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。

(三) 使用WHERE子句设置查询条件
  
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据:
  
  SELECT *
  FROM usertable
  WHERE age>20

WHERE子句可包括各种条件运算符:
  
  比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!<
  范围运算符(表达式值是否在指定的范围):BETWEEN…AND…
  NOT BETWEEN…AND…
  列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……)
  NOT IN (项1,项2……)
  模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE
  空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL
  逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR
  
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30
  
2、列表运算符例:country IN ('Germany','China')
  
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、varchar、text、ntext、datetime和smalldatetime等类型查询。
  
可使用以下通配字符:
  
  百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。
  
  下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。
  
  方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。
  
例如:
  
  限制以Publishing结尾,使用LIKE '%Publishing'
  
  限制以A开头:LIKE '[A]%'
  
  限制以A开头外:LIKE '[^A]%'
  
4、空值判断符例WHERE age IS NULL
  
5、逻辑运算符:优先级为NOT、AND、OR
  
(四)查询结果排序
  
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为:
  
  ORDER BY {column_name [ASC|DESC]} [,…n]
  
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排序。例如:
  
  SELECT *
  FROM usertable
  ORDER BY age desc,userid ASC

另外,可以根据表达式进行排序。

为了大家更容易理解我举出的SQL语句,本文假定已经建立了一个学生成绩管理数据库,全文均以学生成绩的管理为例来描述。
  1.在查询结果中显示列名:
  a.用as关键字:select name as &#technic;姓名&#technic; from students order by age
  b.直接表示:select name &#technic;姓名&#technic; from students order by age
  2.精确查找:
  a.用in限定范围:select * from students where native in (&#technic;湖南&#technic;, &#technic;四川&#technic;)
  b.between...and:select * from students where age between 20 and 30
  c.“=”:select * from students where name = &#technic;李山&#technic;
  d.like:select * from students where name like &#technic;李%&#technic; (注意查询条件中有“%”,则说明是部分匹配,而且还有先后信息在里面,即查找以“李”开头的匹配项。所以若查询有“李”的所有对象,应该命令:&#technic;%李%&#technic;;若是第二个字为李,则应为&#technic;_李%&#technic;或&#technic;_李&#technic;或&#technic;_李_&#technic;。)
  e.[]匹配检查符:select * from courses where cno like &#technic;[AC]%&#technic; (表示或的关系,与"in(...)"类似,而且"[]"可以表示范围,如:select * from courses where cno like &#technic;[A-C]%&#technic;)
  3.对于时间类型变量的处理
  a.smalldatetime:直接按照字符串处理的方式进行处理,例如:
select * from students where birth > = &#technic;1980-1-1&#technic; and birth <= &#technic;1980-12-31&#technic;
  4.集函数
  a.count()求和,如:select count(*) from students (求学生总人数)
  b.avg(列)求平均,如:select avg(mark) from grades where cno=’B2’
  c.max(列)和min(列),求最大与最小
  5.分组group
  常用于统计时,如分组查总数:
select gender,count(sno)
from students
group by gender
(查看男女学生各有多少)
  注意:从哪种角度分组就从哪列"group by"
  对于多重分组,只需将分组规则罗列。比如查询各届各专业的男女同学人数 ,那么分组规则有:届别(grade)、专业(mno)和性别(gender),所以有"group by grade, mno, gender"
select grade, mno, gender, count(*)
from students
group by grade, mno, gender
  通常group还和having联用,比如查询1门课以上不及格的学生,则按学号(sno)分类有:
select sno,count(*) from grades
where mark<60
group by sno
having count(*)>1
  6.UNION联合
  合并查询结果,如:
SELECT * FROM students
WHERE name like ‘张%’
UNION [ALL]
SELECT * FROM students
WHERE name like ‘李%’
  7.多表查询
  a.内连接
select g.sno,s.name,c.coursename
from grades g JOIN students s ON g.sno=s.sno
JOIN courses c ON g.cno=c.cno
(注意可以引用别名)
b.外连接
b1.左连接
select courses.cno,max(coursename),count(sno)
from courses LEFT JOIN grades ON courses.cno=grades.cno
group by courses.cno
  左连接特点:显示全部左边表中的所有项目,即使其中有些项中的数据未填写完全。
  左外连接返回那些存在于左表而右表中却没有的行,再加上内连接的行。
  b2.右连接
  与左连接类似
  b3.全连接
select sno,name,major
from students FULL JOIN majors ON students.mno=majors.mno
  两边表中的内容全部显示
  c.自身连接
select c1.cno,c1.coursename,c1.pno,c2.coursename
from courses c1,courses c2 where c1.pno=c2.cno
  采用别名解决问题。
  d.交叉连接
select lastname+firstname from lastname CROSS JOIN firstanme
  相当于做笛卡儿积
  8.嵌套查询
  a.用关键字IN,如查询李山的同乡:
select * from students
where native in (select native from students where name=’ 李山’)
  b.使用关键字EXIST,比如,下面两句是等价的:
select * from students
where sno in (select sno from grades where cno=’B2’)
select * from students where exists
(select * from grades where
grades.sno=students.sno AND cno=’B2’)
  9.关于排序order
  a.对于排序order,有两种方法:asc升序和desc降序
  b.对于排序order,可以按照查询条件中的某项排列,而且这项可用数字表示,如:
select sno,count(*) ,avg(mark) from grades
group by sno
having avg(mark)>85
order by 3
  10.其他
  a.对于有空格的识别名称,应该用"[]"括住。
  b.对于某列中没有数据的特定查询可以用null判断,如select sno,courseno from grades where mark IS NULL
  c.注意区分在嵌套查询中使用的any与all的区别,any相当于逻辑运算“||”而all则相当于逻辑运算“&&”
  d.注意在做否定意义的查询是小心进入陷阱:
  如,没有选修‘B2’课程的学生 :
select students.*
from students, grades
where students.sno=grades.sno
AND grades.cno <> ’B2’
  上面的查询方式是错误的,正确方式见下方:
select * from students
where not exists (select * from grades
where grades.sno=students.sno AND cno=&#technic;B2&#technic;)
  11.关于有难度多重嵌套查询的解决思想:
  如,选修了全部课程的学生:
select *
from students
where not exists ( select *
from courses
where NOT EXISTS
(select *
from grades
where sno=students.sno
AND cno=courses.cno))
  最外一重:从学生表中选,排除那些有课没选的。用not exist。由于讨论对象是课程,所以第二重查询从course表中找,排除那些选了课的即可。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新评论及回复

最近发表

Powered By Z-Blog 1.8 Spirit Build 80710

Copyright 2007-2008 papozhe.com [asp教程] All Rights Reserved.
浙ICP备07030537号
免责申明:所有文章除特别声明,均来自网上,主要为学习用!内容仅供参考,版权归原作者。如侵犯您利益,请来信告知.
Email:papozhe$Gmail.com QQ:76336503