一、數據庫介紹
1.數據庫管理系統的產生背景
(1)數據時代的到來要求對數據進行有效和安全的管理
涉及的數據量大
數據不隨程序的結束而消失
數據被多個應用程序共享
大數據時代的到來
(2)傳統文件系統管理上的缺陷要求改變數據管理方式
編寫應用程序不方便
數據冗余不可避免
應用程序依賴性
不支持對文件的并發訪問
數據間聯系弱
難以按用戶視圖表示數據
無安全控制功
2.數據庫管理系統的相關概念
(1)數據庫(DB):
數據庫是數據的匯集,它以一定的組織形式存于存儲介質上
(2)數據庫管理系統(DBMS):
是管理數據庫的系統軟件,它實現數據庫系統的各種功 能。是數據庫系統的核心
(3)數據庫管理員(DBA):
負責數據庫的規劃、設計、協調、維護和管理等工作
(4)應用程序(APP):
指以數據庫為基礎的應用程序
3.數據庫管理系統
(1)優點:
相互關聯的數據的集合
較少的數據冗余
程序與數據相互獨立
保證數據的安全、可靠
最大限度地保證數據的正確性
數據可以并發使用并能同時保證一致性
(2)基本功能:
數據定義 數據處理 數據安全 數據備份
(3)架構:
單機架構 大型主機/終端架構 主從式架構(C/S) 分布式架構
(4)分類:
數據庫通常分為層次式數據庫、網絡式數據庫和關系式數據庫三種。
不同的數據庫是按不同的數據結構來聯系和組織的。
在當今的互聯網中,最常見的數據庫模型主要是兩種,即關系型數據庫和非關系型數據庫。
4.關系型數據庫相關概念介紹
(1)概念:
關系型數據庫模型是把復雜的數據結構歸結為簡單的二元關系(即二維表格形式)。在關系型數據庫中,對數據的操作幾乎全部建立在一個或多個關系表格上,通過對這些關聯的表格分類、合并、連接或選取等運算來實現數據庫的管理。
(2)關系:
關系就是指存儲數據的二維表,表種的行和列的存貯不注重次序,因為展示可以通過相關操作來實現次序的需求。
(3)行row:
表中的每一行,又稱為一條記錄record
(4)列column:
表中的每一列,稱為屬性,字段 ,域(field);這個域和domain這個域的含義不同。前者指列的一種稱呼,后者指列的取值范圍。
(5)事務(transaction):
事務(Transaction),一般是指要做的或所做的事情。在計算機術語中是指訪問并可能更新數據庫中各種數據項的一個程序執行單元(unit),通常就是指數據庫事務。
事務的特性:ACID
原子性(Atomicity):事務作為一個整體被執行,包含在其中的對數據庫的操作要么全部被執行,要么都不執行。
一致性(Consistency):事務應確保數據庫的狀態從一個一致狀態轉變為另一個一致狀態。一致狀態的含義是數據庫中的數據應滿足完整性約束。
隔離性(Isolation):多個事務并發執行時,一個事務的執行不應影響其他事務的執行。
持久性(Durability):一個事務一旦提交,他對數據庫的修改應該永久保存在數據庫中。
(6)聯系:
聯系是數據之間的關聯集合,是客觀存在的應用語義鏈。
實體內部的聯系:指組成實體的各屬性之間的聯系。如職工 實體中,職工號和部門經理號之間有一種關聯關系。
實體之間的聯系:指不同實體之間聯系。例學生選課實體和 學生基本信息實體之間。
聯系的類型:一對一聯系(1:1) 一對多聯系(1:n) 多對多聯系(m:n)
5.數據三要素
(1)數據結構:
包括兩類,一類是與數據類型、內容、性質有關的對象,比如關系模型中的域、屬性和關系等;另一類是與數據之間聯 系有關的對象,它從數據組織層表達數據記錄與字段的結構。
(2)數據的操作:
數據提?。⊿ELECT)在數據集合中提取感興趣的內容。
數據更新(INSERT、DELETE、 UPDATE )變更數據庫中的數據。
(3)數據的約束條件 :
是一組完整性規則的集合。
實體(行)完整性 Entity integrity
值行的唯一性,列和列總是不同的,利用主鍵實現
域(列)完整性 Domain Integrity
指有一個合理的取值范圍
參考完整性 Referential Integrity
6.數據庫范式概念
設計關系數據庫時,遵從不同的規范要求,設計出合理的 關系型數據庫,這些不同的規范要求被稱為不同的范式,各種范 式呈遞次規范,越高的范式數據庫冗余越小。
目前關系數據庫有六種范式: 第一范式(1NF)、第二范式 (2NF)、第三范式(3NF)、巴德斯科范式(BCNF)、第 四范式(4NF)和第五范式(5NF,又稱完美范式)。滿足最 低要求的范式是第一范式(1NF)。在第一范式的基礎上進 一步滿足更多規范要求的稱為第二范式(2NF),其余范式 以次類推。一般說來,數據庫只需滿足第三范式(3NF)即可。
(1)第一范式
無重復的列,每一列都是不可分割的基本數據項,同 一列中不能有多個值,即實體中的某個屬性不能有多個值或 者不能有重復的屬性。除去同類型的字段,就是無重復的列 說明:第一范式(1NF)是對關系模式的基本要求,不滿足第一范式(1NF)的數據庫就不是關系數據庫。
(2)第二范式
屬性完全依賴于主鍵,第二范式必須先滿足第一范式 ,要求表中的每個行必須可以被唯一地區分。通常為表加上 一個列,以存儲各個實例的唯一標識PK,非PK的字段需要與 整個PK有直接相關性。
(3)第三范式
屬性不依賴于其它非主屬性,滿足第三范式必須先滿 足第二范式。第三范式要求一個數據庫表中不包含已在其它 表中已包含的非主關鍵字信息,非PK的字段間不能有從屬關系。
范式的目的是為了減少數據冗余,但是相對犧牲了性能。有時候為了性能,需要違反范式。
7.數據庫約束
(1)主鍵
關系型數據庫中的一條記錄中有若干個屬性,若其中某一個屬性組(注意是組)能唯一標識一條記錄,該屬性組就可以成為一個主鍵。
要求:必須提供數據,即字段不為空(null);字段不重復,即唯一標識本行;一張表只能有一個主鍵。
目的:確定一條唯一的記錄。
(2)復合主鍵
表中一個屬性無法唯一標識一條記錄,用兩條屬性組才可以唯一標識一條記錄,那么兩條屬性主就組成了符合主鍵。單獨的每列的字段可重復,但是兩個列組成主鍵后總字段是不重復的。
(3)唯一鍵
一個或多個字段的組合,填入的數據必須能在本表唯一標識本行。和主鍵不同之處:在表中可以有多個;允許為空值
(4)外鍵
一個表中的某字段可填入的數據取決于另一個表的主 鍵或唯一鍵已有的數據 ,鍵表示了兩個表之間的相關聯系。一個表的主鍵是另外一張表的外鍵(唯一鍵也可以做外鍵)
二、安裝MariaDB
MySQL是世界上最流行的開源關系數據庫,它的名字取自于創始人Michael “Monty” Widenius的長女“My”。2008年,Sun收購MySQL;2009年,甲骨文收購了Sun,MySQL落入了與開源社區關系緊張的甲骨文手中。Widenius與他的舊團隊在2009初創建了MySQL的分支MariaDB,它的名字取自于Widenius的幼女“Maria”,他希望通過保留核心開發者和日益增長的社區幫助MariaDB挑戰甲骨文的MySQL。換言之,MariaDB其實就是Mysql的另一個版本,其中的很多操作命令,并沒有發生什么本質變化。
MariaDB的安裝方式大致分為三種,第一種是利用程序包管理器的程序包進行安裝,簡單說可以通過配置yum源來進行安裝;第二種是通過對遠嗎進行編譯安裝進行一些功能選擇,以滿足生產活動中對一些特殊功能的要求;第三種是利用官網提供的已經編譯好的二進制格式程序包進行安裝。下面我們主要介紹如何在CentOS6上利用第三種方式進行安裝。
1.安裝前準備
(1)準備用戶。
因為MariaDB是通過用戶身份進行運行的,因此要提前為其準備好運行賬戶和組。
groupadd -r -g 306 mysql
新建組并指定為系統組,編號為306,組名為mysql。
useradd -r -g 306 -u 306 -s /sbin/nologin –m –d /app/data mysql
新建用戶mysql并指定為系統用戶,編號為306,屬組編號為306,shell類型為/sbin/nologin,創建家目錄并指定為/app/data。
chown mysql:mysql /app/data
改變目錄/app/data目錄的所有者和屬組,我們可以用其當做數據庫的存放目錄,這也是我們之所以指定為其創建家目錄的原因所在。
(2)準備二進制程序包。
tar xf mariadb-VERSION-linux-x86_64.tar.gz -C /usr/local
注意必須要將程序包解壓到這個目錄,因為在初始編譯的時候就已經指定了路徑。
cd /usr/local;ln -sv mariadb-VERSION mysql
為解壓好的目錄創建軟鏈接,或者直接為這個目錄直接改名為mysql都可以,目的純粹是為了方便我們管理。
chown -R root:mysql /usr/local/mysql/
將安裝目錄的所有者從root改為mysql,從而使得mysql賬戶獲得權限。之前我們已經說過,數據庫的運行是需要通過某個賬戶身份進行的,利用我們自建的用戶mysql更加方便我們進行管理,也使得數據庫更加安全。注意要加上R選項,這樣是為整個目錄和其子目錄以及文件遞歸授權。
(3)為數據庫準備配置文件。
在準備配置文件之前,需要注意的是,數據庫會在啟動時自動讀取配置文件,讀取的次序是/etc/my.cnf --> /etc/mysql/my.cnf --> --default-extrafile=/PATH/TO/CONF_FILE --> ~/.my.cnf mkdir /etc/mysql/
注:后面的配置文件會覆蓋前面的配置文件。
cd cd /usr/local/mysql/support-files/;ls
數據庫已經為我們準備了配置文件模板,我們可以通過這條命令查詢并進行選擇。而且有”my-small.cnf my-medium.cnf my-large.cnf my-huge.cnf”適合多種類型數據庫的配置文件模板供我們選擇。這里我們選擇huge模板。
cp /usr/local/mysql/support-files/my-large.cnf /etc/mysql/my.cnf
直接copy配置文件模板到目錄/etc/mysql并改名為myconf。
修改配置文件,只需要改變以下幾項即可。
? datadir = /app/data 指定數據庫位置。必須要指定到我們之前選定的數據庫存放目錄。
innodb_file_per_table = on 允許每個表格單獨存放。方便管理,可省略。
skip_name_resolve = on 禁止主機名反向解析,加快登錄速度,可省略。
2.創建數據庫文件
cd/usr/local/mysql/;./scripts/mysql_install_db --datadir=/app/data --user=mysql
創建數據庫文件并不需要我們直接手動進行,數據庫為我們準備了腳本,我們只需要執行腳本即可。注意必須在目錄/usr/local/mysql中,我們才可以執行這個腳本。
3.創建日志文件
touch /var/log/mysqld.log;chown mysql /var/log/mysqld.log
為了方便對數據進行管理和排錯,我們要自己手動創建數據庫文件,并且要給予數據庫的運行賬戶mysql以權限,讓其可以寫數據進去。
4.配置服務腳本
install /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld
為了使服務腳本可以利用service命令進行管理,我們需要將服務腳本copy進固定目錄中,用install命令是因為這個命令既可以復制又可以加權限。
chkconfig --add mysqld
將服務增加到chkconfig可以管理的列表,以方便我們用這個命令進行管理。
chkconfig mysqld on
將服務列為開機啟動
service mysqld start;ss-ntl
啟動服務,并查看端口是否已經打開。
5.為客戶端工具指明PATH路徑。
我們在安裝編譯好的二進制程序包的時候,不僅安裝了服務端程序,也安裝了客戶端程序。所以我們要為客戶端程序指明PATH路徑。
vim /etc/profile.d/mysql.sh
#export PATH=/usr/local/mysql/bin:$PATH
source /etc/profile.d/mysql.sh
6.執行安全初始化腳本
剛安裝好的數據庫是無論什么身份都可以登錄的,所以需要進行安全初始化,為數據庫的root用戶創建密碼,以及禁止非數據庫目錄登錄數據庫。
mysql_secure_installation
執行后按照提示一步步進行設置即可。
三、一些基本的管理
1.管理數據庫
(1)創建數據庫
CREATE DATABASE 'DB_NAME';
CREATE SCHEMA [IF NOT EXISTS] 'DB_NAME';
CHARACTER SET 'character set name'
定義字符集
COLLATE 'collate name'
定義排序方式
(2)刪除數據庫
DROP DATABASE 'DB_NAME';
DROP SCHEMA [IF EXISTS] 'DB_NAME';
(3)查看支持所有字符集
SHOW CHARACTER SET;
(4)查看支持所有排序規則
SHOW COLLATION;
(5)獲取命令使用幫助
HELP ;
(6)查看數據庫列表
SHOW DATABASES;
2.管理表
(1)針對表的結構
DDL語句:Data Defination Language 針對表結構
CREATE,創建
DROP, 刪除
ALTER 修改
1)創建表
CREATE TABLE [IF NOT EXISTS] ‘tbl_name’ (col1 type1 修飾符, col2 type2 修飾符, ...)
其他選項:
ENGINE [=] engine_name 指定該表存儲用什么引擎 不指定就默認
SHOW ENGINES;查看支持的engine類型
ROW_FORMAT [=] {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT |COMPACT}定義行格式
解釋:
tbl_name:想要創建的表名
col1:指定字段名
type1:指定字段的數據類型
修飾符:下面會詳細介紹
[IF NOT EXISTS]:判斷語句,如果不存在
舉例:
USE hhydb;
使用hhydb這個數據庫
CREATE TABLE students (id int UNSIGNED NOT NULL PRIMARY KEY,name VARCHAR(20) NOT NULL,age tinyint UNSIGNED);
創建student表
DESC students;
查看
CREATE TABLE students2 (id int UNSIGNED NOT NULL ,name VARCHAR(20) NOT NULL,age tinyint UNSIGNED,PRIMARY KEY(id,name));
創建student2表
2)查看表
SHOW TABLES [FROM db_name];
查看有哪些表
DESC tb_name;
查看某個表結構
SHOW INDEXES FROM students;
查看表索引
SHOW TABLE STATUS LIKE 'tbl_name'\G;
查看表狀態,表名要加引號
3)刪除表
DROP TABLE [IF EXISTS] 'tbl_name';
刪除整個表
4)修改表
ALTER TABLE 'tbl_name' RENAME 'newtbl_name';
為表改名
ALTER TABLE 'tbl_name' ADD 'col_name' data_type [FIRST|AFTER col_name];
添加字段
ALTER TABLE 'tbl_name' CHANGE 'col_name' 'newcol_name' data_type;
修改字段名及屬性
ALTER TABLE 'tbl_name' CHANGE 'col_name' 'col_name' ;
修改字段屬性
ALTER TABLE 'tbl_name' MODIFY ‘col_name’ data_type;
修改字段屬性
ALTER TABLE 'tbl_name' DROP ‘col_name’ data_type ;
刪除某個字段
解釋:
[FIRST|AFTER col_name] :在某個字段之前或者之后
data_type:數據類型
CHANGE全稱:CHANGE VOLUMN
舉例
ALTER TABLE students RENAME s1;
為表students改名為s1
ALTER TABLE s1 ADD phone varchar(11) AFTER name;
為表s1在name字段后增加字段phone,數據類型varchar
ALTER TABLE s1 MODIFY phone int;
改表s1中的字段phone的數據類型為int
ALTER TABLE s1 CHANGE COLUMN phone mobile char(11);
修改表s1中字段phone數據類型為char,并改名為mobile
ALTER TABLE s1 DROP COLUMN mobile;
刪除字段mobile
ALTER TABLE students ADD gender ENUM('m','f');
ENUM:枚舉值,這里規定只有兩個選擇要么M,要么f
ALETR TABLE students CHANGE id sid int UNSIGNED NOT NULL PRIMARY KEY;
修改字段id的屬性并改名為sid
(3)針對表結構
1)創建索引
CREATE INDEX ’idx_name‘ ON ’tbl_name‘(col_name) ;
創建索引
ALTER TABLE ADD INDEX ’idx_name’(col_name);
增加索引
注:
不指定索引名,會默認以字段名作為索引名。
如果創建表時指定了字段屬性為主鍵或者唯一鍵,那么系統會默認以主鍵和唯一鍵為索引。
2)查看索引
SHOW INDEX FROM ‘tbl_name [FROM db_name]’\G;
SHOW INDEX FROM ‘[db_name.]tbl_name‘\G;
注:\G,讓數據顯示以行顯示
3)刪除索引
ALTER TABLE ‘tbl_name’ DROP INDEX ‘idx_name’;
4)修改索引
數據庫中沒有直接修改索引的方法,需要先刪除在創建來實現索引的修改。
注:
索引是特殊數據結構
創建索引必須要有索引名稱
定義在查找時作為查找條件的字段
優點:提高查詢速度
缺點:占用額外空間,影響插入速度
(3)針對表中數據
DML語句:Data Manipulation Language 針對表內數據
INSERT 增
DELETE 刪
UPDATE 改
DQL語句:Data Query Language 針對表內數據
SELECT 查
1)插入數據
INSERT [INTO] tbl_name [(col_name,...)] {VALUES | VALUE} (val1,...),(...),...
解釋:
INTO:可以省略
tbl_name:想要操作的表名
col_name:想要操作的字段名,多個用逗號隔開。如果不寫字段,會默認針對所有字段按照次數進行賦值操作。
VALUES:插入的語法要求,必須寫
val1:表示插入的值,多個用逗號隔開,字符串要加引號
舉例
INSERT INTO students VALUES(1,'tom','m'),(2,'alice','f');
INSERT INTO students(id,name) VALUES(3,'jack'),(4,'allen');
2)修改數據
UPDATE tbl_name SET col1=val1, col2=val2, ... [WHERE clause] [ORDER BY 'col_name' [DESC]] [LIMIT [m,]n];
解釋:
SET:修改的固定關鍵字
WHERE clause:定位
ORDER BY:排序,用的少,一般查詢多
LIMIT m,n:條件,跳過m選擇n個
注意:
①UPDATE s2 SET gender=null where id=4;
②UPDATE s2 SET gender=NULL where id=4;
③UPDATE s2 SET gender=’‘ where id=4;
④UPDATE s2 SET gender=’NULL‘ where id=4;
⑤UPDATE s2 SET gender=’NULL‘ where id=4;
上面四個寫法含義:
①②含義相同,表示將gender這個字段的值賦值為空值,并定位為id=4的那行。
③表示將gender這個字段的值賦值為零值(零值也是有值),并定位為id=4的那行。
④表示將gender這個字段的值賦值為字符串NULL,并定位為id=4的那行。
⑤表示將gender這個字段的值賦值為字符串null,并定位為id=4的那行。
舉例
UPDATE s2 SET age=21,gender='m' WHERE id=3;
3)刪除數據
DELETE FROM tbl_name [WHERE clause] [ORDER BY 'col_name' [DESC]] [LIMIT [m,]n];
按條件刪除
DELETE FROM tbl_name;
全部清除
TRUNCATE TABLE tbl_name;
全部清除
注:兩個全部清除的區別在于,前者要記錄日志,速度會慢一點。
舉例
DELETE FROM s2 WHERE id=3;
4)查看數據
SELECT col1[[AS] name],col2[[AS] name],... FROM tbl_name [WHERE clause] [ORDER BY 'col_name' [DESC]] [LIMIT [m,]n];
解釋:
col1,col2:選擇顯示哪些字段。*代表顯示所有字段。
AS name:選擇按照name顯示字段名,而不是顯示直接顯示字段名。相當于起了別名。AS可以省略。
FROM tbl_name :選擇從哪張表顯示。
WHERE clause:定位顯示。
ORDER BY 'col_name' [DESC]:排序顯示。
LIMIT [m,]n:條件顯示,跳過m選擇n個。
舉例
SELECT id AS 編號,name 姓名,gender 性別 FROM s2;
SELECT * FROM s2 WHERE id < 3;
SELECT * FROM s2 WHERE gender='m';
SELECT * FROM s2 WHERE gender IS NULL;
SELECT * FROM s2 WHERE gender IS NOT NULL;
SELECT * FROM s2 ORDER BY id DESC LIMIT 3;
根據id字段的值倒序顯示,限制只顯示三行
SELECT * FROM s2 ORDER BY id DESC LIMIT 1,3;
根據id字段的值正序顯示,限制跳過一行顯示后面3行
SELECT * FROM s2 WHERE id >=2 and id <=4;
根據id字段的行數為條件,查看2和4之間的行
SELECT * FROM s2 WHERE name LIKE ‘t%’ ;
按照通配符模糊查詢,定位name字段中t開頭后面跟任意字符的行
SELECT * FROM s2 WHERE name LIKE '%c%';
按照通配符模糊查詢,定位name字段中中間包含t的任意字符的行
SELECT * FROM s2 WHERE name RLIKE 'a';
按照正則表達式精確查找,定位name字段中只要包含a字母的行
SELECT * FROM s2 WHERE name RLIKE 'a';
按照正則表達式精確查找,定位name字段中只要a字母為首的行
SELECT * FROM s2 WHERE name RLIKE '^a.*e$';
按照正則表達式精確查找,定位name字段中以a字母為首n字母結尾的行
SELECT * FROM s2 WHERE name RLIKE '.*[lo].*';
按照正則表達式精確查詢,定位name字段中任意包含l或者o字母的行
SELECT * FROM s2 WHERE name IN ('alice','allen');
定位name字段中值是alice和allen的行進行顯示
(4)特殊用法
CREATE TABLE newtbl_name SELECT * FROM tbl_name;
復制粘貼
INSERT INTO newtbl_name SELECT * FROM tbl_name;
按照格式插入, 要求前表存在且結構和后表結構完全相同
(5)字段表示法
*: 所有字段
as:字段別名,col1 AS alias1
(6)定位
WHERE clause語句
操作符:
>, <, >=, <=, ==, !=:賦值
BETWEEN ... AND ... :定位范圍
LIKE: 通配符模糊匹配
%:任意長度的任意字符
_:任意單個字符;
RLIKE: 正則表達式精確匹配
.*:任意長度的任意字符
^:錨定行首
$:錨定行尾
. :單個字符
+ :重復一次以上
IS NULL ,IS NOT NULL : 根據是否為空匹配
IN (val1,val2,…): 根據挑選的值顯示
條件邏輯操作:
and,or,not 與,或,非
(7)排序
ORDER BY 'col_name' [DESC]語句
DESC: 表示倒序排
ASC: 表示正序排,不寫默認就是這個排序方法
(8)限制條件
[LIMIT [m,]n]語句
LIMIT m,n: 表示跳過m個,選擇之后的n個
LIMIT n: 表示選擇n個
3.數據和修飾符
表示用來規定數據存放格式的,數據庫中的數據類型有多種
(1)MySql支持多種列類型:
數值類型
日期/時間類型
字符串(字符)類型
(2)選擇正確的數據類型對于獲得高性能至關重要,三大原則:
更小的通常更好,盡量使用可正確存儲數據的最小數據類型
簡單就好,簡單數據類型的操作通常需要更少的CPU周期
盡量避免NULL,包含為NULL的列,對MySQL更難優化
(3)數據類型
整形:
tinyint(m) 1個字節 范圍(-128~127)
smallint(m) 2個字節 范圍(-32768~32767)
mediumint(m) 3個字節 范圍(-8388608~8388607)
int(m) 4個字節 范圍(-2147483648~2147483647)
bigint(m) 8個字節 范圍(+-9.22*10的18次方)
注:
一個字節8位,最高位表示是正數還是負數
0表示負數 最高位是0 所以其取值范圍是-128~127
1表示整數 最高位是1 所以取值范圍是0~255翻倍
取值范圍如果加了unsigned,則最大值翻倍,如tinyint unsigned 的取值范圍為(0~255)。
int(m)里的m定義顯示的格式,是表示SELECT查詢結果集中的顯示寬度,并不影響實際的取值范圍。
MySQL可以為整型類型指定寬度,例如Int(11),對絕大多數應用這是沒有意義的:
它不會限制值的合法范圍,只是規定了MySQL 的一些交互工具(例如MySQL命令行客戶端)用來顯示字符的個數。
對于存儲和計算來說,Int(1)和Int(20)是相同的。
浮點型:
float(m,d) 單精度浮點型 8位精度(4字節) m總個數,d小數位
double(m,d) 雙精度浮點型 16位精度(8字節) m總個數,d小 數位
注:
設一個字段定義為float(6,3),如果插入一個數123.45678,實 際數據庫里存的是123.457,但總個數還以實際為準,即6位
定點數:
decimal(m,d) 參數m<65 是總個數,d<30且 d<m 是小數位
注:
MySQL5.0和更高版本將數字打包保存到一個二進制字符串中(每4個字節存9個數字)。
例如,decimal(18,9)小數點兩 邊將各存儲9個數字,一共使用9個字節:小數點前的數字用4 個字節,小數點后的數字用4個字節,小數點本身占1個字節
浮點類型在存儲同樣范圍的值時,通常比decimal使用更少的空間。float使用4個字節存儲。double占用8個字節.
因為需要額外的空間和計算開銷,所以應該盡量只在對小數進行精確計算時才使用decimal——例如存儲財務數據。
但在數據量比較大的時候,可以考慮使用bigint代替decimal
字符串:
char(n) 固定長度,最多255個字符,必須指定
varchar(n) 可變長度,最多65535個字符,必須指定
tinytext 可變長度,最多255個字符
text 可變長度,最多65535個字符
mediumtext 可變長度,最多2的24次方-1個字符
longtext 可變長度,最多2的32次方-1個字符
BINARY(M) 固定長度,可存二進制或字符,允許長度為0M字節,
VARBINARY(M) 可變長度,可存二進制或字符,允許長度 為0-M字節
內建類型 ENUM枚舉, SET集合
char和varchar:
1)char(n) 若存入字符數小于n,則以空格補于其后,查詢之時再將空格去掉,所以char類型存儲的字符串末尾不能有空格;varchar 不限于此。
2)char(n) 固定長度,char(4)不管是存入幾個字符,都將占用4個 字節,varchar是存入的實際字符數+1個字節(n< n>255),所以 varchar(4),存入3個字符將占用4個字節。
3)char類型的字符串檢索速度要比varchar類型的快。
varchar和text:
1)varchar可指定n,text不能指定,內部存儲varchar是存入的實際字符數+1個字節(n< n>255),text是實際字符數+2個字節。
2)text類型不能有默認值。
3)varchar可直接創建索引,text創建索引要指定前多少個字符。 varchar查詢速度快于text。
二進制數據:
BLOB和text存儲方式不同,TEXT以文本方式存儲,英文存儲區分大小寫,而Blob是以二進制方式存儲,不分大小寫
BLOB存儲的數據只能整體讀出
TEXT可以指定字符集,BLOB不用指定字符集
日期時間:
date 日期 '2008-12-2'
time 時間 '12:25:36'
datetime 日期時間 '2008-12-2 22:06:44'
timestamp 時間戳,自動存儲記錄修改時間
YEAR(2) 年份
注:
若定義一個字段為timestamp,這個字段里的時間數據會隨其他字段修改的時候自動刷新;
這個數據類型的字段可以存放這條記錄最后被修改的時間。即timestamp指時間戳;
修改時間會記錄,就算前后數據一樣,也可以通過時間戳發現是否進行過修改;
數據庫本身只能看到當前狀態,無法確定是否被修改過。
(4)修飾符
所有類型:
NULL 數據列可包含NULL值
NOT NULL 數據列不允許包含NULL值
DEFAULT 設定默認值
PRIMARY KEY 主鍵
UNIQUE KEY 唯一鍵
數值型可以加的修飾符:
AUTO_INCREMENT 自動遞增,適用于整數類型,如果中間某個數刪除會出現問題
UNSIGNED 無符號
4.管理用戶
(1)用戶賬號組成
用戶賬號:'user'@'host'
user: 用戶名
host: 允許用戶通過哪些主機遠程連接mysqld服務
注:
mysql的賬號是由用戶名和主機兩部分組成的。
host的格式:
IP:直接可以寫IPv4或者IPv6格式
網絡地址:可以直接寫網絡,或者CIDR表示法的網絡
主機名:寫成域名,需要配合數據庫服務器的DNS進行解析成IP后才可以使用。
通配符(%和_) :可以在寫host的時候搭配通配符使用,下劃線表示單一一個字符
(2)創建用戶
CREATE USER 'username'@'host' [IDENTIFIED BY 'password'];
只是創建用戶,可以鏈接服務器,不代表能夠對數據庫進行操作,因為沒有給予權限
(3)查看用戶
SELECT user();
查看當前用戶
SELECT User,Host,Password FROM mysql.user;
查看所有用戶
(4)刪除用戶
DROP USER 'username'@'host';
(5)更改口令
1)SET PASSWORD FOR 'user'@'host' = PASSWORD(‘password');
注意:這是正常通過命令修改的做法。PASSWORD()這是一個函數,加密口令的作用
推薦做法。
2) UPDATE user SET password=PASSWORD('magedu') WHERE User='root' ;
注意:這是通過修改表內數據的做法。修改表的命令不會馬上生效,需執行FLUSH PRIVILEGES生效
不推薦 如果有兩個用戶同名(不同主機),就會導致所有同名的用戶密碼都會被修改,而且這個命令不會立即生效
3) /usr/local/mysql/bin/mysqladmin -u root –poldpassword password 'newpassword‘
注意:這是在myaql外利用腳本實現。
(6)破解口令
找到mysql的user這個數據庫將其刪除,重新運行mysql初始化腳本mysqlsecureinstallation
5.管理權限
(1)對用戶進行授權
GRANT priv_type,... ON [object_type] db_name.tb_name TO 'user'@'host' [IDENTIFIED BY 'password'] [WITH GRANT OPTION];
解釋:
priv_type 給予的權限類型
select: 查
insert: 插入
upset: 改
delete: 刪
ALL: 代表完全控制 增刪改查
注:授權多個用逗號隔開
ON 表示對什么進行授權
db_name.tb_name 指明數據庫名和表
*.*: 所有庫的所有表
db_name.*: 指定庫的所有表
db_name.tb_name: 指定庫的指定表
db_name.routine_name: 指定庫的存儲過程和函數
TO 表示授權給那個用戶
'user'@'host 用戶名和主機地址
IDENTIFIED BY 'password' 相當于如果沒有這個賬號的話就會生成這個用戶而且設置密碼且給予權限 如果有用戶 這個操作可以省略
WITH GRANT OPTION 級聯授權,自己被授予的權限還可以傳給其他用戶
舉例
GRANT SELECT,DELETE ON hhydb.s2 TO 'hhy'@'172.18.65.%' IDENTIFIED BY '123456';
(2)查看用戶的權限
SHOW GRANTS FOR 'user'@'host';
查看某個用戶的權限
SHOW GRANTS FOR CURRENT_USER[()];
查看當前正在使用的用戶的權限
舉例
SHOW GRANTS FOR hhy@'172.18.65.%';
SHOW GRANTS FOR CURRENT_USER();
(3)回收用戶的權限
REVOKE priv_type, ... ON db_name.tb_name FROM 'user_name' @'%';
舉例
REVOKE DELETE ON hhydb.* FROM 'hhy'@'172.18.65.%';
(4)注意:
MariaDB服務進程啟動時會讀取mysql庫中所有授權表至內存
1) GRANT或REVOKE等執行權限操作會保存于系統表中,MariaDB的服務進程通常會自動重讀授權表,使之生效
2) 對于不能夠或不能及時重讀授權表的命令,可手動讓MariaDB的服務進程重讀授權表:mysql> FLUSH PRIVILEGES;
————–終—————–
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/87657
實在不怪小的排版不行,怪只怪這不支持html也不支持markdown,心碎,還是自搭網站吧。