Oracle ORA-02049分散式鎖資源等待問題
阿新 • • 發佈:2020-12-09
今日內容
-
資料庫的基本概念
-
MySQL資料庫軟體
- 安裝
- 解除安裝
- 配置
-
SQL
資料庫的基本概念
1. 資料庫的英文單詞: DataBase 簡稱 : DB
2. 什麼資料庫?
* 用於儲存和管理資料的倉庫。
3. 資料庫的特點:
1. 持久化儲存資料的。其實資料庫就是一個檔案系統
2. 方便儲存和管理資料
3. 使用了統一的方式操作資料庫 -- SQL
4. 常見的資料庫軟體
* 參見《MySQL基礎.pdf》
MySQL資料庫軟體
1. 安裝 * 參見《MySQL基礎.pdf》 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安裝目錄:basedir="D:/develop/MySQL/" * 配置檔案 my.ini 2. MySQL資料目錄:datadir="C:/ProgramData/MySQL/MySQL Server 5.5/Data/" * 幾個概念 * 資料庫:資料夾 * 表:檔案 * 資料:資料
SQL
1.什麼是SQL? Structured Query Language:結構化查詢語言 其實就是定義了操作所有關係型資料庫的規則。每一種資料庫操作的方式存在不一樣的地方,稱為“方言”。 2.SQL通用語法 1. SQL 語句可以單行或多行書寫,以分號結尾。 2. 可使用空格和縮排來增強語句的可讀性。 3. MySQL 資料庫的 SQL 語句不區分大小寫,關鍵字建議使用大寫。 4. 3 種註釋 * 單行註釋: -- 註釋內容 或 # 註釋內容(mysql 特有) * 多行註釋: /* 註釋 */ 3. SQL分類 1) DDL(Data Definition Language)資料定義語言 用來定義資料庫物件:資料庫,表,列等。關鍵字:create, drop,alter 等 2) DML(Data Manipulation Language)資料操作語言 用來對資料庫中表的資料進行增刪改。關鍵字:insert, delete, update 等 3) DQL(Data Query Language)資料查詢語言 用來查詢資料庫中表的記錄(資料)。關鍵字:select, where 等 4) DCL(Data Control Language)資料控制語言(瞭解) 用來定義資料庫的訪問許可權和安全級別,及建立使用者。關鍵字:GRANT, REVOKE 等
DDL:操作資料庫、表
1. 操作資料庫:CRUD 1. C(Create):建立 * 建立資料庫: * create database 資料庫名稱; * 建立資料庫,判斷不存在,再建立: * create database if not exists 資料庫名稱; * 建立資料庫,並指定字符集 * create database 資料庫名稱 character set 字符集名; * 練習: 建立db4資料庫,判斷是否存在,並制定字符集為gbk * create database if not exists db4 character set gbk; 2. R(Retrieve):查詢 * 查詢所有資料庫的名稱: * show databases; * 查詢某個資料庫的字符集:查詢某個資料庫的建立語句 * 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):建立 1. 語法: create table 表名( 列名1 資料型別1, 列名2 資料型別2, .... 列名n 資料型別n ); * 注意:最後一列,不需要加逗號(,) * 資料庫型別: 1. int:整數型別 * age int, 2. double:小數型別 * score double(5,2) 3. date:日期,只包含年月日,yyyy-MM-dd 4. datetime:日期,包含年月日時分秒 yyyy-MM-dd HH:mm:ss 5. timestamp:時間錯型別 包含年月日時分秒 yyyy-MM-dd HH:mm:ss * 如果將來不給這個欄位賦值,或賦值為null,則預設使用當前的系統時間,來自動賦值 6. varchar:字串 * name varchar(20):姓名最大20個字元 * zhangsan 8個字元 張三 2個字元 * 建立表 create table student( id int, name varchar(32), age int , score double(4,1), birthday date, 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. 如果要刪除所有記錄
1. delete from 表名; -- 不推薦使用。有多少條記錄就會執行多少次刪除操作
2. TRUNCATE TABLE 表名; -- 推薦使用,效率更高 先刪除表,然後再建立一張一樣的表。
3. 修改資料:
* 語法:
* update 表名 set 列名1 = 值1, 列名2 = 值2,... [where 條件];
* 注意:
1. 如果不加任何條件,則會將表中所有記錄全部修改。
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):null參與的運算,計算結果都為null
* 表示式1:哪個欄位需要判斷是否為null
* 如果該欄位為null後的替換值。
4. 起別名:
* as:as也可以省略
3. 條件查詢
1. where子句後跟條件
2. 運算子
* > 、< 、<= 、>= 、= 、<>
* BETWEEN...AND
* IN( 集合)
* LIKE:模糊查詢
* 佔位符:
* _:單個任意字元
* %:多個任意字元
* IS NULL
* and 或 &&
* or 或 ||
* not 或 !
-- 查詢年齡大於20歲
SELECT * FROM student WHERE age > 20;
SELECT * FROM student WHERE age >= 20;
-- 查詢年齡等於20歲
SELECT * FROM student WHERE age = 20;
-- 查詢年齡不等於20歲
SELECT * FROM student WHERE age != 20;
SELECT * FROM student WHERE age <> 20;
-- 查詢年齡大於等於20 小於等於30
SELECT * FROM student WHERE age >= 20 && age <=30;
SELECT * FROM student WHERE age >= 20 AND age <=30;
SELECT * FROM student WHERE age BETWEEN 20 AND 30;
-- 查詢年齡22歲,18歲,25歲的資訊
SELECT * FROM student WHERE age = 22 OR age = 18 OR age = 25
SELECT * FROM student WHERE age IN (22,18,25);
-- 查詢英語成績為null
SELECT * FROM student WHERE english = NULL; -- 不對的。null值不能使用 = (!=) 判斷
SELECT * FROM student WHERE english IS NULL;
-- 查詢英語成績不為null
SELECT * FROM student WHERE english IS NOT NULL;
-- 查詢姓馬的有哪些? like
SELECT * FROM student WHERE NAME LIKE '馬%';
-- 查詢姓名第二個字是化的人
SELECT * FROM student WHERE NAME LIKE "_化%";
-- 查詢姓名是3個字的人
SELECT * FROM student WHERE NAME LIKE '___';
-- 查詢姓名中包含德的人
SELECT * FROM student WHERE NAME LIKE '%德%';
今日內容
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. 分組查詢:
1. 語法:group by 分組欄位;
2. 注意:
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;
4. 分頁查詢
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
* 非空約束: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. 建立表時,新增唯一約束
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;
* 主鍵約束: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;
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 主表名稱(主表列名稱);
4. 級聯操作
1. 新增級聯操作
語法:ALTER TABLE 表名 ADD CONSTRAINT 外來鍵名稱
FOREIGN KEY (外來鍵欄位名稱) REFERENCES 主表名稱(主表列名稱) ON UPDATE CASCADE ON DELETE CASCADE ;
2. 分類:
1. 級聯更新:ON UPDATE CASCADE
2. 級聯刪除:ON DELETE CASCADE
資料庫的設計
1. 多表之間的關係
1. 分類:
1. 一對一(瞭解):
* 如:人和身份證
* 分析:一個人只有一個身份證,一個身份證只能對應一個人
2. 一對多(多對一):
* 如:部門和員工
* 分析:一個部門有多個員工,一個員工只能對應一個部門
3. 多對多:
* 如:學生和課程
* 分析:一個學生可以選擇很多門課程,一個課程也可以被很多學生選擇
2. 實現關係:
1. 一對多(多對一):
* 如:部門和員工
* 實現方式:在多的一方建立外來鍵,指向一的一方的主鍵。
2. 多對多:
* 如:學生和課程
* 實現方式:多對多關係實現需要藉助第三張中間表。中間表至少包含兩個欄位,這兩個欄位作為第三張表的外來鍵,分別指向兩張表的主鍵
3. 一對一(瞭解):
* 如:人和身份證
* 實現方式:一對一關係實現,可以在任意一方新增唯一外來鍵指向另一方的主鍵。
3. 案例
-- 建立旅遊線路分類表 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)
);
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. 圖形化工具: