關於{RDBMS(關係型資料庫管理系統)設計範式基礎概念 設計關係資料庫時,遵從不同的規範要求,設計出合理的關係型資料庫,這些不同的規範要求被稱為不同的範式,各種範式呈遞次規範,越高的範式資料庫冗餘越小。 目前關係資料庫有六種範式:第一範式(1NF)、第二範式(2NF)、第三範式(3NF)、巴德斯科 ...
資料庫的結構(3種):層次,網狀,關係型(用的最多);
DBMS的三層模型:
視圖層;面向最終用戶;
邏輯層;面向程式員或DBA;
物理層;面向系統管理員;
關係型資料庫管理系統——RDBMS:
主要的組成部分是表;表是由行(實例,實體,記錄)和列(欄位,域)組成;
關係型資料庫管理系統的實現:
商業方案:Oracle,Sybase{為微軟提供了思路出現SQL-server},Infomix{IBM收購},DB2{IBM}
開源方案:PostgreSQL,mysql,MariaDB
SQL:Structured Query Language,結構化查詢語言;
ANSI(美國國家標準協會): 1986年定義SQL系列標準,89年實施:
SQL-86(草案)、SQL-89、SQL-92、SQL-99、SQL-2003(現在使用的標準)
關於{RDBMS(關係型資料庫管理系統)設計範式基礎概念
設計關係資料庫時,遵從不同的規範要求,設計出合理的關係型資料庫,這些不同的規範要求被稱為不同的範式,各種範式呈遞次規範,越高的範式資料庫冗餘越小。
目前關係資料庫有六種範式:第一範式(1NF)、第二範式(2NF)、第三範式(3NF)、巴德斯科範式(BCNF)、第四範式(4NF)和第五範式(5NF,又稱完美範式)。滿足最低要求的範式是第一範式(1NF)。在第一範式的基礎上進一步滿足更多規範要求的稱為第二範式(2NF),其餘範式以次類推。一般說來,資料庫只需滿足第三範式(3NF)就行了。
(1) 第一範式(1NF) 所謂第一範式(1NF)是指在關係模型中,對域添加的一個規範要求,所有的域都應該是原子性的,即資料庫表的每一列都是不可分割的原子數據項,而不能是集合,數組,記錄等非原子數據項。即實體中的某個屬性有多個值時,必須拆分為不同的屬性。在符合第一範式(1NF)表中的每個域值只能是實體的一個屬性或一個屬性的一部分。簡而言之,第一範式就是無重覆的域。 說明:在任何一個關係資料庫中,第一範式(1NF)是對關係模式的設計基本要求,一般設計中都必須滿足第一範式(1NF)。不過有些關係模型中突破了1NF的限制,這種稱為非1NF的關係模型。換句話說,是否必須滿足1NF的最低要求,主要依賴於所使用的關係模型。 (2) 第二範式(2NF) 第二範式(2NF)是在第一範式(1NF)的基礎上建立起來的,即滿足第二範式(2NF)必須先滿足第一範式(1NF)。第二範式(2NF)要求資料庫表中的每個實例或記錄必須可以被唯一地區分。選取一個能區分每個實體的屬性或屬性組,作為實體的唯一標識。 第二範式(2NF)要求實體的屬性完全依賴於主關鍵字(主鍵)。所謂完全依賴是指不能存在僅依賴主關鍵字一部分的屬性,如果存在,那麼這個屬性和主關鍵字的這一部分應該分離出來形成一個新的實體,新實體與原實體之間是一對多的關係。為實現區分通常需要為表加上一個列,以存儲各個實例的唯一標識。簡而言之,第二範式就是在第一範式的基礎上屬性完全依賴於主鍵。 (3) 第三範式(3NF) 第三範式(3NF)是第二範式(2NF)的一個子集,即滿足第三範式(3NF)必須滿足第二範式(2NF)。簡而言之,第三範式(3NF)要求一個關係中不能包含已在其它關係已包含的非主關鍵字信息。簡而言之,第三範式就是屬性不依賴於其它非主屬性,也就是在滿足2NF的基礎上,任何非主屬性不得傳遞依賴於主屬性。
}
NoSQL:Not-Only SQL,反關係型資料庫; //針對關係型資料庫提出
Memcached、Redis:鍵入值,並將數據存儲在記憶體中,查詢效率極高
MangoDB:完成資料庫切片
Hbase:配合大數據,文檔型資料庫用來存放大型數據
MySQL:http://www.mysql.com
MariaDB:http://mariadb.org 主流的發行版本有兩個:5.5.x 和 10.x.y
Percona XtraDB/MySQL:https://www.percona.com
MySQL/MariaDB:
C/S架構,客戶端/伺服器架構形式:
客戶端工具:
命令行工具:mysql, mysqladmin, mysqldump, ...
圖形工具:phpMyAdmin, SQLyog, navicot, ...
伺服器端程式:
mysqld_safe(預設)、msyqld、mysqld_multi
客戶端到伺服器端的連接方式:
1.客戶端和伺服器端在同一臺主機上:
1) Unix Socket
2) IPv4 Socket
3) IPv6 Socket
2.客戶端和伺服器端分別在不同主機上:
1) IPv4 Socket
2) IPv6 Socket
關係型資料庫管理系統:
數據模型:關係模型,這裡說的是二維關係
1.表:為了滿足範式的設計要求,將一個數據集拆分成多個; //在一個表中,可以沒有任何一行,但至少保證有一列;
行:row(實例,實體,記錄); //記錄數據的特征;
列:column(欄位,域); //記錄數據的某種屬性;
2.視圖:view,虛表;包含已知表中的部分列;
3.索引:index,將表中的某一個或某些欄位抽取出來,單獨將其組織成一個獨特的數據結構,以便於提高數據檢索效率;
支持B-tree(平衡樹)索引{預設使用的索引方式}、hash(哈希)索引、空間索引
如果伺服器端的應用程式想要訪問資料庫,就要有訪問資料庫的能力,應用程式就需要一個SQL介面,使用SQL語句通過SQL介面發送給資料庫管理系統,從而管理資料庫。資料庫管理系統需要通過存儲引擎來存儲或刪除存儲設備中的文件。
SQL介面:計劃執行器,分析器,操作求解器,優化器;
提供了一種能夠跟資料庫管理系統做互動式操作的介面(1),類似於shell;也可以提供編程功能(2);
(1)互動式介面功能:通過SQL介面處理SQL語句;
DDL:Data Definition Language,數據定義語言:CREATE,ALTER,DROP
DML:Data Manipulation Language,數據操縱語言:INSERT,DELETE,UPDATE,SELECT
DCL:Data Control Language,數據控制語言:GRANT,REVOKE
(2)編程功能:變數,函數,迴圈,選擇;
存儲過程:Procedure,使用CALL語句調用;
存儲函數:Function,使用SELECT語句調用;
觸發器(類似條件選擇):Trigger;
事件調度器(Event Schedule);基於事件的條件選擇,類似於觸發器但基於事件
常式:Routine,過程 + 函數
**事務**:Transaction,組織多個操作為一個整體,這個整體所包含的所有操作,要麼全部都執行,要麼全部不執行;只要有任何操作沒有被成功執行,則整個事務回滾(Rollback);
在MySQL中,事務是存儲引擎的屬性;是否支持事務的判斷標準,即:ACID標準(事務四大特性);
A:Atomicity,原子性(不可分割);
C:consistency,一致性(執行開始的狀態和結束的結果保持一致);
I:Isolation,隔離性(加鎖,多個事務分隔開來不能同時進行);
D:Durability,持久性(對數據修改結果要不發生變化);
**約束**:Constraint,向數據表中插入的數據必須遵守的限制規則(範式);
(1.主鍵約束:
主鍵:一個或多個欄位構建的能夠唯一標識記錄的組合;
主鍵約束:填入主鍵的數據,必須不能和已經填寫的數據相同,而且不能為空;
(2.外鍵約束:也稱為"引用性約束";
外鍵:一個表中的某個欄位和其他表中的欄位表達的意義相同;
外鍵約束:一個表中的某個欄位能插入的數據,取決於另一個表的主鍵中包含的數據;
(3.唯一鍵約束:
唯一鍵:一個或多個欄位構建的能夠唯一標識記錄的組合;
唯一鍵約束:填入唯一鍵的數據,必須不能和已經填寫的數據相同,但可以為空;
(4.檢查性約束:
也稱為"表達式約束";取決於表達式的書寫規範;
關係運算:
選擇:根據指定的條件挑選出符合條件的行;
投影:根據指定的條件挑選出符合條件的列;
連接(具有多種連接方式):多表的關聯操作;
**數據抽象分佈:**
物理層(最底層):決定數據的存儲格式,即:如何將數據組織成物理文件;
邏輯抽象層(中間層:存儲引擎,用來上下兩個層次的銜接轉換):描述了資料庫存儲什麼樣的數據,以及數據之間存在怎樣的關係;
視圖層(最頂層):描述了資料庫中全部或部分數據,以表的形式進行展示;
關係模型的分類:關係模型、實體-關係模型(E-R模型)、基於對象的關係模型、半結構化的關係模型:XML
MySQL和MariaDB:
共同點:
1.都支持插件式的存儲引擎(把存儲引擎當做功能模塊來使用); //存儲引擎就是表類型;
2.MySQL/MariaDB服務埠號:3306/TCP
MariaDB的特性:
1.相對於MySQL而言,可以包含更多的存儲引擎;
1)MyISAM:檢索高效但是不支持事務;
Aria:增強版的MyISAM,改善了MyISAM中的崩潰處理機制;
2)InnoDB:支持事務;行級鎖;
Percona-XtraDB:增強版的InnoDB;
2.諸多的擴展和新特性;
3.提供了非常多的測試組件;
4.Truly Open Source(MariaDB的發行機制:真正開源)
MySQL的發行機制(2種):
Enterprise:企業版,提供了豐富的組件和功能;如:線程池,強大的可視化監控組件等;
Community:社區版,只有簡單的資料庫功能
安裝MySQL或MariaDB:
1.基於包管理器格式的程式包直接安裝,如:rpm包,deb包等;
1) OS發行商在光碟鏡像中提供; //版本比較老舊
2) 由程式官方提供;
2.官方提供的通用二進位程式包;直接解壓縮程式包即可使用;
3.源代碼包:編譯安裝之前,需要先編譯安裝cmake
安裝命令:
CentOS 6:yum install mysql-server
CentOS 7:yum install mariadb-server
MySQL的程式環境:
伺服器端程式:mysql-server(CentOS6), mariadb-server(CentOS7)
服務啟動腳本:
/etc/rc.d/init.d/mysqld
常用的二進位文件:
/usr/bin/mysql_install_db //做資料庫的初始化安裝
/usr/bin/mysql_secure_installation //做安全初始化安裝;對使用的管理員用戶做密碼設置,預設是空密碼;刪除空用戶和空數據表;只允許root用戶本地登錄不允許遠程登錄
/usr/bin/mysqld_multi //多實例啟動mysql,可以一次啟動多個mysql進程,不同的進程監聽不同的埠號
/usr/bin/mysqld_safe //預設啟動safe選項,安全服務進程
數據目錄:
/var/lib/mysql //預設的初始化資料庫目錄,未初始化之前目錄中沒有內容
主配置文件:
/etc/my.cnf
客戶端程式:mysql, mariadb
常用的二進位文件:
/usr/bin/mysql //客戶端連接工具
/usr/bin/mysqladmin //非互動式的資料庫管理工具
/usr/bin/mysqlbinlog //二進位日誌的查看和管理工具
/usr/bin/mysqldump //溫備份工具
主配置文件:/etc/my.cnf
ini風格的配置文件:在整個配置文件中,以"[]"劃分成多個配置段,每個配置指令僅針對於其上方直接歸屬的"[]"中表示的組件生效;
在mariadb版本中/etc/my.cnf中添加:
innodb_file_per_table = ON //打開對創建或刪除表的影響,主要是刪除InnoDB存儲引擎的表耗用時間應該更長
skip_name-resolve = ON //跳過名稱解析,不做名稱反解
保存後重啟服務(MariaDB版本一般在CentOS7中):systemctl restart mariadb.service //如果重啟不成功,使用 rm -rf /var/lib/mysql/*文件內容清空,因為有其他資料庫內容,不能重啟資料庫
使用rpm包安裝的mysql或mariadb的預設配置文件載入順序:
/etc/mysql/my.cnf (預設文件不存在)--> /etc/my.cnf(一般預設先載入) --> ~/.my.cnf //後載入的配置項會覆蓋先前配置項,越靠後的文件生效越優先
在使用mysqld_safe命令啟動mysqld服務進程時,可以通過一些選項來更改或附加配置文件的讀取順序;
-c, --defaults-file=name
Like --config-file, except: if first option, then read
this file only, do not read global or per-user config
files; should be the first option
如果在命令行中給出此選項,則此選項必須是第一個選項,此時,僅從此選項指定的配置文件中讀取參數值,不會再讀取任何其他的配置文件,包括全局的和個人的;
-e, --defaults-extra-file=name
Read this file after the global config file and before
the config file in the users home directory; should be
the first option
如果在命令行中給出此選項,則此選項必須是第一個選項,此時,將所有其他的配置文件按照指定順序讀取完成之後,最後再附加讀取此選項指定的配置文件中參數值配置,只要有參數配置衝突,則必然以此選項指定的文件中的參數中為最終生效的參數值;
配置文件的風格:
ini風格的配置文件;即:分段式配置文件;
為MySQL的各應用程式提供與之對應的配置參數信息:
伺服器端應用程式:
[server]
socket=
datadir=
basedir=
[mysqld]
socket=
[mysqld_safe]
socket=
[mysqld_multi]
客戶端應用程式:
[client]
user=
password=
host=
[mysql]
user=
password=
host=
[mysqladmin]
[mysqldump]
配置文件中各參數的定義方法:
PARAMETER_NAME = VALUE
PARAMETER_NAME=VALUE
PARAMETER_NAME
innodb_file_per_table = ON
innodb-file-per-table = ON
defaults-file=/tmp/my.cnf
defaults_file=/tmp/my.cnf
skip_name_resolve=ON
skip_name_resolve
**mysql相關基本命令:
mysql命令 - 基本的互動式命令行客戶端工具;**
格式:mysql [options] [db_name]
常用選項:
--database=db_name, -D db_name
用於指定使用mysql客戶端程式連接到mysql伺服器之後,預設使用哪個資料庫;如果不給定該選項,預設為NULL;
--execute=statement, -e statement
連接至mysql伺服器並將後面的SQL語句交給伺服器運行之後返回執行結果並直接退出互動式登錄模式,返回bash命令提示符;
--host=host_name, -h host_name
用於指定此次mysql程式所連接的mysql伺服器的主機名稱或主機IP地址;預設是localhost(127.0.0.1);
--user=user_name, -u user_name
用於指定連接mysql伺服器時使用的用戶名;預設的用戶名為:'root'@'localhost'
mysql的用戶名:USERNAME@HOSTNAME
USERNAME表示登錄的用戶名稱;
HOSTNAME表示用戶通過哪個特定的客戶端主機連接到mysql伺服器;
如:用戶'root'@'172.16.0.1':表示只有172.16.0.1主機可以通過root用戶連接至myslq伺服器;
HOSTNAME中可以使用通配符:
_:任意單個字元;
%:任意長度的任意字元;
如:'root'@'172.16.%.%'
表示172.16.0.0/16網段中的所有主機都可以使用root用戶連接至mysql伺服器;
如:'root'@'172.16._.%'
表示172.16.0.0~172.16.9.255地址的主機都可以使用root用戶連接至mysql伺服器;
註意:預設情況下,所有用戶均為空密碼,並且還有匿名用戶存在,因此,為了增強安全性,可以使用mysql_secure_installation命令完成賬戶安全初始化;使得mysql伺服器僅能讓root用戶在本地登錄,並且移除匿名用戶和test資料庫;
--password[=password], -p[password]
用於指定連接mysql伺服器時,為對應用戶指定身份驗證所需密碼;如果密碼部分省略不寫,執行命令後需要在新行中給出密碼,這種方式相對更安全;
mysql命令提示符下的互動式命令:
客戶端命令:mysql程式自身完成或執行的命令,在客戶端所在地運行;
clear (\c):停止發送當前正在鍵入的命令或語句並直接返回提示符;
delimiter (\d):設置語句結束標記;預設的語句結束標記為";";
ego (\G):將其前面的語句送往mysql伺服器運行,並將返回的結果縱線顯示;
go (\g):無需輸入語句結束標記,直接將其前面的語句送往伺服器執行;
exit,quit (\q):退出mysql程式的互動式模式;
status (\s):獲取mysql伺服器的狀態信息;
use (\u):將指定的資料庫作為當前正在使用的資料庫;
source (\.):可以在mysql互動式模式中執行SQL腳本文件;
?,help (\?):獲取客戶端命令的幫助信息;
伺服器端命令:mysql客戶端程式通過mysql協議向mysql伺服器端發送的SQL語句;
註意:在書寫伺服器端命令時,每個SQL語句都必須以指定的結束標記結尾,預設是";",修改結束標記的命令為:mysql >\d
伺服器端命令代表的SQL語句,可以分為三類:
DDL:數據定義語言,主要用於管理資料庫及資料庫的各組件;
組件例如:資料庫,表,視圖,索引,用戶,存儲過程,存儲函數,觸發器,事件等;
常用的SQL語句:CREATE,DROP,ALTER,SHOW
DML:數據操縱語言,主要用於管理表中的數據,實現數據的增,刪,改,查等操作;
常用的SQL語句:INSERT,DELETE,UPDATE,SELECT
DCL:數據控制語言,主要用於管理數據訪問的授權;
常用的SQL語句:GRANT,REVOKE
獲取指定的SQL語句的幫助信息(所有的SQL語句本身,不區分字元大小寫;建議使用小寫字母書寫SQL語句);
mysql> help SQL_STATEMENT_KEYWORK //mysql版本資料庫,一般在CentOS6及以前的版本中
MariaDB [(none)]> help SQL_STATEMENT_KEYWORK //MariaDB版本資料庫,一般在CentOS7中使用的預設資料庫
在mysql中,database(資料庫)和schema(方案)這兩個單詞是一樣的;
利用mysql客戶端工具實現mysql資料庫的相關管理操作:
資料庫管理:
創建資料庫:
格式:CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [ create_specification ]
create_specification:
[DEFAULT] CHARACTER SET [=] charset_name
| [DEFAULT] COLLATE [=] collation_name
示例:
創建一個名為mydb的資料庫並設定字元集是utf8:
mysql> create database mydb character set = utf8;
欄位含義:
DATABASE | SCHEMA:表示要創建的對象的類型為"資料庫"或"方案";
IF NOT EXISTS:如果指定要創建的資料庫已經存在,則不報錯也不執行創建操作;
db_name:要創建的資料庫的名稱;
CHARACTER SET [=] | charset_name:為新創建的資料庫指定其預設的字元集;
示例:mysql> show character set:查看mysql伺服器所支持的所有字元集及預設排序規則;
COLLATE [=] | collation_name:
為新創建的資料庫指定字元集的排序規則;
示例:mysql> show collation:查看mysql伺服器上每種字元集所支持的所有的排序規則;
修改資料庫的屬性(如果資料庫中已經有表,且表中已經插入數據時,更改資料庫的字元集和排序規則可能會導致已存數據的亂碼):
ALTER {DATABASE | SCHEMA} [db_name] alter_specification ... //要指定資料庫名稱,否則刪除所有存在的資料庫
alter_specification:
[DEFAULT] CHARACTER SET [=] charset_name :修改字元集
| [DEFAULT] COLLATE [=] collation_name:修改字元集的排序規則
刪除資料庫:
DROP {DATABASE | SCHEMA} [IF EXISTS] db_name //加上[IF EXISTS],刪除一個不存在的資料庫執行但不會報錯,如果不加[IF EXISTS]刪除一個不存在的資料庫會執行然後報錯,*一定要指定資料庫名稱,否則或刪除所有庫*
表管理(關係型資料庫的核心,數據都存儲於表中):
表:二維表,包括行和列;
行(實體,實例,記錄):用來描述某個具體事物的某些屬性;對於表來說,表中可以沒有任何一行數據,此類表稱為"空表";
列(欄位,域):用來定義或描述某個具體的屬性的格式或定義方式;對於表來說,沒有列的表是無意義的,表中至少要有一列;
數據類型:
定義數據類型的意義:
1.決定數據的存儲格式;
2.決定數據所能參與的運算;
3.決定數據可以表示的有效範圍;
對於mysql來說,支持的數據類型:
數值型:
精確數值型:
MySQL數據類型 括弧中m的值(bits) 有符號範圍 無符號範圍
tinyint(m) 1個位元組 (-128~127) (0~256)
smallint(m) 2個位元組 (-32768~32767) (0~65536)
mediumint(m) 3個位元組 (-8388608~8388607) (0~1677216)
int(m) 4個位元組 (-2147483648~2147483647) (0~2147483648*2)
bigint(m) 8個位元組 (+-(9.22*10)^18) (0~((9.22*10)^18)*2)
是否有符號,可以在定義時規定,預設為有符號,可以用unsigned標識來表示無符號
通過規定數據的顯示寬度,達到統一顯示的目的。
註意定義格式:alter table tbl_int add c tinyint(2) zerofill; //需要使用前導零來填充以達到目的:zerofill;其中若數大於顯示寬度,則直接顯示原數字
近似數值型:
FLOAT:單精度浮點數
示例:一個欄位定義為float(5,3),如果插入一個數123.45678,實際資料庫里存的是123.457,但總個數還以實際為準,即6位
DOUBLE:雙精度浮點數
字元串型:
變長字元型:
VARCHAR(length):字元不區分大小寫;最大存放65536個字元;
VARCHAR(30)
chenliang$ -- 字元只占了VARCHAR總空間30位元組大小中的10位元組,末尾的$用來表示字元結束並將字元占用VARCHAR空間大小+1,如果空間已滿則不顯示$
VARBINARY(length):字元區分大小寫;最大存放65536個字元;
定長字元型
CHAR(length):字元不區分大小寫;256個字元;
CHAR(30)
chenliang -- 字元雖然只占了9位元組存儲空間,但是必須要占用30位元組的空間
BINARY(length):字元區分大小寫;256個字元;
對象存儲類型(大型的數據用於存儲文本塊或圖像、聲音文件等二進位數據類型,比指定類型支持的最大範圍大的值將被自動截短):
TEXT:存儲大量的純文本信息;
TINYTEXT:可最大存放256位元組
TEXT:可最大存放65536位元組
MEDIUMTEXT:可最大存放16777736位元組
LONGTEXT:可最大存放43億9千萬位元組
BLOB:存儲非純文本信息經過流式化處理之後的二進位數據;
TINYBLOB:可最大存放256位元組
BLOB:可最大存放65536位元組
MEDIUMBLOB:可最大存放16777736位元組
LONGBLOB:可最大存放43億9千萬位元組
日期時間型:
類型 名稱 大小(位元組) 格式
DATE 日期型 3 YYYY-MM-DD
TIME 時間型 3 HH:MM:SS
TIMESTAMP 時間戳類型 8 YYYYMMDD HHMMSS
DATETIME 日期時間型 8 YYYY-MM-DD HH:MM:SS
YEAR 年份 2/4 YY/YYYY
內置特殊類型:
集合類型:
SET:集合,插入的數據可以是集合中各個元素的任意組合;
SET('a','b','c','d')
a
aa
aab
abdc
枚舉類型:
ENUM:枚舉,只能存放列舉出來的固定的字元或字元串;
ENUM('F','M')
F
M
數據類型相關的修飾符:
與整數類型相關的:
UNSIGNED,無符號整數; //UNSIGNED修飾符必須緊跟在精確數值類型標識符之後;
AUTO_INCREMENT [=] Value:
整型數據的自動遞增或自動遞減;
通用修飾符:
NOT NULL:非空約束;一般是為主鍵做約束;
DEFAULT Value:為欄位設置預設值;
創建表:
CREATE TABLE [IF NOT EXISTS] tbl_name (create_definition,...) [table_options]
create_definition(創建定義項):表中各個列是怎麼定義的,列的格式,列的類型
col_name :列的名稱
格式:data_type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY] [COMMENT 'string'] [COLUMN_FORMAT {FIXED|DYNAMIC|DEFAULT}] [STORAGE {DISK|MEMORY|DEFAULT}] [reference_definition]
選項:
data_type [NOT NULL | NULL]:數據類型 [不為空|空]
[DEFAULT default_value]:是否設置預設值為多少
[AUTO_INCREMENT]:預設自動增長步長為1
[UNIQUE [KEY]:定義唯一鍵
[PRIMARY] KEY]:定義主鍵
[COMMENT 'string']:定義註釋內容
[COLUMN_FORMAT {FIXED|DYNAMIC|DEFAULT}]:列的格式{靜態|動態|預設格式}
[STORAGE {DISK|MEMORY|DEFAULT}]:存儲方式{磁碟|記憶體|預設位置}
table_options:表選項
ENGINE [=] engine_name | AUTO_INCREMENT [=] value
示例:
mysql> create table stu_info (SID tinyint unsigned not null auto_increment primary key,SName varchar(50) not null,SAge tinyint unsigned,Gender enum('F','M'));
顯示表的結構:mysql> desc stu_info;
顯示創建表的SQL語句:mysql> show create table stu_info;
刪除表:
DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ...
示例:mysql> drop table stu_info;
修改表:修改表的各個欄位的屬性和定義的內容;
ALTER TABLE tbl_name [alter_specification [, alter_specification] ...]
增加表的欄位:
ADD [COLUMN] col_name column_definition [FIRST | AFTER col_name ]
示例:mysql> alter table stu_info add Stel_num varchar(20) not null after SAge;
修改表的欄位屬性
CHANGE [COLUMN] old_col_name new_col_name column_definition [FIRST|AFTER col_name]
MODIFY [COLUMN] col_name column_definition [FIRST | AFTER col_name]
示例:
mysql> alter table stu_info change column Stel_num SMobile char(11) not null after Gender;
mysql> alter table stu_info modify SAge tinyint unsigned after Gender;
刪除表的欄位:
DROP [COLUMN] col_name //刪除欄位的操作可能會引起數據的變化,所以,刪除欄位時要慎重;
示例:mysql> alter table stu_info drop SMobile;
數據管理:實質上就是管理表中的數據;
向表中添加數據:
INSERT [INTO] tbl_name [(col_name,...)] {VALUES | VALUE} ({expr | DEFAULT},...),(...),... //如果列名(col_name,...)省略不寫,則預設表示為為表的每一列添加數據
Or:
INSERT [INTO] tbl_name SET col_name={expr | DEFAULT}, ...
示例:
mysql> insert into stu_info values (1,'tom','M',25),(2,'jerry','F',28);
mysql> insert into stu_info (SName) values ('Alice'),('James');
mysql> insert into stu_info set SName='zhangsan',Gender='M',SAge=20;
註意:
1.如果向表中插入的value是字元串,則value必須使用引號引用;
2.如果向表中插入的value是數字,則value一定不能用引號引用;
查看表中的數據內容:
SELECT select_expr [, select_expr ...] [FROM table_references] [WHERE where_condition]
1.顯示整張表:
SELECT * FROM tbl_name;
2.投影:顯示指定的或符合要求的列;
SELECT col_name AS con_alias[,col_name AS con_alias,...] FROM tbl_name;
示例:mysql> select Host as Hostname,User as Username,Password as Pass from user;
3.選擇:顯示符合要求或匹配條件的行;
SELECT col_name AS con_alias[,col_name AS con_alias,...] FROM tbl_name WHERE condition;
WHERE子句用於指明選擇時依據的條件:
col_name 操作符 value
操作符:
1) 比較操作符:>, <, >=, <=, ==, !=
2) 邏輯操作符:與:and,或:or,非:not
3) 特殊操作符:
BETWEEN...AND...
LIKE "PATTERN",其中"PATTERN"中可以適當添加通配符,如:%或_;
RLIKE "PATTERN",使用正則表達式對字元串進行模式匹配;在使用RLIKE進行數據檢索時,索引不生效,檢索效率低,速度慢,不推薦使用;
IS NULL或IS NOT NULL:判斷指定欄位是否為空;
示例:
mysql> select * from stu_info where SAge >= 30;
mysql> select * from stu_info where SAge >= 10 and SAge <=30;
mysql> select * from stu_info where SAge between 10 and 30;
mysql> select * from stu_info where Gender is [not] null;
mysql> select * from stu_info where SName like '%a%';
mysql> select * from stu_info where SName rlike '^j';
mysql> select * from stu_info where SName rlike 'e$';
4.排序:
SELECT col_name AS con_alias[,col_name AS con_alias,...] FROM tbl_name WHERE condition [ORDER BY {col_name | expr | position} [ASC | DESC], ...]
示例:
mysql> select * from stu_info order by SAge; 預設升序排序;
mysql> select * from stu_info order by SAge desc; 降序排序; //末尾加desc,表示降序
修改表數據內容:
UPDATE [LOW_PRIORITY] [IGNORE] table_reference SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ... [WHERE where_condition] [ORDER BY ...] [LIMIT row_count]
示例:
mysql> update stu_info set SName='Obama' where SID=5;
mysql> update stu_info set SAge=SAge+1;
mysql> update stu_info set SAge=SAge+100 where SID in (1,3,5,7);
註意:修改數據時,一定要考慮清楚是否要添加where條件子句;如果不寫where子句,預設修改全表;
刪除表數據:
DELETE FROM tbl_name [WHERE where_condition] [ORDER BY ...] [LIMIT row_count]
示例:
mysql> delete from stu_info where SID > 3;
mysql> delete from stu_info;
註意:在使用UPDATE和DELETE語句時,除非必要,否則一定要使用WHERE子句或ORDER BY + LIMIT子句來限制要操作的數據;否則即為全表操作;
mysqladmin命令:
mysqladmin - client for administering a MySQL server
常用選項:
-u, -h, -p, -P, -D, -S
各選項功能同mysql命令的選項功能;
常用子命令:
create db_name:創建資料庫;
drop db_name:刪除資料庫;
flush-hosts:清除伺服器緩存中所有信息;
flush-logs:清除日誌,讓日誌滾動;
flush-privileges:刷新授權表;
flush-tables:為表加鎖;
password new-password:為指定的用戶設置新密碼;
start-slave:在msyql的集群服務中的從節點啟動用於實施複製功能的線程;
stop-slave:在msyql的集群服務中的從節點關閉用於實施複製功能的線程;
shutdown:停止服務;
mysqld_safe命令:用於啟動mysql服務,定義mysql的工作特性;
格式:/usr/bin/mysqld_safe [OPTIONS]
註意:所有給出的 OPTION(--option)都是一次性生效;如果期望配置參數永久有效,需要將此類配置參數及參數值直接定義在配置文件中即可;
伺服器運行時變數/伺服器運行時參數:MySQL的運行工作特性;這裡特性有兩種:
1.全局特性:
在全局範圍均有效的伺服器參數所配置定義的工作特性;將會作為每個mysql的會話連接的預設特性參數;
2.會話特性:
僅針對於本次mysql的連接會話生效的特性參數;
查看已經生效的mysql運行參數(特性,變數)
SHOW [GLOBAL | SESSION] VARIABLES [like_or_where]
示例:
show [global] variables like '%innodb%';
查看所有名字中包含innodb字樣的伺服器參數及參數值;可以一次顯示多個;
show [global] variables like 'innodb_file_per_table';
僅查看指定名稱的伺服器參數的參數值;
select @@[global.]innodb_file_per_table;
僅查看指定名稱的伺服器參數的參數值;
伺服器狀態參數/伺服器狀態變數:MySQL工作時的統計信息;有兩種狀態參數:
1.全局
2.會話
查看與狀態及統計信息相關的參數/變數的值;
SHOW [GLOBAL | SESSION] STATUS [like_or_where]
示例:
show [global] status like '%innodb%';
查看所有名字中包含innodb字樣的伺服器狀態參數及其值;可以一次顯示多個;
show [global] staus like 'Com_select';
僅查看指定名稱的伺服器狀態參數的值;
伺服器變數/伺服器參數的修改或調整方法:
1.運行時修改:
MariaDB [(none)]> SET [GLOBAL|SESSION] system_var_name = expr;
MariaDB [(none)]> SET @@[GLOBAL.|SESSION.]system_var_name = expr;
示例:
set global innodb_file_per_table=1;
set @@global.innodb_file_per_table=0;
2.永久修改:
通過在配置文件中直接書寫伺服器參數或變數的賦值語句;重啟服務即可生效;
innodb_file_per_table = ON
mysql_secure_installation:安全初始化腳本;
**MySQL的用戶和許可權管理:**
用戶賬號:
'Username'@