1. 程式人生 > >sql面試

sql面試

trim rownum ceil 一個表 最大 dml -- 用戶 數字函數


----1.數據庫的三範式?
一範式: 每個列都是不可分割的原子單元;
二範式: 必須滿足第一範式;每個列都依賴於主鍵。
三範式:必須滿足第二範式;每個列不能傳遞依賴於主鍵。

----2.主鍵的設計原則有哪些?
一、唯一的標識一行;
二、作為一個可以被外鍵有效引用的對象;
三、不需要更新主鍵;
四、主鍵不應該包含動態變化的數據,如時間戳 等;
五、主鍵應當有計算機自動生成。

----3.數據的約束有哪些特點(主鍵約束,唯一約束, 非空約束, null約束, 默認值約束, check[枚舉]約束, 外鍵約束, 長度約束)

一、主鍵約束:表中定義一個主鍵來唯一確定表中每一行數據的標識符;(非空,唯一)
二、唯一約束:保證在一個字段或者一組字段裏的數據與表中其它行的數據相比是唯一的;
三、非空約束:強制列不接受 NULL 值;
四、null約束:只用於定義列約束,沒有其他約束時默認是null約束;
五、默認值約束:用於向列中插入默認值,如果沒有規定其他的值,那麽會將默認值添加到所有的新記錄;
六、check[枚舉]約束:用於限制列中的值的範圍;
七、外鍵約束:用於預防破壞表之間連接的動作;
八、長度約束:


----4.主鍵約束和唯一約束有哪些區別?

1.在一個表中,只能定義一個primary key約束,但可定義多個unique約束;
2.對於指定為primary key的一個列或多個列的組合,其中任何一個列都不能出現空值,而對於unique所約束的唯一鍵,
則允許為null,只是null值最多有一個。

----5.內連接和外連接的區別

內鏈接:也叫自然連接,多表作為聯查,滿足條件的數據才能呈現;
外鏈接:分為左外連接,右外連接,全外連接,全外連接如果有on條件,在一定程度上等同於內聯接,如果沒有on條件表示笛卡爾積。


----6.左外連接,右外連接和全外連接的區別

左外連接:以左表為基準,查詢滿足條件的列,右表沒有匹配到的數據以null代替;
右外連接:以右表為基準,查詢滿足條件的列,左表沒有匹配到的數據以null代替;
全外連接:如果有on條件,在一定程度上等同於內聯接,如果沒有on條件表示笛卡爾積


----7.你使用過哪些mysql函數.

字符串函數: concat連接,lpad左填充,rpad右填充 ,ltrim刪除左邊空格,rtrim刪除右邊空格,replace替換,length返回字符長度
substring截取;
數字函數:ceil向上取整,floor向下取整,abs絕對值,mod取余,rand產生0~1的隨機數,round四舍五入,可設置保留位數,
truncate可設置保留小數,但不會四舍五入
日期函數:now返回年月日時分秒,curdate返回年月日,curtime返回時分秒,week返回當前日期是當前年的第幾周,
year返回當前日期的年份,date_format可設置時間格式,date_add可將日期往前推或向後推
流程函數:if(n,t,f)n為true時執行t,否則執行f ,ifnull(n,t,f)n為空時執行t,否則執行f。


----8.視圖是什麽? 視圖的優點有哪些?
視圖:是基於一個表或多個表或視圖的邏輯表,本身不包含數據,通過它可以對表裏面的數據進行查詢和修改
視圖的優點:
1.對數據庫表的訪問,因為視圖可以有選擇性的選取數據庫裏的一部分。
2.用戶通過簡單的查詢可以從復雜查詢中得到結果, 從而隱藏數據復雜性 。
3.維護數據的獨立性,視圖可從多個表檢索數據。
4.對於相同的數據可產生不同的視圖, 以不同的角度來顯示基表中的數據.
5.視圖中可以使用連接(join),用多個表中相關的列構成一個新的數據集。此視圖就對用戶隱藏了數據來源於多個表的事實。
6.通過視圖可以設定允許用戶訪問的列和數據行,從而為表提供了額外的安全控制。


----9.常用的oracle的函數有哪些?

字符函數:initcap首字母大寫,
lower字母全部轉換成小寫,
upper字母全部轉換成大寫,
replace替換,
substr截取字符串,
concat連接字符串,
lpad 和 和 rpad 左填充字符和右填充字符,
length返回字符串的長度;

日期時間函數:add_months 增加或減去月份,
months_between計算指定的兩個日期之間月數之差,
last_day 返回日期的最後一天,
round 和 和 trunc按照指定的精度進行四舍五入,
next_day 給出日期 date 和星期幾計算下一個星期的日期,
數字函數:abs絕對值,
round四舍五入,
trunc指定截尾取整的數字和截取精度的數字
mod取余
ceil向上取整
floor向下取整
Power(x,y) 返回 x 的 的 y
Mod (x ,y )返回 x 除 除 y 的余數
轉換函數:to_char轉換成字符類型
to_date轉換成時間類型
to_number轉換成數字類型
混合函數:nvl(string1, replace_with)如果 string1 為 null,則 nvl 函數返回 replace_with
的值,否則返回 string1 的值
nvl2(e1, e2, e3) 如果 e1 為 null,則函數返回 e3,否則返回 e2。
nullif(exp1,expr2)如果 exp1 和 exp2 相等則返回空(null),否則返回第一個值

