Java面試系列08:MySQL數據庫基礎

1.創建數據庫,並指定字符集

create database 數據庫名稱 character set 字符集名;

2.修改數據庫的字符集

alter database 數據庫名稱 character set 字符集名稱;

3.數據庫類型:

1. int:整數類型
	age int,
2. double:小數類型
	score double(5,2)
3. date:日期,只包含年月日,yyyy-MM-dd
4. datetime:日期,包含年月日時分秒	 yyyy-MM-dd HH:mm:ss
5. timestamp:時間戳類型	包含年月日時分秒	 yyyy-MM-dd HH:mm:ss	
	如果將來不給這個字段賦值,或賦值爲null,則默認使用當前的系統時間,來自動賦值
6. varchar:字符串
	name varchar(20):姓名最大20個字符
	zhangsan 8個字符  張三 2個字符

4.基礎查詢

1.去除重複:

* distinct
SELECT distinct address FROM student3; 

2.起別名:

* as:as也可以省略

3.查詢姓名第二個字是化的人

	SELECT * FROM student WHERE NAME LIKE "_化%";

4.排序

	ASC:升序,默認的。DESC:降序。
	如果有多個排序條件,則當前邊的條件值一樣時,纔會判斷第二條件。
	SELECT * FROM student3 ORDER BY math DESC, english DESC;	

5.聚合函數:將一列數據作爲一個整體,進行縱向的計算。

	1. count:計算個數
		1. 一般選擇非空的列:主鍵
		SELECT COUNT(*) AS '總人數' FROM student3;
	2. max:計算最大值
		SELECT MAX(age) AS '最大值' FROM student3;
	3. min:計算最小值
		SELECT MIN(age) AS '最大值' FROM student3;
	4. sum:計算和
		SELECT SUM(age) AS '最大值' FROM student3;
	5. avg:計算平均值
		SELECT AVG(age) AS '最大值' FROM student3;

5.分組查詢:

	1. 語法:group by 分組字段;
		1. where 在分組之前進行限定,如果不滿足條件,則不參與分組。
		    having在分組之後進行限定,如果不滿足結果,則不會被查詢出來。
		2.按照性別分組。分別查詢男、女同學的平均分,人數 
		   要求:分數低於70分的人,不參與分組,分組之後。人數要大於2個人
		    SELECT sex , AVG(math),COUNT(id) 人數 
		    FROM student WHERE math > 70 
		    GROUP BY sex HAVING 人數 > 2;

6.分頁查詢

	limit 開始的索引(從0開始),每頁查詢的條數;
	SELECT * FROM student LIMIT 0,3; -- 第1頁

7.添加刪除修改

insert into 表名(列名1,列名2,...列名n) values(值1,值2,...值n);
delete from 表名 [where 條件]
update 表名 set 列名1 = 值1, 列名2 = 值2,... [where 條件];

5.約束:對錶中的數據進行限定,保證數據的正確性、有效性和完整性。

非空約束刪除
	ALTER TABLE stu MODIFY NAME VARCHAR(20);
唯一約束刪除
	ALTER TABLE stu DROP INDEX phone_number;
主鍵約束刪除
	ALTER TABLE stu DROP PRIMARY KEY;
外鍵約束刪除
	ALTER TABLE 表名 DROP FOREIGN KEY 外鍵名稱;
1. 非空約束:not null,值不能爲null
	創建表時添加約束
		NAME VARCHAR(20) NOT NULL -- name爲非空
	創建表完後,添加非空約束(也惡意在創建表時添加)
		ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL;
	刪除name的非空約束
		ALTER TABLE stu MODIFY NAME VARCHAR(20);
2. 唯一約束:unique,值不能重複
	創建表時,添加唯一約束
		phone_number VARCHAR(20) UNIQUE -- 添加了唯一約束
	在創建表後,添加唯一約束
		ALTER TABLE stu MODIFY phone_number VARCHAR(20) UNIQUE;
	刪除唯一約束
		ALTER TABLE stu DROP INDEX phone_number;
3. 主鍵約束:primary key  主鍵就是表中記錄的唯一標識,一張表只能有一個字段爲主鍵,非空且唯一
	id是主鍵
	在創建表時,添加主鍵約束
		id int primary key,-- 給id添加主鍵約束
	刪除主鍵
		ALTER TABLE stu DROP PRIMARY KEY;
	創建完表後,添加主鍵
		ALTER TABLE stu MODIFY id INT PRIMARY KEY;
	自動增長
		auto_increment
	刪除自動增長
		ALTER TABLE stu MODIFY id INT;
	添加自動增長
		ALTER TABLE stu MODIFY id INT AUTO_INCREMENT;
