java Web知識點(2)

AND_YOU_with_ME發表於2017-04-07

SOA面試題部分

1、 web servicesSOA嗎?

SOA是一種思想,它是一種架構的理念,Web Service是一種來實現這理念的技術方法, Web Service是實現SOA的推薦標準。
SOA中,所有的服務之間要鬆耦合,web servcie之間的通訊是通過SOAP協議進行的,SOAP協議是基於XML實現的鬆耦合的協議。
SOA服務需要對他們自己的服務本身進行描述,WSDL就是用來描述如何訪問到SOA的服務。
SOA服務存在於一個目錄中,UDDI就是用來描述從那裡得到SOA服務的,只需要完成SOA的註冊就可以了。

2、 解釋一下什麼是BPEL

BPEL:全稱為Business Process Execution Language,即業務處理執行語言,是一種使用XML編寫的程式語言。用於自動化業務流程,也曾經被稱作WSBPELBPEL4WS。廣泛使用於Web服務相關的專案開發中,優點為具有可移植性和有效保護了投資。
BPEL是一門用於自動化業務流程的形式規約語言。 用XML文件寫入BPEL中的流程能在Web服務之間以標準化的互動方式得到精心組織。這些流程能夠在任何一個符合BPEL規範的平臺或產品上執行。 所以,通過允許顧客們在各種各樣的創作工具和執行平臺之間移動這些流程,BPEL使得他們保護了他們在流程自動化上的投資。儘管以前想使業務流程定義標準化,但BPEL已經引起了史無前例的興趣,而且它最早在軟體供應商中獲得大量認可。

3、 什麼是WEB服務 Web Service?

<1>.程式間以一種標準的方式進行通訊(與程式的開發語言,執行的作業系統,硬體平臺,網路
關係無關)
<2>.用SOAP,WSDL 等協議通訊,以XML 文件方式進行資料交換的網路應用程式.

4、 介紹一下SOASOA的基本特徵?

什麼是SOA
SOA:面向服務的體系結構(Service-Oriented Architecture,SOA,也叫面向服務架構), SOA是指為了解決在Internet環境下業務整合的需要,通過連線能完成特定任務的獨立功能實體實現的一種軟體系統架構。
SOA 是一個元件模型,它將應用程式的不同功能單元(稱為服務)通過這些服務之間定義良好的介面和契約聯絡起來。介面是採用中立的方式進行定義的,它應該獨立於實現服務的硬體平臺、作業系統和程式語言。這使得構建在各種這樣的系統中的服務可以以一種統一和通用的方式進行互動。

SOA與傳統服務的區別
傳統的WebHTML/HTTP)技術有效的解決了人與資訊系統的互動和溝通問題,極大的促進了B2C模式的發展。WEB服務(XML/SOAP /WSDL)技術則是要有效的解決資訊系統之間的互動和溝通問題,促進B2B/EAI/CB2C的發展。SOA則是採用面向服務的商業建模技術和WEB服務技術,實現系統之間的鬆耦合,實現系統之間的整合與協同。WEB服務和SOA的本質思路在於使得資訊系統個體在能夠溝通的基礎上形成協同工作。

解釋下列WebService名詞:WSDL、SOAP、UDDI 

WSDL是一種 XML 格式,用於將網路服務描述為一組端點,這些端點對包含面向文件資訊或程式導向資訊的訊息進行操作。這種格式首先對操作和訊息進行抽象描述,然後將其繫結到具體的網路協議和訊息格式上以定義端點。相關的具體端點即組合成為抽象端點(服務)。
SOAP即簡單物件訪問協議(Simple Object Access Protocol),它是用於交換XML編碼資訊的輕量級協議。
UDDI 的目的是為電子商務建立標準;UDDI是一套基於Web的、分散式的、為Web Service提供的、資訊註冊中心的實現標準規範,同時也包含一組使企業能將自身提供的Web Service註冊,以使別的企業能夠發現的訪問協議的實現標準。

介紹一下你對SOA的認識

