FoosunCMS-自由标签教程
导航:返回上一页
在SQL的世界里,最最基础的操作就是SELECT 语句了。在数据库工具下直接采用SQL的时候很多人都会熟悉下面的操作:
SELECT what
FROM whichTable
WHERE criteria
执行以上语句就会创建一个存放其结果的查询。
而在ASP页面文件上,你也可以采用以上的一般语法,不过情况稍微不同,ASP编程的时候,SELECT 语句的内容要作为字符串赋给一个变量: SQL = "SELECT what FROM whichTable WHERE criteria"
好了,明白了ASP下SQL“说话”的方式,接下来如法炮制即可,只要满足你的需要,传统的SQL查询模式和条件查询都能派用场。
举例说明,不妨假设你的数据库内有个数据表,名字是Products ,现在你想取出这个表里的全部记录。然后你就编写了下面的代码: SQL ="SELECT * FROM Products"
以上代码——SQL语句的作用就是取出表内的全部数据——执行后将会选出数据表内的全部记录。不过,要是只想从表内取出某个特定列,比如p_name。那就不能用 * 通配符了,这里得键入具体某列的名字,代码如下:
SQL ="SELECT p_name FROM Products"
执行以上查询之后Products 表内、p_name 列的内容就会全被选取出来。
用WHERE子句设置查询条件[ ]
有的时候取出全部数据库记录也许正好满足你的要求,不过,在大多数情况下我们通常只需得到部分记录。这样一来该如何设计查询呢?当然会更费点脑筋了,何况本文也存心不想让你去用那个什么劳什子的recordset。
举个例子,假如你只打算取出p_name 记录,而且这些记录的名字必须以字母w打头,那么你就要用到下面的WHERE 子句了:
SQL ="SELECT p_name FROM Products WHERE p_name LIKE 'W%'"
WHERE 关键词的后面跟着用来过滤数据的条件,有了这些条件的帮助,只有满足一定标准的数据才会被查询出来。在以上的例子里,查询的结果只会得到名字以w 打头的p_name 记录。
以上例子中,百分比符号(%)的含义是指示查询返回所有w 字母打头而且后面是任何数据甚至没有数据的记录条目。所以,在执行以上查询的时候, west 和 willow 就会从Products 表内被选取出来并存放在查询里。
就像你看到的那样,只要仔细地设计SELECT 语句,你就可以限制recordset 中返回的信息量,多琢磨琢磨总能满足你的要求。
这些啊还不过是掌握SQL用途刚起步。为了帮助你逐步掌握复杂的SELECT 语句用法,下面就让我们再来看一下关键的标准术语:比较运算符,这些玩意都是你在构筑自己的SELECT 字符串来获得特定数据时要经常用到的。
WHERE子句基础[ ]
在开始创建WHERE 子句的时候,最简单的方式是采用标准的比较符号,它们是 < 、 <= 、 > 、 >= 、<> 和 =。显然,你很快就能明白以下代码的含义和具体运行结果:
SELECT * FROM Products WHERE p_price >= 199.95
SELECT * FROM Products WHERE p_price <> 19.95
SELECT * FROM Products WHERE p_version = '4'
注意: 这里你会注意到,最后一个例句中的数字4周围加了单引号。原因是这样的,在这个例子中的 '4' 是文本类型而非数字类型。因为你会把 SELECT 语句放到引号中来把它作为一个值赋给变量,所以你也可以在语句中采用引号。
比较运算符[ ]
比较运算符指定从表内取出数据的内容范围。你可以用它们来创建过滤器以便缩小recordset的范围,促使其只保存给定任务下你关心的信息。
LIKE、NOT LIKE和 BETWEEN[ ]
你已经在上面取出w打头记录的例子中看到了LIKE的用法。LIKE判定词是一个非常有用的符号。不过,在很多情况下用了它可能会带给你太多的数据,所以在用到它之前最好先开动脑筋多想想自己到底想获得什么数据。假设你想取出5位数字的SKU号码,而且其开头是1结尾是5,那么你可以用下划符(_)代替%符号:
SQL = "SELECT * FROM Products WHERE p_sku LIKE '1___5'"
下划符表示任意一个字符。所以在输入“1 _ _ _ 5”的情况下,你的搜索就会限制在满足特定模式的5位数范围内了。
假如你想反其道而行之,要找出所有不匹配“1_ _ _ 5”模式的SKU条目。那么你只需要在刚才语句例子中的LIKE前面加上NOT就可以了。
BETWEEN
假设你想取出一定范围内的数据,而且你事先知道范围的起点和终点,那么你不妨采用BETWEEN 判断词。现在就让我们假设你想选取给定表内范围在 1和 10之间的记录。你可以如下使用BETWEEN:
WHERE ID BETWEEN 1 AND 10
或者你也可以采用已经熟悉的数学判断字句:
WHERE ID >= 1 AND ID >= 10
联合语句[ ]
我们到目前为止所谈到的SQL语句相对较为简单,如果再能通过标准的recordset循环查询,那么这些语句也能满足一些更复杂的要求。不过,何必非要拘泥在浅尝则止的基础水准之上呢?你完全可以再增加其他一些符号,比如AND、 OR和NOT来完成更强大的功能。
以下面的SQL语句为例:
SQL ="SELECT c_firstname, c_lastname, c_email FROM customers WHERE c_email IS
NOT NULL AND c_purchase = '1' OR c_purchase = '2' AND c_lastname LIKE 'A%'"
就你目前所掌握的SQL知识,以上的例子也不难解释,不过上面的语句并没有很明白地让你看清条件字句是如何胶合在单一SQL语句中的。
多行语句[ ]
在SQL语句不好懂的情况下,你不妨把整个语句分解为多行代码,然后在现有变量基础上逐步增加查询语句的各个组成部分并把它存在同一变量内:
SQL = "SELECT c_firstname, c_lastname, c_emailaddress, c_phone"
SQL = SQL & " FROM customers"
SQL = SQL & " WHERE c_firstname LIKE 'A%' and c_emailaddress NOT NULL"
SQL = SQL & " ORDER BY c_lastname, c_firstname"
到了最后一句,SQL变量就包含了以下的完整SELECT 语句:
"SELECT c_firstname, c_lastname, c_emailaddress, c_phone FROM customers
WHERE c_firstname LIKE 'A%' and c_emailaddress NO NULL ORDER BY c_lastname,
c_firstname"
整句照上面分解之后显然好读多了!在进行调试的时候,你或许更乐于多敲几个字符把程序改得更好读些。不过你可要记住了,在封闭引号之前或者在打开引号之后你需要增加空格,这样才能保证字符串连接起来的时候你没有把几个词凑到了一块。
ORDER BY[ ]
从Access数据库中选取记录有件最令人丧气的事情,它们是以怎样的顺序输入到数据库内就按照怎样的顺序出来。就算你在Access环境内采用Sort By来改变记录视图,数据表内的记录顺序也并没有发生改变。
如果你正在使用ASPrecordset在网页上写出记录,那么你或许知道乱纷纷的顺序是多令人痛苦的事。但是你可能不得不经常得面对这一问题,因为并不存在什么简单方便的解决方案。好在ORDER BY 可以简化这一难题。
为了对你的结果排序,只要在SELECT语句末尾加上ORDER BY,然后指定你需要排序的参照列即可。因此,如果你想要根据顾客的姓氏对Customers表排序,那么你可以编写如下的查询语句:
SQL = "SELECT c_lastname, c_firstname, c_email FROM Customers ORDER BY c_lastname"
这样,只要你建立了recordset而且开始把结果写到屏幕上,你就会看见数据按照字母顺序排列起来了。
多级排序[ ]
其实不仅仅可以在SQL语句中进行一级排序。实际上,在很多情况下,你可能会希望指定两到三级深度的数据排序。
先前采用的单级ORDER BY 排序是按下面的顺序取出数据的:
Absurdly Assured
absurd@assured.com
Absolutely Assured
absolutely@assured.com
Crazed Coder
crazy@coder.net
Loosely Fringe
loose@fringe.to
Lunatic Fringe
lune@fringe.to
Hands On
hands@yes.org
显然ORDER BY 起了应有的作用。在实际的表结构下,Absurdly Assured 是最后的条目,但它排在检索结果的最顶端。Hands On记录排最后因为 O 在以上列表中排在字母表最后。显然,Absolutely按照字母表最好排在Absurdly之前。为此,你需要采取第2级ORDER BY 排序标准,参照第2列进行排序:
SQL = "SELECT c_lastname, c_firstname, c_email FROM Customers ORDER BY
c_lastname, c_firstname"
其结果将首先按照c_lastname 列排序然后按照c_firstname 列排序。假如你的数据表包含的记录比较多,仔细设计排序会令输出结果编排更为合理。
投入使用[ ]
如果你同大多数程序员一样喜欢自己动手编代码,沉湎于掌握新技术的狂热之中。何不从ASP的冗长编码中转过头来尝试一下SQL编码呢?下面我们将就ASP编程时常见的问题以及如何在ASP中高效地利用SQL语句做一番探讨。 好了,SQL的查询语句基本上能看懂了,学起来也就不难了!!
下面我们就开始讲解自由标签了:
登录系统后台→站点管理→自由标签→新建
大家会看到有两个表,
一个是:新闻表(FS_News)字段
另一个是:栏目表(FS_NewsClass)字段
由于大同小异,我们着重讲新闻表(FS_News)字段
名词解释[ ]
- 字段:就是对应在这个数据库表里的字段。
- 类型:就是排序的方式,分为升序和降序。
- 操作:就是查询数据的关系。像等于,大于,小于等。
- 条件值:就是数值判断性字段,是否标题新闻、删除标记等的值为1(真)或0(假),如PicNewsTF=1表示是图片新闻,还可以用栏目ID编号等。
字段名称解释[ ]
- 编号:这个是系统ID编号,一般用于排序。
- 新闻编号:这个是新闻唯一标识字段,一般都要选中。这样才能让程序准确找到新闻的绝对地址。
- 操作方法:双击字段名称可以添加相应的SQL语句,再双击取消。碰到需要加条件值的,可以全部设置好后,点生成才可以,否则条件语句将在你点下一步时条件值消失。只要你记住SQL预览里有的内容都会在点下一步时,保存起来就行了,除非你点了下一步不保存这个自由标签。
按扭解释[ ]
- 清除新闻表:就是清除下面SQL预览里(FS_News)字段里生成的语句。
- 清除栏目表:就是清除栏目表(FS_NewsClass)字段生成的语句。
- 生成:就是生成设置好的SQL语句。
- 次序与数量:点击这个会弹出一个窗口,主要是用来排列生成SQL语句各个字段的次序的,假如其中的字段你往上移,那么对应的SQL语句也会往后移。
下面有个查询数量也就是SQL预览里的Select Top 10 ID这个值,这个值的意思是说:查询库里前10条与当前语句匹配的记录。
再下面有个 栏目对照表:这个是判断属于哪个栏目时用到的,能更精确的去查询。用时只要把后面的数字输入到“所属栏目编号“第三列即可。
下面我以一个简单的实例操作来给大家讲解:
做一个全站推荐新闻自由标签
首先:先确定你所建立栏目里有推荐新闻属性的新闻。
第一:双击“编号”字段,设置降序,为什么呢?因为库里是按ID从小到大,时间从前到后的顺序生成的新闻,也就是说ID号越大,发布的新闻越新。
降序的意思就是:从大到小。
这样,我们在生成新闻时,就可以最新的在上面了,反之也一样。大家可以按需要设置,默认是升序。
然后再双击“新闻编号”,为什么要选这个,这个在库里写着 “新闻唯一标识字段”, 只有选重它,生成的新闻才能是这条新闻的绝对地址,否则程序只生成栏目路径。
第二:
双击“标题”:
既然做推荐新闻,标题是一定要有的吧!所以要双击标题,也就是说无论做什么标签,只要与这个查询内容相关的都要选上,这也像警察捉小偷一样,要有点线索,才能找到地方,当然其它无关的你也可以选,但没必要,只能是浪费时间。让数据库多干活,多做那些没用的事,当然慢了,所 以逻辑的思维是有必要的。
既然是做推荐新闻,这个表里有全站的新闻,你哪知是哪条啊?何况程序呢?所以要加个条件,“是否推荐”这个字段对应着有推荐新闻属性的新闻。选中它,要给他们值这样才能返回数据。操作里选=,值是1,意思就是查询这个字段里所有字段不为空的新闻。
基本上设置好了,这里你还可以设置是否审核条件,和是否删除条件。方法是一样的,我就不多说了。
下一步
给这个标签起名,不用说了吧。
选择模板,如果不选也可以,直接把代码复制到右边那个框里,我就是直接复制的,如果用那个选择的话,会自动过滤HTML标签中的“”,还会自动在table后面加上tbady标签,所以我是直接复制上去的。
我把代码复制出来了
{##}·<a target="_blank" href="[#Url#]" title="[*Title*]">(#Left([*Title*],21)#)</a> |
看明白了吗?就是一个表格,然后循环tr这个行,又因为程序定义了:循环内容{#...#}这里面的是循环内容,所以把他们放到tr外面,作循环用。 然后在href里插入新闻地址,这个系统自带的有,点击插入就OK了,然后就是标题:(#Left([*Title*],21)#) 这个的意思截取标题最左面21个字符,[*Title*]是标题变量,相当于以后生成一个完整的新闻标题,然后Left通过21这个属性,保留下来最左边的21个字符的标题,输出来!OK!保存!
然后点自定义标签—新建标签—自由标签——选中你创建的这个标签,输入你想要生成推荐新闻的数量。 注意:这个数量起决定作用,还记得前面讲的“次序和排序”那里的查询数量吗? 假如这里没有输入任何值,那么就按“次序与排序”那个数量生成新闻,否则无论“次序与排序”那里输入多少,都将会按照现在输入的这个值生成相应数量的新闻。 创建好了这个标签,插入相应的新闻模板中,就可以生成新闻了。