數據庫知識總結(全)


數據庫知識總結

本節內容

1.數據庫的基本概念

2.MySQL數據庫軟

  1. 安裝
  2. 卸載
  3. 配置

3.SQL

數據庫的基本概念

1.數據庫的英文單詞:DataBase 簡稱:DB
2.什么是數據庫?

  • 用於存儲和管理數據的倉庫

3.數據庫的特點:

  1. 持久化存儲數據。其實數據庫就是一個文件系統
  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服務啟動

  1. 手動。
  2. cmd--> services.msc 打開服務的窗口
  3. 使用管理員打開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數據目錄
幾個概念

  1. 數據庫:文件夾
  2. 表:文件
  3. 數據:數據

 

SQL

1.什么是SQL ?

  • Structured Query Languange:結構化查詢語言

其實就是定義了操作所有關系型數據庫的規則。每一種數據庫操作的方式存在不一樣的地方,稱為“方言”。

2.SQL通用語法

  1. SQL語句可以單行或多行書寫,以分號結尾。
  2. 可使用空格和縮進來增強語句的可讀性。
  3. MySQL數據庫的SQL 語言不區分大小寫,關鍵字建議使用大寫。
  4. 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 (37

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 條件]
  • 注意:
  1. 如果不加條件,則刪除表中所有記錄。
  2. 如果要刪除所有記錄
  • 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:查詢語句

  1. 排序查詢
  2. 聚合函數
  3. 分組查詢
  4. 分頁查詢

2.約束
3.多表之間的關系
4.范式
5.數據庫的備份和還原

DQL:查詢語句

1.排序查詢

語法:order by 子句
order by 排序字段1 排序方式1,排序字段2 排序方式2...

排序方式:

ASC:升序,默認的
DESC:降序

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

2.聚合函數:將一列數據作為一個整體,進行縱向的計算。
  1.count:計算個數

  1. 一般選擇非空的列:主鍵
  2. count(*)

  2.max:計算最大值
  3.min:計算最小值
  4.sum:計算和
  5.avg:計算平均值

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

  1. 選擇不包含非空的列進行計算
  2. IFNULL函數

3.分組查詢

語法:group by 分組字段

注意:
  1.分組之后查詢的字段:分組字段、聚合函數
  2.where 和 having的區別?

  1. where 在分組之前進行限定,如果不滿足條件,則不參與分組。having在分組之后進行限定,如果不滿足結果,則不會被查詢出來
  2. 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"方言"

約束

概念:對表中的數據進行限定,保證數據的正確性、有效性和完整性。
分類:

  1. 主鍵約束:primary key
  2. 非空約束:not null
  3. 唯一約束:unique
  4. 外鍵約束: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.注意:

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

  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.內連接查詢

  1. 隱式內連接:使用where條件消除無用數據
  2. 顯示連接:語法:select 字段列表 from 表名1 [inner] join 表名2 on 條件
  3. 內連接查詢:
  • 從那些表中查詢數據
  • 條件是什么
  • 查詢那些字段

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.事務的基本介紹
概念:
如果一個包含多個步驟的業務操作,被事務管理,那么這些操作要么同時成功,要么同時失敗.
操作:

  1. 開啟事務:start transaction;
  2. 回滾:rollback;
  3. 提交:commit;

2.事務的四大特征

  1. 原子性:是不可分割的最小操作單位,要么同時成功,要么同時失敗.
  2. 持久性:當事務提交或回滾后,數據庫會持久化的保存數據
  3. 隔離性:多個事務之間,相互獨立.
  4. 一致性:事務操作前后,數據總量不變


3.事務的隔離級別
概念:多個事務之間隔離的,相互獨立的.但是如果多個事務操作同一批數據,則會引發一些問題,設置不同的隔離級別就可以解決這些問題.
存在問題:

  1. 臟讀:一個事務,讀取到另一個事務中沒有提交的數據
  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分類:

  1. DDL:操作數據庫和表
  2. DML:增刪改表中的數據
  3. DQL:查詢表中的數據
  4. 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用戶的密碼?

  1. cmd --> net stop mysql 停止mysql服務 -- 需要管理員運行該cmd
  2. 使用無驗證方式啟動mysql服務: mysql --skip-grant-tables
  3. 打開新的cmd窗口,直接輸入mysql命令,敲回車.就可以登陸成功
  4. use mysql
  5. uodate user set password = password('你的新密碼') where user = 'root';
  6. 關閉兩個窗口
  7. 打開任務管理器,手動結束mysql.exe的進程
  8. 啟動mysql的服務
  9. 使用新密碼登陸.

  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 '用戶名'@'主機名';

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM