1. 程式人生 > >JavaWeb--MySQL約束

JavaWeb--MySQL約束

	檢視事務的提交方式: select @@autocommit;
	設定事務的提交方式: set @@autocommit = 0/1 ; -- 0代表手動提交,1代表自動提交
limit 不能搭配 in使用 
eg: select * from user where id in (select * from person limit 0,10) //錯誤寫法
order by rand() 隨機排序
eg:select * from (select * from user where id > 5 order by id desc limit 0,10) u order by rand();

DQL:查詢語句

1. DQL:查詢語句(單表查詢)
	1.基本查詢:select * from 表名;(掌握)
		獲取指定列:select 列1,列2,... from 表名;(掌握)
		去重複:獲取指定列:select distinct 列1,列2 from 表名;
		null: IFNULL(列名,0)
		做四則運算:select 列1+列2,... from 表名;
		取別名:select 列1 as 編號,列2 as 名稱,... from 表名; (掌握)
			as關鍵字可以省略:select 列1 編號,列2 名稱,... from 表名;
			例如:SELECT NAME,math 數學,english 英語,math+IFNULL(english,0) 總分 FROM student;
	2.條件查詢:select * from 表名 [where 條件]  有where條件表示條件查詢;
		基本運算子:> >= = < <= !=
		條件連線符: and or  基本運算子可以使用and和or連線,組成多個條件查詢;
		in 的條件:查詢等於in給定值的資料:列=值 or 列=值
		between.. and 條件:查詢在一定範圍內容的資料,相當於: 列>=值 and 列<=值
		判斷是否是null:is null或者is not null
	3.條件查詢-模糊查詢 : where 欄位名 like '包含佔位符的字串';
		佔位符:
			_佔位符:表示1個字元的佔位符
			%佔位符:表示0個或者多個字元的佔位符
	4.聚合函式:對一列資料做統計的函式,聚合函式會自動排除null值
		sum(欄位名):求和
		count(欄位名):統計個數
		max(欄位名):求最大值
		min(欄位名):求最小值
		avg(欄位名):求平均值
	5.分組查詢:group by 欄位名 [having 條件]  使用場景:每個、每類、每種
		where 條件和 having 條件的區別:
			1.分組前/沒有分組過濾用where,分組後過濾使用having
			2.where 條件中不能使用聚合函式,having 條件中可以使用聚合函式;
			3.where 是對基表(原始表)中的資料進行過濾,having是對查詢結果進行過濾;(瞭解)
		注意:使用分組之後,select的返回結果只能是分組欄位或者聚合函式
			例如: select 分組欄位或者聚合函式 from 表名 group by 欄位名 [having 條件];
	6.排序查詢:order by 欄位1 asc/desc,欄位2 asc/desc,...  預設是asc升序排序
		規則:當欄位1的值一樣時按照欄位1就無法排序,那麼就會按照欄位2進行排序;	
	7.分頁查詢:limit 開始索引,每頁顯示條數
		分頁公式:  開始索引=(當前頁碼-1)*每頁顯示條數;
		limit 是一個MySQL"方言";

總結:
	一條完整的sql查詢語句:書寫順序:
	select * from 表名 where 條件 group by 欄位名 having 條件 order by 欄位名 limit 開始索引,每頁顯示條數;
	執行順序:from ... where ... group by ... select...having... order by ...limit

約束

* 概念: 對錶中的資料進行限定,保證資料的正確性、有效性和完整性。	
* 分類:
	1. 主鍵約束:primary key
	2. 非空約束:not null
	3. 唯一約束:unique
	4. 外來鍵約束:foreign key

* 非空約束:not null,某一列的值不能為null
	1. 建立表時新增約束
		CREATE TABLE stu(
			id INT,
			NAME VARCHAR(20) NOT NULL -- name為非空
		);
	2. 建立表完後,新增非空約束 
		ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL;

	3. 刪除name的非空約束
		ALTER TABLE stu MODIFY NAME VARCHAR(20);

* 唯一約束:unique,某一列的值不能重複
	1. 注意:
		* 唯一約束可以有NULL值,但是隻能有一條記錄為null
	2. 在建立表時,新增唯一約束
		CREATE TABLE stu(
			id INT,
			phone_number VARCHAR(20) UNIQUE -- 手機號
		);
	3. 刪除唯一約束
		ALTER TABLE stu DROP INDEX phone_number;
	4. 在表建立完後,新增唯一約束
		ALTER TABLE stu MODIFY phone_number VARCHAR(20) UNIQUE;