這個問題可以從WHY SOA和SOA面臨的挑戰入手回答
1. WHY SOA? SOA的好處在哪裡?
減低IT成本:重用現有的系統,而且SOA系統本身也可以被後來的應用重用; 減少維護費用,對現有系統造成很少的改動。
增加IT收入:快速的適應新的需求,快速的實現,提高效能,實現雲端計算 如 Google, Amazon等等
2. SOA面臨的挑戰有哪些?
更多的系統參與到SOA中,更多的人蔘與到SOA中,需要更多的交流溝通
在安全控制方面特別是在EAI(enterprise application integration)的MOM(Message Oriented Middleware)中的安全控制更加複雜
需要更高更新的技術參與進來,需要更多的有經驗的人員。

主要的開源ESB產品有哪些?各有什麼特點?

主要的開源ESB有Mule,Apache ServiceMix,Open ESB, Jboss ESB, Apache Synapse 等等

Mule

它是一個輕量級的訊息框架和整合平臺,基於EIP(Enterprise Integeration Patterns,由Hohpe和Woolf編寫的一本書)而實現的。
Mule的核心元件是UMO(Universal Message Objects,從Mule2.0開始UMO這一概念已經被元件Componse所代替),UMO實現整合邏輯。

Apache ServiceMix

它是JBI規範的一種實現。它包涵了許多JBI元件,這些元件支援多種協議,比如JMS,HTTP,FTP,FILE等。同時也實現了EIP,規則和排程。

Open ESB是由SUN發起,現在作為Java.net的子專案。所有Open ESB的開發人員都來自SUN。
如同Apache ServiceMix一樣,Open ESB也實現了JBI規範。Open ESB可執行在由SUN支援的Glassfish應用服務中。同時SUN的Netbeans IDE為Open ESB提供了拖拉式的開發工具,這是其他開源ESB不可匹敵的

Apache Synapse具備一些ESB所必備的功能,但是從本質上而言Synapse更是一個web服務仲裁框架,它是構建在Apache Axis2之上的。Synapse的關注點是路由,轉換,訊息驗證以及基於web服務和xml標準的註冊。它支援HTTP, SOAP, SMTP, JMS,FTP ,MTOM/XOPPOP3/IMAP/SMTP 等傳輸協議,還支援多種web服務規範(WS-*),比如WS-Addressing,WS-Security,WS-Policy以及WS- Reliable Messaging。在它的最新版本1.2中加入了對FIX(Financial Information eXchange,金融資訊交換協議 ) 和 Hessian  的支援。同時它還支援多種流行語言,比如Java, JavaScript, Ruby, Groovy等。JBoss ESB是基於JBoss公司的ESB產品Rosetta的。Jboss ESB將JbossMQ作為其訊息層,將JBoss rules為其提供路由功能,
jBPM為其提供服務編排功能。

什麼是ESB?請介紹一下ESB?

ESB的全稱是Enterprise Service Bus (企業服務匯流排)。它是一個ielinghuode用於整合各種企業應用即服務的連線基礎架構,企業服務匯流排能夠通過簡化企業應用及服務之間的連結數量,介面大小以及介面複雜度使企業的面向服務體系SOA更加強大。

Enterprise Service Bus 主要提供一下幾方面的功能:

1. 在服務於服務之間或者應用於應用之間路由訊息;

2. 在服務請求者與服務提供者之間轉換傳輸協議;

3. 在服務請求者與服務提供者之間轉換訊息格式;

4. 處理來自於各種已購源的業務事件;

企業服務匯流排使企業可以更主要的關於企業的核心業務而不用在關注與連線各種應用的IT基礎架構,它還可以讓企業在增加新的服務及對已有服務進行修改時,可以對原有系統及服務不產生影響或者只有微小的影響。

介紹一下Axis2?

Apache Axis2是一個基於Java的Web Service實現, 它提供了完整的物件模型和模組化的架構。
Axis2可以讓你輕易的完成如下工作:
1. 傳送SOAP訊息
2. 接受和處理SOAP訊息
3. 從一個純Java類生成一個Web Service
4. 使用WSDL來建立服務端和客戶端的實現類
5. 非常容易的從一個service來獲取WSDL
6. 傳送和接受帶有附件的SOAP訊息
7. 建立和使用REST的Web Service
8. 建立和使用帶有WS-Security, WS-ReliableMessaging, WS-Addressing, WS-Coordination和WS-AtomicTransaction的Web Service.
9. 使用Axis2的模組化結構來容易的新增新的支援

SOA的常見陷阱或者誤解是什麼?

最經常出現的陷阱是開發人員只注意在構建一個SOA解決方案而不是解決一個特定的業務問題,這樣就會在不同的IT系統之間造成複雜的,不易管理的和不必要的聯絡。

如何在SOA中實現鬆耦合?

實現鬆耦合的一個策略是使用service interface(如果是SOAP web service的話就是指WSDL)來限制它的依賴性, 對消費者隱藏服務的實現。 實現鬆耦合需要更好的包裝服務和功能以降低對service介面的改變。

top-down和bottom-up這兩種實現SOA的流程哪種更鼓勵重用和維護?

因為top-down流程是業務驅動的(business-driven), 所以它能實際的拆分業務和IT之間的不同關注點, 提供一個通用的對兩個都合適的解決方案。所以在大部分情況下,如果你想在中期和長期提高重用和ROL,top-down都是最合適的

如何定義一個可複用的服務?

可複用的服務是一個自主的, 可複用的, 顯式的,無狀態的功能。它擁有一定的粒度,可是是一個組合應用和組合服務的一部分。

可複用的服務必須由服務規範(Service Specifications)描述的業務活動所認可。

一個服務的約束,包括安全, QoS, SLA, 使用策略可能被多個執行時契約(Contracts), 多個介面(SOAP web service的WSDL)和多種實現(程式碼)所定義。

一個可複用的服務需在它的整個生命週期的管理都需要時企業級的。在設計時一直到執行時,它的重用都需要通過規定的流程來保證,而且重用也是需要評估的。

WSDL的操作型別主要有幾種?

request-response型別是最常見的操作型別,但是WSDL總共有四種操作型別

Type

定義

One-way

這個操作會接受訊息但是不會返回一個響應

Request-response

這個操作會接受一個請求而且返回一個響應

Solicit-response

這個操作會傳送一個請求然後等待響應

Notification

這個操作會傳送一個訊息而且不等待響應。

介紹一下WSDL Ports

<portType>元素是最重要的WSDL元素。

它用來描述一個web service, web service進行的操作和web service包含的訊息。

<portType>元素類似與傳統程式語言中的一個功能類。

請介紹一下WSDL的文件結構

WSDL文件的主要元素有:

元素

定義

<types>

web service使用的資料型別

<message>

web service使用的訊息

<portType>

web service進行的操作(方法)

<binding>

web service使用的通訊協議

請簡單介紹一下WSDL

1. WSDL stands for Web Services Description Language, WSDL的全稱是Web Service Description Lanaguage.

2. WSDL是XML格式的, WSDL就是一個XML文件。

3. WSDL是用來描述Web Service的。

4. WSDL也用來定位Web Service。

5. WSDL是W3C推薦的。

第三章:J2EE高階軟體工程師面試題

                          --------資料庫面試題部分

為資料庫建立索引都需要注意些什麼?

1. 索引能提高速度的關鍵就是索引所佔的空間要比表小得多
2. 注意索引的大小,有一些表可以建成索引組織表
3. 索引的列不要太多,要選擇一些selective比較低的列建B-tree索引,選擇selective高的列建bitmap索引(在更新比較多的表不不要建bitmap索引)
4. 將selective較低的列放在前面
5. 在更新不多的表上建索引時,可以考慮用compress選擇,以節約索引的空間

第一正規化(1NF)、第二正規化(2NF)和第三正規化(3NF)之間的區別是什麼?

構造資料庫必須遵循一定的規則。在關聯式資料庫中,這種規則就是正規化。正規化是符合某一種級別的關係模式的集合。關聯式資料庫中的關係必須滿足一定的要求,即滿足不同的正規化。目前關聯式資料庫有六種正規化:第一正規化(1NF)、第二正規化(2NF)、第三正規化(3NF)、第四正規化(4NF)、第五正規化(5NF)和第六正規化(6NF)。滿足最低要求的正規化是第一正規化(1NF)。在第一正規化的基礎上進一步滿足更多要求的稱為第二正規化(2NF),其餘正規化以次類推。一般說來,資料庫只需滿足第三正規化(3NF)就行了。下面我們舉例介紹第一正規化(1NF)、第二正規化(2NF)和第三正規化(3NF)。

