MySQL/MariaDB基礎

數據庫管理系統很早就有了,在最開始時,數據庫管理的結構是層次化的,即層次模型,它是一個樹形結構,可以通過有限次的查找來定位需要的數據,然而,這種查找還是需要遍歷才能實現,所以這種模型應用時間不長久;之後有了網狀模型,也就是多個樹的集合;層次模型和網狀模型都稱爲非關係型數據庫。之後由Edgar Frank Codd提出了一個關係型數據庫的模型,從此之後就有了關係模型,其中Oracle公司就是以此爲原型開發了Oracle數據庫;到現在又提出了反關係模型——No-SQL,它是非關係型的數據庫,例如:鍵值對存儲(memcached,redis),HBASE文檔數據庫等;
大致來講數據庫管理系統發展歷程就是:
層次模型 --> 網狀模型 --> 關係模型 --> No-SQL

這裏我們主要來說說關係型數據庫:
1.表
對於關係型數據庫而言,最基本的數據管理單位爲表,也稱爲二維表,一個表是由行跟列組成的:
行(row):實例實體,記錄,記錄數據的特徵;(例如:某學生的成績信息;);
列(column):字段,域;記錄數據的某種屬性;(例如:默認的身高;)
其中,任何一張RDBMS的表中,可以沒有行,但至少要保證要有一列;否則它就不是表,也存儲不了數據;
對錶的操作是通過關係運算完成的:
選擇:從指定表中檢索符合條件的行;
SELECT * FROM tbl_name WHERE clause;
投影:從指定的表中檢索符合條件的列;
SELECT column1,column2,column3 as column3_alias FROM tbl_name;
可以同時實現選擇和投影的關係運算:
SELECT column1,column2,column3 as column3_alias FROM tbl_name WHERE clause;

2.索引
根據主鍵,外鍵,聯合建,建立成索引,根據索引可以很快查找到數據對應的位置;即提高數據的檢索速度;mysql/mariadb由於不同的存儲引擎,支持的索引也有不同:B-tree平衡樹索引;hash索引;空間索引;

3.視圖
view,也叫作虛表;包含已知表中的一部分列,或所有的列;比如員工的×××信息、工資標準等,但是爲了安全與保密,這張表不能完全提供給所有人訪問,所以就將這張表某些列做成視圖,例如:我將表中A的信息做成視圖,並將視圖授權給A,A可以訪問這個視圖,獲得自己的相關信息,B沒有被授權,那B看不了A的信息;

4.SQL接口
提供了一種能夠跟數據庫管理系統做交互式操作的接口;根據SQL接口來完成編程操作;類似於Linux中的Shell;

5.存儲過程、存儲函數
SQL也能實現編程功能:實施變量定義,函數,循環,選擇等;實現這個功能的叫做存儲過程和存儲函數:
存儲過程,使用call語句來調用
存儲函數,使用select語句調用
兩個定義不同點在於過程沒有返回值,函數可以有返回值;

6.觸發器
類似於條件選擇,當符合某個條件的時候,執行某個操作,調用某個函數,完成某個過程;可以認爲是一個特殊的存儲過程或者存儲函數;

7.事件調度器

8.調用接口
DDL、DML、DCL

9.約束
即向數據表中插入的數據必須遵守的限制規則(範式);
主鍵約束:填入主鍵的數據,不能和已經填寫的數據相同,而且不能爲空;
外鍵約束:也稱爲"引用性約束";一個表中的某個字段能插入的數據,取決於另一個表的主鍵中包含的數據;即:如果某表中頻繁出現冗餘信息,應該將此類信息存儲於其他的表中,而此表中該字段的數據爲另一張表的主鍵中所包含的值;
唯一鍵約束:類似主鍵約束,不能和已經填寫的數據相同,但是可以爲空;
檢查性約束:也稱爲表達式約束,取決於表達式的書寫規範;

