MySQL①——核心基礎(約束、數據庫範式、多表、事務、權限、DDL、DML、DQL、DCL、TPL、忘記數據庫密碼)

MySQL①——核心基礎(約束、數據庫範式、多表、事務、權限、DDL、DML、DQL、DCL、TPL、忘記數據庫密碼)

<<<<<CSDN排版不美觀,想看美觀的進MySQL①——核心基礎(約束、數據庫範式、多表、事務、權限、DDL、DML、DQL、DCL、TPL、忘記數據庫密碼)>>>>>

1、MySQL(關係型數據庫管理系統)

①MySQL概述

MySQL是一個關係型數據庫管理系統,由瑞典MySQL AB 公司開發,目前屬於 Oracle 旗下產品。MySQL 是最流行的關係型數據庫管理系統之一,在 WEB 應用方面,MySQL是最好的 RDBMS (Relational Database Management System,關係數據庫管理系統) 應用軟件。MySQL所使用的 SQL 語言是用於訪問數據庫的最常用標準化語言。MySQL 軟件採用了雙授權政策,分爲社區版和商業版,由於其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點,一般中小型網站的開發都選擇 MySQL 作爲網站數據庫。由於其社區版的性能卓越,搭配 PHP 和 Apache 可組成良好的開發環境。

②下載、安裝與卸載

下載
可以進 https://dev.mysql.com/downloads/mysql/ 選擇下載mysql版本,暫時建議選用 5.x 版本(MySQL版本5.x有5.5、5.6、5.7,接着就是Mysql8.0的版本)

安裝
按照自己的系統下載對應格式的MySQL安裝,例如64位Windows電腦可以下載windows安裝版本,以 .msi 結尾的,然後安裝的時候可以根據提示和需要一步一步安裝,不懂的可以查詢其他相關資料

卸載
卸載的步驟(以Windows爲例):
(1)我的電腦>>服務>>停止MySQL服務
(2)在安裝程序中卸載MySQL
(3)刪除MySQL下所有的安裝文件
(4)刪除C盤中ProgramData目錄下的MySQL目錄(ProgramData目錄爲隱藏目錄,需要在文件瀏覽器中將 “顯示隱藏” 打開)

③啓動/關閉MySQL服務名(兩種方式啓動關閉)

(1)我的電腦>>管理>>服務,右擊 MySQL 服務,選擇啓動或停止(或者直接在 cmd 窗口中輸入 services.msc 進入服務管理)

(2)以管理員身份方式運行 命令提示符(即cmd,DOS窗口) (注意:如果不以管理員身份方式運行,將會提示 “發生系統錯誤5,拒絕訪問”)
net start MySQL 啓動MySQL服務
net stop MySQL 關閉MySQL服務

(注意上述命令中的 “MySQL” 是默認安裝的MySQL服務名,如果你安裝時有所更改,例如將MySQL服務名改爲MySQLXXX,那麼你需要通過命令 net start MySQLXXX 來啓動MySQL服務,其他命令以此類推)

④登錄/退出

登錄(在 cmd 窗口中)
登錄方式一(推薦):mysql -u root -p 然後會提示你輸入密碼,輸入正確則會登錄成功
登錄方式二:mysql -u root -p密碼 (注意-p和密碼之間沒有空格,此方法不推薦,因爲密碼會被看到)
登錄方式三:mysql -u root -p -D 數據庫名字 然後提示你輸入密碼,此方法登錄成功後可以直接select該數據庫
登錄方式四(完整):mysql -h IP地址 -P 端口號 -u root -p密碼 -D 數據庫名 (其中,-選項可以根據自身需要選擇是否加上,但是-u和-p是必須的)
登錄方式五(全稱):mysql --host=IP地址 --port=端口號 --user=root --password
(注意-p和密碼之間沒有空格,其他-選項和值之間可以不加空格也可以加空格)

退出(在 cmd 窗口中)
退出方式一:exit
退出方式一:quit

⑤MySQL目錄結構

MySQL安裝目錄(即安裝MySQL時你選擇的目錄)
bin目錄 存放可執行文件目錄
data目錄 存放了數據文件、日誌文件等
include目錄 存放了一些C語言頭文件等信息
lib目錄 存放了一系列庫文件
share目錄 用於存放字符集、語言等信息
myini文件 是MySQL數據庫中使用的配置文件
my-huge.ini、my-large.ini、my-medium.ini、my-small.ini 分別對應超大型數據庫、大型數據庫、中型數據庫、小型數據庫配置文件
my-template.ini 該文件是配置文件的模板,MySQL配置嚮導將該配置文件中選擇項寫入到my.ini文件之中

