- 什麼是關系型資料庫
- 關系型資料庫,是指采用了關系模型來組織資料的資料庫,其以行和列的形式存儲資料,以便于使用者了解,關系型資料庫這一系列的行和列被稱為表,一組表組成了資料庫
- 主流的關系型資料庫有 Oracle、DB2、MySQL、SQL Server 等
- 什麼是非關系資料庫
- 非關系型資料庫的名字叫 Not Only Sql
- 非關系型資料庫通常指資料以對象的形式存儲在資料庫中,而對象之間的關系通過每個對象自身的屬性來決定。
- 主流的非關系型資料庫有 hbase(列模型)、redis(鍵值對模型)、mongodb(文檔類模型)
- MySQL 與 Oracle 資料庫的差別
- 本質的差別
- Oracle 資料庫是一個對象關系資料庫管理系統(ORDBMS)。它通常被稱為 Oracle RDBMS 或簡稱為 Oracle,是一個收費的資料庫。
- MySQL 是一個開源的關系資料庫管理系統(RDBMS)。它是世界上使用最多的 RDBMS,作為伺服器運作,提供對多個資料庫的多使用者通路。它是一個開源、免費的資料庫。
- 資料庫安全性
- MySQL 使用三個參數來驗證使用者,即使用者名,密碼和位置;Oracle 使用了許多安全功能,如使用者名,密碼,配置檔案,本地身份驗證,外部身份驗證,進階安全增強功能等。
- SQL 文法的差別
- Oracle 的 SQL 文法與 MySQL 有很大不同。Oracle 為稱為 PL / SQL 的程式設計語言提供了更大的靈活性。Oracle 的 SQL * Plus 工具提供了比 MySQL 更多的指令,用于生成報表輸出和變量定義。
- 存儲上的差別:
- 與 Oracle 相比,MySQL 沒有表空間,角色管理,快照,同義詞和包以及自動存儲管理。
- 對象名稱的差別:
- 雖然某些模式對象名稱在 Oracle 和 MySQL 中都不區分大小寫,例如列,存儲過程,索引等。但在某些情況下,兩個資料庫之間的區分大小寫是不同的。
- Oracle 對所有對象名稱都不區分大小寫;而某些 MySQL 對象名稱(如資料庫和表)區分大小寫(取決于底層作業系統)。
- 運作程式和外部程式支援:
- Oracle 資料庫支援從資料庫内部編寫,編譯和執行的幾種程式設計語言。此外,為了傳輸資料,Oracle 資料庫使用 XML。
- MySQL 不支援在系統内執行其他語言,也不支援 XML。
- MySQL 和 Oracle 的字元資料類型比較:
- 兩個資料庫中支援的字元類型存在一些差異。對于字元類型,MySQL 具有 CHAR 和 VARCHAR,最大長度允許為 65535 位元組(CHAR 最多可以為 255 位元組,VARCHAR 為 65535 位元組)。
- 而 Oracle 支援四種字元類型,即 CHAR,NCHAR,VARCHAR2 和 NVARCHAR2;所有四種字元類型都需要至少 1 個位元組長;CHAR 和 NCHAR 最大可以是 2000 個位元組,NVARCHAR2 和 VARCHAR2的最大限制是4000個位元組。可能會在最新版本中進行擴充。
- 本質的差別
- MySQL 常用的資料類型
int | 4 bytes | (-2 147483648,2147483647) | 大整數值 |
bigint | 8 bytes | (-9223372036854775808,9223372036854775807) | 極大整數值 |
float | 浮點值 | ||
char | 0-255 | 定長字元串 | |
varchar | 0-65535 | 不定長字元串 | |
date | 3bytes | 1000-01-01/9999-12-31 | YYYY-MM-DD |
datetime | 8bytes | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS |
- MySQL 中的主鍵限制
- 主鍵就是主關鍵字(primary key):表中的一個或多個字段,它的值用于唯一地辨別表中的某一條記錄。
- MySQL 中的外鍵限制
- 如果表 A 的主關鍵字是表 B 中的字段,則該字段稱為表 B 的外鍵,表 A 稱為主表,表 B 稱為從表。外鍵是用來實作參照完整性的,不同的外鍵限制方式将可以使兩張表緊密的結合起來,特别是修改或者删除的級聯操作将使得日常的維護工作更加輕松。這裡以 MySQL 為例,總結一下 3 種外鍵限制方式的差別和聯系。
- 這裡以使用者表和使用者組表為例,這是一個典型的多對一關系,多個使用者對應于一個使用者組。
- 首先建立使用者組表:
create table t_group (
id int not null,
name varchar(30),
primary key (id)
);
//并插入兩條記錄:
insert into t_group values (1, 'Group1');
insert into t_group values (2, 'Group2');
-
- 下面建立使用者表,分别以不同的限制方式建立外鍵引用關系:
- 級聯(cascade)方式
- 下面建立使用者表,分别以不同的限制方式建立外鍵引用關系:
create table t_user (
id int not null,
name varchar(30),
groupid int,
primary key (id),
foreign key (groupid) references t_group(id) on delete cascade on update cascade
);
// 參照完整性測試
insert into t_user values (1, 'qianxin', 1); // 可以插入
insert into t_user values (2, 'yiyu', 2); // 可以插入
insert into t_user values (3, 'dai', 3); // 錯誤,無法插入,使用者組3不存在,與參照完整性限制不符
// 限制方式測試
insert into t_user values (1, 'qianxin', 1);
insert into t_user values (2, 'yiyu', 2);
insert into t_user values (3, 'dai', 2);
delete from t_group where id=2; // 導緻 t_user 中的 2、3 記錄級聯删除
update t_group set id=2 where id=1; // 導緻 t_user 中的1記錄的 groupid 級聯修改為 2
-
-
- 置空(set null)方式
-
create table t_user (
id int not null,
name varchar(30),
groupid int,
primary key (id),
foreign key (groupid) references t_group(id) on delete set null on update set null
);
// 參照完整性測試insert into t_user values (1, 'qianxin', 1); // 可以插入
insert into t_user values (2, 'yiyu', 2); // 可以插入
insert into t_user values (3, 'dai', 3); // 錯誤,無法插入,使用者組 3 不存在,與參照完整性限制不符
// 限制方式測試
insert into t_user values (1, 'qianxin', 1);
insert into t_user values (2, 'yiyu', 2);
insert into t_user values (3, 'dai', 2);
delete from t_group where id=2; // 導緻 t_user 中的 2、3 記錄的 groupid 被設定為 NULL
update t_group set id=2 where id=1; //導緻 t_user 中的 1 記錄的 groupid 被設定為 NULL
-
- 禁止(no action / restrict)方式
create table t_user (
id int not null,
name varchar(30),
groupid int,
primary key (id),
foreign key (groupid) references t_group(id) on delete no action on update no action
);
// 參照完整性測試
insert into t_user values (1, 'qianxin', 1); // 可以插入
insert into t_user values (2, 'yiyu', 2); // 可以插入
insert into t_user values (3, 'dai', 3); // 錯誤,無法插入,使用者組 3 不存在,與參照完整性限制不符
// 限制方式測試
insert into t_user values (1, 'qianxin', 1);
insert into t_user values (2, 'yiyu', 2);
insert into t_user values (3, 'dai', 2);
delete from t_group where id=2; // 錯誤,從表中有相關引用,是以主表中無法删除
update t_group set id=2 where id=1; // 錯誤,從表中有相關引用,是以主表中無法修改
// 注:在 MySQL 中,restrict 方式與 no action 方式作用相同
- MySQL 中 count(*)、count(1)、count(字段) 的差別
-
- 執行效果上:
-
包括了所有的列,相當于行數,在統計結果的時候,不會忽略列值為 NULLcount(*)
-
包括了忽略所有列,用1代表代碼行,在統計結果的時候,不會忽略列值為 NULLcount(1)
-
隻包括列名那一列,在統計結果的時候,會忽略列值為空(這裡的空不是隻空字元串或者 0,而是表示 null)的計數,即某個字段值為 NULL 時,不統計。count(列名)
-
- 執行效率上:
- 列名為主鍵,count(列名) 會比 count(1) 快
- 列名不為主鍵,count(1) 會比 count(列名) 快
- 如果表多個列并且沒有主鍵,則 count(1) 的執行效率優于 count(*)
- 如果有主鍵,則 select count(主鍵)的執行效率是最優的
- 如果表隻有一個字段,則 select count(*)最優。
- 執行效果上:
- MySQL 中的 DDL 語言
- 資料庫模式定義語言 DDL(Data Definition Language),是用于描述資料庫中要存儲的現實世界實體的語言。主要由 create(添加)、alter(修改)、drop(删除)和 truncate(删除) 四個關鍵字完成
- MySQL 中的 DML 語言
- DML 操作是指對資料庫中表記錄的操作,主要包括表記錄的插入(insert)、更新(update)、删除(delete)和查詢(select)。
作者:多測師進階講師_鄭sir
微信:ZhengYing8887
出處:https://www.cnblogs.com/ZhengYing0813/
備注:本文版權歸作者所有,歡迎轉載和添加作者微信探讨技術,但未經作者同意必須在文章頁面給出原文連結,否則保留追究法律責任的權利。