MariaDB

Mariadb

結構化數據–>關系型數據庫 范式:Entry(每一行來描述一個整體)

半結構化數據–>YAML,XML,JSON 非結構化數據–>日志文件 NoSQL

關系型數據庫:事務能力 ACID測試(原子性,一致性,隔離性,持久性)

MariaDB or MySQL: 層次模型–>網狀模型–>(Codd)關系模型

DBMS(數據管理系統) --> RDBMS(關系型數據管理系統)


表:row,column;

關系運算:
    選擇
    投影

數據庫:表、索引、視圖(虛表)、SQL、存儲過程、存儲函數、觸發器、事件調度器
    DDL(數據定義語言):CREATE,ALTER,DROP
    DML(管理表中的數據):INSERT/UPDATE/DELETE/SELECT

約束:
    主鍵約束:唯一、非空;一張表只能有一個;
    唯一鍵約束:唯一,可以存在多個;
    外鍵約束:參考性約束;
    檢查性約束:check;

三層模型:
    物理層-->系統管理員(SA)
    邏輯層-->DBA
    視圖層-->程序員(Coder)

實現:
    Oracle,DB2,Sybase,Infomix,SQL Server;
    Mysql,Mariadb,PostgreSQL,SQLite;

Mysql: 5.1–>5.5–>5.6–>5.7–>8.0

Mariadb:5.5.x-->10.x

特性:
    插件式存儲引擎
    單進程多線程

安裝Mysql:
        OS Vendor:rpm 
        MySQL:
            source code:cmake
            binary package:
                i686, x86_64; 
                glibc VERSION
            prepackage:rpm, deb
                os, arch, 

        服務端程序:
            mysqld, mysqld_safe, mysqld_multi
        客戶端程序:
            mysql, mysqldump, mysqlbinlog, mysqldmin, ...
        非客戶端類程序:
            myisamchk, myisampack, ...                  

