資料庫常見筆試、面試題總結
1.多表連線查詢
資料庫中多表的連線分為以下幾種:
表a
id | name |
1 | sun |
3 | zhang |
5 | zhao |
id | score |
1 | 90 |
3 | 70 |
4 | 80 |
左連線:left join ,結果集中包括了left join子句中左表的所有行,如果左表中的某行在右表中沒有匹配,那麼對應的右表的行為空值null。
a.id | name | b.id | score |
1 | sun | 1 | 90 |
3 | zhang | 3 | 70 |
5 | zhao | null | null |
右連線:right join ,結果集中包括了right join子句中右表的所有行,如果右表中的某行在左表中沒有匹配,那麼對應的左表的行為空值null。
a.id | name | b.id | score |
1 | sun | 1 | 90 |
3 | zhang | 3 | 70 |
null | null | 4 | 80 |
完整外部連線:full join ,結果集中包括了兩個表的所有行,如果一個表中的某行在另一個表中沒有匹配,那麼對應的行為空值null。
a.id | name | b.id | score |
1 | sun | 1 | 90 |
3 | zhang | 3 | 70 |
5 | zhao | null | null |
null | null | 4 | 80 |
a.id | name | b.id | score |
1 | sun | 1 | 90 |
3 | zhang | 3 | 70 |
a.id | name | b.id | score |
1 | sun | 1 | 90 |
3 | zhang | 1 | 90 |
5 | zhao | 1 | 90 |
1 | sun | 3 | 70 |
3 | zhang | 3 | 70 |
5 | zhao | 3 | 70 |
1 | sun | 4 | 80 |
3 | zhang | 4 | 80 |
5 | zhao | 4 | 80 |
2.Java中資料庫連線步驟
①匯入jar包,並載入驅動。
②配置連線屬性,包括url、使用者名稱、密碼等。
③連線查詢等。常用類包括:DriverManager、Connection、Statement、ResultSet。
例項分析:
package db_connector;
import java.sql.*;
public class MainDbConnect {
public static void main(String[] args) {
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://127.0.0.1:3306/test";
String user = "root";
String password = "mysql";
try {
//Class.forName(*)要求JVM查詢並載入指定類或返回指定類而非類物件
Class.forName(driver);
/*
* 建立連線,配置地址、使用者名稱、密碼等。
* Connection與特定資料庫的連線(會話)。在連線上下文中執行SQL語句並返回結果。
*/
Connection conn = DriverManager.getConnection(url, user, password);
if(conn.isClosed()==false){
System.out.println("資料庫連線正常");
}else{
System.out.println("資料庫連線失敗");
}
/*
* 用於執行靜態 SQL 語句並返回它所生成結果的物件。
* Connection、Statement、ResultSet均為介面,等號後方法返回相應介面實現類的一個類物件,方法在載入的驅動的jar包中實現。
*/
Statement statement = conn.createStatement();
String sql = "select * from a right join b on a.id = b.id";
ResultSet rs = statement.executeQuery(sql);
while(rs.next()){
System.out.println(rs.getString("id") + "\t" + rs.getString("name"));
}
rs.close();
conn.close();
} catch (ClassNotFoundException e) {
System.out.println("找不到驅動器!");
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
備註:
①new()與類名.newInstance()均可例項化物件;二者不同之處在於:
a:前者構造方法更多,強型別,高效;
b:後者只能呼叫無參構造方法,弱型別,低效;
②載入資料庫驅動時使用class.forName(*);而非Class.forName(*).newInstance()的原因;
Java裡面任何class都要載入在虛擬機器上才能執行,而靜態程式碼是和class繫結的,class載入成功就表示執行了你的靜態程式碼了。而在JDBC中明確要求Driver類必須向DriverManager註冊自己,在com.mysql.jdbc.Driver中有註冊的靜態程式碼,而Class.forName()的作用就是要求JVM查詢並載入指定的類。所以不用再例項化呼叫某些方法。
java.sql.DriverManager.registerDriver(new Driver());
③介面中方法均為static方法,成員變數預設為public static final必須初始化且不可更改。
抽象類中可以有非abstract的成員方法
3.資料庫正規化
目前關係資料庫有六種正規化:第一正規化(1NF)、第二正規化(2NF)、第三正規化(3NF)、巴斯-科德正規化(BCNF)、第四正規化(4NF)和第五正規化(5NF)。
越高的正規化資料庫冗餘越小,減少資料庫中資料冗餘的過程。
1NF:資料庫中的每一列都是不可分割的原子資料項,而不能是集合、陣列、記錄等非原子資料項。即實體中的某個屬性有多個值時,必須拆分為不同的屬性。簡而言之,第一正規化就是無重複的域。
資料庫表中的欄位都是單一屬性的,不可再分。這個單一屬性由基本型別構成,包括整型、實數、字元型、邏輯型、日期型等。在當前的任何關係資料庫管理系統(DBMS)中,傻瓜也不可能做出不符合第一正規化的資料庫,因為這些DBMS不允許你把資料庫表的一列再分成二列或多列。因此,你想在現有的DBMS中設計出不符合第一正規化的資料庫都是不可能的。
2NF:在1NF的基礎上,非碼屬性必須完全依賴於候選碼(在1NF基礎上消除非主屬性對主碼的部分函式依賴)。選取一個能區分每個實體的屬性或屬性組,作為實體的唯一標識。第二正規化(2NF)要求實體的屬性完全依賴於主關鍵字。所謂完全依賴是指不能存在僅依賴主關鍵字一部分的屬性。
3NF:在1NF基礎上,任何非主屬性不依賴於其它非主屬性(在2NF基礎上消除傳遞依賴)。第三正規化(3NF)是第二正規化(2NF)的一個子集,即滿足第三正規化(3NF)必須滿足第二正規化(2NF)。簡而言之,第三正規化(3NF)要求一個關係中不包含已在其它關係已包含的非主關鍵字資訊。例如,存在一個部門資訊表,其中每個部門有部門編號(dept_id)、部門名稱、部門簡介等資訊。那麼在員工資訊表中列出部門編號後就不能再將部門名稱、部門簡介等與部門有關的資訊再加入員工資訊表中。如果不存在部門資訊表,則根據第三正規化(3NF)也應該構建它,否則就會有大量的資料冗餘。簡而言之,第三正規化就是屬性不依賴於其它非主屬性,也就是在滿足2NF的基礎上,任何非主屬性不得傳遞依賴於主屬性。
傳遞依賴:(學號)->(系別)->(系辦地點、系辦電話)
BCNF:在1NF基礎上,任何非主屬性不能對主鍵子集依賴(在3NF基礎上消除對主碼子集的依賴)。
備註:
1NF基本都滿足;2NF由依賴關係劃分表,確定主鍵,消除部分函式依賴;3NF消除傳遞依賴,進一步劃分表;