3.4.1 第一正規化(1NF)
    在任何一個關聯式資料庫中,第一正規化(1NF)是對關係模式的基本要求,不滿足第一正規化(1NF)的資料庫就不是關聯式資料庫。
     所謂第一正規化(1NF)是指資料庫表的每一列都是不可分割的基本資料項,同一列中不能有多個值,即實體中的某個屬性不能有多個值或者不能有重複的屬性。如果出現重複的屬性,就可能需要定義一個新的實體,新的實體由重複的屬性構成,新實體與原實體之間為一對多關係。在第一正規化(1NF)中表的每一行只包含一個例項的資訊。例如,對於圖3-2 中的員工資訊表,不能將員工資訊都放在一列中顯示,也不能將其中的兩列或多列在一列中顯示;員工資訊表的每一行只表示一個員工的資訊,一個員工的資訊在表中只出現一次。簡而言之,第一正規化就是無重複的列。

3.4.2 第二正規化(2NF)
    第二正規化(2NF)是在第一正規化(1NF)的基礎上建立起來的,即滿足第二正規化(2NF)必須先滿足第一正規化(1NF)。第二正規化(2NF)要求資料庫表中的每個例項或行必須可以被惟一地區分。為實現區分通常需要為表加上一個列,以儲存各個例項的惟一標識。如
3-2 員工資訊表中加上了員工編號(emp_id)列,因為每個員工的員工編號是惟一的,因此每個員工可以被惟一區分。這個惟一屬性列被稱為主關鍵字或主鍵、主碼。
     第二正規化(2NF)要求實體的屬性完全依賴於主關鍵字。所謂完全依賴是指不能存在僅依賴主關鍵字一部分的屬性,如果存在,那麼這個屬性和主關鍵字的這一部分應該分離出來形成一個新的實體,新實體與原實體之間是一對多的關係。為實現區分通常需要為表加上一個列,以儲存各個例項的惟一標識。簡而言之,第二正規化就是非主屬性非部分依賴於主關鍵字。

3.4.3 第三正規化(3NF)
    滿足第三正規化(3NF)必須先滿足第二正規化(2NF)。簡而言之,第三正規化(3NF)要求一個資料庫表中不包含已在其它表中已包含的非主關鍵字資訊。例如,存在一個部門資訊表,其中每個部門有部門編號(dept_id)、部門名稱、部門簡介等資訊。那麼在圖3-2
的員工資訊表中列出部門編號後就不能再將部門名稱、部門簡介等與部門有關的資訊再加入員工資訊表中。如果不存在部門資訊表,則根據第三正規化(3NF)也應該構建它,否則就會有大量的資料冗餘。簡而言之,第三正規化就是屬性不依賴於其它非主屬性。
所謂正規化就是符合某一種級別的關係模式的集合。通過分解把屬於低階正規化的關係模式轉換為幾個屬於高階正規化的關係模式的集合。這一過程稱為規範化。  
   
  1、   第一正規化(1NF):一個關係模式R的所有屬性都是不可分的基本資料項。  
  2、   第二正規化(2NF):關係模式R屬於第一正規化,且每個非主屬性都完全函式依賴於鍵碼。  
  3、   第三正規化(3NF):關係模式R屬於第一正規化,且每個非主屬性都不偉遞領帶於鍵碼。  
  4、   BC正規化(BCNF):關係模式R屬於第一正規化,且每個屬性都不傳遞依賴於鍵碼。

一組SQL面試題

1. 在表A中有資料
ID    MO
1    Y
2    N
請用一個SELECT 語句寫出,如果MO的值為“Y”,返回“YES”,為N返回“NO”
效果如下:
ID    MO
1    YES
2    NO
SELECT ID,MO=CASE
WHEN MO=’Y’ THEN ‘YES’
WHEN MO=’N’ THEN ‘NO’
END
FROM Az
2. 在表A中查詢出自動增長列中31到40之間的資料(注意可能不是連續的)
select * from A where id between 31 and 40
3. 有一個表table中有一個自動增長欄位ID,如果在儲存過程中向這個表插入一條記錄後,如何獲得新記錄的ID.(寫出獲取新記錄ID的函式即可)
CREATE FUNCTION c_currentId()
RETURNS int
AS
BEGIN
declare @lastId int
select @lastId=max(cid) from c
RETURN (@lastId)
END
select tempdb.dbo.c_currentId() as ‘當前C表中最新的編號’
4. having的用法, 是用來做什麼的    having用來對group by 分組後的記錄進行過濾。
5. sql中的什麼函式可以轉換為時間     select convert(datetime,’2000/01/01′)    select cast(’2001/02/02′ as datetime)
6. 查詢資料放入一張臨時表    select * into #A from Test    select * from #A

