1:觸發(fā)器的作用?
· 觸發(fā)器是一種特殊的存儲過程,主要是通過事件來觸發(fā)而被執(zhí)行的。
· 它可以強(qiáng)化約束,來維護(hù)數(shù)據(jù)的完整性和一致性。
· 可在寫入數(shù)據(jù)表前,強(qiáng)制檢驗或轉(zhuǎn)換數(shù)據(jù)。
· 觸發(fā)器發(fā)生錯誤時,異動的結(jié)果會被撤銷。
· 部分?jǐn)?shù)據(jù)庫管理系統(tǒng)可以針對數(shù)據(jù)定義語言(DDL)使用觸發(fā)器,稱為DDL觸發(fā)器。
· 可依照特定的情況,替換異動的指令 (INSTEAD OF)。
2:觸發(fā)器的限制有哪些?
· 一個表最多只能有三個觸發(fā)器,insert、update、delete
· 每個觸發(fā)器只能用于一個表
· 不能對視圖、臨時表創(chuàng)建觸發(fā)器
· Truncate table能刪除表,但不能觸發(fā)觸發(fā)器
3:什么是存儲過程?用什么來調(diào)用?
· 存儲過程存在于大型數(shù)據(jù)庫系統(tǒng)中,是一個預(yù)編譯的SQL語句(為了完成特定功能的SQL 語句集),經(jīng)過第一次編譯后再次調(diào)用不需要再次編譯。
- 優(yōu)點是:
- 允許模塊化的設(shè)計,就是說只需創(chuàng)建一次,以后在該程序中就可以調(diào)用多次。
- 如果某次操作需要執(zhí)行多次SQL,使用存儲過程比單純SQL語句執(zhí)行要快。
- 減少網(wǎng)絡(luò)流量。存儲過程位于服務(wù)器上,調(diào)用的時候只需要傳遞存儲過程的名稱以及參數(shù)就可以了,因此降低了網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)量。
- 安全性。參數(shù)化的存儲過程可以防止SQL注入式攻擊,而且可以將Grant、Deny以及Revoke權(quán)限應(yīng)用于存儲過程。
- 調(diào)用:
- 1)可以用一個命令對象來調(diào)用存儲過程。
- 2)可以供外部程序調(diào)用,比如:java程序。
4:索引的作用?它的優(yōu)缺點是什么?
· 索引就一種特殊的查詢表,數(shù)據(jù)庫的搜索可以利用它加速對數(shù)據(jù)的檢索。
· 它很類似與現(xiàn)實生活中書的目錄,不需要查詢整本書內(nèi)容就可以找到想要的數(shù)據(jù)。
· 索引可以是唯一的,創(chuàng)建索引允許指定單個列或者是多個列。
· 缺點是它減慢了數(shù)據(jù)錄入的速度,同時也增加了數(shù)據(jù)庫的尺寸大小。
5:什么樣的字段適合建索引?
· 唯一
· 主、外鍵
· 不為空
· 表之間的關(guān)聯(lián)字段
· 查詢比較頻繁的字段
6:索引類型有哪些?
Single column 單行索引
Concatenated 多行索引
Unique 唯一索引
NonUnique 非唯一索引
Function-based 函數(shù)索引
Domain 域索引 物理上:
Partitioned 分區(qū)索引
NonPartitioned 非分區(qū)索引
B-tree :
Normal 正常型B樹
Rever Key 反轉(zhuǎn)型B樹
Bitmap 位圖索引
7:什么是事務(wù)?什么是鎖?
- 事務(wù)就是被綁定在一起作為一個邏輯工作單元的SQL語句分組
如果任何一個語句操作失敗那么整個操作就被失敗,以后操作就會回滾到操作前狀態(tài),或者是上有個節(jié)點。
為了確保要么執(zhí)行,要么不執(zhí)行,就可以使用事務(wù)。
要將有組語句作為事務(wù)考慮,就需要通過ACID測試:
即原子性,一致性,隔離性和持久性。
- 鎖:鎖是實現(xiàn)事務(wù)的關(guān)鍵,鎖可以保證事務(wù)的完整性和并發(fā)性。
與現(xiàn)實生活中鎖一樣,它可以使某些數(shù)據(jù)的擁有者,在某段時間內(nèi)不能使用某些數(shù)據(jù)或數(shù)據(jù)結(jié)構(gòu)。
當(dāng)然鎖還分級別的,比如頁級鎖、行級鎖等。
8:什么叫視圖?游標(biāo)是什么?
- 視圖:是一種虛擬的表,具有和物理表相同的功能。
可以對視圖進(jìn)行增,改,查,操作,試圖通常是有一個表或者多個表的行或列的子集。
對視圖的修改會影響基本表。它使得我們獲取數(shù)據(jù)更容易,相比多表查詢。
- 游標(biāo):是對查詢出來的結(jié)果集作為一個單元來有效的處理。
游標(biāo)可以定在該單元中的特定行,從結(jié)果集的當(dāng)前行檢索一行或多行。
可以對結(jié)果集當(dāng)前行做修改。
一般不使用游標(biāo),但是需要逐條處理數(shù)據(jù)的時候,游標(biāo)顯得十分重要。
9:視圖的優(yōu)缺點?
- 優(yōu)點:
- 對數(shù)據(jù)庫的訪問,因為視圖可以有選擇性的選取數(shù)據(jù)庫里的一部分。
- 用戶通過簡單的查詢可以從復(fù)雜查詢中得到結(jié)果。
- 維護(hù)數(shù)據(jù)的獨(dú)立性,試圖可從多個表檢索數(shù)據(jù)。
- 對于相同的數(shù)據(jù)可產(chǎn)生不同的視圖。
- 缺點:
- 性能:查詢視圖時,必須把視圖的查詢轉(zhuǎn)化成對基本表的查詢,如果這個視圖是由一個復(fù)雜的多表查詢所定義,那么,那么就無法更改數(shù)據(jù)
10:列舉幾種表連接方式,有什么區(qū)別?
- 內(nèi)連接、自連接、外連接(左、右、全)、交叉連接
- 內(nèi)連接:只有兩個元素表相匹配的才能在結(jié)果集中顯示。
- 外連接:
- 左外連接:左邊為驅(qū)動表,驅(qū)動表的數(shù)據(jù)全部顯示,匹配表的不匹配的不會顯示。
- 右外連接:右邊為驅(qū)動表,驅(qū)動表的數(shù)據(jù)全部顯示,匹配表的不匹配的不會顯示。
- 全外連接:連接的表中不匹配的數(shù)據(jù)全部會顯示出來。
- 交叉連接: 笛卡爾效應(yīng),顯示的結(jié)果是鏈接表數(shù)的乘積。
11:主鍵和外鍵的區(qū)別?
· 主鍵在本表中是唯一的、不可唯空的,外鍵可以重復(fù)可以唯空;
· 外鍵和另一張表的主鍵關(guān)聯(lián),不能創(chuàng)建對應(yīng)表中不存在的外鍵。
12:在數(shù)據(jù)庫中查詢語句速度很慢,如何優(yōu)化?
· 建索引
· 減少表之間的關(guān)聯(lián)
· 優(yōu)化sql,不要讓sql做全表查詢
· 簡化查詢字段,沒用的字段不要,已經(jīng)對返回結(jié)果的控制,盡量返回少量數(shù)據(jù)
· 盡量用PreparedStatement來查詢,不要用Statement
13:數(shù)據(jù)庫三范式是什么?
· 第一范式:列不可再分
· 第二范式:行可以唯一區(qū)分,主鍵約束
· 第三范式:表的非主屬性不能依賴與其他表的非主屬性外鍵約束,且三大范式是一級一級依賴的,第二范式建立在第一范式上,第三范式建立第一第二范式上
14:union和union all有什么不同?
· UNION在進(jìn)行表鏈接后會篩選掉重復(fù)的記錄,所以在表鏈接后會對所產(chǎn)生的結(jié)果集進(jìn)行排序運(yùn)算,刪除重復(fù)的記錄再返回結(jié)果。
實際大部分應(yīng)用中是不會產(chǎn)生重復(fù)的記錄,最常見的是過程表與歷史表UNION。
· UNION ALL只是簡單的將兩個結(jié)果合并后就返回。這樣,如果返回的兩個結(jié)果集中有重復(fù)的數(shù)據(jù),那么返回的結(jié)果集就會包含重復(fù)的數(shù)據(jù)了。
· 從效率上說,UNION ALL 要比UNION快很多,所以,如果可以確認(rèn)合并的兩個結(jié)果集中不包含重復(fù)的數(shù)據(jù)的話,那么就使用UNION ALL。
15:varchar2、varchar、char有什么區(qū)別?
- Char的長度是固定的,而varchar2的長度是可以變化的
比如,存儲字符串“abc”對于char(20),表示你存儲的字符將占20個字節(jié),包含17個空,而同樣的varchar2(20)只占了3個字節(jié),20只是最大值,當(dāng)你存儲的字符小于20時,按實際長度存儲。
- char的效率要被varchar2的效率高。
- 目前varchar是varchar2的同義詞
工業(yè)標(biāo)準(zhǔn)的varchar類型可以存儲空字符串,但是oracle不能這樣做,盡管它保留以后這樣做的權(quán)利。
Oracle自己開發(fā)了一個數(shù)據(jù)類型varchar2,這個類型不是一個標(biāo)準(zhǔn)的varchar,他將在數(shù)據(jù)庫中varchar列可以存儲空字符串的特性改為存儲null值,如果你想有向后兼容的能力,oracle建議使用varchar2而不是varchar
16:Oracle語句有多少類型?
- Oracle語句分三類:DDL、DML、DCL。
- DDL(Data Definition Language)數(shù)據(jù)定義語言,包括:
- Create語句:可以創(chuàng)建數(shù)據(jù)庫和數(shù)據(jù)庫的一些對象。
- Drop語句:可以刪除數(shù)據(jù)表、索引、觸發(fā)程序、條件約束以及數(shù)據(jù)表的權(quán)限等
- Alter語句:修改數(shù)據(jù)表定義及屬性。
- Truncate語句:刪除表中的所有記錄,包括所有空間分配的記錄被刪除。
- DML(Data Manipulation Language)數(shù)據(jù)操控語言,包括:
- Insert語句:向數(shù)據(jù)表張插入一條記錄。
- Delete語句:刪除數(shù)據(jù)表中的一條或多條記錄,也可以刪除數(shù)據(jù)表中的所有記錄,但是它的操作對象仍是記錄。
- Update語句:用于修改已存在表中的記錄的內(nèi)容。
- DCL(Data Control Language)數(shù)據(jù)庫控制語言,包括:
- Grant語句:允許對象的創(chuàng)建者給某用戶或某組或所有用戶(PUBLIC)某些特定的權(quán)限。
- Revoke語句:可以廢除某用戶或某組或所有用戶訪問權(quán)限
17:從數(shù)據(jù)庫中隨機(jī)取50條?
· ORACLE
- select * from (select * from t_example order by dbms_random.value) where rownum <=>=>50
· MYSQL
- select * from hj_user order by rand() limit 50
· SQLServer
- select top 20 * from tableName order by newid()
18:order by與group by的區(qū)別?
- order by 排序查詢、asc升序、desc降序
- group by 分組查詢、having 只能用于group by子句、作用于組內(nèi)。
having條件子句可以直接跟函數(shù)表達(dá)式。
使用group by 子句的查詢語句需要使用聚合函數(shù)。
19:commit在哪里會運(yùn)用
- Oracle的commit就是DML語句提交數(shù)據(jù)(這里是釋放鎖不是鎖表),在未提交前你前面的操作更新的都是內(nèi)存,沒有更新到物理文件中。
- 執(zhí)行commit從用戶角度講就是更新到物理文件了,事實上commit時還沒有寫date file,而是記錄了redo log file,要從內(nèi)存寫到data物理文件,需要觸發(fā)檢查點,由DBWR這個后臺進(jìn)程來寫,這里內(nèi)容有點多的,如果不深究的話你就理解成commit即為從內(nèi)存更新到物理文件。
- insert以后commit之前是鎖表的狀態(tài),其他事務(wù)無法對該表進(jìn)行操作
- 如果不提交的話,那么這個表就被鎖了
20:序列的作用
· Oracle使用序列來生成唯一編號,用來處理一個表中自增字段。
· Oracle序列是原子對象,并且是一致的。
也就是說,一旦您訪問一個序列號,Oracle將在處理下一個請求之前自動遞增下一個編號,從而確保不會出現(xiàn)重復(fù)值。
21:表和視圖的關(guān)系
· 視圖其實就是一條查詢sql語句,用于顯示一個或多個表或其他視圖中的相關(guān)數(shù)據(jù)。
· 表就是關(guān)系數(shù)據(jù)庫中實際存儲數(shù)據(jù)用的。
22:Oracle基本數(shù)據(jù)類型
· 字符串類型:char、nchar、varchar、varchar2、nvarchar2
· 數(shù)字類型: number、integer
· 浮點類型: binary_float、binary_double、float
· 日期類型: date、 timestamp
· LOB類型: blob、clob、nclob、bfile
23:truncate與 delete區(qū)別
- TRUNCATE TABLE 在功能上與不帶 WHERE 子句的 DELETE 語句相同:二者均刪除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系統(tǒng)和事務(wù)日志資源少。
- DELETE 語句每次刪除一行,并在事務(wù)日志中為所刪除的每行記錄一項。
- TRUNCATE TABLE 通過釋放存儲表數(shù)據(jù)所用的數(shù)據(jù)頁來刪除數(shù)據(jù),并且只在事務(wù)日志中記錄頁的釋放。
- TRUNCATE、DELETE、DROP 比較:
- TRUNCATE TABLE :刪除內(nèi)容、釋放空間但不刪除定義。
- DELETE TABLE: 刪除內(nèi)容不刪除定義,不釋放空間。
- DROP TABLE :刪除內(nèi)容和定義,釋放空間。
24:Oracle獲取系統(tǒng)時間
- select to_char(sysdate, 'yyyy-MM-dd HH24:mi:ss') from dual;
25:數(shù)據(jù)庫查詢結(jié)果怎么去重
· 使用distinct關(guān)鍵字
26:事務(wù)四大特性
- ACID:
- 原子性:要么執(zhí)行,要么不執(zhí)行
- 隔離性:所有操作全部執(zhí)行完以前,其它會話不能看到過程
- 一致性:事務(wù)前后,數(shù)據(jù)總額一致
- 持久性:一旦事務(wù)提交,對數(shù)據(jù)的改變就是永久的
27:InnoDB索引和MyISAM索引的區(qū)別?
· 主索引的區(qū)別,InnoDB的數(shù)據(jù)文件本身就是索引文件。而MyISAM的索引和數(shù)據(jù)是分開的。
· 輔助索引的區(qū)別:InnoDB的輔助索引data域存儲相應(yīng)記錄主鍵的值而不是地址。而MyISAM的輔助索引和主索引沒有多大區(qū)別。
· MyISAM表鎖,不支持事務(wù),表損壞率較高
· InnoDB行鎖,支持事務(wù)
28:什么是內(nèi)存泄漏?
- 一般我們所說的內(nèi)存泄漏指的是堆內(nèi)存的泄漏。堆內(nèi)存是程序從堆中為其分配的,大小任意的,使用完后要顯示釋放內(nèi)存。
- 當(dāng)應(yīng)用程序用關(guān)鍵字new等 創(chuàng)建對象時,就從堆中為它分配一塊內(nèi)存,使用完后程序調(diào)用free或者delete釋放該內(nèi)存,否則就說該內(nèi)存就不能被使用,我們就說該內(nèi)存被泄漏了。
29:數(shù)據(jù)庫常見的鎖有哪些?
- 行鎖,表鎖;樂觀鎖,悲觀鎖
- 行鎖:開銷大,加鎖慢;會出現(xiàn)死鎖;鎖定粒度最小,發(fā)生鎖沖突的概率最低,并發(fā)度也最高
- 表鎖:開銷小,加鎖快;不會出現(xiàn)死鎖;鎖定粒度大,發(fā)生鎖沖突的概率最高,并發(fā)度最低
- 悲觀鎖:假定會發(fā)生并發(fā)沖突,屏蔽一切可能違反數(shù)據(jù)完整性的操作
- 樂觀鎖:假設(shè)不會發(fā)生并發(fā)沖突,只在提交操作時檢查是否違反數(shù)據(jù)完整性。不能解決臟讀問題
30:談一談數(shù)據(jù)庫優(yōu)化方面的經(jīng)驗?
從三方面去回答:
- 1:數(shù)據(jù)庫設(shè)計
- 數(shù)據(jù)庫表:字段類型、字段長度、注釋、字段命名規(guī)范
- 數(shù)據(jù)庫索引:外鍵、關(guān)聯(lián)字段、查詢頻率比較高的字段、
如果數(shù)據(jù)表字段>20,則最多支持16個索引
如果數(shù)據(jù)表字段<>
- 數(shù)據(jù)庫視圖:相當(dāng)于一張臨時表,業(yè)務(wù)中,盡量少使用
- 數(shù)據(jù)庫引擎:根據(jù)業(yè)務(wù),選擇對應(yīng)的表引擎技術(shù)
- 數(shù)據(jù)庫存儲過程:盡量少用
- 數(shù)據(jù)庫字符:UTF-8、或者和頁面字符保持一致
- 數(shù)據(jù)庫監(jiān)聽器/觸發(fā)器:一般用于調(diào)度任務(wù)或者備份還原
- 2:業(yè)務(wù)調(diào)用的sql語句優(yōu)化
- 盡量少關(guān)聯(lián)表,效率最高關(guān)聯(lián)4張表,如果多于4張表,則需要開啟兩個鏈接事務(wù),但是這兩個事務(wù),必須在一個service當(dāng)中。
- 如果是查詢語句,則不建議使用*
- 如果是查詢語句,where條件后面,最好使用索引字段進(jìn)行關(guān)聯(lián)
- 3:數(shù)據(jù)庫服務(wù)器的搭建(集群)
- 主從配置:
- 讀寫分離:
- 自動化(容器):