關於數據庫管理系統DBMS--關係型數據庫(MySQL/MariaDB)

數據庫的結構(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-8九、SQL-9二、SQL-9九、SQL-2003(如今使用的標準)

關於{RDBMS(關係型數據庫管理系統)設計範式基礎概念php

設計關係數據庫時,聽從不一樣的規範要求,設計出合理的關係型數據庫,這些不一樣的規範要求被稱爲不一樣的範式,各類範式呈遞次規範,越高的範式數據庫冗餘越小。css

目前關係數據庫有六種範式:第一範式(1NF)、第二範式(2NF)、第三範式(3NF)、巴德斯科範式(BCNF)、第四範式(4NF)和第五範式(5NF,又稱完美範式)。知足最低要求的範式是第一範式(1NF)。在第一範式的基礎上進一步知足更多規範要求的稱爲第二範式(2NF),其他範式以次類推。通常說來,數據庫只需知足第三範式(3NF)就好了。html

(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的基礎上,任何非主屬性不得傳遞依賴於主屬性。

}mysql

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/TCPsql

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.源代碼包:編譯安裝以前,須要先編譯安裝cmakeshell

安裝命令:
    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'@'Hostname' skip_name_resolve = ON 'user'@'172.16.0.1' 'user'@'a.qhdlink.com' skip_name_resolve = OFF Client_IP --> Client_Hostname 在MySQL上可以實施的用戶帳戶的管理操做: CREATE USER DROP USER GRANT RENAME USER REVOKE SET PASSWORD MySQL中的權限類別:管理類;程序類;庫級別;表級別;字段級別; 管理類的權限: CREATE USER DROP USER RELOAD LOCK TABLES REPLICATION CLIENT REPLICATION SLAVE SHUTDOWN FILE SHOW DATABASES PROCESS SUPER 程序類的權限: FUNCTION PROCEDURE TRIGGER 操做:CREATE,ALTER,DROP,EXECUTE 庫級別和表級別的權限: CREATE ALTER SHOW DROP INDEX CREATE VIEW SHOW VIEW GRANT OPTION:可以將管理員自身得到的權限生成一個副本,並轉贈給目標用戶; 表級別的數據操做的權限: INSERT REPLACE DELETE UPDATE SELECT 字段級別(列級別)的數據操做的權限: SELECT(col1,col2,...) UPDATE(col1,col2,...) INSERT(col1,col2,...) 全部的權限: ALL ALL PRIVILEGES MySQL的元數據數據庫:mysql 數據字典數據庫; host db user column_priv procs_priv proxies_prive tables_priv 上述元數據數據庫中的表統稱爲"受權表"; 若是對於受權表的內容進行了修改,MySQL每300秒會自動重讀並使新設置生效; 若是不打算等待,能夠手動刷新受權表: MariaDB [mysql]> FLUSH PRIVILEGES; MySQL用戶管理: 'Username'@'Hostname' Username:任意的字符串組合,只能包含基本意義的字符;能夠包含"_"、"."、"-"; Hostname: FDQN Domain_name IP_ADDRESS 可使用MySQL的專用通配符:%, _ skip_name_resolve={ON|OFF} 建立用戶帳戶: CREATE USER語句: CREATE USER user [IDENTIFIED BY [PASSWORD] 'password' | IDENTIFIED WITH auth_plugin [AS 'auth_string']] 示例: MariaDB [mysql]> create user 'testuser'@'%'; MariaDB [mysql]> create user 'testuser'@'%' identified by 'qhdlink'; 也可使用DML語句建立用戶帳戶: INSERT INTO mysql.user SET User='testuser',Host='%',Password=PASSWORD('qhdlink'); 示例: MariaDB [mysql]> insert into user set User='user1',Host='%',Password=PASSWORD('qhdlink'),ssl_cipher='',x509_issuer='',x509_subject='',authentication_string=''; 重命名用戶帳戶: RENAME USER語句: RENAME USER old_user TO new_user [, old_user TO new_user] ... 示例: MariaDB [mysql]> rename user 'testuser'@'%' to 'test'@'172.16.%.%'; 也可使用DML語句重命名用戶帳戶: 示例: MariaDB [mysql]> update user set User='user01',Host='172.16.75.%' where User='user1'; 刪除用戶帳戶: DROP USER語句: DROP USER user [, user] ... 示例: MariaDB [mysql]> drop user 'test'@'172.16.%.%'; 也可使用DML語句刪除用戶帳戶: 示例: MariaDB [mysql]> delete from user where User='user01'; 用戶帳戶的密碼管理: 1.SET PASSWORD語句: SET PASSWORD [FOR user] = { PASSWORD('cleartext password') | OLD_PASSWORD('cleartext password') | 'encrypted password' } 示例: MariaDB [mysql]> set password for 'test'@'%' = PASSWORD('qhdlink'); 2.也可使用DML語句修改用戶帳戶密碼: 示例: MariaDB [mysql]> update user set Password=PASSWORD('qhdlink.com') where User='test'; 3.mysqladmin工具: # mysqladmin -uUSERNAME -hHOSTNAME -p password 'NEW_PASSWORD' 注意:執行此操做的MySQL用戶須要對mysql.user表有修改權限; 忘記MySQL管理員的密碼的解決辦法: 方法一: 1.中止當前的MySQL或MariaDB服務; 2. 在/etc/my.cnf文件中加入下列兩條服務器參數: skip-grant-tables = ON skip-networking = ON 3.啓動MySQL或MariaDB服務,使用mysql或mysqladmin客戶端工具以空祕密的root用戶登陸,進行root用戶的密碼修改; 4.從/etc/my.cnf中刪除上述兩條服務器參數,再重啓服務便可; 方法二: 1.中止當前的MySQL或MariaDB服務; 2.使用命令啓動MySQL服務: # mysqld_safe --skip-grant-tables --skip-networking 3.啓動另外一個會話鏈接,並使用mysql或mysqladmin客戶端工具以空密碼的root用戶的身份修改其密碼; 4.kill掉此前的mysqld-safe及衍生的mysqld服務; 5.再正常啓動服務便可; 對於已經創建的用戶或未創建的用戶進行受權: GRANT語句: GRANT priv_type [(column_list)] [, priv_type [(column_list)]] ... ON [object_type] priv_level TO user_specification [, user_specification] ... [REQUIRE {NONE | ssl_option [[AND] ssl_option] ...}] [WITH with_option ...] priv_type: SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER, RELOAD, REPLICATION CLIENT, REPLICATION SLAVE, SHUTDOWN, FILE, SHOW DATABASES, PROCESS, SUPER object_type: TABLE | FUNCTION | PROCEDURE priv_level: * | *.* | db_name.* | db_name.tbl_name | tbl_name | db_name.routine_name *:表示全部的數據庫; *.*:表示全部數據庫中的全部表對象; db_name.*:表示指定數據庫中的全部表對象; db_name.tbl_name:表示指定數據庫中的指定的表對象; tbl_name:表示當前正在使用的數據庫中的指定的表對象; db_name.routine_name:表示指定數據庫中的指定存儲函數後存儲過程對象;一般須要使用object_type參數共同決定; user_specification: user [ IDENTIFIED BY [PASSWORD] 'password' | IDENTIFIED WITH auth_plugin [AS 'auth_string' ] ] ssl_option: SSL | X509 | CIPHER 'cipher' | ISSUER 'issuer' | SUBJECT 'subject' with_option: GRANT OPTION | MAX_QUERIES_PER_HOUR count | MAX_UPDATES_PER_HOUR count | MAX_CONNECTIONS_PER_HOUR count | MAX_USER_CONNECTIONS count 示例: MariaDB [mysql]> grant all privileges on hellodb.* to 'test'@'%'; MariaDB [mysql]> grant select,update on hellodb.students to 'test'@'%'; MariaDB [mysql]> grant select(Name,Age,ClassID) on hellodb.students to 'test'@'%'; 也能夠對某些基本表建立視圖以後,再對視圖進行用戶權限受權: MariaDB [hellodb]> create view stu_base as select Name,Age,ClassID from students; MariaDB [hellodb]> grant all on hellodb.stu_base to 'test'@'%'; 取消受權/收回受權: REVOKE語句: REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ... ON [object_type] priv_level FROM user [, user] ... REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ... 示例: MariaDB [mysql]> revoke delete on hellodb.* from 'test'@'%'; MariaDB [mysql]> revoke all on hellodb.students from 'test'@'%'; MariaDB [mysql]> revoke select(Age,ClassID) on hellodb.students from 'test'@'%'; 注意:在取消已經作出的受權時,REVOKE語句所指定的priv_level部分應該和受權時GRANT語句所指定的priv_level保持絕對一致;不然斷定這次取消受權的操做失敗; 示例:前提是testdb數據庫中包含有tb1和tb2兩張表; MariaDB [testdb]> grant all on testdb.* to 'test'@'%'; MariaDB [testdb]> revoke all on testdb.tb2 from 'test'@'%'; ERROR 1147 (42000): There is no such grant defined for user 'test' on host '%' on table 'tb2' 正確的取回受權的方式: MariaDB [testdb]> revoke all on testdb.* from 'test'@'%'; MariaDB [testdb]> grant all on testdb.tb1 to 'test'@'%'; 此時,'test'@'%'用戶就只有對testdb數據庫中tb2表有全部操做權限; 查看用戶的受權: SHOW GRANTS語句: SHOW GRANTS [FOR user]

MariaDB/MySQL的模式:
ANSI:寬鬆模式。對於插入的數據進行校驗,若是該數據不符合字段定義的數據類型或長度要求,則對數據類型進行調整,也能夠對數據進行截取保存,發送warning警告;
TRADITIONAL:嚴格模式。對於插入的數據進行校驗,若是該數據不符合字段定義的數據類型或長度要求,報告Error錯誤警告,且錯誤數據不會被寫入;
該模式用於事務時,此前可能已經進行了一系列的數據插入和修改操做,而一旦發送上述錯誤,此前全部的INSERT/UPDATE等操做均會被當即放棄並回滾。
該模式用於非事務時,一旦發送上述錯誤,則此前全部的INSERT/UPDATE等操做均不會回滾
STRICT_TRANS_TABLES:嚴格模式。對於插入的數據進行校驗,若是該數據不符合字段定義的數據類型或長度要求,報告Error錯誤警告,且錯誤數據不會被寫入;
STRICT_ALL_TABLES:嚴格模式。對於事務型操做,與STRICT_TRANS_TABLES模式效果同樣;對於非事務操做,與TRADITIONAL模式效果同樣。編程

實時修改sql_mode: MariaDB [(none)]> set @@global.sql_mode=TRADITIONAL; 注意: 1.沒有最好或最差的模式,只有最合適的模式; 2.使用上述SQL命令只能一次性生效,若是想要永久修改,則須要編輯配置文件;

SQL:
DDL:數據庫對象;
獲取DDL相關SQL語句的方法:
MariaDB [testdb]> help data definition

數據庫對象:
            DATABASE, TABLE, VIEW, FUNCTION, PRECEDURE, INDEX, ...

DML:數據;
    獲取DML相關SQL語句的方法:
        MariaDB [testdb]> help data manipulation 數據操縱: INSERT/REPLACE, DELETE, UPDATE, SELECT, ...

DDL:
數據庫:
建立數據庫:
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [DEFAULT] [CHARACTER SET [=] charset_name | [DEFAULT] COLLATE [=] collation_name]

修改數據庫的字符集或排序規則:
        ALTER {DATABASE | SCHEMA} [db_name] [DEFAULT] [CHARACTER SET [=] charset_name  | [DEFAULT] COLLATE [=] collation_name]

    刪除數據庫:
        DROP {DATABASE | SCHEMA} [IF EXISTS] db_name

    使用客戶端命令建立數據庫:
        ~]# mysqladmin create mydb ~]# mysql -e "create database mydb;" 使用客戶端命令刪除數據庫: ~]# mysqladmin drop mydb //會對刪除數據庫的操做進行確認; ~]# mysql -e "drop database mydb;" 表: 建立表: CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name (create_definition,...) [table_options] [partition_options] //使用SQL語句全新的定義出一張新表,包括表的名稱、字段數量、數據類型、存儲引擎的選擇等各類屬性; Or: CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)] [table_options] [partition_options] select_statement //利用SELECT語句的查詢結果來填充新表的內容,可是新表的表格式可能與基表不一致,不少的數據類型的修飾符可能會丟失; Or: CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name { LIKE old_tbl_name | (LIKE old_tbl_name) } //直接複製基本的表格式到新表上,但新表中沒有任何數據,即爲空表; 注意: 1.對於MySQL或MariaDB的表來講,存儲引擎是很是重要的概念,一般須要在建立表的時候來指定;若是沒有明確指定,則使用默認的存儲引擎; 2.對於已經建立完成的空表,能夠任意調整其存儲引擎; 3.對於非空表,不建議直接修改表的存儲引擎; 良心建議:在建立表之初或者存儲數據以前,肯定表的存儲引擎; 刪除表: DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ... [RESTRICT | CASCADE] 建議:使用修改表名稱的方式使指定表再也不被繼續使用; 修改表格式: ALTER [ONLINE | OFFLINE] [IGNORE] TABLE tbl_name [alter_specification [, alter_specification] ...] 能夠修改的內容: ADD:字段,索引,約束,鍵(主鍵,惟一鍵,外鍵) CHANGE:字段名稱,字段定義格式和字段的位置; MODIFY:字段定義格式和字段的位置; DROP:字段,索引,約束,鍵; RENAME:修改表名稱; 查看錶結構: DESC [db_name.]tbl_name; 查看錶的定義方式: SHOW CREATE TABLE tbl_name; 查看錶的狀態和屬性信息: SHOW TABLE STATUS [from | in db_name] like 'PATTERN' | where expr; 示例: MariaDB [hellodb]> show table status where name='students'\G 視圖:VIEW,虛表; 就是一個SELECT語句的執行結果; 建立視圖: CREATE VIEW view_name [(column_list)] AS SELECT clause; 示例: MariaDB [hellodb]> create view student as select StuID,Name,Gender from students; 刪除視圖: DROP VIEW [IF EXISTS] view_name [, view_name] ... [RESTRICT | CASCADE] 示例: MariaDB [hellodb]> drop view student; 注意: 可否在視圖中實現插入新的數據記錄,取決於基表中沒有被視圖選擇的字段是否要求不能爲空,若是有此類約束,則結果是沒法插入新數據;不然能夠插入新數據,沒有被視圖選擇的字段內容,默認都爲"NULL"; 索引: 索引的類型: 彙集索引、非彙集索引: 彙集索引:索引和數據存放在一塊兒,找到索引即找到數據; 非彙集索引:索引和數據不存放在一塊兒,索引經過索引指針指向數據所在位置; 稠密索引、稀疏索引:是否索引了每一條數據記錄; 稠密索引:每條數據記錄都有一條索引與之對應; 稀疏索引:並非每條數據記錄都有一條索引與之對應,而是一條索引對應某個或某些數據塊; 主鍵索引、輔助索引: BTree:Balance Tree,B- Tree,BTree,B+Tree 左前綴索引: 注意:在使用BTree索引進行檢索時,給出的PATTERN的最左側字符不要出現通配符,不然,沒法使用索引進行檢索;只能全文遍歷; Hash索引: R Tree:Spacial,空間索引; FULLTEXT:全文索引; 覆蓋索引:索引中的內容就是要檢索的內容,經過檢索索引內容便可當即找到數據,並直接返回檢索結果; EXPLAIN:分析查詢語句的執行路由; 建立索引: 1.在建立表時,經過指定主鍵或惟一鍵,能夠自動建立索引; 2.若是在建立表時,沒有指定主鍵或惟一鍵,則能夠在表成功建立以後添加索引; CREATE [ONLINE|OFFLINE] [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [index_type] ON tbl_name (index_col_name,...) [index_option] ... 示例: MariaDB [hellodb]> create index name_index on students(Name); 查看索引: SHOW {INDEX | INDEXES | KEYS} {FROM | IN} tbl_name [{FROM | IN} db_name] [WHERE expr] 示例: MariaDB [hellodb]> show index from students\G 刪除索引: DROP [ONLINE|OFFLINE] INDEX index_name ON tbl_name 示例: MariaDB [hellodb]> drop index name_index on students; DML:操縱數據; INSERT/REPLACE、DELETE、UPDATE、SELECE INSERT:向表中插入新的數據記錄;每次能夠向表中插入一行或多行數據; INSERT [INTO] tbl_name [(col_name,...)] {VALUES | VALUE} ({expr | DEFAULT},...),(...),... 示例: MariaDB [hellodb]> insert into students (Name,Age,Gender) values ('Rio Messi',31,'M'); MariaDB [hellodb]> insert into students (Name,Age,Gender) values ('Guo Jing',40,'M'),('Huang Rong',27,'F'); 沒有明確的規定字段名稱,則意味着爲一行中的各個字段添加數據內容: MariaDB [hellodb]> insert into students values (30,'Liu Bei',57,'M',1,2); 注意:添加的數據內容,必需要嚴格的對應每一個數據字段,須要保證數據類型的匹配; INSERT [INTO] tbl_name SET col_name={expr | DEFAULT}, ... 示例: MariaDB [hellodb]> insert into students set Name='Tang Xuanzang',Age=35,Gender='M'; INSERT [INTO] tbl_name [(col_name,...)] SELECT ... 將後面SELECT語句的查詢結果插入到選中的目標表中;注意下列問題: 1.SELECT語句的查詢結果中包含的字段數量,應該和目標表中的指定字段數量相同; 2.SELECT語句的查詢結果中包含的各字段的數據類型,必需要與目標表中各字段的數據類型保持一致; 此種插入數據的方法,更多的用於表複製操做; 此前曾經使用CREATE TABLE命令經過複製表格式的方式建立過一個空的新表,而後再將原表中的數據以方法複製到新表中; REPLACE命令與INSERT命令的功能幾乎徹底相同,除了一種特殊狀況以外: 當向表中插入數據時,若是主鍵位置或惟一鍵位置出現重複數據時,不會繼續插入而是選擇替換對應行中各字段的數據; DELETE: Single-table syntax: DELETE FROM tbl_name [WHERE where_condition] [ORDER BY ...] [LIMIT row_count] Multiple-table syntax: DELETE tbl_name[.*] [, tbl_name[.*]] ... FROM table_references [WHERE where_condition] Or: DELETE FROM tbl_name[.*] [, tbl_name[.*]] ... USING table_references [WHERE where_condition] 注意:默認狀況下,MySQL或MariaDB都不會阻止不帶有WHERE條件子句的刪除操做,這將意味着,有可能會由於此操做致使清空整張表中的數據; 限制條件: WHERE where_condition LIMIT row_count ORDER BY ... LIMIT row_count WHERE where_condition LIMIT row_count WHERE where_condition ORDER BY ... LIMIT row_count 示例: MariaDB [hellodb]> delete from students limit 3; 刪除正常的查詢結果中的前三行數據記錄; MariaDB [hellodb]> delete from students where Age<20; 刪除Age字段中值小於20的全部數據記錄; MariaDB [hellodb]> delete from students where Name like 'h%' limit 2; 刪除Name字段以"H|h"開頭的全部數據記錄中的前兩條記錄; MariaDB [hellodb]> delete from students order by age desc limit 3; 刪除根據Age字段進行降序排序的查詢結果中的前三條數據記錄; UPDATE: Single-table syntax: UPDATE table_reference SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ... [WHERE where_condition] [ORDER BY ...] [LIMIT row_count] Multiple-table syntax: UPDATE table_references SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ... [WHERE where_condition] 注意:默認狀況下,MySQL或MariaDB都不會阻止不帶有WHERE條件子句的修改操做,這將意味着,有可能會由於此操做致使整張表中的全部數據記錄被同時修改; 限制條件: WHERE where_condition LIMIT row_count ORDER BY ... LIMIT row_count WHERE where_condition LIMIT row_count WHERE where_condition ORDER BY ... LIMIT row_count 示例: 同DELETE的示例; 注意:在MySQL或MariaDB中,若是服務器變量sql_safe_updates=ON,則能夠阻止不帶有限制條件的UPDATE更新操做或DELETE刪除操做; 臨時調整: MariaDB [hellodb]> set @@sql_safe_updates=ON; 永久生效:/etc/my.cnf sql_safe_updates=ON MariaDB [hellodb]> update students set ClassID=1; ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column SELECT Query Cache:MySQL/MariaDB的查詢結果緩存; K/V對存儲; Key:查詢語句通過hash以後的hash值; Value:查詢語句的執行結果; MySQL/MariaDB的查詢執行路徑: 1.用戶發送請求 --> 查詢緩存(命中) --> 響應用戶; 2.用戶發送請求 --> 查詢緩存(未命中) --> 解析器 --> 預處理器 --> [查詢優化器 -->] 查詢執行引擎 --> 存儲引擎 --> 查詢執行引擎 --> [緩存查詢結果 -->] 響應用戶; SELECT [ALL | DISTINCT | DISTINCTROW ] [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS] select_expr [, select_expr ...] [FROM table_references [WHERE where_condition] [GROUP BY {col_name | expr | position} [ASC | DESC], ... [WITH ROLLUP]] [HAVING where_condition] [ORDER BY {col_name | expr | position} [ASC | DESC], ...] [LIMIT {[offset,] row_count | row_count OFFSET offset}] [PROCEDURE procedure_name(argument_list)] [INTO OUTFILE 'file_name' [CHARACTER SET charset_name] export_options | INTO DUMPFILE 'file_name' | INTO var_name [, var_name]] [FOR UPDATE | LOCK IN SHARE MODE]] DISTINCT:數據去重;即:重複出現的數據僅顯示一次; SQL_CACHE: 顯式的指出必須將這次的查詢語句的執行結果存放至查詢緩存; SQL_NO_CACHE: 顯式的指出絕對不能將這次的查詢語句的執行結果存放至查詢緩存; query_cache_type服務器變量是MySQL的緩存開關,一般有三個取值: 1.ON:啓用緩存功能; 默認緩存全部符合緩存條件的查詢結果;除非使用SQL_NO_CACHE參數明確指出不緩存查詢結果; 2.OFF:關閉緩存功能; 默認不緩存任何查詢結果;僅能緩存使用SQL_CACHE參數明確的指出的查詢結果; 3.DEMAND:按需緩存; 若是明確指出SQL_CACHE,即緩存查詢結果,不然,默認隱式關閉查詢緩存; query_cache_limit | 1048576 query_cache_min_res_unit | 4096 select_expr: *:表示表中的全部字段(列); col1,col2,...coln:普通的列名列表;一般用於執行投影運算; col_name1 as col_alias1,col_name2 as col_alias2, ... 對於查詢結果中的各字段名稱使用別名進行重定義; table_references: [db_name.]tbl_name db_name.* [db_name.]tbl_name1,[db_name.]tbl_name2, ... [db_name.]tbl_name1 as tbl_alias1,[db_name.]tbl_name2 as tbl_alais2, ... 單表查詢: select select_expr1,select_expr2,... from tbl_name where expr group by col_name having expr order by col_name limit WHERE條件子句: 經過指明特定的過濾條件或表達式來實現"選擇"運算;過濾條件有下列幾種: 1.算術表達式:Age+10, 算術操做符:+, -, *, /, %; 2.比較表達式:Age+10<20; 比較操做符:=, <=>, <>, !=, >, >=, <, <=; 3.邏輯表達式: 邏輯操做符:AND, OR, NOT, XOR; 4.其餘表達式: 空值判斷:IS NULL, IS NOT NULL; 連續區間判斷:BETWEEN ... AND ... 至關於<=100 AND >=50; 列表從屬關係判斷:IN (LIST); 模糊值判斷: LIKE:能夠支持通配符,%和_;若是想要使用索引實現加速檢索,則最左側字符不能使用通配符; RLIKE或REGEXP:能夠支持正則表達式元字符;只要在查詢條件中包含正則表達式元字符,則必定沒法使用索引進行檢索;功能很強大,但檢索性能可能變差; GROUP BY子句: 根據指定的字段將查詢結果進行分組歸類,以方便進行聚合運算; 經常使用的聚合運算函數: avg():取平均值運算; max():取最大值運算; min():取最小值運算; sum():作和運算; count():作次數統計; 示例: 統計每一個班級裏面的人數: MariaDB [hellodb]> select ClassID,count(ClassID) as nos from students group by ClassID; 統計每一個班級裏面全部人的平均年齡: MariaDB [hellodb]> select ClassID,avg(Age) as nos from students where ClassID is not null group by ClassID; 統計全部學生中男生和女生的平均年齡: MariaDB [hellodb]> select Gender,avg(Age) as nos from students group by Gender; HAVING子句:對於通過分組歸類並進行了聚合運算之後的結果進行條件過濾; 其條件表達式的書寫格式與WHERE子句相同; 示例: 統計人數超過3人的班級及其人數數據: MariaDB [hellodb]> select ClassID,count(ClassID) as nos from students where ClassID is not null group by ClassID having nos>=3; ORDER BY子句:根據指定的字段將查詢結果進行排序,可使用升序或降序,默認是升序; 升序:ASC 降序:DESC 示例: MariaDB [hellodb]> select ClassID,count(ClassID) as nos from students where ClassID is not null group by ClassID having nos>=3 order by nos desc; LIMIT子句: 對於查詢的結果進行限定行數的輸出; LIMIT {[offset,] row_count | row_count OFFSET offset} 1.LIMIT [offset,] row_count offset:偏移量,在輸出結果中,從第一行開始(含)跳過的不顯示的行數; row_count:要顯示的行數; 示例:顯示查詢結果中的第二行和第三行; MariaDB [hellodb]> select ClassID,count(ClassID) as nos from students where ClassID is not null group by ClassID having nos>=3 order by nos desc limit 1,2; 2.LIMIT row_count OFFSET offset 示例:顯示查詢結果中的第二行和第三行; MariaDB [hellodb]> select ClassID,count(ClassID) as nos from students where ClassID is not null group by ClassID having nos>=3 order by nos desc limit 2 offset 1; 多表查詢: 建議:在生成環境中,能使用單表查詢便可獲得結果的操做,儘量使用單表查詢;由於多表查詢會給服務器形成過大的負載壓力; 所謂多表查詢,即指經過對多個表內容的查詢,以得到具備必定關聯關係的查詢結果的查詢方式;也稱爲鏈接操做,鏈接操做也就是將多張表關聯在一塊兒的方法; 鏈接操做: 交叉鏈接: 也稱爲笛卡爾積鏈接; 內鏈接: 等值鏈接:讓表和表之間經過某特定字段的等值判斷的方式創建的內鏈接; 非等值鏈接:讓表和表之間經過某特定字段的不等值判斷的方式創建的內鏈接;在極少的場合中才有應用; 外鏈接:以某張爲基準表,判斷參考表與基準表之間的鏈接關係; 左外鏈接: 以左表爲基準表,右表爲參考表,顯示出基準表中全部的行,並將參考表中與基準表中有關聯關係的行合併輸出,若是基準表中的行與參考表中無關,則輸出NULL; 鏈接操做符:LEFT JOIN 右外鏈接: 以右表爲基準表,左表爲參考表,顯示出基準表中全部的行,並將參考表中與基準表中有關聯關係的行合併輸出,若是基準表中的行與參考表中無關,則輸出NULL; 鏈接操做符:RIGHT JOIN 天然鏈接: 經過MySQL的進程自行判斷並完成的鏈接過程。一般MySQL會使用表中的名稱相同的字段做爲基本的鏈接條件; 鏈接操做符:NATRUAL INNER 天然外鏈接: 天然左外鏈接: 鏈接操做符:NATURAL LEFT JOIN 天然右外鏈接: 鏈接操做符:NATURAL RIGHT JOIN 自鏈接: 人爲的將一張表中的兩個字段之間創建的鏈接關係; 示例: 交叉內鏈接: 每一個學生所在的班級名稱: MariaDB [hellodb]> select Name,Class from students as s,classes as c where s.CLassID=c.ClassID; MariaDB [hellodb]> select Name,Class from students,classes where students.CLassID=classes.ClassID; 交叉左外鏈接: 每一個學生所在班級的名稱,即便該學生不屬於任何班級: MariaDB [hellodb]> select Name,Class from students left join classes on students.CLassID=classes.ClassID; 交叉右外鏈接: 每一個班級的學生姓名,即便該班級中沒有任何學生; MariaDB [hellodb]> select Class,Name from students right join classes on students.ClassID=classes.ClassID; || MariaDB [hellodb]> select Class,Name from classes left join students on students.ClassID=classes.ClassID; 子查詢:嵌套查詢; 在SELECT查詢語句中嵌套另外一個SELECT查詢語句;等同於從某個視圖中獲取查詢結果; SELECT col1,col2,* FROM tbl_name WHERE col OPTS VALUE; 示例: 用於WHERE子句中的子查詢: 查詢學生中年齡大於全班平均年齡的學生的姓名和年齡; MariaDB [hellodb]> select Name,Age from students where Age>(select avg(Age) from students); 用於IN子句中的子查詢: 查詢學生的年齡和老師的年齡相同的學生的名字: MariaDB [hellodb]> select Name from students where Age in (select Age from teachers); 查詢學生的年齡和老師的年齡相同的學生和老師的名字: MariaDB [hellodb]> select t.Name as Teacher,s.Name as Student from students as s,teachers as t where s.Age=t.Age; 用於FROM子句的子查詢: 查詢有班級的學生對應的班級名稱: MariaDB [hellodb]> select s.Name,s.Class from (select StuID,students.Name,students.Age,Gender,Class from students,classes where students.ClassID=classes.ClassID) as s; 聯合查詢: 將多張表的內容經過多個SELECT語句查詢獲得的結果組合輸出; 注意:使用聯合查詢的前提條件: 多張表須要有相同數據類型的字段; 操做符:UNION 示例: MariaDB [hellodb]> select StuID as ID,Name,Age,Gender from students union select TID as ID,Name,Age,Gender from teachers; select查詢: 單表查詢 --> 多表查詢(交叉內鏈接) --> 多表查詢(外鏈接) --> 子查詢 --> 聯合查詢;

MySQL的存儲引擎:
存儲引擎也稱爲表類型,是一種表級別的概念,原則上來講,每張表均可以獨立地使用某一個存儲引擎;但出於穩定性考慮,在同一個數據庫中的多張表最好選擇同一種存儲引擎;

對於MySQL或MariaDB來講,支持插件式存儲引擎:
    默認狀況下,若是使用RPM包安裝的MySQL或MariaDB,插件文件所在的目錄爲:
        /usr/lib64/mysql/plugin

    安裝一個插件:
        INSTALL PLUGIN plugin_name SONAME 'shared_library_name' plugin_name的相應內容,能夠參考官方站點: http://dev.mysql.com/doc/refman/5.5/en/plugin-data-structures.html 示例: MariaDB [mysql]> install plugin sphinx soname 'ha_sphinx.so'; 注意:使用此方法安裝插件(存儲引擎)以後,會當即自動激活; 卸載一個插件: UNINSTALL PLUGIN plugin_name 示例: MariaDB [mysql]> uninstall plugin sphinx; 注意:每張表,只能使用一個存儲引擎;若是在建立表時沒有給出指定的存儲引擎,MySQL會將新建表的存儲引擎設置爲默認的存儲引擎; 使用SHOW ENGINES命令查看時,support字段的值爲DEFAULT的即爲當前MySQL的默認存儲引擎;當前版本的MariaDB中,默認存儲引擎爲"InnoDB"; 在建立表時,能夠用的一個選項: CREATE TABLE tbl_name (...) ENGINE [=] engine_name; 在表建立以後,插入數據以前,能夠修改存儲引擎的類型: ALTER TABLE tbl_name ENGINE [=] engine_name 注意:不一樣的存儲引擎對於數據的管理方式會不一樣,有時可能會有很大區別,所以,對於空表來講,能夠任意修改其存儲引擎;對於已經存放了數據的表來講,強烈不建議修改表的存儲引擎; 當前MySQL系統上默承認以使用的存儲引擎: MyISAM: 最經典的MySQL的存儲引擎;對於MyISAM而言,有一個缺陷——若是MySQL運行時因意外崩潰,再重啓時須要對錶進行修復,而MyISAM存儲引擎沒法保證表的安全修復; Aria: 具備崩潰後安全修復表特性的加強版的MyISAM存儲引擎; InnoDB: CSV: 基於文本文件存儲數據的存儲引擎;跨數據庫實現數據彼此交換時,比較有用;但CSV中存放的浮點類型的數值數據必定會損失數據精度; MRG_MYISAM: 用於實現將多個MyISAM表在邏輯層上鍊接在一塊兒,用戶就像使用一張表同樣去使用多張表; BLACKHOLE: 黑洞存儲引擎,在級聯複製時比較有用;通常用於記錄binlog作複製的中繼; MEMORY: 內存級的存儲引擎;沒法實現數據持久功能,多用於做爲臨時表(內存表)的存儲引擎;MEMORY是惟一的支持用戶顯式定義hash索引的存儲引擎,所以其查詢速度是很是快的; PERFORMANCE_SCHEMA 展現MySQL運行過程當中的狀態參數和統計數據;這些統計數據自己是MySQL內部的專有數據結構,可是有時用戶須要查詢這些信息,所以PERFORMANCE_SCHEMA就將此類數據虛化成一個MySQL認爲可使用的關係型接口(表); ARCHIVE: 歸檔存儲引擎,一般用來作數據倉庫;這種類型的存儲引擎通常僅支持select和insert語句,且自己不支持索引。適合於存放大量的獨立的做爲歷史記錄的數據。ARCHIVE存儲引擎擁有高效的插入速度,查詢速度相對較慢,用於日誌記錄和聚合函數分析較合適; FEDERATED:將不一樣MySQL服務器聯合起來,邏輯上組成一個完整的數據庫。很是適合於分佈式應用; MyISAM存儲引擎: 優勢: 支持全文索引(FULLTEXT INDEX),能夠實現相似於搜索引擎的功能;實施數據的高效檢索 支持R TREE索引(空間函數的支持(GIS)) 支持數據的壓縮存儲;一旦數據被壓縮,使得數據的佔用空間更小,可是隻能檢索; 支持複雜的行格式定義: ROW_FORMAT [=] {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT} 缺點: 不支持事務; 鎖粒度粗糙,僅支持表級鎖; 崩潰後沒法保證表可以進行安全修復;(Aira) MyISAM存儲引擎的適用場景: 1.只讀或讀多寫少的場景 2.較小的表,以保證崩潰後修復的時間較短,數據丟失較少; MyISAM存儲引擎管理數據表文件的方式: 每一個由MyISAM存儲引擎管理的表,都包含三個文件,直接存儲於數據庫目錄中; tbl_name.frm:format,表格式定義的內容; tbl_name.MYD:MyISAM Data,表中的數據內容; tbl_name.MYI:MyISAM Index,表中可用的索引; 總結: 性能: 表級鎖,併發訪問性能相對較差,尤爲是寫鎖,阻塞全部的讀操做,串行訪問; 支持非彙集索引,全文索引及空間索引,檢索數據時的速度和效率相對較高; 表壓縮,只能讀,沒法接收寫操做請求; 延遲的索引更新,比較合理的利用磁盤IO的性能; 數據安全: 支持手動或自動修復,但可能會致使數據丟失;
相關文章
相關標籤/搜索