1. 程式人生 > >資料庫常見筆試、面試題總結

資料庫常見筆試、面試題總結

1.多表連線查詢

資料庫中多表的連線分為以下幾種:

表a

id name
1 sun
3 zhang
5 zhao
表b
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
內連線:join或者inner join ,結果集中不包括兩個表之間沒有匹配的行,通俗點說,將那些帶有null值的行去掉。
a.id name b.id score
1 sun 1 90
3 zhang 3 70
交叉連線:cross join ,結果集中包含了第一個表的行數乘以第二個表的行數等於笛卡爾結果集的大小。通俗點說就是第一個表中的每一行與另一個表中的每一行按照從上到下的順序依次的連線。
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消除傳遞依賴,進一步劃分表;