天天看點

MySQL限制->(個人學習記錄筆記)

@

目錄

  • MySQL限制
  • DQL:查詢語句
    • 1. 排序查詢
    • 2. 聚合函數:将一列資料作為一個整體,進行縱向的計算。
    • 3. 分組查詢:
    • 4. 分頁查詢
    • 限制
      • 1. 非空限制:not null,值不能為null
      • 2. 唯一限制:unique,值不能重複
      • 3. 主鍵限制:primary key。
      • 4.外鍵限制:foreign key,讓表于表産生關系,進而保證資料的正确性。
    • 資料庫的設計
      • 1. 多表之間的關系
        • 1.1 分類:
        • 1.2 實作關系:
        • 1.3 案例
      • 2. 資料庫設計的範式
    • 資料庫的備份和還原

    1. 排序查詢
    2. 聚合函數
    3. 分組查詢
    4. 分頁查詢
  1. 多表之間的關系
  2. 範式

文法:

order by 子句

order by 排序字段1 排序方式1 , 排序字段2 排序方式2...

排序方式:

ASC

:升序,預設的。

DESC

:降序。

注意:

如果有多個排序條件,則目前邊的條件值一樣時,才會判斷第二條件。

  1. count

    :計算個數
    1. 一般選擇非空的列:主鍵
    2. count(*)
  2. max

    :計算最大值
  3. min

    :計算最小值
  4. sum

    :計算和
  5. avg

    :計算平均值

注意:聚合函數的計算,排除null值。

解決方案:

1. 選擇不包含非空的列進行計算

2.

IFNULL

函數

  1. group by 分組字段;

    1. 分組之後查詢的字段:分組字段、聚合函數
    2. where 和 having 的差別?
      1. where 在分組之前進行限定,如果不滿足條件,則不參與分組。having在分組之後進行限定,如果不滿足結果,則不會被查詢出來
      2. where 後不可以跟聚合函數,having可以進行聚合函數的判斷。
    按照性别分組。分别查詢男、女同學的平均分

    SELECT sex , AVG(math) FROM student GROUP BY sex;

    按照性别分組。分别查詢男、女同學的平均分,人數

    SELECT sex , AVG(math),COUNT(id) FROM student GROUP BY sex;

    按照性别分組。分别查詢男、女同學的平均分,人數 要求:分數低于70分的人,不參與分組

    SELECT sex , AVG(math),COUNT(id) FROM student WHERE math > 70 GROUP BY sex;

    按照性别分組。分别查詢男、女同學的平均分,人數 要求:分數低于70分的人,不參與分組,分組之後。人數要大于2個人

    SELECT sex , AVG(math),COUNT(id) FROM student WHERE math > 70 GROUP BY sex HAVING COUNT(id) > 2;

    SELECT sex , AVG(math),COUNT(id) 人數 FROM student WHERE math > 70 GROUP BY sex HAVING 人數 > 2;

  1. 文法:limit 開始的索引,每頁查詢的條數;
  2. 公式:開始的索引 = (目前的頁碼 - 1) * 每頁顯示的條數

    -- 每頁顯示3條記錄

    SELECT * FROM student LIMIT 0,3; -- 第1頁

    SELECT * FROM student LIMIT 3,3; -- 第2頁

    SELECT * FROM student LIMIT 6,3; -- 第3頁

  3. limit 是一個MySQL"方言"

概念: 對表中的資料進行限定,保證資料的正确性、有效性和完整性。

  • 分類:

    1. 主鍵限制:primary key

    2. 非空限制:not null

    3. 唯一限制:unique

    4. 外鍵限制:foreign key

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);

1. 建立表時,添加唯一限制

CREATE TABLE stu(
				id INT,
				phone_number VARCHAR(20) UNIQUE -- 添加了唯一限制
			
			);
           
  • 注意mysql中,唯一限制限定的列的值可以有多個null

2. 删除唯一限制

ALTER TABLE stu DROP INDEX phone_number;

3. 在建立表後,添加唯一限制

ALTER TABLE stu MODIFY phone_number VARCHAR(20) UNIQUE;

1. 注意:

  1. 含義:非空且唯一
  2. 一張表隻能有一個字段為主鍵
  3. 主鍵就是表中記錄的唯一辨別

2. 在建立表時,添加主鍵限制

create table stu(
				id int primary key,-- 給id添加主鍵限制
				name varchar(20)
			);
           

3. 删除主鍵

  • 錯誤 alter table stu modify id int ;

    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)
			);
           
  1. 删除自動增長

    ALTER TABLE stu MODIFY id INT;

  2. 添加自動增長

    ALTER TABLE stu MODIFY id INT AUTO_INCREMENT;

1. 在建立表時,可以添加外鍵

create table 表名(
	....
	外鍵列
	constraint 外鍵名稱 foreign key (外鍵列名稱) references 主表名稱(主表列名稱)
);
           

2. 删除外鍵

ALTER TABLE 表名 DROP FOREIGN KEY 外鍵名稱;

3. 建立表之後,添加外鍵

ALTER TABLE 表名 ADD CONSTRAINT 外鍵名稱 FOREIGN KEY (外鍵字段名稱) REFERENCES 主表名稱(主表列名稱);

4. 級聯操作

1. 添加級聯操作

ALTER TABLE 表名 ADD CONSTRAINT 外鍵名稱

FOREIGN KEY (外鍵字段名稱) REFERENCES 主表名稱(主表列名稱) ON UPDATE CASCADE ON DELETE CASCADE ;

2. 分類:

1. 級聯更新:

ON UPDATE CASCADE

2. 級聯删除:

ON DELETE CASCADE

  • 一對一(了解):
    • 如:人和身份證
    • 分析:一個人隻有一個身份證,一個身份證隻能對應一個人
  • 一對多(多對一):
    • 如:部門和員工
    • 分析:一個部門有多個員工,一個員工隻能對應一個部門
  • 多對多:
    • 如:學生和課程
    • 分析:一個學生可以選擇很多門課程,一個課程也可以被很多學生選擇

    • 實作方式:在多的一方建立外鍵,指向一的一方的主鍵。
    • 實作方式:多對多關系實作需要借助第三張中間表。中間表至少包含兩個字段,這兩個字段作為第三張表的外鍵,分别指向兩張表的主鍵
    • 實作方式:一對一關系實作,可以在任意一方添加唯一外鍵指向另一方的主鍵。

-- 建立旅遊線路分類表 tab_category
		-- cid 旅遊線路分類主鍵,自動增長
		-- cname 旅遊線路分類名稱非空,唯一,字元串 100	
		CREATE TABLE tab_category (
						cid INT PRIMARY KEY AUTO_INCREMENT,
						cname VARCHAR(100) NOT NULL UNIQUE
					);
           
/*建立旅遊線路表 tab_route
		rid 旅遊線路主鍵,自動增長
		rname 旅遊線路名稱非空,唯一,字元串 100
		price 價格
		rdate 上架時間,日期類型
		cid 外鍵,所屬分類
		*/
		CREATE TABLE tab_route(
			rid INT PRIMARY KEY AUTO_INCREMENT,
			rname VARCHAR(100) NOT NULL UNIQUE,
			price DOUBLE,
			rdate DATE,
			cid INT,
			FOREIGN KEY (cid) REFERENCES tab_category(cid)
		);
           
/*建立使用者表 tab_user
			uid 使用者主鍵,自增長
			username 使用者名長度 100,唯一,非空
			password 密碼長度 30,非空
			name 真實姓名長度 100
			birthday 生日
			sex 性别,定長字元串 1
			telephone 手機号,字元串 11
			email 郵箱,字元串長度 100
			*/
			CREATE TABLE tab_user (
				uid INT PRIMARY KEY AUTO_INCREMENT,
				username VARCHAR(100) UNIQUE NOT NULL,
				PASSWORD VARCHAR(30) NOT NULL,
				NAME VARCHAR(100),
				birthday DATE,
				sex CHAR(1) DEFAULT '男',
				telephone VARCHAR(11),
				email VARCHAR(100)
			);		
           
/*建立收藏表 tab_favorite
			rid 旅遊線路 id,外鍵
			date 收藏時間
			uid 使用者 id,外鍵
			rid 和 uid 不能重複,設定複合主鍵,同一個使用者不能收藏同一個線路兩次
			*/
			CREATE TABLE tab_favorite (
				rid INT, -- 線路id
				DATE DATETIME,
				uid INT, -- 使用者id
				-- 建立複合主鍵
				PRIMARY KEY(rid,uid), -- 聯合主鍵
				FOREIGN KEY (rid) REFERENCES tab_route(rid),
				FOREIGN KEY(uid) REFERENCES tab_user(uid)
			);
           

  • 概念:設計資料庫時,需要遵循的一些規範。要遵循後邊的範式要求,必須先遵循前邊的所有範式要求
設計關系資料庫時,遵從不同的規範要求,設計出合理的關系型資料庫,這些不同的規範要求被稱為不同的範式,各種範式呈遞次規範,越高的範式資料庫備援越小。
目前關系資料庫有六種範式:第一範式(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基礎上消除傳遞依賴)

圖解:

第一範式(1NF)

MySQL限制->(個人學習記錄筆記)

第二範式(2NF)

MySQL限制->(個人學習記錄筆記)

第三範式(3NF)

MySQL限制->(個人學習記錄筆記)

  1. 指令行:
    • 備份:

      mysqldump -u使用者名 -p密碼 資料庫名稱 > 儲存的路徑

    • 還原:
      1. 登入資料庫
      2. 建立資料庫
      3. 使用資料庫
      4. 執行檔案。

        source 檔案路徑

  2. 圖形化工具:

繼續閱讀