4.外鍵約束:讓表於表產生關係,從而保證數據的正確性。
	在創建表時,可以添加外鍵
		外鍵列
		constraint 外鍵名稱 foreign key (外鍵列名稱) references 主表名稱(主表列名稱)
	 刪除外鍵
		ALTER TABLE 表名 DROP FOREIGN KEY 外鍵名稱;
	創建表之後,添加外鍵
		ALTER TABLE 表名 ADD CONSTRAINT 外鍵名稱 
		FOREIGN KEY (外鍵字段名稱) 
		REFERENCES 主表名稱(主表列名稱);
	級聯操作:要刪把約束相關的數據一起刪,定義外鍵的表執行就行了
		1. 級聯更新:ON UPDATE CASCADE 
		2. 級聯刪除:ON DELETE CASCADE 
		ALTER TABLE 表名 ADD CONSTRAINT 外鍵名稱 
		FOREIGN KEY (外鍵字段名稱) 
		REFERENCES 主表名稱(主表列名稱) 
		ON UPDATE CASCADE 
		ON DELETE CASCADE  ;

6.數據庫的設計

1.一對一
	人和身份證
	一對一關係實現,可以在任意一方添加唯一外鍵指向另一方的主鍵
2.一對多(多對一):
	部門和員工
	在多的一方建立外鍵,指向一的一方的主鍵。
3.多對多
	學生和課程
	多對多關係實現需要藉助第三張中間表。
	中間表至少包含兩個字段,
	這兩個字段作爲第三張表的外鍵,分別指向兩張表的主鍵
4.數據庫設計的範式
	第一範式(1NF):每一列都是不可分割的原子數據項
	第二範式(2NF):在1NF的基礎上,非碼屬性必須完全依賴於碼
		             (在1NF基礎上消除非主屬性對主碼的部分函數依賴)
		1.函數依賴:A-->B,如果通過A屬性(屬性組)的值,可以確定唯一B屬性的值。則稱B依賴於A
			學號-->姓名
		2. 完全函數依賴:A-->B, 如果A是一個屬性組,則B屬性值得確定需要依賴於A屬性組中所有的屬性值。
			(學號,課程名稱) --> 分數
		3. 部分函數依賴:A-->B, 如果A是一個屬性組,則B屬性值得確定只需要依賴於A屬性組中某一些值即可。
			(學號,課程名稱) -- > 姓名
		4. 傳遞函數依賴:A-->B, B -- >C . 
		    如果通過A屬性(屬性組)的值,可以確定唯一B屬性的值,
		    在通過B屬性(屬性組)的值可以確定唯一C屬性的值,
		    則稱 C 傳遞函數依賴於A
			學號-->系名,系名-->系主任
		5.碼:如果在一張表中,一個屬性或屬性組,被其他所有屬性所完全依賴,
		          則稱這個屬性(屬性組)爲該表的碼
	第三範式(3NF):在2NF基礎上,任何非主屬性不依賴於其它非主屬性(在2NF基礎上消除傳遞依賴)

7.多表查詢