儲存過程的優缺點是什麼?

優點:
1.由於應用程式隨著時間推移會不斷更改,增刪功能,T-SQL過程程式碼會變得更復雜,StoredProcedure為封裝此程式碼提供了一個替換位置。

2.執行計劃(儲存過程在首次執行時將被編譯,這將產生一個執行計劃-- 實際上是 Microsoft SQL Server為在儲存過程中獲取由 T-SQL 指定的結果而必須採取的步驟的記錄。)快取改善效能。
……..但sql server新版本,執行計劃已針對所有 T-SQL 批處理進行了快取,而不管它們是否在儲存過程中,所以沒比較優勢了。

3.儲存過程可以用於降低網路流量,儲存過程程式碼直接儲存於資料庫中,所以不會產生大量T-sql語句的程式碼流量。

4.使用儲存過程使您能夠增強對執行計劃的重複使用,由此可以通過使用遠端過程呼叫 (RPC) 處理伺服器上的儲存過程而提高效能。RPC 封裝引數和呼叫伺服器端過程的方式使引擎能夠輕鬆地找到匹配的執行計劃,並只需插入更新的引數值。

5.可維護性高,更新儲存過程通常比更改、測試以及重新部署程式集需要較少的時間和精力。

6.程式碼精簡一致,一個儲存過程可以用於應用程式程式碼的不同位置。

7.更好的版本控制,通過使用 Microsoft Visual SourceSafe 或某個其他原始碼控制工具,您可以輕鬆地恢復到或引用舊版本的儲存過程。

8.增強安全性:
a、通過向使用者授予對儲存過程(而不是基於表)的訪問許可權,它們可以提供對特定資料的訪問;
b、提高程式碼安全,防止 SQL隱碼攻擊(但未徹底解決,例如,將資料操作語言--DML,附加到輸入引數);
c、SqlParameter 類指定儲存過程引數的資料型別,作為深層次防禦性策略的一部分,可以驗證使用者提供的值型別(但也不是萬無一失,還是應該傳遞至資料庫前得到附加驗證)。

缺點:

1.如果更改範圍大到需要對輸入儲存過程的引數進行更改,或者要更改由其返回的資料,則您仍需要更新程式集中的程式碼以新增引數、更新 GetValue() 呼叫,等等,這時候估計比較繁瑣了。

2.可移植性差

由於儲存過程將應用程式繫結到 SQL Server,因此使用儲存過程封裝業務邏輯將限制應用程式的可移植性。如果應用程式的可移植性在您的環境中非常重要,則將業務邏輯封裝在不特定於 RDBMS 的中間層中可能是一個更佳的選擇。

如何用SQL語句進行模糊查詢?

LIKE條件一般用在指定搜尋某欄位的時候, 通過”% _” 萬用字元的作用實現模糊查詢功能,萬用字元可以在前面也可以在後面或前後都有。

搜尋以mian開頭:
SELECT * FROM teble WHERE title LIKE ‘mian%’

搜尋以mian結束:
SELECT * FROM teble WHERE title LIKE ‘%mian’

搜尋包含mian:
SELECT * FROM teble WHERE title LIKE ‘%mian%’
註釋:%表示0個或多個字元構成的字串
_表示單個字元

介紹一下內聯、左聯、右聯

.先看一些最簡單的例子

例子

Table A
aid adate
1 a1
2 a2
3 a3

TableB

bid bdate
1 b1
2 b2
4 b4
兩個表a,b相連線,要取出id相同的欄位
select * from a inner join b on a.aid = b.bid這是僅取出匹配的資料.
此時的取出的是:
1 a1 b1
2 a2 b2

那麼left join 指:
select * from a left join b on a.aid = b.bid
首先取出a表中所有資料,然後再加上與a,b匹配的的資料
此時的取出的是:
1 a1 b1
2 a2 b2
3 a3 空字元