MySQL數據目錄(C:\ProgramData\MySQL\MySQL Server x.x下 x.x爲你安裝的版本號)
該目錄下的data目錄中
mysql、performance_schema等文件夾就是你MySQL中的數據庫
代表數據庫目錄下以 .frm 結尾的文件爲數據表

2、結構化查詢語言SQL(Structured Query Language)

①SQL概述

結構化查詢語言(Structured Query Language)簡稱SQL(發音:/ˈes kjuː ˈel/ “S-Q-L”),是一種特殊目的的編程語言,是一種數據庫查詢和程序設計語言,用於存取數據以及查詢、更新和管理關係數據庫系統;同時也是數據庫腳本文件的擴展名。至於發音,中國的開發者創造了一種獨特的SQL發音:/'sɜːkl/,Oracle沿用了/ˈsiːkwəl/這個讀音,因爲這門語言以前叫做“SEQUEL”。但更官方一些的讀音應該是ISO標準規定的/ˌɛsˌkjuːˈɛl/。雖然SQL有國際標準,但是各種通行的數據庫系統在其實踐過程中都對SQL規範作了某些編改和擴充。所以,實際上不同數據庫系統之間的SQL不能完全相互通用。

②SQL通用語法

(1)SQL可以單行或多行書寫,以 分號; 結尾
(2)可以使用空格或縮進來增強語句的可讀性
(3)MySQL數據庫的SQL語句不區分大小寫,但是關鍵字建議大寫
(4)註釋:
單行註釋:-- 註釋文字 (–和註釋文字之間有空格)