(1. 內連接查詢:
	1. 隱式內連接:使用where條件消除無用數據,連接條件是:WHERE t1.`dept_id` = t2.`id`;  兩張表連接到了一起,不符合條件的數據不在裏邊
		查詢所有員工信息(名稱,性別)和對應的部門信息(名稱)
			SELECT 
				t1.name, -- 員工表的姓名
				t1.gender,-- 員工表的性別
				t2.name -- 部門表的名稱
			FROM
				emp t1,
				dept t2
			WHERE 
				t1.`dept_id` = t2.`id`;
	2. 顯式內連接:(寫不寫inner都一樣)where換成了:JOIN dept ON emp.`dept_id` = dept.`id`;	
			SELECT * FROM emp INNER JOIN dept ON emp.`dept_id` = dept.`id`;
	
(2. 外鏈接查詢:
	1. 左外連接:select 字段列表 from 表1 left [outer] join 表2 on 條件;
		    查詢的是左表所有數據以及其交集部分。
		    就是左邊的表連接右邊的表,條件是:join 表2 on 條件;,左邊表所有數據都有
	           查詢所有員工信息,如果員工有部門,則查詢部門名稱,沒有部門,則不顯示部門
			SELECT 	
				t1.*,
				t2.`name` 
			FROM 
				emp t1 
			LEFT JOIN 
				dept t2 
			ON 
				t1.`dept_id` = t2.`id`;
	2. 右外連接:* 語法:select 字段列表 from 表1 right [outer] join 表2 on 條件;
		     * 查詢的是右表所有數據以及其交集部分。
		SELECT 
			* 
		FROM 
			dept t2 
		RIGHT JOIN 
			emp t1 
		ON t1.`dept_id` = t2.`id`;

(3.子查詢:
	概念:查詢中嵌套查詢,稱嵌套查詢爲子查詢。
		查詢工資最高的員工信息
			SELECT 
				* 
			FROM 
				emp 
			WHERE 
				emp.`salary` = (SELECT 
						MAX(salary) 
					         FROM 
						emp);
	子查詢不同情況
		1. 子查詢的結果是單行單列的:
			子查詢可以作爲條件,使用運算符去判斷。 運算符: > >= < <= =
			比如:查詢員工工資小於平均工資的人
				SELECT * FROM emp WHERE emp.salary < (SELECT AVG(salary) FROM emp);
		2. 子查詢的結果是多行單列的:
			子查詢可以作爲條件,使用運算符in來判斷
			比如:查詢'財務部'和'市場部'所有的員工信息
				SELECT 
					* 
				FROM 
					emp 
				WHERE 
					dept_id IN (SELECT 
							id 
						   FROM 
							dept 
						   WHERE 
							NAME = '財務部' OR NAME = '市場部');
		3. 子查詢的結果是多行多列的:
			子查詢可以作爲一張虛擬表參與查詢
			比如:查詢員工入職日期是2011-11-11日之後的員工信息和部門信息
				SELECT 
					* 
				FROM 
					dept t1 ,(SELECT * FROM emp 
					                WHERE emp.`join_date` > '2011-11-11') t2
				WHERE t1.id = t2.dept_id;

8.事務的基本介紹

(1. 概念:如果一個包含多個步驟的業務操作,被事務管理,那麼這些操作要麼同時成功,要麼同時失敗。
(2. 操作:
	1. 開啓事務: start transaction;
	2. 回滾:rollback;
	3. 提交:commit;
	MySQL數據庫中事務默認自動提交
	Oracle 數據庫默認是手動提交事務
		修改事務的默認提交方式:
			查看事務的默認提交方式:SELECT @@autocommit; -- 1 代表自動提交  0 代表手動提交
			修改默認提交方式: set @@autocommit = 0;
(3. 事務的四大特徵:
	1. 原子性:是不可分割的最小操作單位,要麼同時成功,要麼同時失敗。
	2. 持久性:當事務提交或回滾後,數據庫會持久化的保存數據。
	3. 隔離性:多個事務之間。相互獨立。
	4. 一致性:事務操作前後,數據總量不變
(4. 事務的隔離級別(瞭解)
	概念:多個事務之間隔離的,相互獨立的。
                            但是如果多個事務操作同一批數據,則會引發一些問題,
	          設置不同的隔離級別就可以解決這些問題。
	存在問題:
		1. 髒讀:一個事務,讀取到另一個事務中沒有提交的數據
		2. 不可重複讀(虛讀):在同一個事務中,兩次讀取到的數據不一樣。
		3. 幻讀:一個事務操作(DML)數據表中所有記錄,另一個事務添加了一條數據,則第一個事務查詢不到自己的修改。
	隔離級別:
		 read uncommitted:讀未提交
			產生的問題:髒讀、不可重複讀、幻讀
		read committed:讀已提交 (Oracle)
			產生的問題:不可重複讀、幻讀
 		repeatable read:可重複讀 (MySQL默認)
			產生的問題:幻讀
		serializable:串行化
			可以解決所有的問題
		隔離級別從小到大安全性越來越高,但是效率越來越低

9.JDBC

  	//1. 導入驅動jar包
    //2.註冊驅動
    Class.forName("com.mysql.jdbc.Driver");
    //3.獲取數據庫連接對象
    Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "root");
    //4.定義sql語句
    String sql = "update account set balance = 500 where id = 1";
    //5.獲取執行sql的對象 Statement
    Statement stmt = conn.createStatement();
    //6.執行sql
    int count = stmt.executeUpdate(sql);
    //7.處理結果
    System.out.println(count);
    //8.釋放資源
    stmt.close();
    conn.close();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章