* 主鍵約束:primary key。
	1. 注意:
		1. 含義:非空且唯一
		2. 一張表只能有一個主鍵,但是一個主鍵可以由多列構成,primary key(id,name)
		create table person(id int,name int,primary key(id,name));
		3. 主鍵就是表中記錄的唯一標識

	2. 在建立表時,新增主鍵約束
		create table stu(
			id int primary key,-- 給id新增主鍵約束
			name varchar(20)
		);

	3. 刪除主鍵
	
		ALTER TABLE stu DROP PRIMARY KEY;

	4. 建立完表後,新增主鍵
		ALTER TABLE stu MODIFY id INT PRIMARY KEY;

	5. 自動增長:
		1.  概念:如果某一列是數值型別的,使用 auto_increment 可以來完成值得自動增長

		2. 在建立表時,新增主鍵約束,並且完成主鍵自增長
		create table stu(
			id int primary key auto_increment,-- 給id新增主鍵約束
			name varchar(20)
		);


3. 刪除自動增長
ALTER TABLE stu MODIFY id INT;
4. 新增自動增長
ALTER TABLE stu MODIFY id INT AUTO_INCREMENT;

* 外來鍵約束:foreign key,讓表於表產生關係,從而保證資料的正確性。
	1. 在建立表時,可以新增外來鍵
		* 語法:
			create table 表名(
				....
				外來鍵列
				constraint 外來鍵名稱 foreign key (外來鍵列名稱) references 主表名稱(主表列名稱)
			);

	2. 刪除外來鍵
		ALTER TABLE 表名 DROP FOREIGN KEY 外來鍵名稱;

	3. 建立表之後,新增外來鍵
		ALTER TABLE 表名 ADD CONSTRAINT 外來鍵名稱 FOREIGN KEY (外來鍵欄位名稱) REFERENCES 主表名稱(主表列名稱);  (單表間用modify,多表add)


4. 級聯操作
1. 新增級聯操作
語法:ALTER TABLE 表名 ADD CONSTRAINT 外來鍵名稱 FOREIGN KEY (外來鍵欄位名稱) REFERENCES 主表名稱(主表列名稱) ON UPDATE CASCADE ON DELETE CASCADE ;
2. 分類:DML
1. 級聯更新:ON UPDATE CASCADE
2. 級聯刪除:ON DELETE CASCADE

資料庫的設計

1. 多表之間的關係
一對一:在任意一方新增外來鍵指向另一方的主鍵,並且給外來鍵欄位新增unique約束;(瞭解)
一對多:在多的一方新增外來鍵指向一的一方的主鍵;
多對多:建立一張中間表,這個中間表中至少有兩個欄位作為外來鍵分別指向多對多雙方的主鍵;


​ 2. 資料庫設計的正規化
* 概念:設計資料庫時,需要遵循的一些規範。要遵循後邊的正規化要求,必須先遵循前邊的所有正規化要求

		設計關係資料庫時,遵從不同的規範要求,設計出合理的關係型資料庫,這些不同的規範要求被稱為不同的正規化,各種正規化呈遞次規範,越高的正規化資料庫冗餘越小。
		目前關係資料庫有六種正規化:第一正規化(1NF)、第二正規化(2NF)、第三正規化(3NF)、巴斯-科德正規化(BCNF)、第四正規化(4NF)和第五正規化(5NF,又稱完美正規化)。

	* 分類:
		1. 第一正規化(1NF):每一列都是不可分割的原子資料項
		2. 第二正規化(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. 碼:如果在一張表中,一個屬性或屬性組,被其他所有屬性所完全依賴,則稱這個屬性(屬性組)為該表的碼
					例如:該表中碼為:(學號,課程名稱)
					* 主屬性:碼屬性組中的所有屬性
					* 非主屬性:除過碼屬性組的屬性
					
		3. 第三正規化(3NF):在2NF基礎上,任何非主屬性不依賴於其它非主屬性(在2NF基礎上消除傳遞依賴)

資料庫的備份和還原

1. 命令列:
	* 語法:
		* 備份: mysqldump -u使用者名稱 -p密碼 資料庫名稱 > 儲存的路徑
		* 還原:
			1. 登入資料庫
			2. 建立資料庫
			3. 使用資料庫
			4. 執行檔案。source 檔案路徑
2. 圖形化工具:
			SQLyog