註釋內容 (#和註釋文字之間雖然不強制有空格,但建議留有空格,這種註釋爲MySQL特有註釋)

多行註釋:/* 註釋文字 */

③SQL語句分類

結構化查詢語言包含6個部分:
一:數據查詢語言(DQL:Data Query Language):
其語句,也稱爲“數據檢索語句”,用以從表中獲得數據,確定數據怎樣在應用程序給出。保留字SELECT是DQL(也是所有SQL)用得最多的動詞,其他DQL常用的保留字有WHERE,ORDER BY,GROUP BY和HAVING。這些DQL保留字常與其他類型的SQL語句一起使用。
二:數據操作語言(DML:Data Manipulation Language):
其語句包括動詞INSERT,UPDATE和DELETE。它們分別用於添加,修改和刪除表中的行。也稱爲動作查詢語言。
三:事務處理語言(TPL:Transaction Processing Language):
它的語句能確保被DML語句影響的表的所有行及時得以更新。TPL語句包括BEGIN TRANSACTION,COMMIT和ROLLBACK。
四:數據控制語言(DCL:Data Control Language):
它的語句通過GRANT或REVOKE獲得許可,確定單個用戶和用戶組對數據庫對象的訪問。某些RDBMS可用GRANT或REVOKE控制對錶單個列的訪問。
五:數據定義語言(DDL:Data Definition Language):
其語句包括動詞CREATE和DROP。在數據庫中創建新表或刪除表(CREAT TABLE 或 DROP TABLE);爲表加入索引等。DDL包括許多與人數據庫目錄中獲得數據有關的保留字。它也是動作查詢的一部分。
六:指針控制語言(CCL):
它的語句,像DECLARE CURSOR,FETCH INTO和UPDATE WHERE CURRENT用於對一個或多個表單獨行的操作。

(接下來的學習建議使用SQLyog或者Navicat Premium圖形化工具,更推薦SQLyog)

④數據定義語言(DDL:Data Definition Language)

1、操作數據庫:CRUD
C(Create) 創建:
CREATE DATABASE 數據庫名; >>> 創建數據庫
CREATE DATABASE IF NOT EXISTS 數據庫名; >>> 創建數據庫 (更加安全的方式)
CREATE DATABASE 數據庫名 CHARACTER SET 字符集; >>> 以指定字符集創建該數據庫
CREATE DATABASE IF NOT EXISTS 數據庫名 CHARACTER SET 字符集; >>> 以指定字符集創建數據庫 (更安全更完整)
R(Retrieve) 查詢:
SHOW DATABASES; >>> 查詢所有數據庫名稱
SHOW CREATE DATABASE 數據庫名; >>> 查詢數據庫字符集/查詢數據庫創建語句
U(Update) 更新:
ALTER DATABASE 數據庫名稱 CHARACTER SET 字符集; >>> 修改指定數據庫的字符集
D(Delete) 刪除:
DROP DATABASE 數據庫名; >>> 刪除指定數據庫
DROP DATABASE IF EXISTS 數據庫名; >>> 刪除指定數據庫 (更安全的方式)
use 使用數據庫:
SELECT DATABASE(); >>> 查詢當前正在使用的數據庫
USE 數據庫名; >>> 使用指定數據庫

2、操作數據表:CRUD
C(Create) 創建:
創建表格式:
CREATE IF NOT EXISTSTABLE 表名(
列名1 數據類型1,
列名2 數據類型2,

列名n 數據類型n
);
數據類型有:
整數類型:int
小數類型:double (double(6,2) 表示一共六位,最大整數佔4位,小數佔兩位,最大表示9999.99)
日期:一、date 只包含年月日,格式爲yyyy-MM-dd
二、datetime 包含年月日時分秒,格式爲yyyy-MM-dd HH:mm:ss
時間戳:timestamp 包含年月日時分秒,格式爲yyyy-MM–dd HH:mm:ss(如果該字段沒有賦值或賦值爲null,則默認使用當前的系統時間來賦值)
字符串:varchar (varchar(20)表示最大存儲20個字符)
(注意:最後一列結尾不需要加逗號, ; 同理創建數據表那一行也可以加上IF NOT EXISTS)
複製表格式:
CREATE TABLE 表名 like 被複制的表名; >>> 不會複製表中的數據
R(Retrieve) 查詢:
SHOW TABLES; >>> 查詢某個數據庫中所有的表
DESC 表名; >>> 查詢表結構
SHOW CREATE TALBE 表名 >>> 查看數據表字符集
U(Update) 更新/修改:
ALTER TABLE 表名 RENAME TO 新表名 >>> 修改表名
ALTER TABLE 表名 CHARARCTER SET 字符集 >>> 修改表的字符集
ALTER TABLE 表名 add 列名 數據類型 >>> 添加一列
ALTER TABLE 表名 CHANGE 舊列名 新列名 新數據類型 >>> 修改列的名稱、類型
ALTER TABLE 表名 MODIFY 列名 新數據類型 >>> 修改列的數據類型
ALTER TABLE 表名 DROP 列名 >>> 刪除列
D(Delete) 刪除:
DROP TABLE 表名; >>> 刪除數據表
DROP TABLE IF EXISTS 表名; >>> 刪除數據表 (更安全)

⑤數據操作語言(DML:Data Manipulation Language)

添加數據:
INSERT INTO 表名(列名1,列名2,…列名n) VALUES(值1,值2,…值n); >>> 添加數據 (列名和值一一對應,否則將會報錯)
INSERT INTO 表名 VALUES(值1,值2,…值n); (該方法默認給表中所有列添加值,但是必須給所有列添加數據)
除了數字類型以外,其他類型需要使用引號(單雙引號)引起來
刪除數據:
DELETE FROM 表名 WHERE 條件; (例如:DELETE FROM USER WHERE id=1;)
DELETE FROM 表名; (注意:如果像這種不加條件,則默認刪除表中所有記錄;但是就算刪除所有表也不推薦該方式,因爲數據表中有多少條數據它就會執行多少次刪除操作,效率低)
TRUNCATE TABLE 表名; (該方法結果也是清空表記錄,它的原理是先刪除表,然後再創建一張一模一樣的空表,效率更高)
修改數據:
UPDATE 表名 SET 列名1=值1,…列名n=值n WHERE 條件;
UPDATE 表名 SET 列名1=值1,…列名n=值n;(注意:如果像這種不加條件,則會默認修改數據表中所有數據)

⑥數據查詢語言(DQL:Data Query Language)

條件查詢:
WHERE字句後跟條件
運算符:

、<、<=、>=、=、<>、!=
BETWEEN…AND >>> 包含首尾
IN(集合)
LIKE >>> 模糊查詢 (和佔位符搭配使用)
IS NULL(注意:NULL的值不能使用 =或者!= 判斷)
AND 或 &&
OR 或 ||
NOT 或 !
佔位符:
_ >>> 單個任意字符
% >>> 0個1個或多個任意字符
查詢數據:
SELECT * FROM 表名; >>> 查詢表中所有記錄
SELECT 字段列表 FROM 表名列表 WHERE 條件列表 GROUP BY 分組字段 HAVING 分組之後的條件 ORDER 排序規則 LIMIT 分頁限定 >>> 這是完整的查詢語法,但是可以根據需要選擇關鍵字進行組合
SELECT DISTINCT 字段列表 FROM 表名; >>> 去重查詢 (注意:如果字段列表有多個,只有組合結果重複纔會去重)
SELECT 字段名1 運算符 字段名2 AS 別名 FROM 表名 >>> 可以根據查詢該表下字段1和字段2運算後的結果,並以別名命名查詢顯示出來,其中 AS省略也可以,也會以別名的方式顯示 (如果其中一個字段爲字符或字符串,則會將其結果看成0;如果其中一個字段值爲null,則運算後結果也會是null,所以爲了避免該情況,可以使用 IFNULL(判斷的字段,0) 解決該問題)

排序查詢:
SELECT * FROM 表名 ORDER BY 字段名; >>> 默認按該字段名升序排列該表名下的數據
SELECT * FROM 表名 ORDER BY 字段名 ASC; >>> 按該字段名升序排列該表名下的數據 (同上)
SELECT * FROM 表名 ORDER BY 字段名 DESC; >>> 按該字段名降序排列該表名下的數據
SELECT * FROM 表名 ORDER BY 字段名1 排序方式1,字段名2 排序方式2…; >>> 先按照排序方式1排序字段名1,當條件相同的值在一起,再按照排序方式2對字段名2進行排序,排序方式有ASC升序和DESC降序兩種

聚合函數:
將一列數據作爲一個整體,進行縱向計算(注意:聚合函數的計算會排除null值)
count:計算個數
SELECT COUNT(字段名) FROM 表名; >>> 計算字段名非空的有多少個
SELECT COUNT(IFNULL(字段名,如果爲空就替換成的值)) FROM 表名; >>> 查詢該字段名共有多少條記錄,包括爲空的字段
SELECT COUNT(*) FROM 表名; >>> 查看該表共有多少條數據(只要該數據有一個字段不爲null,則算一條數據,效率不高)
SELECT COUNT(主鍵名) FROM 表名; >>> 查看該表共有多少條數據 (推薦,因爲主鍵是不能爲空的)
(選擇不爲空的字段,比如主鍵,因爲主鍵是不能爲空的)
max:計算最大值
SELECT MAX(字段名) FROM 表名; >>> 查看該表下字段的最大值
min:計算最小值
SELECT MIN(字段名) FROM 表名; >>> 查看該表下字段的最小值
sum:求和
SELECT SUM(字段名) FROM 表名; >>> 查看該表中字段的總和(字符串varchar等結果爲0)
avg:計算平均值
SELECT AVG(字段名) FROM 表名; >>> 查看該表中字段的平均值(字符串varchar等結果爲0)

分組查詢:
格式:查詢語句 GROUP BY 分組字段
注意分組之後查詢的字段一般是:聚合函數、分組字段,其他的實用意義不大
例如:SELECT AVG(salary) AS a,department_id FROM employees GROUP BY department_id; >>> 查詢每個部門的平均工資
查詢語句 WHERE 條件 GROUP BY 分組字段
查詢語句 WHERE 條件 GROUP BY 分組字段 HAVING 條件
區別:1、WHERE在分組之前限定,如果不滿足條件,不參與分組;HAVING在分組之後進行限定,如果不滿足條件,則不會被查詢出來
2、WHERE後不可以跟聚合函數,HAVING可以進行聚合函數的判斷

分頁查詢:
格式:查詢語句 LIMIT 開始索引,每頁查詢的條數;
公式:開始索引=(當前頁碼-1)*每頁顯示的條數
該分頁操作的語法只能在MySQL中使用,相當於MySQL的“方言”

SQLyog格式化代碼快捷鍵,Ctrl+F12,讓代碼看起來更加整齊規範

⑦表約束

約束有纏縛,束縛,按照約定(特定)條件限制,管束等意思。約束用於限制加入表的數據,保證數據的正確性、有效性和完整性。

約束類型
主鍵約束(Primary Key constraint):要求主鍵列數據唯一,並且不允許爲空也不能重複。
非空約束(Not Null constraint):非空約束。
唯一約束(Unique constraint):要求該列唯一,允許爲空,MySQL允許存在多個空值
外鍵約束(Foreign Key constraint):用於在兩個表之間建立關係,需要指定引用主表的哪一列。
默認約束(Default constraint):某列的默認值,如在數據庫裏有一項數據很多重複,可以設爲默認值。
檢查約束(Check constraint):某列取值範圍限制,格式限制等,如有關年齡、郵箱(必須有@)的約束,該種約束在MySQL暫時無描述。

主鍵約束 PRIMARY KEY:主鍵約束,非空且唯一、一張表只能有一個字段爲主鍵(但是可以創建聯合主鍵)。主鍵可以看成一張表中的唯一標識
創建表時給 id字段 添加主鍵約束:
CREATE TABLE 表名(
id varchar(20) PRIMARY KEY, – 主鍵id
name varchar(20) NOT NULL, – 姓名 非空

IDCard varchar(20) NOT NULL UNIQUE – 身份證 非空且唯一
);
創建表之後添加主鍵約束:
ALTER TABLE 表名 MODIFY 字段名 數據類型 PRIMARY KEY;
創建表之後刪除主鍵約束:
ALTER TABLE 表名 DROP PRIMARY KEY;

自動增長:如果某一列是數值類型的,使用 AUTO_INCREMENT可以來完成值的自動增長,一般配合主鍵來使用
創建表時給 id字段 添加主鍵約束並且自動增長
CREATE TABLE 表名(
id varchar(20) PRIMARY KEY AUTO_INCREMENT , – 主鍵id且自動增長
name varchar(20) NOT NULL, – 姓名 非空

IDCard varchar(20) NOT NULL UNIQUE – 身份證 非空且唯一
);
創建表之後添加自動增長
ALTER TABLE 表名 MODIFY 字段名 數據類型 AUTO_INCREMENT ;
創建表之後刪除自動增長:
ALTER TABLE 表名 MODIFY 字段名 數據類型;
如果給某字段設置了自動增長後,再使用 INSERT INTO 插入語句,也可以將該字段值設置爲 NULL 值,哪怕該字段原先設置了主鍵或者NOT NULL也沒問題,它會在自動在以前該字段最大值的基礎上+1;哪怕你將最大值那一列數據刪除,他還是會記住歷史的最大值,然後自動+1

非空約束 NOT NULL:要求數據不能爲空
創建表時給 name字段 添加非空約束:
CREATE TABLE 表名(
id varchar(20), – id列

name varchar(20) NOT NULL – 姓名 非空
);
創建表之後添加非空約束
ALTER TABLE 表名 MODIFY 字段 數據類型 NOT NULL;
創建表之後刪除非空約束
ALTER TABLE 表名 MODIFY 字段 數據類型 ;

唯一約束 UNIQUE:值不能重複,允許爲空NULL,MySQL允許存在多個空值NULL
創建表時給 name字段 添加唯一約束
CREATE TABLE 表名(
id varchar(20), – id

name varchar(20) UNIQUE – 姓名 唯一
);
創建表之後添加唯一約束
ALTER TABLE 表名 MODIFY 字段 數據類型 UNIQUE;
創建表之後刪除唯一約束
ALTER TABLE 表名 DROP INDEX 字段名;

外鍵約束 FOREIGN KEY:用於在兩個表之間建立關係,需要指定引用主表的哪一列。
創建表時給 外鍵列 添加外鍵:
CREATE TABLE 表名(

外鍵列名 數據類型,
CONSTRAINT 外鍵名 FOREIGN KEY (外鍵列名稱) REFERENCES 主表名稱(關聯的主表列名稱)
);

創建表之後添加外鍵:
ALTER TABLE 表名 ADD CONSTRAINT 外鍵名 FOREIGN KEY (外鍵列名稱) REFERENCES 主表名稱(主表列名稱);
創建表之後刪除外鍵:
ALTER TABLE 表名 DROP FOREIGN KEY 外建名;
級聯更新和級聯刪除操作:級聯更新簡而言之就是更改 關聯外鍵並且是主鍵那個字段 時,對應的關聯外鍵另外一個字段的該值也會隨之改成相應的值;級聯刪除簡而言之就是
ALTER TABLE 表名 ADD CONSTRAINT 外鍵名 FOREIGN KEY (外鍵列名稱) REFERENCES 主表名稱(關聯的主表列名稱) ON UPDATE CASCADE ON DELETE CASCADE;
級聯更新:ON UPDATE CASCADE
級聯刪除:ON DELETE CASCADE
SQLyog的架構設計器(Ctrl+Alt+D)可以看到多表之間的一些關係

⑧多表關係

多表之間的關係:一對一(人和身份證)、一對多或多對一(常見,例如員工和部門或者部門和員工)、多對多(例如學生和課程)
實現:
一對一:可以在任何一方的添加唯一約束的外鍵指向另外一方;不過實際開發一般用到得少,一般合成一張表而不拆分成多表
一對多(多對一):在多的一方建立外鍵,指向一的一方的主鍵
多對多:藉助第三張中間表,中間表至少包含兩個字段,這兩個字段作爲第三張表的外鍵,分別指向兩張表的主鍵

⑨數據庫範式

數據庫設計的範式Normal Form、數據庫標準化Database Normalization:設計關係數據庫時,遵從不同的規範要求,設計出合理的關係型數據庫,這些不同的規範要求被稱爲不同的範式,各種範式呈遞次規範,越高的範式數據庫冗餘越小。目前關係數據庫有六種範式:第一範式(1NF)、第二範式(2NF)、第三範式(3NF)、巴斯-科德範式(BCNF)、第四範式(4NF)和第五範式(5NF,又稱完美範式)。
第一範式(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、主屬性:在一個關係中,如一個屬性是構成某一個候選關鍵字的屬性集中的一個屬性,則稱它爲主屬性。
6、非主屬性/非碼屬性:不包含在任何一個候選碼中的屬性稱爲非主屬性。非主屬性是相對與主屬性來定義的,是指關係中不包含任何一個候選碼中的屬性。
例如:在關係——學生(學號,姓名,年齡,性別,班級)中,主碼是“學號”,那麼其他的“姓名”、“年齡”、“性別”、“班級”就都可以稱爲非主屬性。
7、碼:如果在一張表中,一個屬性或屬性組,被其他所有屬性所完全依賴,則稱這個屬性(屬性組)爲該表的碼
例如:下面例子中,(學號,課程名稱)組成的屬性組
8、主碼/主鍵:主關鍵字(primary key)是表中的一個或多個字段,它的值用於唯一地標識表中的某一條記錄,一個表的主鍵可以由多個關鍵字共同組成,並且主關鍵字的列不能包含空值
9、候選碼:若關係中的一個屬性或屬性組的值能夠唯一地標識一個元組,且他的真子集不能唯一的標識一個元組,則稱這個屬性或屬性組做候選碼。例如:在學生實體中,“學號”是能唯一的區分學生實體的,同時又假設“姓名”、“班級”的屬性組合足以區分學生實體,那麼{學號}和{姓名,班級}都是(超級碼)候選碼。候選碼(超級碼)就是可以被選爲主碼的屬性或屬性組。候選碼中出現過的屬性稱爲主屬性;非主屬性就是不包含在任何候選碼中的屬性。例如:關係 工人(工號,身份證號,姓名,性別,部門).顯然工號和身份證號都能夠唯一標示這個關係,所以都是候選碼。工號、身份證號這兩個屬性就是主屬性。如果主碼是一個屬性組,那麼屬性組中的屬性都是主屬性。
第三範式(3NF):在2NF基礎上,任何非主屬性不依賴於其它非主屬性(在2NF基礎上消除傳遞依賴)

三大範式應用舉例:
假如需要開發一個信息管理系統,暫時設計表如下:

經過第一範式分析後處理:

經過第二範式分析處理後:

經過第三範式分析處理後:

⑩數據庫的備份和還原

命令方式:
備份語法格式:mysqldump -u root -p密碼 數據庫名 > 保存的路徑
mysqldump -u root -p 數據庫名 > 保存的路徑 >>> 當然也可以這種方式,更加安全
還原語法格式:1、登錄數據庫
2、創建數據庫
3、使用數據庫
4、執行文件 : source sql腳本文件路徑全名
當然如果該數據庫存在,可以: mysql –u用戶名 –p密碼 –D數據庫 < sql腳本文件路徑全名
圖形化界面(SQLyog):
備份:進入SQLyog後選擇需要備份的數據庫>>> 右擊,選擇備份/導出>>>備份數據庫,轉儲到SQL>>>選擇存放路徑>>>點擊導出
還原:右擊>>>執行SQL文件

命令行方式和圖形化界面備份的區別:SQLyog備份的SQL文件包含創建數據庫命令,而命令行方式沒有;命令行導出後的SQL文件還原時需要自己創建一下數據庫,而SQLyog備份後的SQL還原的時候可以創建也可以不創建數據庫,只不過數據庫名字和原來一樣

⑪多表查詢

語法:
SELECT 字段列表 FROM 表名列表 >>> 查出各個集合的組合結果集,笛卡爾積
SELECT 字段列表 FROM 表名列表 WHERE… >>> 使用條件消除無用數據
笛卡爾積:笛卡爾乘積是指在數學中,兩個集合X和Y的笛卡尓積(Cartesian product),又稱直積,表示爲X × Y,第一個對象是X的成員而第二個對象是Y的所有可能有序對的其中一個成員,A×B = {(x,y)|x∈A∧y∈B},即兩個集合所有組成的情況
內連接查詢:
隱式內連接:
SELECT 字段列表 FROM 表名列表 WHERE 兩邊相關條件
顯式內連接:
SELECT 字段列表 FROM 表名1 INNER JOIN 表名2 ON 條件
SELECT 字段列表 FROM 表名1 INNER JOIN 表名2 ON 條件 >>> 該語法是上面語句的省略寫法
內連接查詢注意事項:
1、確定應該查詢哪些表
2、明確兩表之間查詢的條件
3、需要查詢哪些字段
外鏈接查詢:
左外連接:
SELECT 字段列表 FROM 表1 LEFT OUTER JOIN 表2 ON 條件 >>> 查詢表1所有數據以及其交集部分
SELECT 字段列表 FROM 表1 LEFT JOIN 表2 ON 條件 >>> 上面查詢語句的簡化形式
右外連接:
SELECT 字段列表 FROM 表1 RIGHT OUTER JOIN 表2 ON 條件 >>> 查詢表2所有數據以及其交集部分
SELECT 字段列表 FROM 表1 RIGHT JOIN 表2 ON 條件 >>> 上面查詢語句的簡化形式
子查詢:查詢中嵌套查詢,該嵌套查詢即爲子查詢
例如:SELECT * FROM employees WHERE salary = (SELECT MAX(salary) FROM employees); >>> 查詢工資最高的員工信息
子查詢的各種情況:
1、子查詢的結果是單行單列的
子查詢作爲條件,使用運算符進行判斷。運算符:> >= < <= =
SELECT * FROM employees WHERE salary > (SELECT AVG(salary) FROM employees); >>> 查詢工資比平均工資高的員工的信息
2、子查詢的結果是多行單列的
子查詢可以作爲條件,使用運算符 IN 來判斷
SELECT department_id FROM departments WHERE department_name =‘Adm’ OR department_name =‘Mar’; >>> 查詢部門名字爲"Adm"和"Mar"的部門id是多少,返回一列兩條記錄
SELECT * FROM employees WHERE department_id IN(SELECT department_id FROM departments WHERE department_name =‘Adm’ OR department_name =‘Mar’); >>> 查詢部門名字爲"Adm"和"Mar"的所有員工信息
3、子查詢的結果是多行多列的
子查詢可以作爲一張虛擬表
SELECT * FROM 表1,(多行多列子查詢SELECT語句) WHERE 條件

⑫事務、事務處理語言(TPL:Transaction Processing Language)

事務的基本介紹
概念:數據庫事務(簡稱:事務)是數據庫管理系統執行過程中的一個邏輯單位,由一個有限的數據庫操作序列構成。
目的:1、爲數據庫操作序列提供了一個從失敗中恢復到正常狀態的方法,同時提供了數據庫即使在異常狀態下仍能保持一致性的方法。
2、當多個應用程序在併發訪問數據庫時,可以在這些應用程序之間提供一個隔離方法,以防止彼此的操作互相干擾。
操作:開啓事務 START TRANSACTION;
回滾 ROLLBACK;
提交 COMMIT;
例如:銀行轉賬分爲三步:1、查詢轉賬人賬戶餘額是否大於500 2、第1步條件成立則轉賬人賬戶金額 -500 3、被轉賬人賬戶餘額 +500
可能會發生這樣的情況,在第二步執行完後,發生了異常,或者說停電了等等意外情況,導致第三步沒有執行,這將會給數據帶來無法挽回的損失,而且這種情況出現機率非常高
事物提交的方式分爲:自動提交和手動提交
自動提交:MySQL默認自動提交
手動提交:需要先開啓事務,再提交。Oracle默認提交方式爲手動提交
查看事務默認提交方式:SELECT @@autocommit; >>> 1代表自動提交 0代表手動提交
修改事務默認提交方式:SET @@autocommit=0; 或者 SET @@autocommit=1;
事務的四大特徵
原子性(Atomicity):事務作爲一個整體被執行,包含在其中的對數據庫的操作要麼全部被執行,要麼都不執行。
一致性(Consistency):事務應確保數據庫的狀態從一個一致狀態轉變爲另一個一致狀態。一致狀態的含義是數據庫中的數據應滿足完整性約束。
隔離性(Isolation):多個事務併發執行時,一個事務的執行不應影響其他事務的執行。相互獨立。
持久性(Durability):已被提交的事務對數據庫的修改應該永久保存在數據庫中。
事務的併發問題
1、髒讀 dirty read:髒讀是指在一個事務處理過程裏讀取了另一個未提交的事務中的數據。
2、不可重複讀 non-repeatable read:不可重複讀是指在對於數據庫中的某個數據,一個事務範圍內多次查詢卻返回了不同的數據值,這是由於在查詢間隔,被另一個事務修改並提交了(不可重複讀和髒讀的區別是,髒讀是某一事務讀取了另一個事務未提交的髒數據,而不可重複讀則是讀取了前一事務提交的數據)
3、幻讀 phantom read:幻讀是事務非獨立執行時發生的一種現象。例如事務T1對一個表中所有的行的某個數據項做了從“1”修改爲“2”的操作,這時事務T2又對這個表中插入了一行數據項,而這個數據項的數值還是爲“1”並且提交給數據庫。而操作事務T1的用戶如果再查看剛剛修改的數據,會發現還有一行沒有修改,其實這行是從事務T2中添加的,就好像產生幻覺一樣,這就是發生了幻讀(幻讀和不可重複讀都是讀取了另一條已經提交的事務(這點就髒讀不同),所不同的是不可重複讀查詢的都是同一個數據項,而幻讀針對的是一批數據整體(比如數據的個數))
事務的隔離級別
1、read uncommitted (讀未提交):最低級別,任何情況都無法保證。
2、read committed (讀已提交):可避免髒讀的發生。(Oracle默認)
3、repeatable read (可重複讀):可避免髒讀、不可重複讀的發生。(MySQL默認)
4、serializable (串行化):可避免髒讀、不可重複讀、幻讀的發生。
隔離級別從小到大安全性越來越高,但是效率越來越低
數據庫查詢隔離級別:
SELECT @@tx_isolation;
數據庫設置隔離級別:
SET GLOBAL TRANSACTION ISOLATION LEVEL 級別字符串;(設置之後需要斷開重新連接纔會看到生效)
⑬用戶管理和權限管理、數據控制語言(DCL:Data Control Language)
用戶管理:
創建用戶:
CREATE USER ‘用戶名’@‘主機名’ IDENTIFIED BY ‘密碼’;
刪除用戶:
DROP USER ‘用戶名’@‘主機名’;
修改用戶:
UPDATE user SET PASSWORD = PASSWORD(‘新密碼’) WHERE USER = ‘用戶名’;
SET PASSWORD FOR ‘用戶名’@‘主機名’ = PASSWORD(‘新密碼’);
查詢用戶:
切換到名字爲 “mysql” 的數據庫,查詢user表 >>> SELECT * FROM USER; (如果查詢到Host這一列有localhost,代表只能在本機登錄MySQL;如果有通配符 % ,代表可以在任意主機登錄MySQL)
補充:MySQL忘記了root用戶的密碼
1、管理員方式運行cmd >>> net stop mysql 停止mysql服務
2、使用無驗證方式啓動MySQL服務:mysqld --skip-grant-tables,然後保持該窗口不關
3、接下來新建一個cmd窗口,直接輸入mysql登錄mysql數據庫,然後輸入 use mysql; ,再使用更改用戶密碼的MySQL命令。更改完後關閉所有cmd窗口。
4、手動結束 mysqld.exe 進程,然後以管理員方式運行cmd,net start mysql 啓動服務,就可以使用新密碼登錄了。
權限管理:
查詢權限:
SHOW GRANTS FOR ‘用戶名’@‘主機名’;
授予權限:
GRANT 權限列表 ON 數據庫名.表名 TO ‘用戶名’@‘主機名’; >>> 對錶操作的權限列表有INSERT、DELETE、UPDATE、SELECT等
GRANT ALL ON . TO ‘用戶名’@‘主機名’; >>> 所有數據庫的所有表的所有權限授予給指定用戶
撤銷權限:
REVOKE 權限列表 ON 數據庫名.表名 FROM ‘用戶名’@‘主機名’;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章