1. 程式人生 > >遍歷資料庫表(ACCESS/SQL SERVER)的方法。SQL中IN,NOT IN,EXISTS,NOT EXISTS的用法和差別。資料庫中的exists與in

遍歷資料庫表(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;