【java面試】資料庫篇
1.SQL語句分為哪幾種?
SQL語句主要可以劃分為以下幾類:
DDL(Data Definition Language):資料定義語言,定義對資料庫物件(庫、表、列、索引)的操作。
包括:CREATE、DROP、ALTER、RENAME、 TRUNCATE等
DML(Data Manipulation Language): 資料操作語言,定義對資料庫記錄的操作。
包括:INSERT、DELETE、UPDATE、SELECT等
DCL(Data Control Language): 資料控制語言,定義對資料庫、表、欄位、使用者的訪問許可權和安全級別。
包括:GRANT、REVOKE等
Transaction Control:事務控制
包括:COMMIT、ROLLBACK、SAVEPOINT等
2.Delete、truncaate、drop都是刪除語句,它們有什麼分別?
delete 屬於DML語句,刪除資料,保留表結構,需要commit,可以回滾,如果資料量大,很慢。
truncate 屬於DDL語句,刪除所有資料,保留表結構,自動commit,不可以回滾,一次全部刪除所有資料,速度相對較快。
Drop屬於 DDL語句,刪除資料和表結構,不需要commit,刪除速度最快。
3.Where和having都是條件篩選關鍵字,它們有什麼分別?
WHERE是在資料分組前進行條件過濾, HAVING子句是在資料分組後進行條件過濾,WHERE子句中不能使用聚合函式,HAVING子句可以使用聚合函式。
4.資料庫事務
事務是最小的邏輯工作單元。
事務特性(ACID)
原子性:一個事務裡面的操作要麼不做,要麼都做;
一致性:事務啟動之前和啟動之後要保持平衡狀態
例如完整性約束a+b=10,一個事務改變了a,那麼b也應隨之改變。
隔離性:在一個會話裡面讀取不到另一個會話裡未提交的資料.
永久性:事務一經提交永不回退。
5.如何刪除表中的重複資料,只保留一條記錄?
1.通過建立臨時表
create cf table tbl_tmp as select distinct * from tbl;
truncate table tbl;//清空表記錄
insert into tbl select * from tbl_tmp;//將臨時表中的資料插回來。
2.利用rowid
delete from tbl where rowid in
(select a.rowid from tbl a, tbl b
where a.rowid>b.rowid
and a.col1=b.col1 and a.col2 = b.col2)
3.利用max或min函式
delete from tbl a where rowid not in
(select max(b.rowid) from tbl b where a.col1=b.col1 and a.col2 = b.col2);
//這裡max使用min也可以
delete from tbl where rowid not in
(select max(rowid) from tbl tgroup by t.col1, t.col2);
4.如何通過sql語句完成分頁?
Orcle
1.select t.*,rownum rn from tab t where t.rn<=10(rownum 從1開始)
2.select t.* from (select tab.*,rownum rn from tab where rn<10) t where t.rn>=5(rownum 不從1開始)
3.select t.* from (select tab.*,rownum rn from tab) t where t.rn bettewen 5 and 10(rownum 不從1開始)
Mysql
1.SELECT*FROMtable LIMIT 5,10; // 檢索記錄行 6-15//為了檢索從某一個偏移量到記錄集的結束所有的記錄行,可以指定第二個引數為 -1:
2. SELECT*FROMtable LIMIT 95,-1; // 檢索記錄行 96-last.
//如果只給定一個引數,它表示返回最大的記錄行數目:
3.SELECT*FROMtable LIMIT 5; //檢索前 5 個記錄行5.Oracle資料優化1.建庫:第一步我們先建一個tableaspace(假設表空間名為TEST),
然後建立使用者TEST(一般情況下使用者名稱和表空間同名),
建立的使用者TEST使用已建立的tablespace(TEST).
這樣做是避免訪問上產生熱點。2.建表:根據資料庫三大正規化建表3.索引:在經常查詢的欄位建立索引注意:如果表的列很少,不適合建索引.當執行過多次的insert,delete,update操作後,會產生索引碎片,影響查詢速度4.sql優化:儘量使sql語句使用到索引,避免全表查詢 產生全表查詢的操作符:not in,<>,is null,is not null,like '%%'5.經常查詢的SQL可以寫成儲存過程6.當表資料達到十幾G到幾百G是,可考慮對錶進行分割槽6.JDBC中的Statement 和PreparedStatement的區別?
PreparedStatement是預編譯的SQL語句,效率高於Statement。
PreparedStatement支援?操作符,相對於Statement更加靈活。
PreparedStatement可以防止SQL注入,安全性高於Statement。
注意:當sql語句只執行一次時用Statement,因為PreparedStatement開銷大7.索引的缺點1.需要佔用物理空間;2.當對錶資料進行增加,修改和刪除時,索引也需要動態維護,降低資料維護速度。8.日期格式轉換Mysql字串轉日期,或日期轉字串date_format(dateString,'%Y-%m-%d %H:%i:%s')Oralce字串轉日期 to_date('2017-06-08 15:15','YYYY-MM-DD HH24:MI')日期轉字串 to_char(sysdate,'YYYY-MM-DD HH24:MI:SS AM DY') from dual
結果為:
TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS PM DY)
-------------------------------------
2017-06-08 15:19:15 下午 星期四
9.資料庫連線池
資料庫連線池的基本思想就是為資料庫連線建立一個“緩衝池”。預先在緩衝池中放入一定數量的連線,當需要建立資料庫連線時,只需從“緩衝池”中取出一個,使用完畢之後再放回去。我們可以通過設定連線池最大連線數來防止系統無盡的與資料庫連線。更為重要的是我們可以通過連線池的管理機制監視資料庫的連線的數量﹑使用情況,為系統開發﹑測試及效能調整提供依據。
優點:
第一、減少連線建立時間。連線池中的連線是已準備好的、可重複使用的,獲取後可以直接訪問資料庫,因此減少了連線建立的次數和時間。
第二、簡化的程式設計模式。當使用連線池時,每一個單獨的執行緒能夠像建立一個自己的JDBC連線一樣操作,允許使用者直接使用JDBC程式設計技術。
第三、控制資源的使用。如果不使用連線池,每次訪問資料庫都需要建立一個連線,這樣系統的穩定性受系統連線需求影響很大,很容易產生資源浪費和高負載異常。連線池能夠使效能最大化,將資源利用控制在一定的水平之下。連線池能控制池中的連線數量,增強了系統在大量使用者應用時的穩定性。
10.union all 和union的區別Union All操作僅僅是簡單的將兩個子查詢結果集直接求並操作,並不會剔除掉兩者結果集中重複的部分,而Union操作除了會剔除掉結果集中重複的部分以外,還會對結果集進行排序(其實執行的實質邏輯應該是先將某一子結果集進行排序,然後再判斷是否有重複的資料,若有則刪除掉重複的資料)。
小tips:由於Union需要對查詢結果集進行排序操作,當資料量較大時,若非特殊需要,儘量不要使用Union操作,而改用Union All操作,然後對Union All出來的結果執行去重操作即可,這樣會使得查詢的效率大大的增強。
11.mysql和oracle的區別1. Oracle是大型資料庫而Mysql是中小型資料庫,Oracle市場佔有率達40%,Mysql只有20%左右,同時Mysql是開源的而Oracle價格非常高。2. Oracle支援大併發,大訪問量,是OLTP最好的工具。3. 安裝所用的空間差別也是很大的,Mysql安裝完後才152M而Oracle有3G左右,且使用的時候Oracle佔用特別大的記憶體空間和其他機器效能。4.Oracle也Mysql操作上的一些區別
①自動增長型別的處理 MYSQL有自動增長的資料類型,插入記錄時不用操作此欄位,會自動獲得資料值。ORACLE沒有自動增長的資料類型,需要建立一個自動增長的序列號,插入記錄時要把序列號的下一個值賦於此欄位。
②單引號的處理 MYSQL裡可以用雙引號包起字串,ORACLE裡只可以用單引號包起字串。③分頁的SQL語句的處理 MYSQL處理分頁的SQL語句比較簡單,用LIMIT 開始位置, 記錄個數;ORACLE處理分頁的SQL語句就比較繁瑣了。每個結果集只有一個ROWNUM欄位標明它的位置, 並且只能用ROWNUM<100, 不能用ROWNUM>80④ 長字串的處理 ORACLE也有它特殊的地方。INSERT和UPDATE時最大可操作的字串長度小於等於4000個單位元組, 如果要插入更長的字串, 請考慮欄位用CLOB型別,方法借用ORACLE裡自帶的DBMS_LOB程式包。插入修改記錄前一定要做進行非空和長度判斷,不能為空的欄位值和超出長度欄位值都應該提出警告,返回上次操作。 ⑤空字元的處理 MYSQL的非空欄位允許為空字串,ORACLE裡定義了非空欄位就不容許為空字串。⑥字串的模糊比較 MYSQL裡用 欄位名 like '%字串%',ORACLE裡也可以用 欄位名 like '%字串%' 但這種方法不能使用索引, 速度不快。⑦日期欄位的處理MYSQL日期欄位分DATE和TIME兩種,ORACLE日期欄位只有DATE,包含年月日時分秒資訊,用當前資料庫的系統時間為SYSDATE, 精確到秒
歡迎關注微信公眾號"java從心"