數據庫知識總結
本節內容
1.數據庫的基本概念
2.MySQL數據庫軟
- 安裝
- 卸載
- 配置
3.SQL
數據庫的基本概念
1.數據庫的英文單詞:DataBase 簡稱:DB
2.什么是數據庫?
- 用於存儲和管理數據的倉庫
3.數據庫的特點:
- 持久化存儲數據。其實數據庫就是一個文件系統
- 方便存儲和管理數據
- 使用了統一的方式操作數據庫 -- SQL
4.常見的數據庫軟件
MySQL數據庫軟件
MySQL的安裝在博客中比較多也比較全,這里就不一一截圖。
主要講解下MySQL的卸載
1.安裝
參見博客
2.卸載
1.去mysql的安裝目錄找到my.ini文件並打開
- 復制datadir="C:/ProgramData/MySQL/MySQL Server 5.5/Data/"
2.卸載MySQL
3.刪除C:/ProgramData目錄下的MySQL文件夾 (隱藏文件)
3.配置
MySQL服務啟動
- 手動。
- cmd--> services.msc 打開服務的窗口
- 使用管理員打開cmd
net start mysql :啟動mysql的服務
net stop mysql :關閉mysql的服務
MySQL登陸
1.mysql -uroot -p密碼 2.mysql -hip -uroot -p 連目標的密碼 3.mysql --host=ip --user=root --password=連接目標的密碼
MySQL退出
1.exit 2.quit
MySQL目錄結構
1.MySQL安裝目錄
配置文件 my.ini
2.MySQL數據目錄
幾個概念
- 數據庫:文件夾
- 表:文件
- 數據:數據
SQL
1.什么是SQL ?
- Structured Query Languange:結構化查詢語言
其實就是定義了操作所有關系型數據庫的規則。每一種數據庫操作的方式存在不一樣的地方,稱為“方言”。
2.SQL通用語法
- SQL語句可以單行或多行書寫,以分號結尾。
- 可使用空格和縮進來增強語句的可讀性。
- MySQL數據庫的SQL 語言不區分大小寫,關鍵字建議使用大寫。
- 3種 注釋
- 單行注釋: -- 注釋內容 或 # 注釋內容(mysql特有)
- 多行注釋: /*注釋*/
3.SQL分類
1.DDL(Data Definition Language)數據定義語言
- 用來定義數據庫對象:數據庫、表、列等。關鍵字:create,drop,alter等
2.DML(Data Manipulatio Language)數據操作語言
- 用來對數據庫中表的數據進行增刪改。關鍵字:insert,delete,update 等
3.DQL(Data Query Language)數據庫查詢語言
- 用來查詢數據庫中表的記錄(數據)。關鍵字:select,where 等
4.DCL(Data Control Language)數據控制語言(了解)
- 用來定義數據庫的訪問權限和安全級別,及創建用戶。關鍵字:GRANY,REVOKE 等。
DDL:操作數據庫表
1.操作數據庫:CRUD
1.C(Create):創建
- 創建數據庫:
create database 數據庫名稱
- 創建數據庫,判斷不存在,再創建:
create database if not exists 數據庫名稱;
- 創建數據庫,並指定字符集
create database 數據庫名稱 character set 字符集名;
- 練習:創建db3數據庫,判斷是否存在,並指定字符集為gbk
create database if not exists db3 character set gbk;
2.R(Retrieve):查詢
- 詢所有數據庫的名稱:
show database;
- 查詢某個數據庫的字符集:查詢某個數據庫的創建語句
show create database 數據庫名稱;
3.U(Update):修改
- 修改數據庫的字符集
alter database 數據庫名稱 character set 字符集名稱:
4.D(Delete):刪除
- 刪除數據庫
drop database 數據庫名稱;
- 判斷數據庫存在,存在再刪除
drop database if exists 數據庫名稱;
5:使用數據庫
- 查詢當前正在使用的數據庫名稱
select database();
- 使用數據庫
use 數據庫名稱;
2.操作表
1.C(Create):創建
- 語法;
create table 表名(
列名1 數據類型1,
列名2 數據類型2,
...
列名n 數據類型n
);
注意:最后一列,不需要加逗號(,)
- 數據類型:
1.int:整數類型
age int,
2.double:小數類型
score duoble (3,7)
3.data:日期,只包含年月日,yyyy-MM-dd
4.datatime:日期,包含年月日時分秒 ,yyyy-MM-dd HH:mm;ss
5.timestamp:時間類型 包含年月日時分秒 yyyy-MM-dd HH:mm;ss
如果將來不給這個字段賦值,或賦值為null,則默認使用當前的系統時間,來自動賦值
6.varchar:字符串
name varchar(20):姓名最大20的字符 cainiao 7個字符 張三 2個字符
- 創建表
create table student( id int, name varchar(37), age int, score double(4.1), birthday data, insert_time timestamp );
- 復制表:
create table 表名 like 被復制的表名
2.R(Retrieve):查詢
- 查詢某個數據庫中所有的表名稱
show tables;
- 查詢表結構
desc 表名;
3.U(Update):修改
- 1.修改表名
alter table 表名 rename to 新的表名;
- 2.修改表的字符集
alter table 表名 character set 字符集名稱;
- 3.添加一列
alter table 表名 add 列名 數據類型;
- 4.修改列名稱 類型
alter table 表名 change 列名 新列名 新列別 新數據類型;
alter table 表名 modify 列名 新數據類型;
- 5.刪除列
alter table 表名 drop 列名;
4.D(Delete):刪除
drop table 表名; drop table if exists 表名;
*客戶端圖形化工具:SQLYog
DML:增刪改表中的數據
1.添加數據:
- 語法:
insert into 表名(列名1,列名2,...列名n) values(值1,值2,...值n);
- 注意:
1.列名和值要一一對應。
2.如果表名后,不定義列名,則默認給所有列添加值。
insert into 表名 values(值1,值2,...值n);
3.除了數字類型,其他類型需要使用引號(單雙都可以)引起來
2.刪除數據:
- 語法:
delete from 表名 [where 條件]
- 注意:
- 如果不加條件,則刪除表中所有記錄。
- 如果要刪除所有記錄
- delete from 表名;-- 不推薦使用。有多少條記錄就會執行多少次刪除操作。
- TRUNCATE TABLE 表名; -- 推薦使用,效率更高 先刪除表,然后再創建一張一樣的表。
3.修改數據
- *語法:
update 表名 set 列名1 = 值1,列名2 = 值2,...[where 條件];
注意:
- 如果不加任何條件,則會將表中所有記錄全部修改。
DQL:查詢表中的記錄
select * from 表名;
1.語法
select
字段列表
from
表名列表
where
條件列表
group by
分組字段
having
分組之后的條件
order by
排序
limit
分頁限定
2.基礎查詢
1.多個字段的查詢
select 字段名1,字段名2... from 表名;
注意:
- 如果查詢所有字段,則可以使用*來替代字段列表。
2.去除重復
distinct
3.計算列
一般可以使用四則運算計算一些列的值。(一般只會進行數值型的計算)
ifnull(表達式1,表達式2);
- 表達式1:那個字段需要判斷是否為null
- 如果改字段為null后的替換值。
4.起別名
as :as也可以省略
3.條件查詢
1.where子句后跟條件
2.運算符 >,<,>=,<=,=,<> BETWEEN...AND IN(集合) LIKE IS NULL and or && or or || not or !
本節內容
1.DQL:查詢語句
- 排序查詢
- 聚合函數
- 分組查詢
- 分頁查詢
2.約束
3.多表之間的關系
4.范式
5.數據庫的備份和還原
DQL:查詢語句
1.排序查詢
語法:order by 子句
order by 排序字段1 排序方式1,排序字段2 排序方式2...
排序方式:
ASC:升序,默認的
DESC:降序
注意:
如果有多個排序條件,則當前的條件值一樣時,才會判斷第二條件。
2.聚合函數:將一列數據作為一個整體,進行縱向的計算。
1.count:計算個數
- 一般選擇非空的列:主鍵
- count(*)
2.max:計算最大值
3.min:計算最小值
4.sum:計算和
5.avg:計算平均值
注意:聚合函數的計算,排除null值。
解決方案:
- 選擇不包含非空的列進行計算
- IFNULL函數
3.分組查詢
語法:group by 分組字段
注意:
1.分組之后查詢的字段:分組字段、聚合函數
2.where 和 having的區別?
- where 在分組之前進行限定,如果不滿足條件,則不參與分組。having在分組之后進行限定,如果不滿足結果,則不會被查詢出來
- where 后不可以跟聚合函數,having可以進行聚合函數的判斷。
4.分頁查詢
語法:limit開始的索引,每頁查詢的條數;
公式:開始的索引 = (當前的頁碼 - 1) * 每頁顯示的條數 --每頁顯示3條記錄 SELECT * FROM student LIMIT 0.3; --第1頁 SELECT * FROM student LIMIT 3.3; --第2頁 SELECT * FROM student LIMIT 6.3; --第3頁 limit 是一個MySQL"方言"
約束
概念:對表中的數據進行限定,保證數據的正確性、有效性和完整性。
分類:
- 主鍵約束:primary key
- 非空約束:not null
- 唯一約束:unique
- 外鍵約束:foreign key
非空約束:not 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.注意:
- 含義:非空且唯一
- 一張表只能有一個字段為主鍵
- 主鍵就是表中記錄的唯一標識
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) );
3.刪除自動增長
ALTER TABLE stu MODIFY id INT;
--添加自動增長
ALTER TABLE stu MODIFY id INT auto_increment
外鍵約束:foreign key,讓表與表產生關系,從而保證數據的正確性。
1.在創建表時,添加外鍵
語法:
create table 表名(
...
外鍵列
constraint 外鍵名稱 foregin key (外鍵列名稱) references 主表名稱(主表列名稱)
);
2.刪除外鍵
ALTER TABLE 表名 DROP FOREIGN KEY 外鍵名稱;
3.創建表之后,添加外鍵
ALTER TABLE employee(表名) ADD CONSTRAINT(外鍵名稱) emp_dept_fk FOREIGN KEY (dep_id(外鍵字段名稱)) REFERENCES department(id)(主表名稱(主表列名稱))
4.級聯操作
添加級聯操作
語法:
ALTER TABLE 表名 ADD CONSTRAINT(外鍵名稱)
FOREIGN KEY (外鍵字段名稱) REFERENCES 主表名稱(主表列名稱)
分類:
1.級聯更新:
ON UPDATE CASCADE
2.級聯刪除:
ON DELETE CASCADE
數據庫的設計
1.多表之間的關系
1.一對一(了解) 如:人和身份證 分析:一個人只有一個身份證,一個身份證只能對應一個人 2.一對多(多對一): 如:部門和員工 分析:一個部門有多個員工,一個員工只能對應一個部門 3.多對多: 如:學生和課程 分析:一個學生可以選擇多個課程,一個課程也可以被多個學生選擇
2.實現關系:
1.一對一 如:人和身份證 實現關系:一對一關系實現,可以在任意一方添加唯一外鍵指向另一方的主鍵。 2.一對多(多對一): 如:部門和員工 實現關系:在多的一方建立外鍵,指向另一方的主鍵。 3.多對多: 如:學生和課程 實現關系:多對多關系實現需要借助第三張中間表。中間表至少包含兩個字段,這兩個字段作為第三張表的外鍵,分別指向兩張表的主鍵。
2.數據庫設計的范式
概念:設計數據庫時,需要遵循的一些規范。要遵循后邊的范式要求,必須先遵循前邊的所有范式要求
設計關系數據庫時,遵從不同的規范要求,設計合理的關系型數據庫,這些不同的規范要求被稱為不同的范式,各種范式呈遞規范,越高的范式數據庫冗余越小。
目前關系數據庫有六種范式:第一范式(1NF),第二范式(2NF),第三范式(3NF),巴斯-科德范式(BCNF),第四范式(4NF),
分類:
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傳遞函數依賴於A 5.碼:如果在一張表中,一個屬性或屬性組,被其他所有屬性所完全依賴,則稱這個屬性(屬性組)為該表的碼 例如:該表中碼為:(學號,課程名稱) 主屬性:碼屬性組中的所有屬性 非主屬性:除了碼屬性組的屬性
3.第三范式(3NF):在2NF基礎上,任何非主屬性不依賴於其他非主屬性(在2NF基礎上消除傳遞依賴)
本節內容
1.多表查詢
2.事務
3.DCL
多表查詢:
查詢語法
select 列名列表 from 表名列表 where ...
准備sql
#創建部門表
CREATE TABLE dept();
#創建員工表
CREATE TABLE emp();
笛卡爾積:
有兩個集合A,B,去這兩個集合的所有組成情況.
要完成多表查詢,需要消除無用的數據
多表查詢的分類:
1.內連接查詢
- 隱式內連接:使用where條件消除無用數據
- 顯示連接:語法:select 字段列表 from 表名1 [inner] join 表名2 on 條件
- 內連接查詢:
- 從那些表中查詢數據
- 條件是什么
- 查詢那些字段
2.外連接查詢
1.左外連接:
語法:select 字段列表 from 表1 left [outer] join 表2 on 條件; 查詢的是左表所有數據以及其交集部分.
2.右外連接
語法:select 字段列表 from 表1 right [outer] join 表2 on 條件; 查詢的是右表所有數據以及其交集部分.
子查詢:
概念:查詢中嵌套查詢,稱嵌套查詢為子查詢
--查詢工資最高的員工信息
--1查詢最高的工資是多少 9000 SELECT MAX(salary) FROM emp; --2 查詢員工信息,並且工資等於9000的 select * from emp WHERE emp.'salary'=9000; --一條sql就完成這個操作.子查詢 SELECT * FROM emp WHERE emp.'salary' = (SELECT MAX(salary) FROM emp);
事務
1.事務的基本介紹
概念:
如果一個包含多個步驟的業務操作,被事務管理,那么這些操作要么同時成功,要么同時失敗.
操作:
- 開啟事務:start transaction;
- 回滾:rollback;
- 提交:commit;
2.事務的四大特征
- 原子性:是不可分割的最小操作單位,要么同時成功,要么同時失敗.
- 持久性:當事務提交或回滾后,數據庫會持久化的保存數據
- 隔離性:多個事務之間,相互獨立.
- 一致性:事務操作前后,數據總量不變
3.事務的隔離級別
概念:多個事務之間隔離的,相互獨立的.但是如果多個事務操作同一批數據,則會引發一些問題,設置不同的隔離級別就可以解決這些問題.
存在問題:
- 臟讀:一個事務,讀取到另一個事務中沒有提交的數據
- 不可重復讀(虛讀):在同一個事物中,兩次讀取到的數據不一樣.
- 幻讀:一個事務操作(DML)數據表中所有記錄,另一個事務添加了一條數據,則第一個事務查詢不到自己的修改.
隔離級別:
1.read uncommmitted:讀未提交 產生的問題:臟讀,不可重復讀,幻讀 2.read committed :讀已提交(Oracle) 產生的問題:不可重復讀,幻讀 3.repeatable read:可重復讀(MySQL默認) 產生的問題:幻讀 4.serializable:串行化 可以解決所有的問題
注意:隔離級別從小到大安全性越來越高,但是效率越來越低
數據庫查詢隔離級別:
select @@tx_isolation
數據庫設置隔離級別:
set global transaction isolation level 級別字符串;
DCL:管理用戶、授權
SQL分類:
- DDL:操作數據庫和表
- DML:增刪改表中的數據
- DQL:查詢表中的數據
- DCL:管理用戶、授權
DBA:數據庫管理員
DCL:管理用戶、授權
1.管理用戶
1.添加用戶:
語法:CREATE USER '用戶名'@'主機名' IDENTIFIED BY '密碼';
2.刪除用戶
語法:DROP USER '用戶名'@'主機名';
3.修改用戶密碼:
UPDATE USER SET PASSWORD('新密碼') WHERE USER = '用戶名'; UPDATE USER SET PASSWORD('abc') WHERE USER = 'cainiao'; SET PASSWORD FOR '用戶名'@'主機名'=PASSWORD('新密碼'); SET PASSWORD FOR 'root'@'localhost'=PASSWORD('123');
如果使用mysql中忘記了root用戶的密碼?
- cmd --> net stop mysql 停止mysql服務 -- 需要管理員運行該cmd
- 使用無驗證方式啟動mysql服務: mysql --skip-grant-tables
- 打開新的cmd窗口,直接輸入mysql命令,敲回車.就可以登陸成功
- use mysql
- uodate user set password = password('你的新密碼') where user = 'root';
- 關閉兩個窗口
- 打開任務管理器,手動結束mysql.exe的進程
- 啟動mysql的服務
- 使用新密碼登陸.
4.查詢用戶:
--1.切換到 mysql數據庫
USE mysql ;
--2.查詢user表
SELECT * FROM USER;
通配符:% 表示可以在任意主機使用用戶登陸數據庫
2.權限管理
--查詢權限:
SHOW GRANTS FOR '用戶名'@'主機名'; SHOW GRANTS FOE 'CAINIAO'@'%';
--授予權限
grant 權限列表 on 數據庫名.表名 to '用戶名'@'主機名';
--給張三用戶授予所有權限,在任意數據庫任意表上
GRANT ALL ON *.* TO 'zhangsan'@ 'localhost';
--撤銷權限:
revoke 權限列表 on 數據庫名.表名 from '用戶名'@'主機名';