數據庫常見面試題

(1)表的操做mysql

      表的建立:create table 表名 (列名1 類型 約束, 列名2 類型 約束...)sql

      表的刪除:drop table 表名數據庫

      表的更改:alter table 表名 add|drop 列名|約束名安全

      插入記錄:insert into 表名... value...網絡

      更新記錄:update 表名 set 列名=值 where 條件oracle

      刪除記錄:delete from 表名 where 條件模塊化

      查詢記錄:select 列名... from 表名 where 條件函數

(2)什麼是數據庫約束,常見的約束有哪幾種?fetch

       約束能夠分爲:主鍵約束primary key、外鍵約束foreign key、惟一約束unique、檢查約束check、空值約束not null、默認值約束default優化

(3)主鍵和外鍵的區別?

      主鍵在本表中是惟一的,不可爲空的,外鍵能夠重複能夠爲空。

      外鍵和另外一張表的主鍵關聯,不能建立對應表中不存在的外鍵。

(4)什麼是索引?優缺點?

      對數據庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問數據庫表中的特定信息。

      優缺點:優勢:利用索引能夠加速對數據的檢索,索引是能夠惟一的,建立索引容許指定單個列或者多個列

                    缺點:減慢了數據錄入速度,同時也增長了數據庫的尺寸大小

(5)order by和group by的區別?

      order by爲排序查詢、ASC升序  DESC降序

      group by爲分組查詢、having只能用於group by子句、做用於組內、having條件子句的查詢語句須要使用聚合函數

(6)sql的錶鏈接方式有哪些?

       內鏈接、外鏈接、交叉鏈接

       內鏈接:inner join in ,兩表都知足的組合

       外鏈接:分爲左鏈接、右鏈接、全鏈接

            - 左鏈接  A left(outer) join B     以A表爲基礎,A表的所有數據,B表有的組合,沒有的爲null

            - 右鏈接  A right(outer) join B   以B表爲基礎,B表的所有數據,A表有的組合,沒有的爲null

            - 全鏈接  A full(outer) join  兩表相同的組合在一塊兒,A表有,B表沒有的數據(顯示爲null),一樣B表有,A表沒有的顯示爲null

       交叉鏈接:cross join,即便笛卡爾乘積

(7)在數據庫中查詢語句速度很慢,如何優化?

      ① 創建索引

      ② 減小表之間的關聯

      ③ 優化sql語句,儘可能讓sql很快定位數據,不要讓sql作全表查詢,應該走索引,把數據量大的排在前面

      ④ 簡化查詢字段,沒用的字段不要

      ⑤ 儘可能用PreparedStatement來查詢,不要用Statement

(8)什麼是遊標?

      遊標是一種能從包括多條數據記錄的結果中每次提取一條記錄進行處理的機制。

      遊標的使用步驟:① 定義遊標  declare cursor 遊標名稱 for select 查詢語句[for {readonly|update}]

                                   ② 打開遊標  open cursor

                                   ③ 從遊標中操做數據  fetch...  current of cursor

                                   ④ 關閉遊標  close cursor

(9)如何在刪除主表記錄時,一併刪除從表相關聯的記錄?

      若是兩張表存在主外鍵關係,那麼在刪除主鍵表的記錄時,若是從表有相關聯的記錄那麼將致使刪除失敗

      在定義外鍵約束時,能夠同時指定3種刪除策略:一是將從表記錄一併刪除(級聯刪除);

                                                                                   二是將從表記錄外鍵字段設置爲NULL;

(10)列舉幾種經常使用的聚合函數?

      sum函數   avg函數  max函數    min函數   count函數

(11)oracle基本數據類型?

      ① 字符串類型  char  、nchar 、 varchar 、  vachar2

      ② 數字類型  number 、 integer

      ③ 浮點類型  float

      ④ 日期類型  date 、  timestamp

      ⑤ LOB類型   blob 、 clob 、 nclob 、  bfile

(12)oracle和mysql的區別?

      ① 庫函數不一樣

      ② oracle是用表空間來管理的,mysql不是

      ③ 顯示當前全部的表、用戶、改變鏈接用戶、顯示當前鏈接用戶、執行外部腳本的語句的不一樣

      ④ 分頁查詢時,mysql用limit ;oracle用rownum

(13)union和union all有什麼不一樣?

       union在進行錶鏈接後篩選重複的記錄,因此在錶鏈接後會對所產生的結果集進行排序運算,刪除重複的記錄再返回結果

       union all 只是簡單地將兩個結果合併後返回

       從效率上說,union all比union快不少,因此,若是能夠確認合併的兩個結果集中不包括重複的數據的話,那麼就使用union all

(14)truncate和delete的區別?

      相同處:兩者均刪除表中的所有行

      不一樣處:① truncate table比delete速度快

                    ② delete語句每次刪除一行,並在事務日誌中爲所刪除的每行記錄一項;truncate經過釋放存儲數據所用的數據頁來刪除數據,而且只在事務日誌中記錄頁的釋放。

                    ③ truncate table刪除內容,釋放空間但不刪除定義

                    ④ delete table刪除內容,不刪除定義但不釋放空間

                    ⑤ drop table刪除內容和定義,釋放空間

(15)行轉列、列轉行怎麼轉?

      ① 使用decode函數

      ② 使用case when語句

(16)oracle怎麼去重?怎麼獲取系統時間?

      去重:使用distinct關鍵字   select distinct name from A

      獲取系統時間:select to_char(sysdate, 'yyyy-MM-dd HH24:mi:ss') from dual;

(17)序列的做用?

      oracle使用徐磊來生成惟一編號,用來處理一個表中自增字段。

      一旦訪問一個序列號,oracle將在處理下一個請求以前自動遞增下一個編號,從而確保不會出現重複值。

(18)什麼是存儲過程?存儲過程的優缺點?

      存儲過程一個預編譯的sql語句,優勢是容許模塊化的設計

      就是說只需建立一次,之後在該程序中就能夠調用屢次,若是某次操做須要執行屢次sql,使用存儲過程比單純的sql語句執行要快。

      存儲過程的優缺點:優勢:① 存儲過程是預編譯過的,執行效率高

                                                 ② 存儲過程的代碼存放於數據庫中,經過存儲過程名直接調用,減小網絡通信。

                                                 ③ 安全性高,執行存儲過程須要有必定權限的用戶

                                                 ④ 存儲過程能夠重複使用,可減小數據庫開發人員的工做量

                                       缺點:移植性差

(19)存儲過程與函數的區別?

      ① 函數有返回值,存儲過程沒有返回值

      ② 由於存儲過程沒有返回值,因此不能將存儲過程的執行結果賦值給變量;函數有返回值類型,調用函數時,能夠將函數的執行結果賦值給變量。

           也就是是說,函數能夠在select語句中使用,而存儲過程則不能。

下面是一些sql語句練習:

       -- 查詢全部學生的數學成績   

       select s.name,g.score

       from student s, grade g

       where s.id=g.id and g.kemu='數學';

       -- 統計每一個學生的總成績,顯示字段:姓名、總成績 

       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

       -- 列出數學成績前三名的學生信息

       select a.id, a.name, g.kemu, g.score

       from student a, grade g

       where g.score = '數學' order by score limit 3;

       -- 統計英語課少於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;

相關文章
相關標籤/搜索