同樣的也有right join
指的是首先取出b表中所有資料,然後再加上與a,b匹配的的資料
此時的取出的是:
1 a1 b1
2 a2 b2
4 空字元 b4

LEFT JOIN 或 LEFT OUTER JOIN。
左向外聯接的結果集包括 LEFT OUTER 子句中指定的左表的所有行,而不僅僅是聯接列所匹配的行。如果左表的某行在右表中沒有匹配行,則在相關聯的結果集行中右表的所有選擇列表列均為空值

. left join/right join/inner join操作演示

A記錄如下:
aID aNum
1 a20050111
2 a20050112
3 a20050113
4 a20050114
5 a20050115

B記錄如下:
bID bName
1 2006032401
2 2006032402
3 2006032403
4 2006032404
8 2006032408

實驗如下:
1. left join
sql語句如下:

SELECT * FROM A
LEFT JOIN B
ON A.aID = B.bID
結果如下:
aID aNum bID bName
1 a20050111 1 2006032401
2 a20050112 2 2006032402
3 a20050113 3 2006032403
4 a20050114 4 2006032404
5 a20050115 NULL NULL
(所影響的行數為 5 行)

結果說明:
left join是以A表的記錄為基礎的,A可以看成左表,B可以看成右表,left join是以左表為準的.
換句話說,左表(A)的記錄將會全部表示出來,而右表(B)只會顯示符合搜尋條件的記錄(例子中為: A.aID = B.bID).
B表記錄不足的地方均為NULL.

2. right join
sql語句如下:

SELECT * FROM A
RIGHT JOIN B
ON A.aID = B.bID
結果如下:
aID aNum bID bName
1 a20050111 1 2006032401
2 a20050112 2 2006032402
3 a20050113 3 2006032403
4 a20050114 4 2006032404
NULL NULL 8 2006032408
(所影響的行數為 5 行)

結果說明:
仔細觀察一下,就會發現,和left join的結果剛好相反,這次是以右表(B)為基礎的,A表不足的地方用NULL填充.

3.inner join
sql語句如下:

SELECT * FROM A
INNERJOIN B
ON A.aID = B.bID
結果如下:
aID aNum bID bName
1 a20050111 1 2006032401
2 a20050112 2 2006032402
3 a20050113 3 2006032403
4 a20050114 4 2006032404

結果說明:
很明顯,這裡只顯示出了 A.aID = B.bID的記錄.這說明inner join並不以誰為基礎,它只顯示符合條件的記錄.

-----------------[以下為網上的一點資料]------------------
LEFT JOIN操作用於在任何的 FROM 子句中,組合來源表的記錄。使用 LEFT JOIN 運算來建立一個左邊外部聯接。左邊外部聯接將包含了從第一個(左邊)開始的兩個表中的全部記錄,即使在第二個(右邊)表中並沒有相符值的記錄。

語法:
FROM table1 LEFT JOIN table2 ON table1.field1 compopr table2.field2

說明:
① table1, table2引數用於指定要將記錄組合的表的名稱。
② field1, field2引數指定被聯接的欄位的名稱。且這些欄位必須有相同的資料型別及包含相同型別的資料,但它們不需要有相同的名稱。
③ compopr引數指定關係比較運算子:”=”, “<", ">“, “<=", ">=” 或 “<>“。
④ 如果在INNER JOIN操作中要聯接包含Memo 資料型別或 OLE Object 資料型別資料的欄位,將會發生錯誤。

說一下mysql, oracle等常見資料庫的分頁實現方案?

1.Oracle:
select * from ( select row_.*, rownum rownum_ from ( query_SQL ) row_ where rownum =< max) where rownum_ >= min
2.SQL Server:
select top @pagesize * from tablename where id not in (select top @pagesize*(@page-1) id from tablename order by id) order by id

3.MySQL
select * from tablename limit position, counter

4.DB2
select * from (select *,rownumber() as ROW_NEXT from tablename) where ROW_NEXT between min and max

