遍历数据库表(ACCESS/SQL SERVER)的方法。SQL中IN,NOT IN,EXISTS,NOT EXISTS的用法和差别。数据库中的exists与in

遍历数据库表(ACCESS/SQL SERVER)的方法

以前在网上查找遍历SQL数据库表的方法,可以用

select name from sysobjects where xtype='u' and (not name LIKE 'dtproperties') 
来查询SQL的系统表(SQL SERVER中系统表记录的系统的一些对象信息,包括表、字段、存储过程等等,其实利用系统表不仅仅可以查询遍历所有表,还可以查询遍历莫个表的字段等等,当然利用ADO就可以遍历出字段信息,这里就不多作描述,这里主要针对ACCESS以及ACCESS延伸chude问题作些介绍),可是当遇到 ACCESS时有些人就没办法了,其实ACCESS也是有系统表的,只不过默认是隐藏的,下面我们就来让他们现身,打开一个ACCESS数据库——〉工具 ——〉选项——〉视图页,把“系统对象”、“隐藏对象”钩上,确定后回数据库看看,看到什么了,哈哈,对,这些就是系统表,这里我们也可以像SQL SERVER利用查询系统表来遍历数据库用户表,可以用

 SELECT Name FROM MSysObjects WHERE ((Left([name],4)<>"MSys") AND Type=1 ORDER BY Name

或者

SELECT Name FROM MSysObjects WHERE Flags=0 AND Type=1 ORDER BY Name 
不过要注意的是默认情况下我们是没有对MSysObjects表有任何的权限的(包括查询),所以我们还要以下操作:打开的ACCESS数据库 ——〉工具——〉安全——〉用户与组的权限,在“对象名称”中选中MSysObjects,在“权限”中钩上“读取数据”,OK了,现在我们就可以像 SQL一样遍历ACCESS数据库所有表了。不过你是不是觉得这样操作比较麻烦(其实也没有多麻烦),下面我们就来介绍另外一种遍历表的方法。
————-ADO的OpenSchema方法————

先给一个简单的例子(前面省略了conn和rs的定义):

 <% Dim adSchemaTables

adSchemaTables=20

Set rs=conn.OpenSchema(adSchemaTables)

Do while not rs.eof    

    IF rs("TABLE_TYPE")="TABLE" THEN 

       Response.Write rs("TABLE_NAME")

     END IF  

   rs.movenext

Loop%> 
这样也就遍历出了所有用户表,当然这个对SQL SERVER同样适用,下面就针对这个简单的例子作个说明,OpenSchema 方法返回与数据源有关的信息,例如关于服务器上的表以及表中的列等信息,参数adSchemaTables=20 表示我需要查询的是关于表的信息,rs(“TABLE_TYPE”)=”TABLE”就表示是用户表而非系统表。关于OpenSchema的祥解可以参考ADO手册或者临时参考http://www.lyu.edu.cn/home/yss/ado/mdmthopenschema.htm

以上只是对查询方法做出了介绍,而并没有写出ASP的逻辑处理,这个只是用ADO执行查询语句,简单的循环输出结果,我想大家应该都会把!

综上:要遍历数据库表我们可以通过查询系统表和利用OpenSchema方法两种方式,限于篇幅,无论是对系统表还是OpenSchema方法,本文都没有做过多详细的介绍,他们还有更多其他的用处,大家可以自己去探索!

============================================================================

SQL中IN,NOT IN,EXISTS,NOT EXISTS的用法和差别

SQL中IN,NOT IN,EXISTS,NOT EXISTS的用法和差别:

IN:确定给定的值是否与子查询或列表中的值相匹配。
IN 关键字使您得以选择与列表中的任意一个值匹配的行。
当要获得居住在 California、Indiana 或 Maryland 州的所有作者的姓名和州的列表时,就需要下列查询:
SELECT ProductID, ProductName FROM Northwind.dbo.Products WHERE CategoryID = 1 OR CategoryID = 4 OR CategoryID = 5
然而,如果使用 IN,少键入一些字符也可以得到同样的结果:
SELECT ProductID, ProductName FROM Northwind.dbo.Products WHERE CategoryID IN (1, 4, 5)
IN 关键字之后的项目必须用逗号隔开,并且括在括号中。
下列查询在 titleauthor 表中查找在任一种书中得到的版税少于 50% 的所有作者的 au_id,然后从 authors 表中选择 au_id 与

titleauthor 查询结果匹配的所有作者的姓名: 
SELECT au_lname, au_fname FROM authors WHERE au_id IN (SELECT au_id FROM titleauthor WHERE royaltyper < 50)
结果显示有一些作者属于少于 50% 的一类。

NOT IN:通过 NOT IN 关键字引入的子查询也返回一列零值或更多值。
以下查询查找没有出版过商业书籍的出版商的名称。
SELECT pub_name FROM publishers WHERE pub_id NOT IN (SELECT pub_id FROM titles WHERE type = 'business')


使用 EXISTS 和 NOT EXISTS 引入的子查询可用于两种集合原理的操作:交集与差集。两个集合的交集包含同时属于两个原集合的所有元素。

差集包含只属于两个集合中的第一个集合的元素。

EXISTS:指定一个子查询,检测行的存在。 
本示例所示查询查找由位于以字母 B 开头的城市中的任一出版商出版的书名:
SELECT DISTINCT pub_name FROM publishers WHERE EXISTS (SELECT * FROM titles WHERE pub_id = publishers.pub_id AND type =

'business')
SELECT distinct pub_name FROM publishers WHERE pub_id IN (SELECT pub_id FROM titles WHERE type = 'business')
两者的区别:
EXISTS:后面可以是整句的查询语句如:SELECT * FROM titles
IN:后面只能是对单列:SELECT pub_id FROM titles

NOT EXISTS:
例如,要查找不出版商业书籍的出版商的名称:
SELECT pub_name FROM publishers WHERE NOT EXISTS (SELECT * FROM titles WHERE pub_id = publishers.pub_id AND type =

'business')
下面的查询查找已经不销售的书的名称:
SELECT title FROM titles WHERE NOT EXISTS (SELECT title_id FROM sales WHERE title_id = titles.title_id)

=====================================================================================

数据库中的exists与in  

对于exists 与 in,以前一直认为功能是通用的,后来经人讲解才发现,完全错误.
in 是指某个值是否存在于某一结果集中.
sql语句:
解释说明:
SELECT * FROM `v_rights` where roleId = 73;
and sysId  in (SELECT sysId FROM `sys_syscap` where parentId =4);
是指表`v_rights`的列sysId的值是否存在于(SELECT sysId FROM `sys_syscap` where parentId =4)的结果集中
exist 是指某个结果集是否存在数据.
解释说明:
sql语句:
select exists (SELECT sysId FROM `sys_syscap` where parentId =99);
如果SELECT sysId FROM `sys_syscap` where parentId =99返回的结果集有,
则select exists (SELECT sysId FROM `sys_syscap` where parentId =99)打印出的结果为1.
相反为0;

猜你喜欢

转载自blog.csdn.net/hljqfl/article/details/86173184