配置文件:
    讀取多處的多個配置文件,而且會以指定的次序的進行;

        # my_print_defaults

            Default options are read from the following files in the given order:
            /etc/mysql/my.cnf  /etc/my.cnf ~/.my.cnf 

            不同的配置文件中出現同一參數且擁有不同值時,后讀取將為最終生效值; 

            修改默認讀取的配置文件(mysqld_safe命令):
                 --defaults-file=file_name

            于讀取的默認配置文件之外再加載一個文件:    
                --defaults-extra-file=path

        配置文件格式:ini風格的配置文件,能夠為mysql的各種應用程序提供配置信息:
            [mysqld]
            [mysqld_safe]
            [mysqld_multi]
            [server]
            [mysql]
            [mysqldump]
            [client]
            ...

                PARAMETER = VALUE 

                PARAMETER:
                    innodb_file_per_table
                    innodb-file-per-table 

        程序文件:
            服務端程序:mysqld_safe, mysqld_multi
            客戶端程序:mysql, mysqldump, mysqladmin
            工具程序:myisampack, ...

        mysql --> mysql protocol --> mysqld 
            mysql:交互式CLI工具;

            mysql [options] db_name

                常用選項:
                    --host=host_name, -h host_name:服務端地址;
                    --user=user_name, -u user_name:用戶名;
                    --password[=password], -p[password]:用戶密碼; 
                    --port=port_num, -P port_num:服務端端口; 
                    --protocol={TCP|SOCKET|PIPE|MEMORY}:
                        本地通信:基于本地回環地址進行請求,將基于本地通信協議;
                            Linux:SOCKET
                            Windows:PIPE,MEMORY
                        非本地通信:使用非本地回環地址進行的請求; TCP協議;
                    --socket=path, -S path
                    --database=db_name, -D db_name:
                    --compress, -C:數據壓縮傳輸
                    --execute=statement, -e statement:非交互模式執行SQL語句;
                    --vertical, -E:查詢結果縱向顯示;

                命令:
                    客戶端命令:于客戶端執行;
                    服務端命令:SQL語句,需要一次性完整地發往服務端;語句必須有結束符;

                    ?         (\?) Synonym for `help'.
                    clear     (\c) Clear the current input statement.
                    connect   (\r) Reconnect to the server. Optional arguments are db and host.
                    delimiter (\d) Set statement delimiter.
                    edit      (\e) Edit command with $EDITOR.
                    ego       (\G) Send command to mysql server, display result vertically.
                    exit      (\q) Exit mysql. Same as quit.
                    go        (\g) Send command to mysql server.
                    help      (\h) Display this help.
                    nopager   (\n) Disable pager, print to stdout.
                    notee     (\t) Don't write into outfile.
                    pager     (\P) Set PAGER [to_pager]. Print the query results via PAGER.
                    print     (\p) Print current command.
                    prompt    (\R) Change your mysql prompt.
                    quit      (\q) Quit mysql.
                    rehash    (\#) Rebuild completion hash.
                    source    (\.) Execute an SQL script file. Takes a file name as an argument.
                    status    (\s) Get status information from the server.
                    system    (\!) Execute a system shell command.
                    tee       (\T) Set outfile [to_outfile]. Append everything into given outfile.
                    use       (\u) Use another database. Takes database name as argument.
                    charset   (\C) Switch to another charset. Might be needed for processing binlog with multi-byte charsets.
                    warnings  (\W) Show warnings after every statement.
                    nowarning (\w) Don't show warnings after every statement.   

                mysql命令的使用幫助:
                    # man mysql
                    # mysql  --help  --verbose

            sql腳本運行:
                mysql [options] [DATABASE] < /PATH/FROM/SOME_SQL_SCRIPT

        mysqld服務器程序:工作特性的定義方式
            命令行選項
            配置文件參數

            服務器參數/變量:設定MySQL的運行特性;
                mysql> SHOW GLOBA|[SESSION] VARIABLES [LIKE clause];
            like后面字符串要用引號引起來

MariaDB

            SHOW GLOBAL VARIABLES;
            查看全局的服務器變量,定義服務器的工作特性的

            只想查看Threads開頭的狀態變量

MariaDB

            狀態(統計)參數/變量:保存MySQL運行中的統計數據或狀態數據;
                mysql> SHOW GLOBA|[SESSION] STATUS [LIKE clause];

            顯示單個變量設定值的方法:
                mysql> SELECT @@[global.|session.]system_var_name


                    %:匹配任意長度的任意字符;
                    _:匹配任意單個字符;

            變量/參數級別:
                全局:為所有會話設定默認; 
                會話:跟單個會話相關;會話建立會從全局繼承;

            服務器變量的調整方式:
                運行時修改:
                    global:僅對修改后新建立的會話有效;
                    session:僅對當前會話有效,且立即生效;
                啟動前通過配置文件修改:
                    重啟后生效;

            運行時修改變量值操作方法:
                mysql> HELP SET

                SET [GLOBAL | SESSION] system_var_name = expr
                SET [@@global. | @@session. | @@]system_var_name = expr

MariaDB

把autocommit的值改為0

方法一

MariaDB

方法二

MariaDB

改全局級別不影響當前會話,但是對新建立的回話全局級別時生效的

        安裝完成后的安全初始化:
            mysql_secure_installation

        運行前常修改的參數:
            innodb_file_per_table=ON
            skip_name_resolve=ON
            ...


    SQL:ANSI SQL 
        SQL-86, SQL-89, SQL-92, SQL-99, SQL-03, ...

    MySQL的數據類型:
        字符型
        數值型
        日期時間型
        內建類型

        字符型:
            CHAR(#), BINARY:定長型;CHAR不區分字符大小寫,而BINARY區分;
            VARCHAR(#), VARBINARY:變長型
            TEXT:TINYTEXT,TEXT,MEDIUMTEXT,LONGTEXT
            BLOB:TINYBLOB,BLOB,MEDIUMBLOB, LONGBLOB
        數值型:
            浮點型:近似
                FLOAT
                DOUBLE
                REAL
                BIT
            整型:精確
                INTEGER:TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT
                DECIMAL
        日期時間型:
            日期:DATE
            時間:TIME
            日期j時間:DATETIME
            時間戳:TIMESTAMP
            年份:YEAR(2), YEAR(4)
        內建:
            ENUM:枚舉
                ENUM('Sun','Mon','Tue','Wed')
            SET:集合

        類型修飾符:
            字符型:NOT NULL,NULL,DEFALUT ‘STRING’,CHARACET SET ‘CHARSET’,COLLATION ‘collocation'
            整型:NOT NULL, NULL, DEFALUT value, AUTO_INCREMENT, UNSIGNED
            日期時間型:NOT NULL, NULL, DEFAULT 

    SQL MODE:定義mysqld對約束等違反時的響應行為等設定;
        常用的MODE:
            TRADITIONAL
            STRICT_TRANS_TABLES
            STRICT_ALL_TABLES
不應該默認使用空模式

        修改方式:
            mysql> SET GLOBAL sql_mode='MODE';
            mysql> SET @@global.sql_mode='MODE';

CREATE TABLE tbl1 (id tinyint unsigned,name CHAR(5)) 創建一個表,定義一個字段為id,另一個字段是name,只能有五個字符

MariaDB [testdb]> CREATE TABLE tbl3 (id tinyint unsigned,name char(6));

MariaDB [testdb]> INSERT INTO tbl3 (id) VALUES (16),(256);

MariaDB

MariaDB

MariaDB

超過的字符被修剪了,違反了規則后,正常插入沒問題,但會有錯誤。插入時會發生警告。一旦違反約束規則的話,應該拒絕數據插入。

這時候定義一種功能

MariaDB

默認mysql定義在空模式下,TRADITIONAL,嚴格遵守規則,不然無法定義

MariaDB

MariaDB

這時候就會提示插入數據錯誤;

MariaDB

    SQL:DDL,DML
        DDL:
            mysql> HELP Data Definition

            CREATE, ALTER, DROP
                DATABASE, TABLE
                INDEX, VIEW, USER
                FUNCTION, FUNCTION UDF, PROCEDURE, TABLESPACE, TRIGGER, SERVER 

        DML:
            mysql> HELP Data Manipulation

            INSERT/REPLACE, DELETE, SELECT, UPDATE

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

            ALTER {DATABASE | SCHEMA} [db_name] CHARACTER SET [=] charset_name  COLLATE [=] collation_name

            DROP {DATABASE | SCHEMA} [IF EXISTS] db_name

        表:
            CREATE 
                (1) CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
                    (create_definition,...)
                    [table_options]
                    [partition_options]

                    CREATE TABLE [IF NOT EXISTS] tble_name (col_name  data_typ|INDEX|CONSTRAINT);

                table_options:
                    ENGINE [=] engine_name

                        查看支持的所有存儲引擎:
                            mysql> SHOW ENGINES;

                        查看指定表的存儲引擎:
                            mysql> SHOW TABLE STATUS LIKE clause;

                    ROW_FORMAT [=] {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT}

                (2) CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
                    [(create_definition,...)]
                    [table_options]
                    [partition_options]
                    select_statement

                    直接創建表,并將查詢語句的結果插入到新創建的表中;

                (3) CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
                    { LIKE old_tbl_name | (LIKE old_tbl_name) }

                    復制某存在的表的結構來創建新的空表;

            DROP:
                DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name]; 

            ALTER:
                ALTER  TABLE tbl_name
                    [alter_specification [, alter_specification] ...]

                    可修改內容:
                        (1) table_options
                        (2) 添加定義:ADD
                            字段、字段集合、索引、約束
                        (3) 修改字段:
                            CHANGE [COLUMN] old_col_name new_col_name column_definition [FIRST|AFTER col_name]
                            MODIFY [COLUMN] col_name column_definition [FIRST | AFTER col_name]
                        (4) 刪除操作:DROP
                            字段、索引、約束

                    表重命名:
                        RENAME [TO|AS] new_tbl_name

            查看表結構定義:
                DESC tbl_name;

            查看表定義:
                SHOW CREATE TABLE tbl_name

            查看表屬性信息:
                SHOW TABLE STATUS [{FROM | IN} db_name] [LIKE 'pattern' | WHERE expr]

        索引:
            創建:
                CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [index_type] ON tbl_name (index_col_name,...)

            查看:
                SHOW {INDEX | INDEXES | KEYS} {FROM | IN} tbl_name [{FROM | IN} db_name] [WHERE expr]

            刪除:
                DROP  INDEX index_name ON tbl_name

            索引類型:
                聚集索引、非聚集索引:索引是否與數據存在一起;
                主鍵索引、輔助索引
                稠密索引、稀疏索引:是否索引了每一個數據項;
                BTREE(B+)、HASH、R Tree、FULLTEXT
                    BTREE:左前綴;

            EXPLAIN:分析查詢語句的執行路徑;

        視圖:VIEW
            虛表:存儲下來的SELECT語句;

            創建:
                CREATE  VIEW view_name [(column_list)] AS select_statement

            修改:
                ALTER  VIEW view_name [(column_list)] AS select_statement

            刪除:
                DROP VIEW [IF EXISTS] view_name [, view_name] ...

    DML:
        INSERT/REPLACE,DELETE,UPDATE,SELECT

        INSERT:
            單行插入
            批量插入

            INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
            [INTO] tbl_name [(col_name,...)]
            {VALUES | VALUE} ({expr | DEFAULT},...),(...),...
            [ ON DUPLICATE KEY UPDATE
            col_name=expr
                [, col_name=expr] ... ]

            Or:

            INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
            [INTO] tbl_name
            SET col_name={expr | DEFAULT}, ...
            [ ON DUPLICATE KEY UPDATE
            col_name=expr
                [, col_name=expr] ... ]

            Or:

            INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]
            [INTO] tbl_name [(col_name,...)]
            SELECT ...
            [ ON DUPLICATE KEY UPDATE
            col_name=expr
                [, col_name=expr] ... ]

        DELETE:

            DELETE  FROM tbl_name [WHERE where_condition] [ORDER BY ...] [LIMIT row_count]      

            注意:一定要有限制條件,否則將清空整個表;
                限制條件:
                    [WHERE where_condition]
                     [ORDER BY ...] [LIMIT row_count]

        UPDATE:

            UPDATE table_reference SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
                [WHERE where_condition]
                [ORDER BY ...]
                [LIMIT row_count]               

            注意:一定要有限制條件,否則將修改整個表中指定字段的數據;
                限制條件:
                    [WHERE where_condition]
                     [ORDER BY ...] [LIMIT row_count]


            注意:sql_safe_updates變量可阻止不帶條件更新操作;

    SELECT:

        Query Cache:緩存查詢的執行結果;
            key:查詢語句的hash值; 
            value:查詢語句的執行結果;

            SQL語句的編寫方式:
                SELECT name FROM tbl2;
                select name from tbl2;

        查詢執行路徑:
            請求-->查詢緩存
            請求-->查詢緩存-->解析器-->預處理器-->優化器-->查詢執行引擎-->存儲引擎-->緩存-->響應


        SELECT語句的執行流程:
            FROM  --> WHERE --> Group By --> Having --> Order BY --> SELECT --> Limit 

            先找到執行的表,用where做條件過濾,就能拿到子集,對這個子集要拿到分組。做聚合計算(最大值,平均值)。把聚合都的結果指定過濾條件用having,having用來描述group by的結果如何被過濾的。order by排序,select執行,limit顯示。

MariaDB

挑選行

MariaDB

既能挑選字段,又能挑選行;

MariaDB

添加一個列,性別

MariaDB

往新加的列上賦值

MariaDB

顯示F性別的平均值,和M性別的平均值

MariaDB

MariaDB

MariaDB

聚合后的結果指明過濾條件;

        單表查詢:

            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}] 

            用法:
                SELECT col1, col2, ... FROM tble_name;
                SELECT col1, col2, ... FROM tble_name WHERE clause;
                SELECT col1, col2, ... FROM tble_name  [WHERE clause] GROUP BY col_name [HAVING clause]; 

            DISTINCT:數據去重;
            SQL_CACHE:顯式指定緩存查詢語句的結果;
            SQL_NO_CACHE:顯式指定不緩存查詢語句的結果;

            query_cache_type服務器變量有三個值:
                ON:啟用; 
                    SQL_NO_CACHE:不緩存;默認符合緩存條件都緩存;
                OFF:關閉;
                DEMAND:按需緩存;
                    SQL_CACHE:緩存;默認不緩存;

            字段可以使用別名 :
                col1 AS alias1, col2 AS alias2, ...

            WHERE子句:指明過濾條件以實現“選擇”功能;
                過濾條件:布爾型表達式;

                [WHERE where_condition]
                    算術操作符:+, -, *, /, %
                    比較操作符:=, <>, !=, <=>, >, >=, <, <=

                        IS NULL, IS NOT NULL
                        區間:BETWEEN min AND max 
                        IN:列表;
                        LIKE:模糊比較,%和_;
                        RLIKE或REGEXP

                    邏輯操作符:
                        AND, OR, NOT, XOR

            GROUP BY:根據指定的字段把查詢的結果進行“分組”以用于“聚合”運算;
                avg(), max(), min(), sum(), count()

                HAVING:對分組聚合后的結果進行條件過濾;

            ORDER BY:根據指定的字段把查詢的結果進行排序;
                升序:ASC
                降序:DESC 

            LIMIT:對輸出結果進行數量限制
                [LIMIT {[offset,] row_count | row_count OFFSET offset}]





        練習:導入hellodb.sql生成數據庫
            (1) 在students表中,查詢年齡大于25歲,且為男性的同學的名字和年齡;

MariaDB

            (2) 以ClassID為分組依據,顯示每組的平均年齡;

MariaDB

            (3) 顯示第2題中平均年齡大于30的分組及平均年齡;

MariaDB

            (4) 顯示以L開頭的名字的同學的信息;

MariaDB

MariaDB

            (5) 顯示TeacherID非空的同學的相關信息;

MariaDB

            (6) 以年齡排序后,顯示年齡最大的前10位同學的信息;

MariaDB

            (7) 查詢年齡大于等于20歲,小于等于25歲的同學的信息;用三種方法;

MariaDB

        練習:導入hellodb.sql,以下操作在students表上執行
            1、以ClassID分組,顯示每班的同學的人數;

MariaDB

            2、以Gender分組,顯示其年齡之和;

MariaDB

            3、以ClassID分組,顯示其平均年齡大于25的班級;

MariaDB

            4、以Gender分組,顯示各組中年齡大于25的學員的年齡之和;

MariaDB

        多表查詢:
            連接操作:
                交叉連接:笛卡爾乘積;
                內連接:
                    等值連接:讓表之間的字段以等值的方式建立連接;

MariaDB

                    不等值連接:
                    自然連接
                    自連接
                外連接:
                    左外連接:
                        FROM tb1 LEFT JOIN tb2 ON tb1.col = tb2.col 
                    右外連接:
                        FROM tb1 RIGHT JOIN tb2 ON tb1.col = tb2.col 

        子查詢:在查詢中嵌套查詢;

            用于WHERE子句中的子查詢;
                (1) 用于比較表達式中的子查詢:子查詢僅能返回單個值; 
                (2) 用于IN中的子查詢:子查詢可以返回一個列表值; 
                (3) 用于EXISTS中的子查詢:
            用于FROM子句中的子查詢;
                SELECT tb_alias.col1, ... FROM (SELECT clause) AS tb_alias WHERE clause; 

        聯合查詢:將多個查詢語句的執行結果相合并;
            UNION 
                SELECT clause UNION SELECT cluase;


        練習:導入hellodb.sql,完成以下題目:
            1、顯示前5位同學的姓名、課程及成績;

MariaDB

            2、顯示其成績高于80的同學的名稱及課程;

MariaDB

            3、求前8位同學每位同學自己兩門課的平均成績,并按降序排列;

MariaDB

            4、顯示每門課程課程名稱及學習了這門課的同學的個數;

原創文章,作者:15152188070,如若轉載,請注明出處:http://www.www58058.com/59378

(1)
1515218807015152188070
上一篇 2016-11-15 11:29
下一篇 2016-11-15 23:31

相關推薦

  • 文件查找:locate/find

    文件查找就是在文件系統上查找符合條件的文件,工具名分別為:locate和find locate是非實時查找或數據庫查找的工具;而find則是實時查找工具。 locate locate依賴于事先構建的索引。索引的構建是在系統較為空閑時自動進行(即為周期性任務),也可以手動更新數據庫(updatedb) 注意:索引構建過程需要遍歷整個根文件系統,極其消耗資源。 …

    Linux干貨 2016-03-12
  • Linux學習之數據重定向

    大綱: 一、數據重定向定義 二、數據重定向分類 三、數據重定向作用 四、示例 一、數據重定向:命令的運行的結果默認輸出在監視器上,重定向就是把這個結果輸出到其它地方或其它文件。 二、數據重定向分類: 1.標準輸出: (standard output,簡稱stdout,代碼為 1 ,使用 > 或 >>):命令執行成功輸出的正確提示信…

    Linux干貨 2015-06-24
  • Linux系統啟動流程簡介

    centos系統啟動流程 本篇僅僅講解centos5和6 centos7并不適用 Linux系統的組成部分:內核+根文件系統 內核功能: 進程管理 內存管理 網絡管理 驅動程序 文件系統 安全功能 有以下目錄結構的文件系統可以被識別為根文件系統,但根文件系統本身不存在 rootfs:/bin/ /sbin /etc/ /sys/…

    Linux干貨 2016-09-10
  • 測試Markdown

    測試markdown是否可用

    Linux干貨 2018-03-10
  • fstab配置文件詳解

    /etc/fstab配置文件詳解 /etc/fstab:記錄了計算機上硬盤分區的相關信息,啟動Linux時,檢查分區的fsck命令,掛載分區的mount命令,都需要fstab這個文件的信息,來正確的檢查和掛載硬盤,而且這個硬盤需要root用戶權限才能編輯 詳解: 設備名稱   掛載點  分區的類型  掛載選項  dump選項  fsck選項 設備名稱: 可以…

    Linux干貨 2017-04-23
  • tcpdump輸出詳解

    在這里不得不再吐槽下國內整個IT粗糙浮躁,度娘下來的中文文檔幾盡抄襲~google下來的文檔英文文檔質量遠高于國內中文文檔.用ie或沒有安裝插件的瀏覽器訪問,不然可能會有其它訪問請求數據干擾分析 IP數據包結構 TCP數據包結構 // tcpdump需root權限 # tcpdump -x -i eth1 i…

    Linux干貨 2015-04-15
欧美性久久久久