——————————————————————————————–
1.分頁方案一:(利用Not In和SELECT TOP分頁)效率次之
語句形式:
SELECT TOP 10 * FROM TestTable
WHERE(ID NOT IN (SELECT TOP 20  id FROM  TestTable  ORDERBY  id))   ORDERBYID
SELECT  TOP 頁大小 * FROM TestTable
WHERE( ID NOT IN (SELECT  TOP  每頁大小-1*待查詢頁數-1  id  FROM  表 ORDERBY  id)) ORDERBYID
思路:先查詢出待查詢頁之前的全部條數的id,查詢ID不在這些ID中的指定數量條數

2.分頁方案二:(利用ID大於多少和SELECT TOP分頁)效率最高
語句形式:
SELECT  TOP  10 *   FROM  TestTable
WHERE(ID>(SELECT MAX(id) FROM(SELECT TOP20 id  FROM  TestTable ORDERBYid)AS T))ORDERBY ID
SELECT  TOP  頁大小* FROM  TestTable
WHERE(ID>(SELECT MAX(id) FROM(SELECT TOP 每頁大小*待查詢頁數-1  id FROM 表  ORDERBY id)AS T)) ORDERBY ID
思路:先獲得待查詢頁的之前全部條數id,獲得它們當中最大的ID號,以此最大ID號為標誌,查詢比這個ID號大的指定條數

3.分頁方案三:
SELECT TOP PageSize * FROM(SELECT TOP nPage*PageSize * from YOURTABLE order by id)as a order by id desc
SELECT TOP 每頁條數 * FROM (SELECT TOP 待查詢頁*每頁條數) * from YOURTABLE order by id)as a order by id desc
思路:先正排序查詢出待查詢頁之前(包括當前頁)的全部條數,然後將其倒排序,取指定條數

幾個SQL的面試題

1. 解釋一下SQL裡面的null
答案:null代表一個unknown的值或者一個不存在的值
2. 如何用SQL判斷一個值是不是null?
答案:可以用is null來判斷一個值是不是null
3.    所有包含null的計算表示式的返回結果都是null, 這句話正確嗎?比如5+ null返回null
答案:正確
4. 所有與null得比較運算都返回unknown正確嗎?
答案:正確
5. (unknown or true) = true正確嗎?
答案:正確
6. (unknown or false) = unknown正確嗎?
答案:正確
7. (unknown or unknown) = unknown正確嗎?
答案:正確
8. (true and unknown) = unknown正確嗎?
答案:正確
9. (false and unknown) = false正確嗎?
答案:正確
10. (unknown and unknown) = unknown正確嗎?
答案:正確
11.   (not unknown) = unknown 正確嗎?
答案:正確

介紹一下游標?

遊標是從資料表中提取出來的資料,以臨時表的形式存放在記憶體中,在遊標中有一個資料指標,在初始狀態下指向的是首記錄,利用fetch語句可以移動該指標,從而對遊標中的資料進行各種操作,然後將操作結果寫回資料表中。

SELECT 語句返回的行集包括所有滿足該語句 WHERE 子句中條件的行。由語句所返回的這一完整的行集被稱為結果集。應用程式,特別是互動式聯機應用程式,並不總能將整個結果集作為一個單元來有效地處理。這些應用程式需要一種機制以便每次處理一行或一部分行。遊標就是提供這種機制的結果集擴充套件。

遊標通過以下方式擴充套件結果處理:

l         允許定位在結果集的特定行。

l         從結果集的當前位置檢索一行或多行。

l         支援對結果集中當前位置的行進行資料修改。

l         為由其他使用者對顯示在結果集中的資料庫資料所做的更改提供不同級別的可見性支援。

l         提供指令碼、儲存過程和觸發器中使用的訪問結果集中的資料的 Transact-SQL 語句。

儲存過程的優點有哪些?

l         更快的執行速度:儲存過程只在創造時進行編譯,以後每次執行儲存過程都不需再重新編譯,而一般SQL語句每執行一次就編譯一次,所以使用儲存過程可提高資料庫執行速度;

l         與事務的結合,提供更好的解決方案:當對資料庫進行復雜操作時(如對多個表進行Update、Insert、Query和Delete時),可將此複雜操作用儲存過程封裝起來與資料庫提供的事務處理結合一起使用;

l         支援程式碼重用:儲存過程可以重複使用,可減少資料庫開發人員的工作量;

l         安全性高:可設定只有某此使用者才具有對指定儲存過程的使用權。

相關文章