分組函數:AVG (columname) 返回指定列的平均值
MAX (columname) 返回指定列的最大值
MIN (columname) 返回指定列的最小值
SUM (columname) 返回指定列的總值
COUNT
COUNT (*) 統計所有行個數,包括重復行和空值得行
COUNT (columname) 統計指定列非空值的個行數
COUNT (DISTINCR columname) 統計指定列中 非重復,非空值得行個數

----10.存儲函數和存儲過程的區別?
1.存儲函數有且只有一個返回值,而存儲過程可能有返回值。
2.存儲函數只能有輸入函數 而存儲過程可以有多個 in,out,inout 參數。
3.存儲過程中的語句功能更強大,存儲過程可以實現很復雜的業務邏輯,而函數有很多限制,如不能在函數中使用 insert,update,delete,create 等語句;存儲函數只完成查詢的 工作,可接受輸入參數並返回一個結果,也就是函數實現的功能針對性比較強。
4.存儲過程可以調用存儲函數。但函數不能調用存儲過程。
5.存儲過程一般是作為一個獨立的部分來執行(call 調用)。而函數可以作為查詢語句的一個部分來調用。


----11.存儲過程的缺點 和 優點?
優點:
1.存儲過程只在創造時進行編譯,以後每次執行存儲過程都不需再重新編譯,可提高數據庫執行速度。
2.當對數據庫進行復雜操作時,可將此復雜操作用存儲過程封裝起來與數據庫提供的事務處理結合一起使用。
3.存儲過程可以重復使用,可減少數據庫開發人員的工作量
4.安全性高,可設定只有某些用戶才具有對指定存儲過程的使用權
5. 通過存儲過程可以使相關的動作在一起發生,從而可以維護數據庫的完整性和安全性。
6. 可以降低網絡的通信量。
7. 使體現企業規則的運算程序放入數據庫服務器中,以便集中控制;

缺點:
1.調試麻煩;
2.移植問題,數據庫端代碼當然是與數據庫相關的;
3.重新編譯問題,因為後端代碼是運行前編譯的,如果帶有引用關系的對象發生改變時,
受影響的存儲過程、包將需要重新編譯(不過也可以設置成運行時刻自動編譯);
4.如果在一個程序系統中大量的使用存儲過程,到程序交付使用的時候隨著用戶需求的增
加會導致數據結構的變化。


----12.jdbc中如何調用存儲過程?
1.class.forname加載數據庫驅動;
2.創建connection連接;
3.通過connection對象創建callableStatement對象;
4.設置傳入的參數和註冊傳出參數;
5.執行sql語句,獲取傳出參數;
6.釋放資源,關閉結果集,callableStatement對象、connection對象。

----13.jdbc的執行步驟
1.class.forname加載數據庫驅動;
2.創建connection連接;
3.通過connection對象創建Statement對象;
4.通過Statement對象執行sql語句完成增刪查改操作;
5.如果是查詢,返回一個結果集對象,循環叠代結果集。


----14.觸發器是什麽? 觸發器的類型有哪些?
數據庫觸發器:是一個與表相關聯的、存儲的 PL/SQL 程序。每當一個特定的數據操作語句(Insert,update,delete)在指定的表上發出時,
Oracle 自動地執行觸發器中定義的語句序列。

語句級觸發器
在指定的操作語句操作之前或之後執行一次,不管這條語句影響了多少行。
行級觸發器(FOR EACH ROW)
觸發語句作用的每一條記錄都被觸發。在行級觸發器中使用 old 和 new 偽記錄變量,識別值的狀態。

-----15.遊標的作用?
1. 指定結果集中特定行的位置。
2. 基於當前的結果集位置檢索一行或連續的幾行。
3. 在結果集的當前位置修改行中的數據。
4. 對其他用戶所做的數據更改定義不同的敏感性級別。
5. 可以以編程的方式訪問數據庫。


----16.mysql的端口? oracle的端口?
mysql的端口:3306;
oracle的端口:1521;


----17.mysql的分頁? oracle的分頁?

limit分頁:Select * from table_name limit n,m;//n為起始行數,m為要截取的行數;
rownum分頁:select a.* ,rownum rn from (select * from table_name rownum<=n) a where rn>m;


----18.簡單說下數據庫的事務;
事務是保持數據的一致性,它由相關的 DDL 或者 DML 語句做為載體,這組語句執行的
結果要麽一起成功,要麽一起失敗;
數據庫事務的四個特點(ACID):原子性,一致性,隔離性,持久性。


----19.oracle的索引.
索引是關系數據庫中用於存放每一條記錄的一種對象,主要目的是加快數據
的讀取速度和完整性檢查。

sql面試