SQL的大致組成就是如此,而且不論是關係型或是非關係型數據庫都由三層模型構成:視圖層;面向最終用戶;邏輯層;面向程序員或DBA;物理層;面向系統管理員;
RDBMS的應用實現:
商業版:Oracle,DB2,Sybase,Infomix,SQL Server,MySQL;
開源版:MySQL Community Server,MariaDB,PostgreSQL,SQLlite;

如今在CentOS中比較流行的數據庫管理系統是MySQL/MariaDB,他們擁有屬於自己的特性:
插件式的存儲引擎:
1.存儲引擎於MySQL/MariaDB而言,也被稱爲"表類型":MyISAM,InnoDB,XtraDB(InnoDB),Aria,BlackHole,...
2.單進程多線程;

在Linux(CentOS)中安裝MySQL/MariaDB:
1.rpm包
2.Binary Package:二進制包
3.SourceCode Package:壓縮包,然而需要使用cmake工具編譯安裝;

當用以上三種方法安裝完成以後,MySQL/MariaDB有自己的配置文件,在不同位置有多個配置文件,通常按照一定的順序來讀取其中的配置參數:
Default options are read from the following files in the given order:/etc/mysql/my.cnf /etc/my.cnf /etc/my.cnf.d ~/.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

如果在命令行中給出此選項,則此選項必須是第一個選項,此時,將所有其他的配置文件按照指定順序讀取完成之後,最後再附加讀取此選項指定的配置文件中參數值配置,只要有參數配置衝突,則必然以此選項指定的文件中的參數中爲最終生效的參數值;

     可以通過ps aux | grep mysql查看是否附加上了上面的選項:

MySQL/MariaDB基礎

MySQL/MariaDB配置文件的風格:
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/MariaDB的程序環境:
程序文件:
服務器端程序:
mysqld_safe、mysqld_multi
客戶端程序:
msyql、mysqladmin、mysqldump、...
服務器端輔助管理工具程序:
myisam*、my_print_defaults、mysql_secure_installation、mysql_install_db、...

mysql命令
交互式命令行工具和非交互式命令行工具;
-u, -h, -p, -P, -D, -S, -e
MySQL/MariaDB基礎

交互式模式:
客戶端命令:
?(\?,\h), \c, \d, \g, \G, \q, ., !, \s, \u, ...

服務器端命令:
    SQL語句,需要使用語句結束符;
    help COMMAND

    DDL:
    CREATE、DROP、ALTER、SHOW;
    DML:
    SELECT、INSERT、UPDATE、DELETE;
    DCL:
    GRANT、REVOKE;

mysql命令支持mysql腳本的執行:
mysql [options] [DB_NAME] < /PATH/TO/SOME_SQL_SCRIPT_FILE
MySQL/MariaDB基礎
MySQL/MariaDB基礎

mysqladmin命令:
mysqladmin - client for administering a MySQL server
常用選項:
-u, -h, -p, -P, -D, -S
各選項功能同mysql命令的選項功能;

常用子命令:
create db_name:創建數據庫;
MySQL/MariaDB基礎
MySQL/MariaDB基礎

drop db_name:刪除數據庫;
MySQL/MariaDB基礎

flush-hosts:清除服務器緩存中所有信息;
flush-logs:清除日誌,讓日誌滾動;
flush-privileges:刷新授權表;
flush-tables:爲表加鎖;
password new-password:爲指定的用戶設置新密碼;
MySQL/MariaDB基礎
MySQL/MariaDB基礎
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]

查看所有名字中包含innodb字樣的服務器參數及參數值;可以一次顯示多個;
MySQL/MariaDB基礎

僅查看指定名稱的服務器參數的參數值;
MySQL/MariaDB基礎

僅查看指定名稱的服務器參數的參數值;
MySQL/MariaDB基礎

服務器狀態參數/服務器狀態變量:MySQL工作時的統計信息;有兩種狀態參數:
        1.全局
        2.會話

        查看與狀態及統計信息相關的參數/變量的值;
            SHOW [GLOBAL | SESSION] STATUS [like_or_where]

查看所有名字中包含innodb字樣的服務器狀態參數及其值;可以一次顯示多個;
MySQL/MariaDB基礎

僅查看指定名稱的服務器狀態參數的值;
MySQL/MariaDB基礎

服務器變量/服務器參數的修改或調整方法:
        1.運行時修改:
            MariaDB [(none)]> SET [GLOBAL|SESSION] system_var_name = expr;
            MariaDB [(none)]> SET @@[GLOBAL.|SESSION.]system_var_name = expr;
![](http://i2.51cto.com/images/blog/201807/23/160ba485e1b067c1f87a5392e756c9f1.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
![](http://i2.51cto.com/images/blog/201807/23/70804904a58b8d1a8fad65e46d4a2c2c.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
2.永久修改:
            通過在配置文件中直接書寫服務器參數或變量的賦值語句;重啓服務即可生效;
![](http://i2.51cto.com/images/blog/201807/23/2253b7ea1a1c1495b67880bfc7144aa3.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

mysql_secure_installation命令:安全初始化腳本;
MySQL/MariaDB基礎
按照操作一步步做就行;

SQL_MODE和數據類型詳解

SQL:結構化查詢語言;在IBM公司發佈了一些標準後,之後由ANSI(美國國家標準委員會)又重新定義發佈了一些標準:SQL-86,SQL-89,SQL-92,SQL-99,SQL-03

每一個標準內部又有不同的寬鬆程度的規定(SQL_MODE),在MariaDB/MySQL中有:

ANSI:寬鬆模式。對於插入的數據進行校驗,如果該數據不符合字段定義的數據類型或長度要求,則對數據類型進行調整,也可以對數據進行截取保存,發送warning警告;

TRADITIONAL:嚴格模式。對於插入的數據進行校驗,如果該數據不符合字段定義的數據類型或長度要求,報告Error錯誤警告,且錯誤數據不會被寫入;
該模式用於事務時,此前可能已經進行了一系列的數據插入和修改操作,而一旦發送上述錯誤,此前所有的INSERT/UPDATE等操作均會被立即放棄並回滾。
該模式用於非事務時,一旦發送上述錯誤,則此前所有的INSERT/UPDATE等操作均不會回滾

STRICT_TRANS_TABLES:嚴格模式。對於插入的數據進行校驗,如果該數據不符合字段定義的數據類型或長度要求,報告Error錯誤警告,且錯誤數據不會被寫入;

STRICT_ALL_TABLES:嚴格模式。對於事務型操作,與STRICT_TRANS_TABLES模式效果一樣;對於非事務操作,與TRADITIONAL模式效果一樣。

實時修改sql_mode:
MySQL/MariaDB基礎
MySQL/MariaDB基礎

永久修改/etc/my.cnf:然後重啓服務即可
MySQL/MariaDB基礎
注意:
1.沒有最好或最差的模式,只有最合適的模式;
2.使用上述SQL命令只能一次性生效,如果想要永久修改,則需要編輯配置文件;

MySQL的數據類型:

字符型:
CHAR(#),BINARY(#):定長字符類型;CHAR類型不區分字符大小寫,BINARY類型區分;
VARCHAR(#),VARBINARY(#):變長字符類型;
TEXT:TINYTEXT,TEXT,MEDIUMTEXT,LONGTEXT;
BLOB:TINYBLOB,BLOB,MEDIUMBLOB,LONGBLOB;

數值型:
浮點型:近似值;
單精度
雙精度
REAL
BIT
整型:精確值;
INTEGER:TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT;
BOOLEAN
DICIMAL
OCTAL
HEXIMAL
日期時間型:
日期型:DATE 2018/07/19
時間型:TIME 9:38:42
日期時間型:DATETIME 2018/07/19 9:38:42
時間戳:TIMESTAMP,數值型的整型;
內建類型:
ENUM:枚舉;
SET:集合;
數據類型的修飾符:
字符型:NULL, NOT NULL, DEFAULT 'STRING',CHARACTER SET 'CHARSET', COLLATION "COLLATION";
整型:NULL, NOT NULL, DEFAULT 'VALUE', AUTO_INCREMENT, UNSIGNED;
日期時間型:NULL, NOT NULL, DEFAULT 'DATE/TIME/DATETIME'
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
MySQL/MariaDB基礎
MySQL/MariaDB基礎
MySQL/MariaDB基礎

MySQL/MariaDB基礎

表:
創建表:
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.對於非空表,不建議直接修改表的存儲引擎;
    良心建議:在創建表之初或者存儲數據之前,確定表的存儲引擎;

MySQL/MariaDB基礎

刪除表:
DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ... [RESTRICT | CASCADE]

建議:使用修改表名稱的方式使指定表不再被繼續使用;

MySQL/MariaDB基礎

修改表格式:
ALTER [ONLINE | OFFLINE] [IGNORE] TABLE tbl_name [alter_specification [, alter_specification] ...]

可以修改的內容:
    ADD:字段,索引,約束,鍵(主鍵,唯一鍵,外鍵)
    CHANGE:字段名稱,字段定義格式和字段的位置;
    MODIFY:字段定義格式和字段的位置;
    DROP:字段,索引,約束,鍵;
    RENAME:修改表名稱;

查看錶結構:
DESC [db_name.]tbl_name;
MySQL/MariaDB基礎

查看錶的定義方式:
SHOW CREATE TABLE tbl_name;
MySQL/MariaDB基礎

查看錶的狀態和屬性信息:
SHOW TABLE STATUS [from | in db_name] like 'PATTERN' | where expr;
MySQL/MariaDB基礎

視圖:VIEW,虛表;
就是一個SELECT語句的執行結果;

創建視圖:
CREATE VIEW view_name [(column_list)] AS SELECT clause;
MySQL/MariaDB基礎

刪除視圖:
DROP VIEW [IF EXISTS] view_name [, view_name] ... [RESTRICT | CASCADE]
MySQL/MariaDB基礎

注意:
能否在視圖中實現插入新的數據記錄,取決於基表中沒有被視圖選擇的字段是否要求不能爲空,如果有此類約束,則結果是無法插入新數據;否則可以插入新數據,沒有被視圖選擇的字段內容,默認都爲"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] ...

MySQL/MariaDB基礎

查看索引:
SHOW {INDEX | INDEXES | KEYS} {FROM | IN} tbl_name [{FROM | IN} db_name] [WHERE expr]
MySQL/MariaDB基礎

刪除索引:
DROP [ONLINE|OFFLINE] INDEX index_name ON tbl_name
MySQL/MariaDB基礎

DML:操縱數據;
INSERT/REPLACE、DELETE、UPDATE、SELECE

INSERT:向表中插入新的數據記錄;每次可以向表中插入一行或多行數據;
INSERT [INTO] tbl_name [(col_name,...)] {VALUES | VALUE} ({expr | DEFAULT},...),(...),...
MySQL/MariaDB基礎
MySQL/MariaDB基礎

    沒有明確的規定字段名稱,則意味着爲一行中的各個字段添加數據內容:

MySQL/MariaDB基礎

MySQL/MariaDB基礎

    注意:添加的數據內容,必須要嚴格的對應每個數據字段,需要保證數據類型的匹配;

INSERT [INTO] tbl_name SET col_name={expr | DEFAULT}, ...

MySQL/MariaDB基礎
MySQL/MariaDB基礎

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]

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
刪除正常的查詢結果中的前三行數據記錄;
MySQL/MariaDB基礎

刪除Age字段中值小於20的所有數據記錄;
MySQL/MariaDB基礎

刪除Name字段以"H|h"開頭的所有數據記錄中的前兩條記錄;
MySQL/MariaDB基礎

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

注意:在MySQL或MariaDB中,如果服務器變量sql_safe_updates=ON,則可以阻止不帶有限制條件的UPDATE更新操作或DELETE刪除操作;
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():做次數統計;

統計每個班級裏面的人數:
MySQL/MariaDB基礎

統計每個班級裏面所有人的平均年齡:
MySQL/MariaDB基礎

統計所有學生中男生和女生的平均年齡:
MySQL/MariaDB基礎

HAVING子句:對於經過分組歸類並進行了聚合運算以後的結果進行條件過濾;
其條件表達式的書寫格式與WHERE子句相同;

統計人數超過3人的班級及其人數數據:
MySQL/MariaDB基礎

ORDER BY子句:根據指定的字段將查詢結果進行排序,可以使用升序或降序,默認是升序;
升序:ASC
降序:DESC

MySQL/MariaDB基礎

LIMIT子句:
對於查詢的結果進行限定行數的輸出;
LIMIT {[offset,] row_count | row_count OFFSET offset}

    1.LIMIT [offset,] row_count
        offset:偏移量,在輸出結果中,從第一行開始(含)跳過的不顯示的行數;
        row_count:要顯示的行數

顯示查詢結果中的第二行和第三行;
MySQL/MariaDB基礎

    2.LIMIT row_count OFFSET offset

顯示查詢結果中的第二行和第三行;
MySQL/MariaDB基礎

多表查詢:
建議:在生成環境中,能使用單表查詢即可得到結果的操作,儘可能使用單表查詢;因爲多表查詢會給服務器造成過大的負載壓力;

所謂多表查詢,即指通過對多個表內容的查詢,以獲得具有一定關聯關係的查詢結果的查詢方式;也稱爲連接操作,連接操作也就是將多張表關聯在一起的方法;

連接操作:
    交叉連接:
        也稱爲笛卡爾積連接;

    內連接:
        等值連接:讓表和表之間通過某特定字段的等值判斷的方式建立的內連接;

        非等值連接:讓表和表之間通過某特定字段的不等值判斷的方式建立的內連接;在極少的場合中才有應用;

    外連接:以某張爲基準表,判斷參考表與基準表之間的連接關係;
        左外連接:
            以左表爲基準表,右表爲參考表,顯示出基準表中所有的行,並將參考表中與基準表中有關聯關係的行合併輸出,如果基準表中的行與參考表中無關,則輸出NULL;

            連接操作符:LEFT JOIN

        右外連接:
            以右表爲基準表,左表爲參考表,顯示出基準表中所有的行,並將參考表中與基準表中有關聯關係的行合併輸出,如果基準表中的行與參考表中無關,則輸出NULL;

            連接操作符:RIGHT JOIN

    自然連接:
        通過MySQL的進程自行判斷並完成的連接過程。通常MySQL會使用表中的名稱相同的字段作爲基本的連接條件;

        連接操作符:NATRUAL INNER

        自然外連接:

        自然左外連接:
            連接操作符:NATURAL LEFT JOIN

        自然右外連接:
            連接操作符:NATURAL RIGHT JOIN

    自連接:
        人爲的將一張表中的兩個字段之間建立的連接關係;

交叉內連接:
每個學生所在的班級名稱:
MySQL/MariaDB基礎

交叉左外連接:
每個學生所在班級的名稱,即使該學生不屬於任何班級:
MySQL/MariaDB基礎

交叉右外連接:
每個班級的學生姓名,即使該班級中沒有任何學生;
MySQL/MariaDB基礎

子查詢:嵌套查詢;
在SELECT查詢語句中嵌套另一個SELECT查詢語句;等同於從某個視圖中獲取查詢結果;

SELECT col1,col2,* FROM tbl_name WHERE col OPTS VALUE;

用於WHERE子句中的子查詢:
查詢學生中年齡大於全班平均年齡的學生的姓名和年齡;
MySQL/MariaDB基礎

用於IN子句中的子查詢:
查詢學生的年齡和老師的年齡相同的學生的名字:
MySQL/MariaDB基礎

            查詢學生的年齡和老師的年齡相同的學生和老師的名字:

MySQL/MariaDB基礎

用於FROM子句的子查詢:
查詢所有班級的學生對應的班級名稱:
MySQL/MariaDB基礎

聯合查詢:
將多張表的內容通過多個SELECT語句查詢得到的結果組合輸出;

注意:使用聯合查詢的前提條件:
    多張表需要有相同數據類型的字段;

    操作符:UNION

MySQL/MariaDB基礎

MySQL之用戶賬戶管理詳解:
在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

程序類的權限:
    FUNCITION
    PROCEDURE
    TRIGGER
    操作:CREATE,ALTER,DROP,EXECUTE

庫級別的權限:
    CREATE
    ALTER
    SHOW
    DROP
    INDEX
    CREATE VIEW
    SHOW VIEW
    GRANT OPTION:能夠將管理員自身獲得的權限生成一個副本,並轉贈給目標用戶;

表級別的權限:
    INSERT
    DELETE
    UPDATE
    SELECT
    REPLACE

字段級別(列級別)的數據操作的權限:
    SELECT(cil1,col2,...)
    UPDATE(cil1,col2,...)
    INSERT(cil1,col2,...)

所有的權限:
    ALL
    ALL PRIVILEGES

MySQL的元數據數據庫:mysql
    數據字典數據庫:
        host
        db
        user

        column_pric
        procs_priv
        proxies_priv
        tables_priv

        上述元數據數據庫中的表統稱爲"授權表";    

        如果對於授權表的內容進行了修改,MySQL每300秒會自動重讀並使新設置生效;

        如果不打算等待,可以手動刷新授權表;
            MariaDB [mysql]> FLUSH PRIVILIGES;

MySQL用戶管理:br/>'Username'@'Hostname'
Username:任意的字符串組合,只能包含基本意義的字符串;可以包含"_ "、"."、" -";
Hostname:
FQDN
Domain_name
IPADDR
可以使用MySQL的專用通配符;%,

創建用戶賬戶:
    CREATE USER語句;
    CREATE USER user [IDENTIFIED BY [PASSWORD] 'password' | IDENTIFIED WITH auth_plugin [AS 'auth_string']]

MySQL/MariaDB基礎

也可以使用DML語句創建用戶賬戶:
INSERT INTO mysql.user SET User='USER_NAME',Host='%',Password='PASSWORD(password)'
MySQL/MariaDB基礎
MySQL/MariaDB基礎

重命名用戶賬戶:
RENAME USER old_user To new_user [,old_user to new_user] ...
MySQL/MariaDB基礎
MySQL/MariaDB基礎

刪除用戶賬戶:
DROP USER;
MySQL/MariaDB基礎
MySQL/MariaDB基礎

用戶賬戶的密碼管理:
1.SET PASSWORD語句:
SET PASSWORD [FOR user] = {PASSWORD('cleartext password')
MySQL/MariaDB基礎
MySQL/MariaDB基礎

2.也可以使用DML語句修改用戶賬戶密碼;

MySQL/MariaDB基礎
MySQL/MariaDB基礎
MySQL/MariaDB基礎

3.mysqladmin工具;
    mysqladmin -uuser_name -hHOSTNAME -p password 'NEW_PASSWORD'

    注意:執行此操作的MySQL用戶需要對用戶進行權限授權;

忘記MySQL管理員的密碼的解決方法:
方法一:
1.停止當前的MySQL或MariaDB服務;
2.在/etc/my.cnf文件中加入下列兩條服務器參數;
skip-grant-tables=ON
skip-networking=ON
3.啓動MySQL或MariaDB服務,使用mysql客戶端工具以空密碼登錄並修改root密碼;
4.從/etc/my.cnf文件中添加的兩條語句刪除;在重啓服務;

方法二:
    1.停止當前的MySQL或MariaDB服務;
    2.使用mysqld_safe --skip-grant-tables --skip-networking在前端啓動mysql;
    3.在另一臺服務器上使用mysql客戶端工具以空密碼登錄並修改root密碼;
    4.kill掉第二步中的任務;

對於已經建立的用戶或未建立的用戶進行授權:
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:
        GRANT 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,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.tb1_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

MySQL/MariaDB基礎
MySQL/MariaDB基礎
//因爲授權只對該用戶授權了hellodb數據庫的所有權限,所以除了hellodb其他的數據庫看不到;

MySQL/MariaDB基礎
MySQL/MariaDB基礎
MySQL/MariaDB基礎
MySQL/MariaDB基礎
//這個設置,使得改用戶只能對對應數據庫中的特定項查看,其他選項雖然有,但是他沒權限查看;

取消授權/收回授權:
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] ...

注意:取消已經做出的授權時,REVOKE語句所指定的priv_level部分應該和授權時GRANT語句所指定的priv_level保持絕對一致;否則判定此次取消授權的操作失敗;

MySQL/MariaDB基礎
MySQL/MariaDB基礎

MySQL/MariaDB基礎
//我授權的時候,是對hellodb.*操作,然後取消授權的時候是hellodb.students,這樣是錯誤的

查看用戶的授權:
SHOW GRANTS:
SHOW GRANTS [FOR user]
MySQL/MariaDB基礎

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

對於MySQL或MariaDB來說,支持插件式存儲引擎;
默認情況下,如果使用RPM包安裝的MySQL或MariaDB,插件文件所在的目錄爲:/usr/lib64/mysql/plugin
查看引擎:
MySQL/MariaDB基礎

安裝一個插件:
    INSTALL PLUGIN plugin_name SONAME 'shared_library_name'

    plugin_name的響應內容,可以參考官方站點:
        http://dev.mysql.com/doc/refman/5.5/en/plugin-data-structures.html

MySQL/MariaDB基礎
MySQL/MariaDB基礎

    注意:使用此方法安裝插件(存儲引擎)之後,會立即自動激活;

卸載一個插件:
    UNINSTALL PLUGIN plugin_name

MySQL/MariaDB基礎

注意:每張表只能使用一個存儲引擎;如果在創建表時沒有給出指定的存儲引擎;MySQL會將新建表的存儲引擎

使用SHOW ENGINES命令查看時,support字段的值爲DEFAULT的即爲當前MySQL的默認存儲引擎;當前版本的MariaDB中,默認存儲引擎爲InnoDB;

在創建表時,可以使用的一個選項:
CREATE TABLE tbl_name (...) ENGINE [=] engine_name;

在表創建之後,插入數據之前,可以修改存儲引擎的類型:
    ALTER TABLE tbl_name ENGINE [=] engine_name
    示例:
        MariaDB [xwl]> alter table x2 engine = MyISAM;

    注意:不同的存儲引擎對於數據的管理方式會不同,有時可能會有很大區別,因此,對於空表來說,可以任意修改其存儲引擎,對於已經存放了數據的表來說,強烈不建議修改表的存儲引擎;

當前MySQL系統上可用的存儲引擎:
MyISAM:
最經典的MySQL存儲引擎;對於MyISAM而言,有一個缺陷——如果MySQL運行時因意外崩潰,再重啓時需要對標進行修復,而MyISAM存儲引擎無法保證表的安全修復;
Aria:
具有崩潰後安全洗浴表特性的增強版的MyISAM存儲引擎;
InnoDB:
CSV:
基於文件存儲數據的存儲引擎;跨數據庫實現數據彼此交換時,比較有用;但CSV中存放的浮點類型的數據一定會損失數據精度;
MRG_MYISAM:
用於實現將多個MyISAM表在邏輯層上連接在一起,用戶就像使用一張表一樣去使用多張表;
BLAKHOLE:
黑洞存儲引擎,在級聯複製時比較有用;一般用於記錄binlog做複製的中繼;
MEMORY:
內存級的存儲引擎;無法實現數據持久功能多用於作爲臨時表(內存表)的存儲引擎;MEMORY是唯一的支持用戶顯示定義hash索引的存儲引擎,因此期查詢速度是非常快的;
PERFORMANCE_SCHEMA:
顯示MySQL運行過程中的狀態參數和統計數據;這些統計數據本身是MySQL內部的專有數據結構,但是有時用戶需要查詢這些信息,因此PERFORMANCE_SCHEMA就將此類數據虛化成一個MySQL認可可以使用的關係型接口;
ARCHIVE:
歸檔存儲引擎,通常用來做數據倉庫;這種類型的存儲引擎一般僅支持select和insert語句,且本身不支持索引。適合於存放大量獨立的作爲歷史記錄的數據。ARCHIVE存儲引擎擁有高效的插入速度,查詢速度相對較慢,用於日誌記錄和聚合函數分析較合適;

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 Idenx,表中可用的索引;

總結:
性能:
表級鎖,併發訪問性能相對較差,尤其是寫鎖,阻塞所有的讀操作,串行訪問;
支持非聚集索引,全文索引及空間索引,檢索數據時的速度和效率相對較高;
表壓縮,只能讀,無法接受寫操作請求;
延遲的索引更新,比較合理的利用磁盤IO的性能;

數據安全:
    支持手動或自動修復,但可能會導致數據丟失;

InnoDB:
Sleepycat
Berkeley DB:

InnoDB,研發了InnoDB存儲引擎,參考了Oracle的主流存儲引擎;

Percona;
    InnoDB --- Percona-XtraDB, Supports transactions, row-level locking, and foreign keys

    ACID:
        AUTOMICITY:原子性;
        CONSISTENCY:一致性;
        ISLATION:隔離性;
        DURABILITY:持久性;

特點:
    1.InnoDB存儲引擎將數據存儲於"表空間"中;(Table Space)
        表空間是一個自組織的自管理的文件系統;
        默認的表空間是所有表在同一個表空間中;即所有的表在同一個文件中;

        innodb_file_per_table=OFF
            意味着所有的InnoDB存儲引擎所管理的表,包括數據,表格式及索引都在同一個表空間中;

            文件名:/$DATA_DIR/ibdata1.

        innodb_file_per_table=ON
            意味着每張表使用單獨的表空間;

            每張表使用兩個文件表示表空間;
                tbl_name.ibd
                tbl_name.frm

        注意:
            如果在設置innodb_file_per_table=ON服務器參數之前已經創建了利用InnoDB存儲引擎管理的表,則其表空間不會因爲設置該服務器參數而變化;只有在定義了該參數之後新建的表才能以單獨的表空間進行數據存儲;

            應該儘早設置該服務器參數,在安裝服務結束之後第一次啓動服務之前配置該服務器參數爲最佳;

    2.支持事務;
        事務型存儲引擎,適合對事務要求較高的場景的應用;
        但是對於短期事務支持的更好;
        爲了實現事務的隔離,並且儘可能提高並行處理效率,定義了四種不同的隔離級別;

    3.精細鎖粒度支持:
        表級鎖;
        頁級鎖;
        行級鎖;
        間隙鎖:防止幻讀;

    4.支持聚集索引,主鍵索引以及輔助索引;
        支持自適應的hash索引;

MySQL/MariaDB還支持很多的額外的第三方社區級別的存儲引擎:
Sphinx存儲引擎:全文索引的存儲索引;
OQGraph:圖形存儲引擎;
Cassandra:FaceBook研發的無中心節點的分佈式NoSQL的數據庫的存儲引擎;HBase(ASF)
COnnect
Squence
ToKuDB:
1.將數據處理性能直接提升20-80倍;
2.支持壓縮,支持壓縮時寫操作;
3.數據量可以擴展到數個TB;
4.完全避免索引碎片;
5.支持事務;
6.支持億級行海量數據存儲;
...

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章