數(shù)據(jù)庫常見面試題精選(數(shù)據(jù)庫常見面試題精選及答案)
(1)表的操作
表的創(chuàng)建:create table 表名 (列名1 類型 約束, 列名2 類型 約束…)
表的刪除:drop table 表名
表的更改:alter table 表名 add|drop 列名|約束名
插入記錄:insert into 表名… value…
更新記錄:update 表名 set 列名=值 where 條件
刪除記錄:delete from 表名 where 條件
查詢記錄:select 列名… from 表名 where 條件
(2)什么是數(shù)據(jù)庫約束,常見的約束有哪幾種?
約束可以分為:主鍵約束primary key、
外鍵約束foreign key、
唯一約束unique、
檢查約束check、
空值約束not null、
默認值約束default
(3)主鍵和外鍵的區(qū)別?
主鍵在本表中是唯一的,不可為空的,外鍵可以重復可以為空。
外鍵和另一張表的主鍵關聯(lián),不能創(chuàng)建對應表中不存在的外鍵。
(4)什么是索引?優(yōu)缺點?
對數(shù)據(jù)庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問數(shù)據(jù)庫表中的特定信息。
優(yōu)缺點:優(yōu)點:利用索引可以加速對數(shù)據(jù)的檢索,索引是可以唯一的,創(chuàng)建索引允許指定單個列或者多個列
缺點:減慢了數(shù)據(jù)錄入速度,同時也增加了數(shù)據(jù)庫的尺寸大小
(5)order by和group by的區(qū)別?
order by為排序查詢、
ASC升序 DESC降序
group by為分組查詢、
having只能用于group by子句、作用于組內、
having條件子句的查詢語句需要使用聚合函數(shù)
(6)sql的表連接方式有哪些?
內連接、外連接、交叉連接
內連接:inner join in ,兩表都滿足的組合
外連接:分為左連接、右連接、全連接
左連接 A left(outer) join B
以A表為基礎,A表的全部數(shù)據(jù),B表有的組合,沒有的為null
右連接 A right(outer) join B
以B表為基礎,B表的全部數(shù)據(jù),A表有的組合,沒有的為null
全連接 A full(outer) join
兩表相同的組合在一起,A表有,B表沒有的數(shù)據(jù)(顯示為null),同樣B表有,A表沒有的顯示為null
交叉連接:cross join,即使笛卡爾乘積
(7)在數(shù)據(jù)庫中查詢語句速度很慢,如何優(yōu)化?
① 建立索引
② 減少表之間的關聯(lián)
③ 優(yōu)化sql語句,盡量讓sql很快定位數(shù)據(jù),不要讓sql做全表查詢,應該走索引,把數(shù)據(jù)量大的排在前面
④ 簡化查詢字段,沒用的字段不要
⑤ 盡量用PreparedStatement來查詢,不要用Statement
(8)什么是游標?
游標是一種能從包括多條數(shù)據(jù)記錄的結果中每次提取一條記錄進行處理的機制。
游標的使用步驟:① 定義游標 declare cursor 游標名稱 for select 查詢語句[for {readonly|update}]
② 打開游標 open cursor
③ 從游標中操作數(shù)據(jù) fetch… current of cursor
④ 關閉游標 close cursor
(9)如何在刪除主表記錄時,一并刪除從表相關聯(lián)的記錄?
如果兩張表存在主外鍵關系,那么在刪除主鍵表的記錄時,如果從表有相關聯(lián)的記錄那么將導致刪除失敗
在定義外鍵約束時,可以同時指定3種刪除策略:一是將從表記錄一并刪除(級聯(lián)刪除);
二是將從表記錄外鍵字段設置為NULL;
(10)列舉幾種常用的聚合函數(shù)?
sum函數(shù) avg函數(shù) max函數(shù) min函數(shù) count函數(shù)
(11)oracle基本數(shù)據(jù)類型?
① 字符串類型 char 、nchar 、 varchar 、 vachar2
② 數(shù)字類型 number 、 integer
③ 浮點類型 float
④ 日期類型 date 、 timestamp
⑤ LOB類型 blob 、 clob 、 nclob 、 bfile
(12)oracle和mysql的區(qū)別?
① 庫函數(shù)不同
② oracle是用表空間來管理的,mysql不是
③ 顯示當前所有的表、用戶、改變連接用戶、顯示當前連接用戶、執(zhí)行外部腳本的語句的不同
④ 分頁查詢時,mysql用limit ;oracle用rownum
(13)union和union all有什么不同?
union在進行表連接后篩選重復的記錄,所以在表連接后會對所產(chǎn)生的結果集進行排序運算,刪除重復的記錄再返回結果
union all 只是簡單地將兩個結果合并后返回
從效率上說,union all比union快很多,所以,如果可以確認合并的兩個結果集中不包括重復的數(shù)據(jù)的話,那么就使用union all
(14)truncate和delete的區(qū)別?
相同處:二者均刪除表中的全部行
不同處:① truncate table比delete速度快
② delete語句每次刪除一行,并在事務日志中為所刪除的每行記錄一項;truncate通過釋放存儲數(shù)據(jù)所用的數(shù)據(jù)頁來刪除數(shù)據(jù),并且只在事務日志中記錄頁的釋放。
③ truncate table刪除內容,釋放空間但不刪除定義
④ delete table刪除內容,不刪除定義但不釋放空間
⑤ drop table刪除內容和定義,釋放空間
(15)行轉列、列轉行怎么轉?
① 使用decode函數(shù)
② 使用case when語句
(16)oracle怎么去重?怎么獲取系統(tǒng)時間?
去重:使用distinct關鍵字 select distinct name from A
獲取系統(tǒng)時間:select to_char(sysdate, 'yyyy-MM-dd HH24:mi:ss') from dual;
(17)序列的作用?
oracle使用序列來生成唯一編號,用來處理一個表中自增字段。
一旦訪問一個序列號,oracle將在處理下一個請求之前自動遞增下一個編號,從而確保不會出現(xiàn)重復值。
(18)什么是存儲過程?存儲過程的優(yōu)缺點?
存儲過程一個預編譯的sql語句,優(yōu)點是允許模塊化的設計
就是說只需創(chuàng)建一次,以后在該程序中就可以調用多次,如果某次操作需要執(zhí)行多次sql,使用存儲過程比單純的sql語句執(zhí)行要快。
存儲過程的優(yōu)缺點:
優(yōu)點:① 存儲過程是預編譯過的,執(zhí)行效率高
② 存儲過程的代碼存放于數(shù)據(jù)庫中,通過存儲過程名直接調用,減少網(wǎng)絡通訊。
③ 安全性高,執(zhí)行存儲過程需要有一定權限的用戶
④ 存儲過程可以重復使用,可減少數(shù)據(jù)庫開發(fā)人員的工作量
缺點:移植性差
(19)存儲過程與函數(shù)的區(qū)別?
① 函數(shù)有返回值,存儲過程沒有返回值
② 因為存儲過程沒有返回值,所以不能將存儲過程的執(zhí)行結果賦值給變量;函數(shù)有返回值類型,調用函數(shù)時,可以將函數(shù)的執(zhí)行結果賦值給變量。
也就是是說,函數(shù)可以在select語句中使用,而存儲過程則不能。
下面是一些sql語句練習:
— 查詢所有學生的數(shù)學成績
select s.name,g.score
from student s, grade g
where s.id=g.id and g.kemu='數(shù)學';
— 統(tǒng)計每個學生的總成績,顯示字段:姓名、總成績
select a.name sum(b.score) as sum_score
from student a, grade b
where a.id = b.id group by name;
— 列出各門課程成績最好的學生,要求顯示字段:學號、姓名、科目、成績
select a.id, a.name, g.kemu, max(g.score)
from student a, grade g
where a.id = g.id group by g.kemu
— 列出數(shù)學成績前三名的學生信息
select a.id, a.name, g.kemu, g.score
from student a, grade g
where g.score = '數(shù)學' order by score limit 3;
— 統(tǒng)計英語課少于80分的人
select a.id, a.name, g.kemu, g.score
from student a, grade g where a.id g.id
and g.kemu = '英語' orader by g.score <80;
— 查詢每科成績的前兩名
select a.id , a.name, g.kemu, g.score
from student a, grade g
where a.id = g.id
order by g.kemu limit 2;
感謝每一個認真閱讀我文章的人?。?!
如果下面這些資料用得到的話可以直接拿走:
1、自學開發(fā)或者測試必備的完整項目源碼與環(huán)境
2、測試工作中所有模板(測試計劃、測試用例、測試報告等)
3、軟件測試經(jīng)典面試題
4、Python/Java自動化測試實戰(zhàn).pdf
5、Jmeter/postman接口測試全套視頻獲取
我個人整理了我這幾年軟件測試生涯整理的一些技術資料,包含:電子書,簡歷模塊,各種工作模板,面試寶典,自學項目等。需要的可以找我