Java面试宝典 HTML、js、ajax、数据库
html&JavaScript&ajax部分
?
1. 判斷第二個日期比第一個日期大
如何用腳本判斷用戶輸入的的字符串是下面的時間格式2004-11-21必須要保證用戶的輸入是此格式,并且是時間,比如說月份不大于12等等,另外我需要用戶輸入兩個,并且后一個要比前一個晚,只允許用JAVASCRIPT,請詳細幫助作答,,
//這里可用正則表達式判斷提前判斷一下格式,然后按下提取各時間字段內容
<script type="text/javascript">
window.onload =function()
{
//這么寫是為了實現js代碼與html代碼的分離,當我修改js時,不能影響html代碼。
document.getElementById("frm1").οnsubmit=
function(){
vard1 = this.d1.value;
vard2 = this.d2.value;
if(!verifyDate(d1)) {alert("第一個日期格式不對");return false;}
if(!verifyDate(d2)) {alert("第二個日期格式不對");return false;}
if(!compareDate(d1,d2)){alert("第二個日期比第一日期小");return false;}
};
}
?
functioncompareDate(d1,d2)
{
var arrayD1= d1.split("-");
var date1 =new Date(arrayD1[0],arrayD1[1],arrayD1[2]);
var arrayD2= d2.split("-");
var date2 =new Date(arrayD2[0],arrayD2[1],arrayD2[2]);
if(date1> date2) return false;
return true;
}
?
functionverifyDate(d)
{
vardatePattern = /^\d{4}-(0?[1-9]|1[0-2])-(0?[1-9]|[1-2]\d|3[0-1])$/;
returndatePattern.test(d);
}
</script>
?
<form id="frm1" action="xxx.html">
<input type="text" name="d1" />
<input type="text" name="d2" />
<input type="submit"/>
</form>
?
2. 用table顯示n條記錄,每3行換一次顏色,即1,2,3用紅色字體,4,5,6用綠色字體,7,8,9用紅顏色字體。
<body>
<table id="tbl">
<tr><td>1</td></tr>
<tr><td>2</td></tr>
<tr><td>3</td></tr>
<tr><td>4</td></tr>
<tr><td>5</td></tr>
<tr><td>6</td></tr>
<tr><td>7</td></tr>
<tr><td>8</td></tr>
<tr><td>9</td></tr>
<tr><td>10</td></tr>
</table>
</body>
<script type="text/javascript">
window.οnlοad=function()
{
var tbl =document.getElementById("tbl");
rows =tbl.getElementsByTagName("tr");
for(i=0;i<rows.length;i++)
{
var j= parseInt(i/3);
if(j%2==0)rows[i].style.backgroundColor="#f00";
else rows[i].style.backgroundColor="#0f0";
}
}
</script>
?
3、HTML的?form提交之前如何驗證數值文本框的內容全部為數字?否則的話提示用戶并終止提交?
<form οnsubmit=’return chkForm(this)’>
<input type="text" name="d1"/>
<input type="submit"/>
</form>
<script type=”text/javascript”?/>
function chkForm(this)
{
var value = thist.d1.value;
var len =value.length;
for(vari=0;i<len;i++)
{
if(value.charAt(i)>"9"|| value.charAt(i)<"0")
{
alert("含有非數字字符");
returnfalse;
}
}
return true;
}
</script>
?
4、請寫出用于校驗HTML文本框中輸入的內容全部為數字的javascript代碼
<input type="text" id="d1" οnblur=" chkNumber(this)"/>
<script type=”text/javascript”?/>
function chkNumber(eleText)
?
{
var value =eleText.value;
var len =value.length;
for(vari=0;i<len;i++)
{
if(value.charAt(i)>"9"|| value.charAt(i)<"0")
{
alert("含有非數字字符");
eleText.focus();
break;
}
}
}
</script>
除了寫完代碼,還應該在網頁上寫出實驗步驟和在代碼中加入實現思路,讓面試官一看就明白你的意圖和檢查你的結果。
?
5、說說你用過那些ajax技術和框架,說說它們的區別
?
?
?Java Web部分
1、Tomcat的優化經驗
答:去掉對web.xml的監視,把jsp提前編輯成Servlet。
有富余物理內存的情況,加大tomcat使用的jvm的內存
?
?
2、HTTP請求的GET與POST方式的區別
答:servlet有良好的生存期的定義,包括加載和實例化、初始化、處理請求以及服務結束。這個生存期由javax.servlet.Servlet接口的init,service和destroy方法表達。
3、解釋一下什么是servlet;
答:servlet有良好的生存期的定義,包括加載和實例化、初始化、處理請求以及服務結束。這個生存期由javax.servlet.Servlet接口的init,service和destroy方法表達。
4、說一說Servlet的生命周期?
答:servlet有良好的生存期的定義,包括加載和實例化、初始化、處理請求以及服務結束。這個生存期由javax.servlet.Servlet接口的init,service和destroy方法表達。
?
Servlet被服務器實例化后,容器運行其init方法,請求到達時運行其service方法,service方法自動派遣運行與請求對應的doXXX方法(doGet,doPost)等,當服務器決定將實例銷毀的時候調用其destroy方法。
web容器加載servlet,生命周期開始。通過調用servlet的init()方法進行servlet的初始化。通過調用service()方法實現,根據請求的不同調用不同的do***()方法。結束服務,web容器調用servlet的destroy()方法。
?
5、Servlet的基本架構
public class ServletName extends HttpServlet {
public void doPost(HttpServletRequest request,HttpServletResponse response) throws
ServletException, IOException {
}
public void doGet(HttpServletRequest request,HttpServletResponse response) throws
ServletException, IOException {
}
}
6、SERVLET API中forward()與redirect()的區別?
答:前者僅是容器中控制權的轉向,在客戶端瀏覽器地址欄中不會顯示出轉向后的地址;后者則是完全的跳轉,瀏覽器將會得到跳轉的地址,并重新發送請求鏈接。這樣,從瀏覽器的地址欄中可以看到跳轉后的鏈接地址。所以,前者更加高效,在前者可以滿足需要時,盡量使用forward()方法,并且,這樣也有助于隱藏實際的鏈接。在有些情況下,比如,需要跳轉到一個其它服務器上的資源,則必須使用
sendRedirect()方法。
?
7、什么情況下調用doGet()和doPost()?
Jsp頁面中的FORM標簽里的method屬性為get時調用doGet(),為post時調用doPost()。
?
8、Request對象的主要方法:
setAttribute(String name,Object):設置名字為name的request的參數值
getAttribute(String name):返回由name指定的屬性值
getAttributeNames():返回request對象所有屬性的名字集合,結果是一個枚舉的實例
getCookies():返回客戶端的所有Cookie對象,結果是一個Cookie數組
getCharacterEncoding():返回請求中的字符編碼方式
getContentLength():返回請求的Body的長度
getHeader(String name):獲得HTTP協議定義的文件頭信息
getHeaders(String name):返回指定名字的request Header的所有值,結果是一個枚舉的實例
getHeaderNames():返回所以request Header的名字,結果是一個枚舉的實例
getInputStream():返回請求的輸入流,用于獲得請求中的數據
getMethod():獲得客戶端向服務器端傳送數據的方法
getParameter(String name):獲得客戶端傳送給服務器端的有name指定的參數值
getParameterNames():獲得客戶端傳送給服務器端的所有參數的名字,結果是一個枚舉的實例
getParametervalues(String name):獲得有name指定的參數的所有值
getProtocol():獲取客戶端向服務器端傳送數據所依據的協議名稱
getQueryString():獲得查詢字符串
getRequestURI():獲取發出請求字符串的客戶端地址
getRemoteAddr():獲取客戶端的IP地址
getRemoteHost():獲取客戶端的名字
getSession([Boolean create]):返回和請求相關Session
getServerName():獲取服務器的名字
getServletPath():獲取客戶端所請求的腳本文件的路徑
getServerPort():獲取服務器的端口號
removeAttribute(String name):刪除請求中的一個屬性
?
?
?
9、forward和redirect的區別
forward是服務器請求資源,服務器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,然后把這些內容再發給瀏覽器,瀏覽器根本不知道服務器發送的內容是從哪兒來的,所以它的地址欄中還是原來的地址。
redirect就是服務端根據邏輯,發送一個狀態碼,告訴瀏覽器重新去請求那個地址,一般來說瀏覽器會用剛才請求的所有參數重新請求,所以session,request參數都可以獲取。
10、request.getAttribute()和?request.getParameter()有何區別?
HttpServletRequest類既有getAttribute()方法,也由getParameter()方法,這兩個方法有以下區別:
(1)HttpServletRequest類有setAttribute()方法,而沒有setParameter()方法
(2)當兩個Web組件之間為鏈接關系時,被鏈接的組件通過getParameter()方法來獲得請求參數,例如假定welcome.jsp和authenticate.jsp之間為鏈接關系,welcome.jsp中有以下代碼:
<a href="authenticate.jsp?username=weiqin"authenticate.jsp </a或者:<form name="form1" method="post" action="authenticate.jsp"
請輸入用戶姓名:<input type="text" name="username"
<input type="submit" name="Submit" value="提交"</form在authenticate.jsp中通過request.getParameter("username")方法來獲得請求參數username:
<% String username=request.getParameter("username"); %
(3)當兩個Web組件之間為轉發關系時,轉發目標組件通過getAttribute()方法來和轉發源組件共享request范圍內的數據。假定authenticate.jsp和hello.jsp之間為轉發關系。authenticate.jsp希望向hello.jsp傳遞當前的用戶名字,如何傳遞這一數據呢?先在authenticate.jsp中調用setAttribute()方法:<%String username=request.getParameter("username");
request.setAttribute("username",username);%<jsp:forward page="hello.jsp" /
在hello.jsp中通過getAttribute()方法獲得用戶名字:
<% String username=(String)request.getAttribute("username"); %
Hello: <%=username %
從更深的層次考慮,request.getParameter()方法傳遞的數據,會從Web客戶端傳到Web服務器端,代表HTTP請求數據。request.getParameter()方法返回String類型的數據。
request.setAttribute()和getAttribute()方法傳遞的數據只會存在于Web容器內部,在具有轉發關系的Web組件之間共享。這兩個方法能夠設置Object類型的共享數據。
request.getAttribute()方法返回request范圍內存在的對象,而request.getParameter()方法是獲取http提交過來的數據。
一般是string型用request.getParameter
對象的引用用request.getAttribute
當然啦,String也是對象。
?
11. jsp有哪些內置對象?作用分別是什么?分別有什么方法?
答:JSP共有以下9個內置的對象:
request?用戶端請求,此請求會包含來自GET/POST請求的參數
response?網頁傳回用戶端的回應
pageContext?網頁的屬性是在這里管理
session?與請求有關的會話期
application servlet?正在執行的內容
out?用來傳送回應的輸出
config?servlet的構架部件
page JSP網頁本身
exception?針對錯誤網頁,未捕捉的例外
?
request表示HttpServletRequest對象。它包含了有關瀏覽器請求的信息,并且提供了幾個用于獲取cookie, header,和session數據的有用的方法。
response表示HttpServletResponse對象,并提供了幾個用于設置送回瀏覽器的響應的方法(如cookies,頭信息等)
out對象是javax.jsp.JspWriter的一個實例,并提供了幾個方法使你能用于向瀏覽器回送輸出結果。
pageContext表示一個javax.servlet.jsp.PageContext對象。它是用于方便存取各種范圍的名字空間、servlet相關的對象的API,并且包裝了通用的servlet相關功能的方法。
session表示一個請求的javax.servlet.http.HttpSession對象。Session可以存貯用戶的狀態信息
applicaton?表示一個javax.servle.ServletContext對象。這有助于查找有關servlet引擎和servlet環境的信息
config表示一個javax.servlet.ServletConfig對象。該對象用于存取servlet實例的初始化參數。
page表示從該頁面產生的一個servlet實例
?
12. jsp有哪些動作?作用分別是什么?
(這個問題似乎不重要,不明白為何有此題)
答:JSP共有以下6種基本動作
jsp:include:在頁面被請求的時候引入一個文件。
jsp:useBean:尋找或者實例化一個JavaBean。
jsp:setProperty:設置JavaBean的屬性。
jsp:getProperty:輸出某個JavaBean的屬性。
jsp:forward:把請求轉到一個新的頁面。
jsp:plugin:根據瀏覽器類型為Java插件生成OBJECT或EMBED標記
?
13、JSP的常用指令
isErrorPage(是否能使用Exception對象),isELIgnored(是否忽略表達式)
?
14. JSP中動態INCLUDE與靜態INCLUDE的區別?
答:動態INCLUDE用jsp:include動作實現
<jsp:include page=included.jsp flush=true />它總是會檢查所含文件中的變化,適合用于包含動態頁面,并且可以帶參數靜態INCLUDE用include偽碼實現,定不會檢查所含文件的變化,適用于包含靜態頁面?<%@include file=included.htm %>
?
15、兩種跳轉方式分別是什么?有什么區別?
(下面的回答嚴重錯誤,應該是想問forward和sendRedirect的區別,畢竟出題的人不是專業搞文字藝術的人,可能表達能力并不見得很強,用詞不一定精準,加之其自身的技術面也可能存在一些問題,不一定真正將他的意思表達清楚了,嚴格意思上來講,一些題目可能根本就無人能答,所以,答題時要掌握主動,只要把自己知道的表達清楚就夠了,而不要去推敲原始題目的具體含義是什么,不要一味想著是在答題)
答:有兩種,分別為:
<jsp:include page=included.jsp flush=true>
<jsp:forward page= nextpage.jsp/>
前者頁面不會轉向include所指的頁面,只是顯示該頁的結果,主頁面還是原來的頁面。執行完后還會回來,相當于函數調用。并且可以帶參數.后者完全轉向新頁面,不會再回來。相當于go to?語句。
?
16、頁面間對象傳遞的方法
request,session,application,cookie等
?
17、JSP和Servlet有哪些相同點和不同點,他們之間的聯系是什么?
JSP是Servlet技術的擴展,本質上是Servlet的簡易方式,更強調應用的外表表達。JSP編譯后是"類servlet"。Servlet和JSP最主要的不同點在于,Servlet的應用邏輯是在Java文件中,并且完全從表示層中的HTML里分離開來。而JSP的情況是Java和HTML可以組合成一個擴展名為.jsp的文件。JSP側重于視圖,Servlet主要用于控制邏輯。
?
18、MVC的各個部分都有那些技術來實現?如何實現?
答:MVC是Model-View-Controller的簡寫。Model代表的是應用的業務邏輯(通過JavaBean,EJB組件實現),View是應用的表示面(由JSP頁面產生),Controller是提供應用的處理過程控制(一般是一個Servlet),通過這種設計模型把應用邏輯,處理過程和顯示邏輯分成不同的組件實現。這些組件可以進行交互和重用。
?
19、我們在web應用開發過程中經常遇到輸出某種編碼的字符,如iso8859-1等,如何輸出一個某種編碼的字符串?
Public String translate(String str) {
String tempStr ="";
try {
tempStr = newString(str.getBytes("ISO-8859-1"), "GBK");
tempStr =tempStr.trim();
}
catch (Exception e) {
System.err.println(e.getMessage());
}
return tempStr;
}
?
20.現在輸入n個數字,以逗號,分開;然后可選擇升或者降序排序;按提交鍵就在另一頁面顯示按什么排序,結果為,提供reset
?
[html] view plain copy
?
?
?
?
?
數據庫部分
1、用兩種方式根據部門號從高到低,工資從低到高列出每個員工的信息。
employee: ??eid,ename,salary,deptid;
select * from employee order by deptid desc
?
?
2、列出各個部門中工資高于本部門的平均工資的員工數和部門號,并按部門號排序
創建表:
MySQL> createtable employee921(id int primary key auto_increment,name varchar(5
0),salary bigint,deptid int);
?
插入實驗數據:
mysql> insert into employee921values(null,'zs',1000,1),(null,'ls',1100,1),(null
,'ww',1100,1),(null,'zl',900,1) ,(null,'zl',1000,2), (null,'zl',900,2),(null,'z
l',1000,2) , (null,'zl',1100,2);
?
編寫sql語句:
?
()select avg(salary) from employee921 group by deptid;
()mysql> selectemployee921.id,employee921.name,employee921.salary,employee921.dep
tid tid from?employee921where salary > (select avg(salary) from employee921 where deptid = tid);
效率低的一個語句,僅供學習參考使用(在group by之后不能使用where,只能使用having,在group by之前可以使用where,即表示對過濾后的結果分組):
mysql> selectemployee921.id,employee921.name,employee921.salary,employee921.dep
tid tid from?employee921where salary > (select avg(salary) from employee921 group by deptid havingdeptid = tid);
()select count(*) ,tid
from (
selectemployee921.id,employee921.name,employee921.salary,employee921.deptid tid
from employee921
where salary>
(selectavg(salary) from employee921 where deptid = tid)
) as t
group by tid ;
?
另外一種方式:關聯查詢
select a.ename,a.salary,a.deptid
from emp a,
(selectdeptd,avg(salary) avgsal from emp group by deptid ) b
where a.deptid=b.deptidand a.salary>b.avgsal;
?
3、存儲過程與觸發器必須講,經常被面試到?
create procedure insert_Student (_name varchar(50),_age int ,out_id int)
begin
insert into studentvalue(null,_name,_age);
select max(stuId)into _id from student;
end;
?
call insert_Student('wfz',23,@id);
select @id;
?
mysql> create trigger update_Student BEFORE update on studentFOR EACH ROW
-> select * from student;
觸發器不允許返回結果
?
create trigger update_StudentBEFORE update on student FOR EACH ROW
insert into?student value(null,'zxx',28);
mysql的觸發器目前不能對當前表進行操作
?
create trigger update_StudentBEFORE update on student FOR EACH ROW
delete from articles?where id=8;
這個例子不是很好,最好是用刪除一個用戶時,順帶刪除該用戶的所有帖子
這里要注意使用OLD.id
?
觸發器用處還是很多的,比如校內網、開心網、Facebook,你發一個日志,自動通知好友,其實就是在增加日志時做一個后觸發,再向通知表中寫入條目。因為觸發器效率高。而UCH沒有用觸發器,效率和數據處理能力都很低。
存儲過程的實驗步驟:
mysql> delimiter |
mysql> create procedureinsertArticle_Procedure (pTitle varchar(50),pBid int,out
pId int)
-> begin
-> insert into article1value(null,pTitle,pBid);
-> select max(id) into pId fromarticle1;
-> end;
-> |
Query OK, 0 rows affected (0.05sec)
?
mysql> callinsertArticle_Procedure('傳智播客',1,@pid);
-> |
Query OK, 0 rows affected (0.00sec)
?
mysql> delimiter ;
mysql> select @pid;
+------+
| @pid |
+------+
| 3?|
+------+
1 row in set (0.00 sec)
?
mysql> select * fromarticle1;
+----+--------------+------+
| id | title?| bid |
+----+--------------+------+
| 1?| test | 1 |
| 2?| chuanzhiboke | 1 |
| 3?|?傳智播客?| 1 |
+----+--------------+------+
3 rows in set (0.00 sec)
?
觸發器的實驗步驟:
create table board1(id intprimary key auto_increment,name varchar(50),ar
ticleCount int);
?
create table article1(id intprimary key auto_increment,title varchar(50)
,bid int referencesboard1(id));
?
delimiter |
?
create triggerinsertArticle_Trigger after insert on article1 for each ro
w begin
-> update board1 setarticleCount=articleCount+1 where id= NEW.bid;
-> end;
-> |
?
delimiter ;
?
insert into board1 value(null,'test',0);
?
insert into article1value(null,'test',1);
還有,每插入一個帖子,都希望將版面表中的最后發帖時間,帖子總數字段進行同步更新,用觸發器做效率就很高。下次課設計這樣一個案例,寫觸發器時,對于最后發帖時間可能需要用declare方式聲明一個變量,或者是用NEW.posttime來生成。
?
4、數據庫三范式是什么?
第一范式(1NF):字段具有原子性,不可再分。所有關系型數據庫系統都滿足第一范式)
數據庫表中的字段都是單一屬性的,不可再分。例如,姓名字段,其中的姓和名必須作為一個整體,無法區分哪部分是姓,哪部分是名,如果要區分出姓和名,必須設計成兩個獨立的字段。
?
第二范式(2NF):
第二范式(2NF)是在第一范式(1NF)的基礎上建立起來的,即滿足第二范式(2NF)必須先滿足第一范式(1NF)。
要求數據庫表中的每個實例或行必須可以被惟一地區分。通常需要為表加上一個列,以存儲各個實例的惟一標識。這個惟一屬性列被稱為主關鍵字或主鍵。
?
第二范式(2NF)要求實體的屬性完全依賴于主關鍵字。所謂完全依賴是指不能存在僅依賴主關鍵字一部分的屬性,如果存在,那么這個屬性和主關鍵字的這一部分應該分離出來形成一個新的實體,新實體與原實體之間是一對多的關系。為實現區分通常需要為表加上一個列,以存儲各個實例的惟一標識。簡而言之,第二范式就是非主屬性非部分依賴于主關鍵字。
?
第三范式的要求如下:
滿足第三范式(3NF)必須先滿足第二范式(2NF)。簡而言之,第三范式(3NF)要求一個數據庫表中不包含已在其它表中已包含的非主關鍵字信息。
所以第三范式具有如下特征:
1,每一列只有一個值
2,每一行都能區分。
3,每一個表都不包含其他表已經包含的非主關鍵字信息。
例如,帖子表中只能出現發帖人的id,而不能出現發帖人的id,還同時出現發帖人姓名,否則,只要出現同一發帖人id的所有記錄,它們中的姓名部分都必須嚴格保持一致,這就是數據冗余。
?
5、說出一些數據庫優化方面的經驗?
用PreparedStatement一般來說比Statement性能高:一個sql發給服務器去執行,涉及步驟:語法檢查、語義分析,編譯,緩存
“inert into user values(1,1,1)”-à二進制
“inert into user values(2,2,2)”-à二進制
“inert into user values(?,?,?)”-à二進制
?
?
?
有外鍵約束會影響插入和刪除性能,如果程序能夠保證數據的完整性,那在設計數據庫時就去掉外鍵。(比喻:就好比免檢產品,就是為了提高效率,充分相信產品的制造商)
(對于hibernate來說,就應該有一個變化:empleyee->Deptment對象,現在設計時就成了employeeàdeptid)
?
看mysql幫助文檔子查詢章節的最后部分,例如,根據掃描的原理,下面的子查詢語句要比第二條關聯查詢的效率高:
1.?select e.name,e.salarywhere e.managerid=(select id from employee where name='zxx');
?
2.?select e.name,e.salary,m.name,m.salary fromemployees e,employees m where
e.managerid = m.id andm.name='zxx';
?
表中允許適當冗余,譬如,主題帖的回復數量和最后回復時間等
將姓名和密碼單獨從用戶表中獨立出來。這可以是非常好的一對一的案例喲!
?
sql語句全部大寫,特別是列名和表名都大寫。特別是sql命令的緩存功能,更加需要統一大小寫,sql語句à發給oracle服務器à語法檢查和編譯成為內部指令à緩存和執行指令。根據緩存的特點,不要拼湊條件,而是用?和PreparedStatment
?
還有索引對查詢性能的改進也是值得關注的。
?
備注:下面是關于性能的討論舉例
?
4航班?3個城市
?
m*n
?
select * from flight,city where flight.startcityid=city.cityidand city.name='beijing';
?
m + n
?
?
select * from flight where startcityid = (select cityid fromcity where cityname='beijing');
?
select flight.id,'beijing',flight.flightTime from flight wherestartcityid = (select cityid from city where cityname='beijing')
?
6、union和union all有什么不同?
假設我們有一個表Student,包括以下字段與數據:
drop table student;
create table student
(
id int primary key,
name nvarchar2(50) not null,
score number not null
);
insert into student values(1,'Aaron',78);
insert into student values(2,'Bill',76);
insert into student values(3,'Cindy',89);
insert into student values(4,'Damon',90);
insert into student values(5,'Ella',73);
insert into student values(6,'Frado',61);
insert into student values(7,'Gill',99);
insert into student values(8,'Hellen',56);
insert into student values(9,'Ivan',93);
insert into student values(10,'Jay',90);
commit;
Union和Union All的區別。
select *
from student
where id < 4
union
select *
from student
where id > 2 and id < 6
結果將是
1 Aaron 78
2 Bill 76
3 Cindy 89
4 Damon 90
5 Ella 73
如果換成Union All連接兩個結果集,則返回結果是:
1 Aaron 78
2 Bill 76
3 Cindy 89
3 Cindy 89
4 Damon 90
5 Ella 73
可以看到,Union和Union All的區別之一在于對重復結果的處理。
?
UNION在進行表鏈接后會篩選掉重復的記錄,所以在表鏈接后會對所產生的結果集進行排序運算,刪除重復的記錄再返回結果。實際大部分應用中是不會產生重復的記錄,最常見的是過程表與歷史表UNION。如:
select * from gc_dfys
union
select * from ls_jg_dfys
這個SQL在運行時先取出兩個表的結果,再用排序空間進行排序刪除重復的記錄,最后返回結果集,如果表數據量大的話可能會導致用磁盤進行排序。
而UNION ALL只是簡單的將兩個結果合并后就返回。這樣,如果返回的兩個結果集中有重復的數據,那么返回的結果集就會包含重復的數據了。
從效率上說,UNION ALL要比UNION快很多,所以,如果可以確認合并的兩個結果集中不包含重復的數據的話,那么就使用UNION ALL。
?
?
7.分頁語句
取出sql表中第31到40的記錄(以自動增長ID為主鍵)
sql server方案1:
selecttop 10 * from t where id not in (select top 30 id from t order by id ) orde byid
sql server方案2:
selecttop 10 * from t where id in (select top 40 id from t order by id) order by iddesc
?
mysql方案:select * from t order by idlimit 30,10
?
oracle方案:select * from (select rownum r,* from t where r<=40) wherer>30
?
總結
以上是生活随笔為你收集整理的Java面试宝典 HTML、js、ajax、数据库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: wifi大师,wifi营销4.5.0版本
- 下一篇: 自己总结的java相关面试题