MySQL 關係型數據庫基礎知識梳理

MySQL 是十分常用的關係型數據庫,是程序員需要掌握的基礎之一.

基本數據屬性

對於計算相關專業的同學們,關係型數據庫 MySQL 是肯定接觸過的. SQL 語句也不會陌生, 不少同學過著 CRUD 增刪改查的日常. 下面來梳理下 MySQL 的基礎知識.

1.1 基本數據類型

數值類型

  • TINYINT、SMALLINT、INT、MEDIUMINT、BIGINT
  • FLOAT、DOUBLE
  • DECIMAL

日期時間類型

  • YEAR
  • TIME、DATE、DATETIME
  • TIMESTAMP

字符串類型

  • CHAR、VARCHAR、BINARY、VARBINARY
  • BLOBTEXT
  • ENUM 和 SET

二進制類型

  • BIT、BINARY、VARBINARY
  • TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB

1.2 字段的約束

primary key(主鍵約束): 表的主鍵約束,它是表的唯一標識,可以唯一的標識表中的某行. 主鍵可以由一列或者多列的組合組成,在一個表中只有一個.

foreign key(外鍵約束): 它用於在兩個表的數據之間建立鏈接,它可以由一個或多個列組成,一個表可以由多個外鍵. myisam 引擎不支持外鍵,innodb 引擎支持外鍵.

  • 主表(父表): 關聯關係的倆個表中,主鍵所在的表是主表.
    • 主表刪除數據前,必須確保沒有外鍵關聯該數據,或者進行級聯刪除.
  • 外表(從表): 關聯關係的倆個表中,外鍵所在的表是從表.
    • 從表插入新數據時,主表中必須存在指定的外鍵.
  • 級聯: 可以通過設置級聯屬性,讓從表數據隨主表一起更新、刪除.

check: 檢查約束,在為字段或表設置了該約束之後某,在進行數據的更新前,會執行 check 約束,判斷此次數據更新是否合法.

not null: 非空約束指字段的值不能為空。對於使用了非空約束的字段,如果用戶在添加數據時沒有指定值,數據庫系統就會報錯

unique: 可以通過設置 unique 為字段設置唯一約束,他可以保證該字段沒有重複值, 設置該約束會為該字段創建一個唯一索引.

default 默認值: 可以通過為字段設置 default,當插入一條記錄沒有為該字段賦值時,將默認為 default 的值.

auto increment: 設置字段自增屬性,在創建數據時,自動的為記錄的創建一個數值, 它要求字段必須被創建了索引.


1.3 索引

index: 索引, 可以通過給表增加索引,從而加快檢索速度. 索引可以是一個字段,也可以是多個字段的組合.

unique_index: 唯一索引,相比於普通索引,它限制字段或字段的組合是唯一的.


基本SQL 語句


2.1 數據表操作

create table 創建數據表, 一個基本的數據表包含一個主鍵,多個各種類型的列.

<code>CREATE TABLE  ([表定義選項])[表選項][分區選項];/<code>

alter table 修改數據表

<code>ALTER TABLE  [修改選項]
# 其中修改選項內容為
{ ADD COLUMN
| CHANGE COLUMN
| ALTER COLUMN { SET DEFAULT | DROP DEFAULT }
| MODIFY COLUMN
| DROP COLUMN
| RENAME TO }/<code>

drop table 刪除數據表

<code>DROP TABLE [IF EXISTS] 表名1 [ ,表名2, 表名3 ...]/<code>


基本的數據表關係

  • 一對一關係: 倆張數據表,表中的數據是一一對應的關係. 如 person 表和 person_detail 表. 它們用於記錄個人的基本信息,以及消息信息,是一一對應的關係. 它們可以通過設置一個外鍵,指向另一張表中的主鍵id 實現.
  • 一對多關係: 倆張表是一對多的關係. 如員工和部門的關係,每個員工只屬於一個部門,一個部門有多個員工. 可以通過在多的一方表即員工 person 表中設置一個 dept_id 指向少的一方即部門 dept 表中,可以設置外鍵.
  • 多對多關係: 比如學生和課程的關係. 每個學生有多門功課,而每門課程可以被多個學生選擇. 多對多關係的實現,需要在倆張基本表 student、class 之外, 建立一個關係映射表 student_class_table . 在這個關係表中,包含 student_id 和 class_id 分別作為 student 和 class 的 id 的外鍵,同時確保 student_id、class_id 的組合是唯一的. 如下:
<code>create table student(id int primary key auto_increment, name char(10));
create table class(id int primary key auto_increment, name char(10));
create table student_class_table(
student_id int,
class_id int,
foreign key (tea_id) references teacher(id),
foreign key (stu_id) references student(id),
primary key (student_id,class_id)
);/<code>

2.2 數據操作

insert 向數據表中插入數據

<code>INSERT INTO  [  [ , … ] ]
VALUES (值1) [… , (值n) ];/<code>

delete 刪除數據

<code>DELETE FROM  [WHERE 子句] [ORDER BY 子句] [LIMIT 子句]/<code>

update 更新數據

<code>INSERT INTO  [  [ , … ] ]
VALUES (值1) [… , (值n) ];/<code>

select 查詢數據

<code>SELECT
{* | }
[
FROM , …
[WHERE
[GROUP BY <group>
[HAVING <expression> [{<operator> <expression>}…]]
[ORDER BY <order>]
[LIMIT[<offset>,] ]
]
/<offset>/<order>/<expression>/<operator>/<expression>/<group>/<code>


END

3.1 面試題思考

以上只是 MySQL 的一些基礎知識點梳理,對於想要面試的同學,這些問題你都會答了嗎?

  1. MySQL 主從複製的原理?
  2. MySQL 的索引原理?B+ 樹、B 樹的區別?
  3. MySQL 的隔離級別?
  4. 事物的四大特性?
  5. 併發事物存在的問題: 髒讀、丟失修改、不可重複讀、幻讀.
  6. MVCC 如何解決一致性問題?
  7. MySQL 的事物是怎麼實現的?
  8. MySQL 日誌的存放形式?(redo、undo)

1. http://c.biancheng.net/view/2440.html


分享到:


相關文章: