1、觸發器的做用?java
觸發器是一中特殊的存儲過程,主要是經過事件來觸發而被執行的。它能夠強化約束,來維護數據的完整性和一致性,可在寫入數據表前,強制檢驗或轉換數據。觸發器發生錯誤時,異動的結果會被撤銷。部分數據庫管理系統能夠針對數據定義語言(DDL)使用觸發器,稱爲DDL觸發器。可依照特定的狀況,替換異動的指令 (INSTEAD OF)。能夠跟蹤數據庫內的操做從而不容許未經許可的更新和變化。能夠聯級運算。如,某表上的觸發器上包含對另外一個表的數據操做,而該操做又會致使該表觸發器被觸發。mysql
觸發器的限制有哪些?程序員
一個表最多隻能有三個觸發器,insert、update、delete。每一個觸發器只能用於一個表。不能對視圖、臨時表建立觸發器。Truncate table能刪除表,但不能觸發觸發器。sql
2、什麼是存儲過程?用什麼來調用?數據庫
存儲過程是一個預編譯的SQL語句,優勢是容許模塊化的設計,就是說只需建立一次,之後在該程序中就能夠調用屢次。若是某次操做須要執行屢次SQL,使用存儲過程比單純SQL語句執行要快。編程
調用: 1)能夠用一個命令對象來調用存儲過程。 2)能夠供外部程序調用,好比:java程序。windows
3、存儲過程的優缺點?瀏覽器
優勢: 1)存儲過程是預編譯過的,執行效率高。 2)存儲過程的代碼直接存放於數據庫中,經過存儲過程名直接調用,減小網絡通信。 3)安全性高,執行存儲過程須要有必定權限的用戶。 4)存儲過程能夠重複使用,可減小數據庫開發人員的工做量。 缺點:移植性差安全
4、存儲過程與函數的區別服務器
存儲過程
一、用於在數據庫中完成特定的操做或者任務(如插入、刪除等)
二、程序頭部聲明用procedure
三、程序頭部聲明時不需描述返回類型可使用in/out/in out 三種模式的參數
四、可做爲一個獨立的PL/SQL語句來執行
五、能夠經過out/in out 返回零個或多個值
六、SQL語句(DML 或SELECT)中不可調用存儲過程
函數
一、用於特定的數據(如選擇)
二、程序頭部聲明用function
三、程序頭部聲明時要描述返回類型,並且PL/SQL塊中至少要包括一個有效的return語句
四、可使用in/out/in out 三種模式的參數
五、不能獨立執行,必須做爲表達式的一部分調用
六、經過return語句返回一個值,且改值要與聲明部分一致,也能夠是經過out類型的參數帶出的變量
七、SQL語句(DML 或SELECT)中能夠調用函數
5、索引的做用?和它的優勢缺點是什麼?
索引就一種特殊的查詢表,數據庫的搜索能夠利用它加速對數據的檢索。它很相似與現實生活中書的目錄,不須要查詢整本書內容就能夠找到想要的數據。
優勢:索引能夠是惟一的,建立索引容許指定單個列或者是多個列。
大大加快數據的檢索速度;加速表和表之間的鏈接
缺點:它減慢了數據錄入的速度,同時也增長了數據庫的尺寸大小。
6、什麼樣的字段適合建索引
惟一;不爲空;主、外鍵;表之間的關聯字段;查詢比較頻繁的字段
7、索引類型有哪些?
邏輯上:
Single column 單行索引
Concatenated 多行索引
Unique 惟一索引
NonUnique 非惟一索引
Function-based 函數索引
Domain 域索引
物理上:
Partitioned 分區索引
NonPartitioned 非分區索引
B-tree :
Normal 正常型B樹
Rever Key 反轉型B樹 Bitmap 位圖索引
8、什麼是事務?什麼是鎖?
事務就是被綁定在一塊兒做爲一個邏輯工做單元的SQL語句分組,若是任何一個語句操做失敗那麼整個操做就被失敗,之後操做就會回滾到操做前狀態,或者是上有個節點。爲了確保要麼執行,要麼不執行,就可使用事務。要將有組語句做爲事務考慮,就須要經過ACID測試,即原子性,一致性,隔離性和持久性。
- 原子性:要麼執行,要麼不執行
- 隔離性:全部操做所有執行完之前,其它會話不能看到過程
- 一致性:事務先後,數據總額一致
- 持久性:一旦事務提交,對數據的改變就是永久的
鎖:在因此的DBMS中,鎖是實現事務的關鍵,鎖能夠保證事務的完整性和併發性。與現實生活中鎖同樣,它可使某些數據的擁有者,在某段時間內不能使用某些數據或數據結構。固然鎖還分級別的,好比頁級鎖、行級鎖等。
數據庫常見的鎖有哪些?
- 行鎖,表鎖;樂觀鎖,悲觀鎖
- 行鎖:開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖衝突的機率最低,併發度也最高
- 表鎖:開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖衝突的機率最高,併發度最低
- 悲觀鎖:假定會發生併發衝突,屏蔽一切可能違反數據完整性的操做
- 樂觀鎖:假設不會發生併發衝突,只在提交操做時檢查是否違反數據完整性。不能解決髒讀問題
數據庫是一個多用戶使用的共享資源。當多個用戶併發地存取數據時,在數據庫中就會產生多個事務同時存取同一數據的狀況。若對併發操做不加控制就可能會讀取和存儲不正確的數據,破壞數據庫的一致性。
加鎖是實現數據庫併發控制的一個很是重要的技術。當事務在對某個數據對象進行操做前,先向系統發出請求,對其加鎖。加鎖後事務就對該數據對象有了必定的控制,在該事務釋放鎖以前,其餘的事務不能對此數據對象進行更新操做。
解釋什麼是死鎖,如何解決Oracle中的死鎖?
是指兩個會話,每一個會話都持有另一個會話想要的資源,因爭奪資源而形成的一種互相等待的現象,此時就會出現死鎖,若無人爲干涉,它們都將沒法推動下去。此時稱系統處於死鎖狀態,這些永遠在互相等待的進程稱爲死鎖進程。Oracle對於「死鎖」採起的策略是回滾其中一個事務,讓另一個事務順利進行。
9、什麼叫視圖?遊標是什麼?
視圖:是一種虛擬的表,具備和物理表相同的功能。能夠對視圖進行增,改,查,操做,視圖一般是有一個表或者多個表的行或列的子集。對視圖的修改會影響基本表。它使得咱們獲取數據更容易,相比多表查詢。
遊標:是對查詢出來的結果集做爲一個單元來有效的處理。遊標能夠定在該單元中的特定行,從結果集的當前行檢索一行或多行。能夠對結果集當前行作修改。通常不使用遊標,可是須要逐條處理數據的時候,遊標顯得十分重要。
表和視圖的關係
· 視圖其實就是一條查詢sql語句,用於顯示一個或多個表或其餘視圖中的相關數據。
· 表就是關係數據庫中實際存儲數據用的。
10、視圖的優缺點
優勢:
1)對數據庫的訪問,由於視圖能夠有選擇性的選取數據庫裏的一部分。
2 )用戶經過簡單的查詢能夠從複雜查詢中獲得結果。
3 )維護數據的獨立性,試圖可從多個表檢索數據。
4 )對於相同的數據可產生不一樣的視圖。
缺點: 性能:查詢視圖時,必須把視圖的查詢轉化成對基本表的查詢,若是這個視圖是由一個複雜的多表查詢所定義,那麼就沒法更改數據
11、列舉幾種錶鏈接方式,有什麼區別?
內鏈接、自鏈接、外鏈接(左、右、全)、交叉鏈接
內鏈接:只有兩個元素表相匹配的才能在結果集中顯示。
外鏈接:左外鏈接:左邊爲驅動表,驅動表的數據所有顯示,匹配表的不匹配的不會顯示。
右外鏈接:右邊爲驅動表,驅動表的數據所有顯示,匹配表的不匹配的不會顯示。
全外鏈接:鏈接的表中不匹配的數據所有會顯示出來。
交叉鏈接: 笛卡爾效應,顯示的結果是連接表數的乘積。
12、主鍵和外鍵的區別?
主鍵在本表中是惟一的、不可惟空的,外鍵能夠重複能夠惟空;
外鍵和另外一張表的主鍵關聯,不能建立對應表中不存在的外鍵。
13、在數據庫中查詢語句速度很慢,如何優化?
1.建索引 2.減小表之間的關聯 3.優化sql,儘可能讓sql很快定位數據,不要讓sql作全表查詢,應該走索引,把數據 量大的表排在前面 4.簡化查詢字段,沒用的字段不要,已經對返回結果的控制,儘可能返回少許數據 5.儘可能用PreparedStatement來查詢,不要用Statement
談一談數據庫優化方面的經驗?
從三方面去回答:
- 1:數據庫設計
- 數據庫表:字段類型、字段長度、註釋、字段命名規範
- 數據庫索引:外鍵、關聯字段、查詢頻率比較高的字段、
若是數據表字段>20,則最多支持16個索引
若是數據表字段<20,則根據查詢頻率字段來定
- 數據庫視圖:至關於一張臨時表,業務中,儘可能少使用
- 數據庫引擎:根據業務,選擇對應的表引擎技術
- 數據庫存儲過程:儘可能少用
- 數據庫字符:UTF-八、或者和頁面字符保持一致
- 數據庫監聽器/觸發器:通常用於調度任務或者備份還原
- 2:業務調用的sql語句優化
- 儘可能少關聯表,效率最高關聯4張表,若是多於4張表,則須要開啓兩個連接事務,可是這兩個事務,必須在一個service當中。
- 若是是查詢語句,則不建議使用*
- 若是是查詢語句,where條件後面,最好使用索引字段進行關聯
- 3:數據庫服務器的搭建(集羣)
- 主從配置:
- 讀寫分離:
- 自動化(容器):
怎樣優化Oracle數據庫,有幾種方式?
1. ORACLE的解析器按照從右到左的順序處理FROM子句中的表名,FROM子句中寫在最後的表(基礎表 driving table)將被最早處理,在FROM子句中包含多個表的狀況下,你必須選擇記錄條數最少的表做爲基礎表
2. SELECT子句中避免使用 ‘ * ‘:ORACLE在解析的過程當中, 會將'*' 依次轉換成全部的列名, 這個工做是經過查詢數據字典完成的, 這意味着將耗費更多的時間
3. 減小訪問數據庫的次數:ORACLE在內部執行了許多工做: 解析SQL語句, 估算索引的利用率, 綁定變量 , 讀數據塊等
4. 用TRUNCATE替代DELETE。當刪除表中的記錄時,在一般狀況下, 回滾段(rollback segments ) 用來存放能夠被恢復的信息. 若是你沒有COMMIT事務,ORACLE會將數據恢復到刪除以前的狀態(準確地說是恢復到執行刪除命令以前的情況) 而當運用TRUNCATE時, 回滾段再也不存聽任何可被恢復的信息.當命令運行後,數據不能被恢復.所以不多的資源被調用,執行時間也會很短
5. 最高效的刪除重複記錄方法 ( 由於使用了ROWID)例子:
DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID)
FROM EMP X WHERE X.EMP_NO = E.EMP_NO);
6. 儘可能多使用COMMIT。只要有可能,在程序中儘可能多使用COMMIT, 這樣程序的性能獲得提升,需求也會由於COMMIT所釋放的資源而減小
7. 減小對錶的查詢:在含有子查詢的SQL語句中,要特別注意減小對錶的查詢
8. 用EXISTS替代IN、用NOT EXISTS替代NOT IN、用>=替代>
9. 用索引提升效率;避免在索引列上使用NOT或計算;避免在索引列上使用IS NULL和IS NOT NULL;老是使用索引的第一個列:若是索引是創建在多個列上, 只有在它的第一個列(leading column)被where子句引用時,優化器纔會選擇使用該索引
14、數據庫三範式是什麼?
第一範式:列不可再分 第二範式:行能夠惟一區分,主鍵約束 第三範式:表的非主屬性不能依賴與其餘表的非主屬性 外鍵約束 且三大範式是一級一級依賴的,第二範式創建在第一範式上,第三範式創建第一第二範式上
15、union和union all有什麼不一樣?
UNION在進行表連接後會篩選掉重複的記錄,因此在表連接後會對所產生的結果集進行排序運算,刪除重複的記錄再返回結果。實際大部分應用中是不會產生重複的記錄,最多見的是過程表與歷史表UNION。
UNION ALL只是簡單的將兩個結果合併後就返回。這樣,若是返回的兩個結果集中有重複的數據,那麼返回的結果集就會包含重複的數據了。
從效率上說,UNION ALL 要比UNION快不少,因此,若是能夠確認合併的兩個結果集中不包含重複的數據的話,那麼就使用UNION ALL。
16、Varchar2和varchar有什麼區別?
Char的長度是固定的,而varchar2的長度是能夠變化的,好比,存儲字符串「abc」對於char(20),表示你存儲的字符將佔20個字節,包含17個空,而一樣的varchar2(20)只佔了3個字節,20只是最大值,當你存儲的字符小於20時,按實際長度存儲。 char的效率要被varchar2的效率高。 目前varchar是varchar2的同義詞,工業標準的varchar類型能夠存儲空字符串,可是oracle不能這樣作,儘管它保留之後這樣作的權利。Oracle本身開發了一個數據類型varchar2,這個類型不是一個標準的varchar,他將在數據庫中varchar列能夠存儲空字符串的特性改成存儲null值,若是你想有向後兼容的能力,oracle建議使用varchar2而不是varchar
17、Oracle和Mysql的區別?
1)庫函數不一樣。
2)Oracle是用表空間來管理的,Mysql不是。
3)顯示當前全部的表、用戶、改變鏈接用戶、顯示當前鏈接用戶、執行外部腳本的語句的不一樣。
4)分頁查詢時候時候,mysql用limit oracle用rownum
mysql> SELECT * FROM table LIMIT 5,10; // 檢索記錄行 6-15 //爲了檢索從某一個偏移量到記錄集的結束全部的記錄行,能夠指定第二個參數爲 -1:
mysql> SELECT * FROM table LIMIT 95,-1; // 檢索記錄行 96-last. //若是隻給定一個參數,它表示返回最大的記錄行數目:
mysql> SELECT * FROM table LIMIT 5; //檢索前 5 個記錄行 //換句話說,LIMIT n 等價於 LIMIT 0,n。
5)sql的語法的不一樣。
18、Oracle語句有多少類型?
Oracle語句分三類:DDL、DML、DCL
- DDL(Data Definition Language)數據定義語言,包括:
- Create語句:能夠建立數據庫和數據庫的一些對象。
- Drop語句:能夠刪除數據表、索引、觸發程序、條件約束以及數據表的權限等
- Alter語句:修改數據表定義及屬性。
- Truncate語句:刪除表中的全部記錄,包括全部空間分配的記錄被刪除。
- DML(Data Manipulation Language)數據操控語言,包括:
select語句
Insert語句:向數據表張插入一條記錄。
Delete語句:刪除數據表中的一條或多條記錄,也能夠刪除數據表中的全部記錄,可是它的操做對象還是記錄。
Update語句:用於修改已存在表中的記錄的內容。
- DCL(Data Control Language)數據庫控制語言,包括:
- Grant語句:容許對象的建立者給某用戶或某組或全部用戶(PUBLIC)某些特定的權限。
- Revoke語句:能夠廢除某用戶或某組或全部用戶訪問權限
19、從數據庫中隨機取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()
20、order by與group by的區別?
order by 排序查詢、asc升序、desc降序
- group by 分組查詢、having 只能用於group by子句、做用於組內。
having條件子句能夠直接跟函數表達式。
使用group by 子句的查詢語句須要使用聚合函數。
21、commit在哪裏會運用
Oracle的commit就是DML語句提交數據(這裏是釋放鎖不是鎖表),在未提交前你前面的操做更新的都是內存,沒有更新到物理文件中。
- 執行commit從用戶角度講就是更新到物理文件了,事實上commit時尚未寫date file,而是記錄了redo log file,要從內存寫到data物理文件,須要觸發檢查點,由DBWR這個後臺進程來寫,這裏內容有點多的,若是不深究的話你就理解成commit即爲從內存更新到物理文件。
- insert之後commit以前是鎖表的狀態,其餘事務沒法對該表進行操做
- 若是不提交的話,那麼這個表就被鎖了
22、序列的做用
· Oracle使用序列來生成惟一編號,用來處理一個表中自增字段。
· Oracle序列是原子對象,而且是一致的。
也就是說,一旦您訪問一個序列號,Oracle將在處理下一個請求以前自動遞增下一個編號,從而確保不會出現重複值。
23、Oracle基本數據類型
· 字符串類型:char、nchar、varchar、varchar二、nvarchar2
· 數字類型: number、integer
· 浮點類型: binary_float、binary_double、float
· 日期類型: date、 timestamp
· LOB類型: blob、clob、nclob、bfile
24、truncate與 delete區別
- TRUNCATE TABLE 在功能上與不帶 WHERE 子句的 DELETE 語句相同:兩者均刪除表中的所有行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系統和事務日誌資源少。
- DELETE 語句每次刪除一行,並在事務日誌中爲所刪除的每行記錄一項。
- TRUNCATE TABLE 經過釋放存儲表數據所用的數據頁來刪除數據,而且只在事務日誌中記錄頁的釋放。
- TRUNCATE、DELETE、DROP 比較:
- TRUNCATE TABLE :刪除內容、釋放空間但不刪除定義。
- DELETE TABLE: 刪除內容不刪除定義,不釋放空間。
- DROP TABLE :刪除內容和定義,釋放空間。
25、Oracle獲取系統時間
- select to_char(sysdate, 'yyyy-MM-dd HH24:mi:ss') from dual;
26、數據庫查詢結果怎麼去重
· 使用distinct關鍵字
27、InnoDB索引和MyISAM索引的區別?
· 主索引的區別,InnoDB的數據文件自己就是索引文件。而MyISAM的索引和數據是分開的。
· 輔助索引的區別:InnoDB的輔助索引data域存儲相應記錄主鍵的值而不是地址。而MyISAM的輔助索引和主索引沒有多大區別。
· MyISAM表鎖,不支持事務,表損壞率較高
· InnoDB行鎖,支持事務
28、什麼是內存泄漏?
- 通常咱們所說的內存泄漏指的是堆內存的泄漏。堆內存是程序從堆中爲其分配的,大小任意的,使用完後要顯示釋放內存。
- 當應用程序用關鍵字new等 建立對象時,就從堆中爲它分配一塊內存,使用完後程序調用free或者delete釋放該內存,不然就說該內存就不能被使用,咱們就說該內存被泄漏了。
29、常見的關係型數據庫管理系統產品有?
答:Oracle、SQL Server、MySQL、Sybase、DB二、Access等。
30、完整性約束包括哪些?
數據完整性(Data Integrity)是指數據的精確(Accuracy) 和 可靠性(Reliability)。
包括:
(1)實體完整性:規定表的每一行在表中是唯一的實體。
(2)域完整性:是指表中的列必須知足某種特定的數據類型約束,其中約束又包括取值範圍、精度等規定。
(3)參照完整性:是指兩個表的主關鍵字和外關鍵字的數據應一致,保證了表之間的數據的一致性,防止了數據丟失或無心義的數據在數據庫中擴散。
(4) 用戶定義的完整性:不一樣的關係數據庫系統根據其應用環境的不一樣,每每還須要一些特殊的約束條件。用戶定義的完整性便是針對某個特定關係數據庫的約束條件,它反映某一具體應用必須知足的語義要求。
SQLServer、MySQL、Oracle比較
1、SQLServer
優勢:
易用性、適合分佈式組織的可伸縮性、用於決策支持的數據倉庫功能、與許多其餘服務器軟件緊密關聯的集成性、良好的性價比等。
爲數據管理與分析帶來了靈活性,容許單位在快速變化的環境中從容響應,從而得到競爭優點。從數據管理和分析角度看,將原始數據轉化爲商業智能和充分利用Web帶來的機會很是重要。
做爲一個完備的數據庫和數據分析包,SQLServer爲快速開發新一代企業級商業應用程序、爲企業贏得核心競爭優點打開了勝利之門。
做爲重要的基準測試可伸縮性和速度獎的記錄保持者,SQLServer是一個具有徹底Web支持的數據庫產品,提供了對可擴展標記語言 (XML)的核心支持以及在Internet上和防火牆外進行查詢的能力。
缺點:
開放性 :SQL Server 只能windows上運行沒有絲毫開放性操做系統系統穩定對數據庫十分重要Windows9X系列產品偏重於桌面應用NT server只適合小型企業並且windows平臺靠性安全性和伸縮性很是有限象unix樣久經考驗尤爲處理大數據庫。
伸縮性並行性 :SQL server 並行實施和共存模型併成熟難處理日益增多用戶數和數據卷伸縮性有限。
安全性:沒有得到任何安全證書。
性能 :SQL Server 多用戶時性能不佳 。
客戶端支持及應用模式: 只支持C/S模式,SQL Server C/S結構只支持windows客戶用ADO、DAO、OLEDB、ODBC鏈接。
使用風險:SQL server 徹底重寫代碼經歷了長期測試斷延遲許多功能須要時間來證實並十分兼容。
2、MySQL
優勢:
體積小、速度快、整體擁有成本低,開源、支持多種操做系統。
是開源數據庫,提供的接口支持多種語言鏈接操做。
MySql的核心程序採用徹底的多線程編程。線程是輕量級的進程,它能夠靈活地爲用戶提供服務,而不過多的系統資源。用多線程和C語言實現的MySql能很容易充分利用CPU。
MySql有一個很是靈活並且安全的權限和口令系統。當客戶與MySql服務器鏈接時,他們之間全部的口令傳送被加密,並且MySql支持主機認證。
支持ODBC for Windows, 支持全部的ODBC 2.5函數和其餘許多函數, 能夠用Access鏈接MySql服務器, 使得應用被擴展。
支持大型的數據庫, 能夠方便地支持上千萬條記錄的數據庫。做爲一個開放源代碼的數據庫,能夠針對不一樣的應用進行相應的修改。
擁有一個很是快速並且穩定的基於線程的內存分配系統,能夠持續使用面沒必要擔憂其穩定性。
MySQL同時提供高度多樣性,可以提供不少不一樣的使用者介面,包括命令行客戶端操做,網頁瀏覽器,以及各式各樣的程序語言介面,例如C+,Perl,Java,PHP,以及Python。你可使用事先包裝好的客戶端,或者乾脆本身寫一個合適的應用程序。MySQL可用於Unix,Windows,以及OS/2等平臺,所以它能夠用在我的電腦或者是服務器上。
缺點:
不支持熱備份。
MySQL最大的缺點是其安全系統,主要是複雜而非標準,另外只有到調用mysqladmin來重讀用戶權限時才發生改變。
沒有一種存儲過程(Stored Procedure)語言,這是對習慣於企業級數據庫的程序員的最大限制。
MySQL的價格隨平臺和安裝方式變化。Linux的MySQL若是由用戶本身或系統管理員而不是第三方安裝則是免費的,第三方案則必須付許可費。Unix或Linux 自行安裝 免費 、Unix或Linux 第三方安裝收費。
3、Oracle
優勢:
開放性:Oracle 能全部主流平臺上運行(包括 windows)徹底支持全部工業標準採用徹底開放策略使客戶選擇適合解決方案對開發商全力支持。
可伸縮性,並行性:Oracle 並行服務器經過使組結點共享同簇工做來擴展windownt能力提供高用性和高伸縮性簇解決方案windowsNT能知足須要用戶把數據庫移UNIXOracle並行服務器對各類UNIX平臺集羣機制都有着至關高集成度。
安全性:得到最高認證級別的ISO標準認證。
性能:Oracle 性能高 保持開放平臺下TPC-D和TPC-C世界記錄。
客戶端支持及應用模式:Oracle 多層次網絡計算支持多種工業標準用ODBC、JDBC、OCI等網絡客戶鏈接 。
使用風險:Oracle長時間開發經徹底向下兼容的普遍應用且風險低 。
缺點:
對硬件的要求很高。
價格比較昂貴。
管理維護麻煩一些。
操做比較複雜,須要技術含量較高。