數據庫結構模型分類
1、層次模型
2、網狀模型
3、關系模型
關系模型的組成部分
- 二維關系
- 表
- row
- column
- 索引
- index
- 視圖
- view (只包含固定字段,不包含其他字段)
- 表
關系型數據庫的常見組件:
數據庫
: Database表
: table行
: row列
: column
索引
: index視圖
: view用戶
: user權限
: privilege存儲過程
: procedure存儲函數
: function觸發器
: trigger事件調度器
: event schedule
DBA的組成部分
- SQL引擎
- 分析器
- 計划執行器
- 優化器
- 操作求解器
- 存儲引擎
- 文件和存儲接口
- 緩沖管理器
- 磁盤空間管理器
- 恢復管理器
- 事務管理器
- 鎖管理器
SQL接口(structured query Language)
類似於OS的shell接口,操作數據庫的數據接口,也提供了編程功能
-
SQL接口語言的標准(其由ANSL組織定義)
- SQL86
- SQL89
- SQL92
- SQL99
- SQL03
-
SQL接口的語言分類
- DDL:(Data Defined Language)
- create
- alter
- drop
- DML:(Data Manapulating Language)
- insert
- delete
- update
- select
- DCL: (Data Control Language)
- grant
- revoke
- DDL:(Data Defined Language)
DB是否支持事務的測試標准
-
ACID
- A : 原子性 --> 不可分割的整體
- C : 一致性 --> 數據的變化是一致性的
- I : 隔離性 --> 事務彼此之間是隔離的
- D : 持久性 --> 只要一個事務完成,它都是持久完成的。
-
事務是將組織多個操作為一個整體,要么全部執行,要全部不執行。其實現機制為:
- 回滾機制
- 事務機制
RDBMS設計范式基礎概念
設計關系數據庫時,遵從不同的規范要求,設計出合理的關系型數據庫,這些不同的規范要求被稱為不同的范式,各種范式呈遞次規范,越高的范式數據庫冗余越小。目前關系數據庫有六種范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴德斯科范式(BCNF)、第四范式(4NF)和第五范式(5NF,又稱完美范式)。滿足最低要求的范式是第一范式(1NF)。在第一范式的基礎上進一步滿足更多規范要求的稱為第二范式(2NF),其余范式以次類推。一般說來,數據庫只需滿足第三范式(3NF)就行了。
- 1) 第一范式(1NF)
- 所謂第一范式(1NF)是指在關系模型中,對域添加的一個規范要求,所有的域都應該是原子性的,即數據庫表的每一列都是不可分割的原子數據項,而不能是集合,數組,記錄等非原子數據項。即實體中的某個屬性有多個值時,必須拆分為不同的屬性。在符合第一范式(1NF)表中的每個域值只能是實體的一個屬性或一個屬性的一部分。簡而言之,第一范式就是無重復的域,並不可分析
- 2) 第二范式 (2NF)
- 第二范式(2NF)是在第一范式(1NF)的基礎上建立起來的,即滿足第二范式(2NF)必須先滿足第一范式(1NF)。第二范式(2NF)要求數據庫表中的每個實例或記錄必須可以被唯一地區分,即不能有兩個行是一樣的。選取一個能區分每個實體的屬性或屬性組,作為實體的唯一標識。
- 3) 第三范式 (3NF)
- 第三范式(3NF)是第二范式(2NF)的一個子集,即滿足第三范式(3NF)必須滿足第二范式(2NF)。簡而言之,第三范式(3NF)要求一個關系中不包含已在其它關系已包含的非主關鍵字信息。簡而言之,不依賴於非主屬性,表與子表中不能有相同的字段。
數據庫的運行模型:
數據庫為C/S架構,如下:
- S : server ,監聽於套接字止,接收並處理客戶端的應用請求
- C : Client
- 程序接口
- CLI
- GUI
- 應用編程接口
- ODBC : Open Database Connection(開放式數據互聯)
- 程序接口
MYSQL的工作模型
- 單進程多線程
- 用戶連接通過線程實現
- 一個線程池可以定義mysql的並發連接
- 處理用戶連接的叫連接線程
- 數據字典:數據一切的元數據信息,依賴mysql庫來存儲
數據庫的基礎概念
- 1)
約束
: Constraint主鍵
: 一個或多個字段的組合,填入的數據必須能在本表中唯一標識本行,且必須提供數據,即NOT NULL
唯一鍵
: 一個或多個字段的組合,填入的數據必須能在本表中唯一標識本行,允許為null
外鍵
: 一個表中的某字段可填入數據取決於另一個表中的主鍵已有的數據。檢查性約束
: 表達式約束,取決於表達式的要求
- 2)
索引
: 將表中的一個或多個字段中的數據復制一份另存,並且這些字段需要按特定的次序排序存儲,常見的索引類型:樹形索引
(MariaDB默認為Btree索引)bash索引
索引有利於讀請求,但不得寫請求
- 3)
關系運算
選擇
: 挑選出符合條件的行(部分)投影
: 挑選出需要的字段連接
: 將多張表關聯起來- 內連接
- 外連接
- 左外連接
- 右外連接
- 自連接
- 4)
數據抽象
:物理層
: 決定數據的存儲格式,即RDBMS 在磁盤上如何組織文件邏輯層
: 描述DB存儲什么數據,以及數據間存在什么樣的關系視圖層
: 描述DB中的部分數據
- 5) 關系模型的分類
關系模型
實體關系模型
基於對象的關系模型
半結構化的關系模型
- XML格式就是一種半結構化數據
常見的RDBMS數據庫
- MySQL
- MariaDB
- PostgreSQL(pgsql)
- Oracle
- MSSQL
=============
MariaDB的特性
- 插件式存儲引擎(注:存儲引擎也稱之為"
表類型
")MYISAM
--> Aria- 不支持事務
INNODB
--> XtraDB- 支持事務
- 諸多擴展和新特性
- 提供了更多的測試組件
- truly open source
Mariadb的安裝
通用二進制格式安裝過程
a. 准備數據目錄
以/mydata/data為例;
b. 配置mariadb
# groupadd -r -g 306 mysql
# useradd -r -g 306 -u 306 mysql
# tar xf mariadb-VERSION.tar.xz -C /usr/local
# ln -sv mariadb-version mysql
# cd /usr/local/mysql
# chown -R root:mysql ./*
# scripts/mysql_install_db --datadir=/mydata/data --user=mysql
# cp supper-files/mysql.server /etc/rc.d/init.d/mysqld
# chkconfig --add mysqld
c. 准備配置文件
配置格式:類ini格式,為各程序均通過單個配置文件提供配置信息;
[prog_name]
能用二進制格式安裝,配置文件查找次序:
/etc/my.cnf --> /etc/mysql/my.cnf --> --default-extra-file=/PATH/TO/CONF_FILE --> ~/.my.cnf
OS提供的mariadb rpm包安裝的配置文件查找次序:
/etc/mysql/my.cnf --> /etc/my.cnf --> --default-extra=/PATH/TO/conf_file --> ~/my.cnf
以上兩者越靠后就是最后生效的.
# mkdir /etc/mysql
# cp support-files/my-large.cnf /etc/mysql/my.cnf
添加三個選項:
[mysqld]
datadir = /mydata/data
innodb_file_per_table = on
skip_name_resolve = on
MariDB程序的組成
Client
mysql
: CLI交互式客戶端程序mysqldump
: 備份工具mysqladmin
: 管理工具mysqlbinlog
: 查看二進制日志工具
Server
mysqld
: 服務端進程mysqld_safe
: 服務端進程,默認也是運行的此進程mysqld_multi
: 服務端進程, 多實例mysql_upgrade
: 升級工具
服務端監聽的兩種socket地址
ip socket
- 監聽在3306/tcp,支持遠程通信
unix socket
- 監聽在sock文件上(/tmp/mysql.sock, /var/lib/mysql/mysql.sock),僅支持本地通信,通信主機為localhost,127.0.0.1都基於unix socket文件通信
命令行交互式客戶端程序---mysql工具
-
options
-uUSERNAME
: 用戶名,默認為root-hHOST
: 服務器主機,默認為localhost-pPASSWD
: 用戶的密碼dDB_NAME
: 連接到服務端之后,指明默認數據庫-
-e 'SCRIPT'
: 連接至MYSQL運行某命令后,直接退出,並返回結果
````
mysql -uroot -h127.0.0.1 -pmagedu -e 'show databases;'
注意: mysql的用戶帳號由兩部分組成,'username'@'hostname',其中host用於限制此用戶可通過哪些主機連接當前的MSYQL服務器
-
支持通配符
:-
%
: 匹配任意長度的任意字符172.16.%.%
_
: 匹配任意單個字符
-
內置命令
\u DB_NAME
: 設定哪個庫為默認數據庫\q
: 退出\d CHAR
: 設定新的語句結束符\g
: 語句通用結束標記\G
: 語句結束標記,但以豎排方式顯示\s
: 返回客戶端與服務端的連接狀態\c
: 取消命令運行
通過mysql協議發往服務器執行並取回結果,每個命令都必須有結束符,默認為";",示例如下:
for i in {1..100};do AGE=$[$RANDOM%100];mysql -uroot -pM8T9cw -e "insert mydb.student(id,name,age) value ($i,\"stu$i\",$AGE);"; done
獲取命令幫助
help
SQL中的數據類型
字符型
- 定長字符型 : (最多255個字符)
CHAR(#)
: 不區分字符大小寫BINARY(#)
: 區分字符大小寫
- 可變長字符型 :
VARCHAR(#)
: 不區分字符大小寫,需要在字符長度加1,最多65536個字符VARBINARY(#)
: 區分字符大小寫,需要在字符長度加1,最多65536個字符TEXT
: 可存文本(2^32)個字符,只能存純文本,不區分大小寫TINYTEXT
TEXT
MEDIUMTEXT
LONGTEXT
BLOB
: 文本(2^32)個字符,可以存儲圖片
- 定長字符型 : (最多255個字符)
內置類型
SET
: 集合ENUM
: 枚舉
數值型
精確數值型
INT
TINYINT
: 一個字節SMALLINT
: 二個字節MEDINUMINT
: 三個字節INT
: 四個字節BIGINT
: 八個字節
- 近似數據型
FLOAT
: 單精度DOBULE
: 雙精度
日期時間型
DATE
: 日期型TIME
: 時間型DATETIME
: 日期時間型TIMESTAMP
: 時間戳(從過去到現在經過的秒數)YEAR(2)
: 2位年數YEAR(4)
: 4位年數
數據類型修飾符
- 所有類型都適用:
NOT NULL
: 非空DEFAULT value
: 默認值
- 數值型適用
AUTO_INCREMENT
: 自增長UNSIGNED
: 無符號,通常用於Int后面,進行修飾為正整數
- 字段修飾符
PRIMARY KEY
: 主鍵定義UNIQUE KEY
: 唯一鍵定義
- 所有類型都適用:
==========
數據庫操作語言
數據庫操作
使用格式
create database | schema [if not exists]'DB_NAME';
drop database | schema 'DB_NAME';
- 查看數據庫
show databases;
- 創建數據庫
create database mydb;
- 刪除數據庫
drop database mydb;
- 查看支持的所有字符集
show character set;
- 查看支持的所有排序規則
show collation;
- 修改數據庫的默認字符集
alter database testdb character set utf32;
- 修改數據庫的默認字符排序規則
alter database testdb collate utf32_sinhala_ci;
表操作
使用格式
create table [if not exists] tb_name (col1 datatype 修飾符, col2 datatype 修飾符) engine=' '
- 查看所有的引擎(被支持的)
show engines
- 查看所有數據庫中的表
show tables;
show tables from mysql;
- 查看表結構
desc students;
- 創建表
create table students(id int unsigned not null primary key, name varchar(30) not null, age tinyint unsigned not null,gender enum('F','M'))
- 向表中添加字段
alter table students add second_name char(30);
- 向表中刪除字段
alter table students drop second_name;
- 對表添加主鍵
alter table students2 add primary key (id);
- 對表刪除主鍵
alter table students2 drop primary key;
- 對表添加索引
alter table students2 add index name (name);
- 對表刪除索引
alter table students2 drop index name;
drop index name on students2;
- 對表添加唯一鍵
alter table students drop second_name;
- 對表刪除唯一鍵
alter table students drop index name;
-
修改字段字義屬性
alter table students modify name char(20);
alter table students2 change name new_name char(20) after id;
-
alter table students2 change name new_name char(20);
modify : 只可以修改字段定義的屬性 change : 可以修改字段名稱和定義的字段屬性
- 查看表狀態
show table status like 'students2'\G
- 修改表引擎
alter table students2 engine[=]myisam;
- 查看表的字段描述
desc students;
- 查看庫中的所有表
show tables
show tables from mysql;
- 刪除表
drop table students2;
向表中插入數據
insert weizi value(1,'zhen',30,'F');
insert weizi values(3,'wei',30,'F'),(4,'ping',31,'F');
insert weizi (id,name) value (5,"weizi");
刪除表中的數據
delete from weizi where name="zhen";
delete from weizi where age is null;
delete from weizi where age > 30;
delete from weizi where id >=50 and age <=20;
delete from weizi order by age asc limit 5;
修改表中的字段值
update weizi set age=35 where id=3 and age=30;
update weizi set age=age-5 where age=35;
update weizi age=age-age;
update weizi set age=age-5 where order by id desc limit 10;
update weizi set age=age-15 where name not like 'stu%';
Select操作語句
- 使用格式
select col1,col2,....from tb1_name [where clause] [order y 'col_name'] [limit [m,]n]
- 字段表示法
*
: 表示所有字段as
: 字段別名, col1 as alias1
- where clause
操作符
:==
<
>
<=
>=
!=
between....and...
條件邏輯操作
and
or
not
模糊匹配
like
%
_
rlike 'pattern'
: 基於正則表達式匹配is null
is no null
- 排序
desc
: 降序asc
: 升序
Select示例
select name,age from students where age >30 and age<80;
select name,age from students where age between 30 and 80;
select name from students where name like '%ang%';
select name from students where name rlike '^.*ang.*$;
select name,age from students where age is null;
select name,age form students where age is not null;
select id,name from students order by name;
select id,name from students order by name desc;
權限及授權管理
- 用戶表示方法:
username@host
- 管理權限的分類
管理權限
數據庫
表
字段
存儲例程
授權:
- 授權語法格式
grant pri_type,...on [object_type] db_name.tbl_name to 'user'@'host' [identified by 'PASSWD']
pri_type
all privileges
: 表示全部權限
db_name.tbl_name
的表示方法:*.*
: 所有庫的所有表db_name.*
: 指定庫的所有表db_name.tbl_name
: 指定庫的特定表db_name.routine_name
: 指定庫上的存儲過程或存儲函數
object_type
table
function
procedure
- 授權示例:
grant all privileges on mydb.* to 'zhenping'@'172.16.%.%' identified by 'MT8ddd';
取消權限
- 取消授權語法格式
revoke pri_type,.... on db_name.tb_name from 'user'@'host';
- 取消授權示例:
revoke all privileges on mydb.* from 'zhenping'@'172.16.%.%';
查看用戶權限
show grants for 'user'@'host';
讓新授權的權限立即生效
flush privileges;
1 Mariadb服務進程啟動時會讀取mysql庫中的所有授權表至內存中;
2 grant和revoke等執行權限操作時會保存於表中,mariadb的服務進程會自動重讀授權表
3 對於不能夠或不能及時重讀授權表,可手動讓服務進程重啟授權表,使用flush privileges
作者:魏鎮坪
鏈接:http://www.jianshu.com/p/e59afa955a2d
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。