Java面试宝典 HTML、js、ajax、数据库
html&JavaScript&ajax部分
?
1. 判斷第二個日期比第一個日期大
如何用腳本判斷用戶輸入的的字符串是下面的時間格式2004-11-21必須要保證用戶的輸入是此格式,并且是時間,比如說月份不大于12等等,另外我需要用戶輸入兩個,并且后一個要比前一個晚,只允許用JAVASCRIPT,請詳細幫助作答,,
//這里可用正則表達式判斷提前判斷一下格式,然后按下提取各時間字段內(nèi)容
<script type="text/javascript">
window.onload =function()
{
//這么寫是為了實現(xiàn)js代碼與html代碼的分離,當(dāng)我修改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提交之前如何驗證數(shù)值文本框的內(nèi)容全部為數(shù)字?否則的話提示用戶并終止提交?
<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("含有非數(shù)字字符");
returnfalse;
}
}
return true;
}
</script>
?
4、請寫出用于校驗HTML文本框中輸入的內(nèi)容全部為數(shù)字的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("含有非數(shù)字字符");
eleText.focus();
break;
}
}
}
</script>
除了寫完代碼,還應(yīng)該在網(wǎng)頁上寫出實驗步驟和在代碼中加入實現(xiàn)思路,讓面試官一看就明白你的意圖和檢查你的結(jié)果。
?
5、說說你用過那些ajax技術(shù)和框架,說說它們的區(qū)別
?
?
?Java Web部分
1、Tomcat的優(yōu)化經(jīng)驗
答:去掉對web.xml的監(jiān)視,把jsp提前編輯成Servlet。
有富余物理內(nèi)存的情況,加大tomcat使用的jvm的內(nèi)存
?
?
2、HTTP請求的GET與POST方式的區(qū)別
答:servlet有良好的生存期的定義,包括加載和實例化、初始化、處理請求以及服務(wù)結(jié)束。這個生存期由javax.servlet.Servlet接口的init,service和destroy方法表達。
3、解釋一下什么是servlet;
答:servlet有良好的生存期的定義,包括加載和實例化、初始化、處理請求以及服務(wù)結(jié)束。這個生存期由javax.servlet.Servlet接口的init,service和destroy方法表達。
4、說一說Servlet的生命周期?
答:servlet有良好的生存期的定義,包括加載和實例化、初始化、處理請求以及服務(wù)結(jié)束。這個生存期由javax.servlet.Servlet接口的init,service和destroy方法表達。
?
Servlet被服務(wù)器實例化后,容器運行其init方法,請求到達時運行其service方法,service方法自動派遣運行與請求對應(yīng)的doXXX方法(doGet,doPost)等,當(dāng)服務(wù)器決定將實例銷毀的時候調(diào)用其destroy方法。
web容器加載servlet,生命周期開始。通過調(diào)用servlet的init()方法進行servlet的初始化。通過調(diào)用service()方法實現(xiàn),根據(jù)請求的不同調(diào)用不同的do***()方法。結(jié)束服務(wù),web容器調(diào)用servlet的destroy()方法。
?
5、Servlet的基本架構(gòu)
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()的區(qū)別?
答:前者僅是容器中控制權(quán)的轉(zhuǎn)向,在客戶端瀏覽器地址欄中不會顯示出轉(zhuǎn)向后的地址;后者則是完全的跳轉(zhuǎn),瀏覽器將會得到跳轉(zhuǎn)的地址,并重新發(fā)送請求鏈接。這樣,從瀏覽器的地址欄中可以看到跳轉(zhuǎn)后的鏈接地址。所以,前者更加高效,在前者可以滿足需要時,盡量使用forward()方法,并且,這樣也有助于隱藏實際的鏈接。在有些情況下,比如,需要跳轉(zhuǎn)到一個其它服務(wù)器上的資源,則必須使用
sendRedirect()方法。
?
7、什么情況下調(diào)用doGet()和doPost()?
Jsp頁面中的FORM標簽里的method屬性為get時調(diào)用doGet(),為post時調(diào)用doPost()。
?
8、Request對象的主要方法:
setAttribute(String name,Object):設(shè)置名字為name的request的參數(shù)值
getAttribute(String name):返回由name指定的屬性值
getAttributeNames():返回request對象所有屬性的名字集合,結(jié)果是一個枚舉的實例
getCookies():返回客戶端的所有Cookie對象,結(jié)果是一個Cookie數(shù)組
getCharacterEncoding():返回請求中的字符編碼方式
getContentLength():返回請求的Body的長度
getHeader(String name):獲得HTTP協(xié)議定義的文件頭信息
getHeaders(String name):返回指定名字的request Header的所有值,結(jié)果是一個枚舉的實例
getHeaderNames():返回所以request Header的名字,結(jié)果是一個枚舉的實例
getInputStream():返回請求的輸入流,用于獲得請求中的數(shù)據(jù)
getMethod():獲得客戶端向服務(wù)器端傳送數(shù)據(jù)的方法
getParameter(String name):獲得客戶端傳送給服務(wù)器端的有name指定的參數(shù)值
getParameterNames():獲得客戶端傳送給服務(wù)器端的所有參數(shù)的名字,結(jié)果是一個枚舉的實例
getParametervalues(String name):獲得有name指定的參數(shù)的所有值
getProtocol():獲取客戶端向服務(wù)器端傳送數(shù)據(jù)所依據(jù)的協(xié)議名稱
getQueryString():獲得查詢字符串
getRequestURI():獲取發(fā)出請求字符串的客戶端地址
getRemoteAddr():獲取客戶端的IP地址
getRemoteHost():獲取客戶端的名字
getSession([Boolean create]):返回和請求相關(guān)Session
getServerName():獲取服務(wù)器的名字
getServletPath():獲取客戶端所請求的腳本文件的路徑
getServerPort():獲取服務(wù)器的端口號
removeAttribute(String name):刪除請求中的一個屬性
?
?
?
9、forward和redirect的區(qū)別
forward是服務(wù)器請求資源,服務(wù)器直接訪問目標地址的URL,把那個URL的響應(yīng)內(nèi)容讀取過來,然后把這些內(nèi)容再發(fā)給瀏覽器,瀏覽器根本不知道服務(wù)器發(fā)送的內(nèi)容是從哪兒來的,所以它的地址欄中還是原來的地址。
redirect就是服務(wù)端根據(jù)邏輯,發(fā)送一個狀態(tài)碼,告訴瀏覽器重新去請求那個地址,一般來說瀏覽器會用剛才請求的所有參數(shù)重新請求,所以session,request參數(shù)都可以獲取。
10、request.getAttribute()和?request.getParameter()有何區(qū)別?
HttpServletRequest類既有g(shù)etAttribute()方法,也由getParameter()方法,這兩個方法有以下區(qū)別:
(1)HttpServletRequest類有setAttribute()方法,而沒有setParameter()方法
(2)當(dāng)兩個Web組件之間為鏈接關(guān)系時,被鏈接的組件通過getParameter()方法來獲得請求參數(shù),例如假定welcome.jsp和authenticate.jsp之間為鏈接關(guān)系,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")方法來獲得請求參數(shù)username:
<% String username=request.getParameter("username"); %
(3)當(dāng)兩個Web組件之間為轉(zhuǎn)發(fā)關(guān)系時,轉(zhuǎn)發(fā)目標組件通過getAttribute()方法來和轉(zhuǎn)發(fā)源組件共享request范圍內(nèi)的數(shù)據(jù)。假定authenticate.jsp和hello.jsp之間為轉(zhuǎn)發(fā)關(guān)系。authenticate.jsp希望向hello.jsp傳遞當(dāng)前的用戶名字,如何傳遞這一數(shù)據(jù)呢?先在authenticate.jsp中調(diào)用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()方法傳遞的數(shù)據(jù),會從Web客戶端傳到Web服務(wù)器端,代表HTTP請求數(shù)據(jù)。request.getParameter()方法返回String類型的數(shù)據(jù)。
request.setAttribute()和getAttribute()方法傳遞的數(shù)據(jù)只會存在于Web容器內(nèi)部,在具有轉(zhuǎn)發(fā)關(guān)系的Web組件之間共享。這兩個方法能夠設(shè)置Object類型的共享數(shù)據(jù)。
request.getAttribute()方法返回request范圍內(nèi)存在的對象,而request.getParameter()方法是獲取http提交過來的數(shù)據(jù)。
一般是string型用request.getParameter
對象的引用用request.getAttribute
當(dāng)然啦,String也是對象。
?
11. jsp有哪些內(nèi)置對象?作用分別是什么?分別有什么方法?
答:JSP共有以下9個內(nèi)置的對象:
request?用戶端請求,此請求會包含來自GET/POST請求的參數(shù)
response?網(wǎng)頁傳回用戶端的回應(yīng)
pageContext?網(wǎng)頁的屬性是在這里管理
session?與請求有關(guān)的會話期
application servlet?正在執(zhí)行的內(nèi)容
out?用來傳送回應(yīng)的輸出
config?servlet的構(gòu)架部件
page JSP網(wǎng)頁本身
exception?針對錯誤網(wǎng)頁,未捕捉的例外
?
request表示HttpServletRequest對象。它包含了有關(guān)瀏覽器請求的信息,并且提供了幾個用于獲取cookie, header,和session數(shù)據(jù)的有用的方法。
response表示HttpServletResponse對象,并提供了幾個用于設(shè)置送回瀏覽器的響應(yīng)的方法(如cookies,頭信息等)
out對象是javax.jsp.JspWriter的一個實例,并提供了幾個方法使你能用于向瀏覽器回送輸出結(jié)果。
pageContext表示一個javax.servlet.jsp.PageContext對象。它是用于方便存取各種范圍的名字空間、servlet相關(guān)的對象的API,并且包裝了通用的servlet相關(guān)功能的方法。
session表示一個請求的javax.servlet.http.HttpSession對象。Session可以存貯用戶的狀態(tài)信息
applicaton?表示一個javax.servle.ServletContext對象。這有助于查找有關(guān)servlet引擎和servlet環(huán)境的信息
config表示一個javax.servlet.ServletConfig對象。該對象用于存取servlet實例的初始化參數(shù)。
page表示從該頁面產(chǎn)生的一個servlet實例
?
12. jsp有哪些動作?作用分別是什么?
(這個問題似乎不重要,不明白為何有此題)
答:JSP共有以下6種基本動作
jsp:include:在頁面被請求的時候引入一個文件。
jsp:useBean:尋找或者實例化一個JavaBean。
jsp:setProperty:設(shè)置JavaBean的屬性。
jsp:getProperty:輸出某個JavaBean的屬性。
jsp:forward:把請求轉(zhuǎn)到一個新的頁面。
jsp:plugin:根據(jù)瀏覽器類型為Java插件生成OBJECT或EMBED標記
?
13、JSP的常用指令
isErrorPage(是否能使用Exception對象),isELIgnored(是否忽略表達式)
?
14. JSP中動態(tài)INCLUDE與靜態(tài)INCLUDE的區(qū)別?
答:動態(tài)INCLUDE用jsp:include動作實現(xiàn)
<jsp:include page=included.jsp flush=true />它總是會檢查所含文件中的變化,適合用于包含動態(tài)頁面,并且可以帶參數(shù)靜態(tài)INCLUDE用include偽碼實現(xiàn),定不會檢查所含文件的變化,適用于包含靜態(tài)頁面?<%@include file=included.htm %>
?
15、兩種跳轉(zhuǎn)方式分別是什么?有什么區(qū)別?
(下面的回答嚴重錯誤,應(yīng)該是想問forward和sendRedirect的區(qū)別,畢竟出題的人不是專業(yè)搞文字藝術(shù)的人,可能表達能力并不見得很強,用詞不一定精準,加之其自身的技術(shù)面也可能存在一些問題,不一定真正將他的意思表達清楚了,嚴格意思上來講,一些題目可能根本就無人能答,所以,答題時要掌握主動,只要把自己知道的表達清楚就夠了,而不要去推敲原始題目的具體含義是什么,不要一味想著是在答題)
答:有兩種,分別為:
<jsp:include page=included.jsp flush=true>
<jsp:forward page= nextpage.jsp/>
前者頁面不會轉(zhuǎn)向include所指的頁面,只是顯示該頁的結(jié)果,主頁面還是原來的頁面。執(zhí)行完后還會回來,相當(dāng)于函數(shù)調(diào)用。并且可以帶參數(shù).后者完全轉(zhuǎn)向新頁面,不會再回來。相當(dāng)于go to?語句。
?
16、頁面間對象傳遞的方法
request,session,application,cookie等
?
17、JSP和Servlet有哪些相同點和不同點,他們之間的聯(lián)系是什么?
JSP是Servlet技術(shù)的擴展,本質(zhì)上是Servlet的簡易方式,更強調(diào)應(yīng)用的外表表達。JSP編譯后是"類servlet"。Servlet和JSP最主要的不同點在于,Servlet的應(yīng)用邏輯是在Java文件中,并且完全從表示層中的HTML里分離開來。而JSP的情況是Java和HTML可以組合成一個擴展名為.jsp的文件。JSP側(cè)重于視圖,Servlet主要用于控制邏輯。
?
18、MVC的各個部分都有那些技術(shù)來實現(xiàn)?如何實現(xiàn)?
答:MVC是Model-View-Controller的簡寫。Model代表的是應(yīng)用的業(yè)務(wù)邏輯(通過JavaBean,EJB組件實現(xiàn)),View是應(yīng)用的表示面(由JSP頁面產(chǎn)生),Controller是提供應(yīng)用的處理過程控制(一般是一個Servlet),通過這種設(shè)計模型把應(yīng)用邏輯,處理過程和顯示邏輯分成不同的組件實現(xiàn)。這些組件可以進行交互和重用。
?
19、我們在web應(yīng)用開發(fā)過程中經(jīng)常遇到輸出某種編碼的字符,如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.現(xiàn)在輸入n個數(shù)字,以逗號,分開;然后可選擇升或者降序排序;按提交鍵就在另一頁面顯示按什么排序,結(jié)果為,提供reset
?
[html] view plain copy
?
?
?
?
?
數(shù)據(jù)庫部分
1、用兩種方式根據(jù)部門號從高到低,工資從低到高列出每個員工的信息。
employee: ??eid,ename,salary,deptid;
select * from employee order by deptid desc
?
?
2、列出各個部門中工資高于本部門的平均工資的員工數(shù)和部門號,并按部門號排序
創(chuàng)建表:
MySQL> createtable employee921(id int primary key auto_increment,name varchar(5
0),salary bigint,deptid int);
?
插入實驗數(shù)據(jù):
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);
效率低的一個語句,僅供學(xué)習(xí)參考使用(在group by之后不能使用where,只能使用having,在group by之前可以使用where,即表示對過濾后的結(jié)果分組):
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 ;
?
另外一種方式:關(guān)聯(lián)查詢
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、存儲過程與觸發(fā)器必須講,經(jīng)常被面試到?
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;
觸發(fā)器不允許返回結(jié)果
?
create trigger update_StudentBEFORE update on student FOR EACH ROW
insert into?student value(null,'zxx',28);
mysql的觸發(fā)器目前不能對當(dāng)前表進行操作
?
create trigger update_StudentBEFORE update on student FOR EACH ROW
delete from articles?where id=8;
這個例子不是很好,最好是用刪除一個用戶時,順帶刪除該用戶的所有帖子
這里要注意使用OLD.id
?
觸發(fā)器用處還是很多的,比如校內(nèi)網(wǎng)、開心網(wǎng)、Facebook,你發(fā)一個日志,自動通知好友,其實就是在增加日志時做一個后觸發(fā),再向通知表中寫入條目。因為觸發(fā)器效率高。而UCH沒有用觸發(fā)器,效率和數(shù)據(jù)處理能力都很低。
存儲過程的實驗步驟:
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)
?
觸發(fā)器的實驗步驟:
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);
還有,每插入一個帖子,都希望將版面表中的最后發(fā)帖時間,帖子總數(shù)字段進行同步更新,用觸發(fā)器做效率就很高。下次課設(shè)計這樣一個案例,寫觸發(fā)器時,對于最后發(fā)帖時間可能需要用declare方式聲明一個變量,或者是用NEW.posttime來生成。
?
4、數(shù)據(jù)庫三范式是什么?
第一范式(1NF):字段具有原子性,不可再分。所有關(guān)系型數(shù)據(jù)庫系統(tǒng)都滿足第一范式)
數(shù)據(jù)庫表中的字段都是單一屬性的,不可再分。例如,姓名字段,其中的姓和名必須作為一個整體,無法區(qū)分哪部分是姓,哪部分是名,如果要區(qū)分出姓和名,必須設(shè)計成兩個獨立的字段。
?
第二范式(2NF):
第二范式(2NF)是在第一范式(1NF)的基礎(chǔ)上建立起來的,即滿足第二范式(2NF)必須先滿足第一范式(1NF)。
要求數(shù)據(jù)庫表中的每個實例或行必須可以被惟一地區(qū)分。通常需要為表加上一個列,以存儲各個實例的惟一標識。這個惟一屬性列被稱為主關(guān)鍵字或主鍵。
?
第二范式(2NF)要求實體的屬性完全依賴于主關(guān)鍵字。所謂完全依賴是指不能存在僅依賴主關(guān)鍵字一部分的屬性,如果存在,那么這個屬性和主關(guān)鍵字的這一部分應(yīng)該分離出來形成一個新的實體,新實體與原實體之間是一對多的關(guān)系。為實現(xiàn)區(qū)分通常需要為表加上一個列,以存儲各個實例的惟一標識。簡而言之,第二范式就是非主屬性非部分依賴于主關(guān)鍵字。
?
第三范式的要求如下:
滿足第三范式(3NF)必須先滿足第二范式(2NF)。簡而言之,第三范式(3NF)要求一個數(shù)據(jù)庫表中不包含已在其它表中已包含的非主關(guān)鍵字信息。
所以第三范式具有如下特征:
1,每一列只有一個值
2,每一行都能區(qū)分。
3,每一個表都不包含其他表已經(jīng)包含的非主關(guān)鍵字信息。
例如,帖子表中只能出現(xiàn)發(fā)帖人的id,而不能出現(xiàn)發(fā)帖人的id,還同時出現(xiàn)發(fā)帖人姓名,否則,只要出現(xiàn)同一發(fā)帖人id的所有記錄,它們中的姓名部分都必須嚴格保持一致,這就是數(shù)據(jù)冗余。
?
5、說出一些數(shù)據(jù)庫優(yōu)化方面的經(jīng)驗?
用PreparedStatement一般來說比Statement性能高:一個sql發(fā)給服務(wù)器去執(zhí)行,涉及步驟:語法檢查、語義分析,編譯,緩存
“inert into user values(1,1,1)”-à二進制
“inert into user values(2,2,2)”-à二進制
“inert into user values(?,?,?)”-à二進制
?
?
?
有外鍵約束會影響插入和刪除性能,如果程序能夠保證數(shù)據(jù)的完整性,那在設(shè)計數(shù)據(jù)庫時就去掉外鍵。(比喻:就好比免檢產(chǎn)品,就是為了提高效率,充分相信產(chǎn)品的制造商)
(對于hibernate來說,就應(yīng)該有一個變化:empleyee->Deptment對象,現(xiàn)在設(shè)計時就成了employeeàdeptid)
?
看mysql幫助文檔子查詢章節(jié)的最后部分,例如,根據(jù)掃描的原理,下面的子查詢語句要比第二條關(guān)聯(lián)查詢的效率高:
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';
?
表中允許適當(dāng)冗余,譬如,主題帖的回復(fù)數(shù)量和最后回復(fù)時間等
將姓名和密碼單獨從用戶表中獨立出來。這可以是非常好的一對一的案例喲!
?
sql語句全部大寫,特別是列名和表名都大寫。特別是sql命令的緩存功能,更加需要統(tǒng)一大小寫,sql語句à發(fā)給oracle服務(wù)器à語法檢查和編譯成為內(nèi)部指令à緩存和執(zhí)行指令。根據(jù)緩存的特點,不要拼湊條件,而是用?和PreparedStatment
?
還有索引對查詢性能的改進也是值得關(guān)注的。
?
備注:下面是關(guān)于性能的討論舉例
?
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有什么不同?
假設(shè)我們有一個表Student,包括以下字段與數(shù)據(jù):
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的區(qū)別。
select *
from student
where id < 4
union
select *
from student
where id > 2 and id < 6
結(jié)果將是
1 Aaron 78
2 Bill 76
3 Cindy 89
4 Damon 90
5 Ella 73
如果換成Union All連接兩個結(jié)果集,則返回結(jié)果是:
1 Aaron 78
2 Bill 76
3 Cindy 89
3 Cindy 89
4 Damon 90
5 Ella 73
可以看到,Union和Union All的區(qū)別之一在于對重復(fù)結(jié)果的處理。
?
UNION在進行表鏈接后會篩選掉重復(fù)的記錄,所以在表鏈接后會對所產(chǎn)生的結(jié)果集進行排序運算,刪除重復(fù)的記錄再返回結(jié)果。實際大部分應(yīng)用中是不會產(chǎn)生重復(fù)的記錄,最常見的是過程表與歷史表UNION。如:
select * from gc_dfys
union
select * from ls_jg_dfys
這個SQL在運行時先取出兩個表的結(jié)果,再用排序空間進行排序刪除重復(fù)的記錄,最后返回結(jié)果集,如果表數(shù)據(jù)量大的話可能會導(dǎo)致用磁盤進行排序。
而UNION ALL只是簡單的將兩個結(jié)果合并后就返回。這樣,如果返回的兩個結(jié)果集中有重復(fù)的數(shù)據(jù),那么返回的結(jié)果集就會包含重復(fù)的數(shù)據(jù)了。
從效率上說,UNION ALL要比UNION快很多,所以,如果可以確認合并的兩個結(jié)果集中不包含重復(fù)的數(shù)據(jù)的話,那么就使用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
?
總結(jié)
以上是生活随笔為你收集整理的Java面试宝典 HTML、js、ajax、数据库的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: wifi大师,wifi营销4.5.0版本
- 下一篇: 前端面试总结--JS