1. 程式人生 > >Mysql總結——對mysql整體知識的梳理

Mysql總結——對mysql整體知識的梳理

常用命令

    檢視版本:
        mysql --version
        mysql -V
        登入後: >selectversion();
    檢視現有資料庫:
        show databases;
    使用某個資料庫:
        use 資料庫;
    檢視所選資料庫中的表:
        show tables;
    檢視當前位置:
        select database();
    檢視某個資料庫中的表:
        select tables from 資料庫;
    退出:
        exit
; Ctrl+c 建立資料庫: create database 資料庫; 刪除資料庫: drop database 資料庫; 資料庫中匯入sql: source 路徑/檔案.sql; 顯示錶結構: desc 表名; 模糊查詢含char的mysql變數: show variables like '%char%'; 查看錶的建立語句: show create table 表名\G / 表名; 建立資料庫使用者: create
user 使用者名稱 identified by '密碼'; 使用者授權: grant all on 資料庫.* to 使用者名稱;

簡單查詢

    查詢所有值
        select * from table;
    查詢值as別名
        select  ename name from table;(select ename as name from table);

資料排序

order by (欄位名/欄位下標值)... asc(desc):根據指定排序    升(降)    

處理函式

    lower(字串)
    upper(字串)
    substr(被擷取字串,起始下標(1
),擷取長度) length(字串長度) trim(字串) round(數值(四捨五入值),整數(0:個位,正整數:小數位,負整數:整數位))/round(數值(預設舍到個位)) rand() case...when...else...end 匹配值 ifnull(value,0) 當value值為null時,設值為0 str_to_date('日期字串''日期格式') date_format(日期型別資料,'日期格式') 分組函式/聚合函式/多行處理函式:分組函式自動忽略空置,不需要手動新增where條件排除空值;不能直接使用在where關鍵字後面 sum(欄位) avg(欄位) max(欄位)/min(欄位) count(欄位/*) distinct 欄位,欄位... 單欄位去重/多欄位聯合去重 group by 欄位,欄位... 分組 group by...having... 對分組資料繼續過濾

select語句總結

select  5.對當前臨時表進行整列讀取
        ....
    from    1.將硬碟上的表文件載入到記憶體 
        ....
    where   2.將符合條件的資料行過濾出來,生成一張臨時表
        ....
    group by    3.根據列中的資料種類,將當前臨時表劃分成若干個新的臨時表
        ....
    having  4.過濾掉group by生成的不符合條件的臨時表
        ....
    order by    6.select生成的臨時表進行重新排序,生成新的臨時表
        ....
    limit   7.對最終的臨時表進行擷取
        ....

SQL分類:

    DQL語句   資料查詢語言  select
    DML語句   資料操作語言 insert delete update
    DDL語句   資料庫定義語言 create drop alter
    TCL語句   事物控制語言 commit rollback

mysql日期格式

    %Y:代表四位的年份  %y:代表兩位的年份
    %m:代表月(01..12)  %c:代表月(1..12)
    %d:代表日          
    %H:代表24小時制      %h:代表12小時制
    %i:代表分鐘         %S/%s:代表秒

連線查詢/跨表查詢
笛卡爾積現象:若兩張表進行連線查詢時沒有任何條件限制,最終的查詢結果為兩張表記錄的乘積

分類:
        年代:
            SQL92
                select e.ename,d.dname 
                from em as e,dm as d
                where e.s = d.s;
            SQL99
                select e.ename,d.dname 
                from em as e
                join dm as d
                on e.s = d.s;

        連線方式:
            內連線(省略了inner關鍵字)
                等值連線
                    select e.ename,d.dname 
                    from em as e
                    (inner) join dm as d
                    on e.s = d.s;
                非等值連線
                    select e.ename,d.dname 
                    from em as e
                    join dm as d
                    on e.s between d.s and d.s1;
                自連線(把一張表看成兩張表)
                    select e.ename,d.ename as dname 
                    from em as e
                    join em as d
                    on e.s = d.r;
            外連線:a表b表能夠完全匹配的記錄查詢出來外,將其中一張表的記錄無條件的完全查詢出來,另一張表沒有匹配記錄時,會自動模擬出null值與之匹配省略了outer關鍵字)
                左連線:左邊表的全部行與右邊表的匹配行
                    select e.ename,d.dname 
                    from em as e
                    left (outer) join dm as d
                    on e.s = d.s;
                右連線:右邊表的全部行與左邊表的匹配行
                    select e.ename,d.dname 
                    from em as e
                    right (outer) join dm as d
                    on e.s = d.s;
            全連線
    多個join..on..,按順序分別進行匹配

子查詢:select語句巢狀select語句

    select...(select)
    from...(select)
    where...(select)

union合併集合

    select ename from emp where job='a'
    union
    select ename form emp where job='b'

limit使用(mysql特有,獲取表中前幾行或某幾行資料)

    limit 下標位置(0開始),擷取長度    如果不寫下標位置預設為0
    分頁:
        頁碼:pageNo
        資料量:pageSize
        查詢:limit(pageNo-1)*pageSize,pageSize

DDL:
    create table 表名(
        欄位名稱    欄位型別    欄位長度    欄位約束,
        欄位名稱    欄位型別    欄位長度    欄位約束
    );
    drop table 表名;
    drop table if exites 表名;(mysql)
    複製表:create table 表名 as 查詢語句
    alter table 表名 add 欄位名 欄位型別;
    alter table 表名 modify 欄位名 欄位型別;
    alter table 表名 drop 欄位名;
    alter table 表名 change 原欄位名 新欄位名 欄位型別;
DML:
    insert into 表名(欄位名,欄位名,...) values(欄位值,欄位值,...);
    insert into 表名 查詢語句;    快速插入
    update 表名 set  欄位名稱 = 欄位值,欄位名稱 = 欄位值 where 限制條件;    不加where直接更新所有該欄位值
    delete from 表名 where 限制條件;      不加where直接刪除表中所有資料
約束:
        not null    非空約束
        unique      唯一性約束
        constraint 別名   unique(欄位,欄位...) 約束起別名,可用於查詢刪除
        primary key 主鍵約束(mysql提供自增數字auto_increment,專門生成主鍵)
        foreign key 外來鍵約束,foreign key(欄位) references 表名(欄位),被引用的欄位必須具有unique約束,外來鍵值為空的資料為孤兒資料
級聯更新與級聯刪除
        在新增級聯更新與級聯刪除時,需要在外來鍵約束後面新增關鍵字
        級聯刪除:在刪除父表資料的時候,級聯刪除子表中資料
            on delete cascade
        級聯更新:
            on update cascade

儲存引擎

本質:mysql特有
        ·通過採用不同的技術將資料儲存在檔案或記憶體中
        ·每一種技術都有不同的儲存機制,不同的儲存機制提供不同的功能與能力
        ·通過選擇不同的技術,可以獲得額外的速度或功能,改善我們的應用
    使用ENGINE為create table指定儲存引擎
        create table table_name(
            no int
        )ENGINE = MyISAM;
    當建立表時沒有指定儲存引擎,則使用當前預設的儲存引擎;預設儲存引擎在my.ini配置檔案中使用default-storage-engine 指定;
    修改表儲存引擎:alter table 表名 ENGINE = 儲存引擎名稱;
    查看錶使用儲存引擎:
        show create table 表名\G;
        show table status like '表名'\G;
常用儲存引擎:
        MyISAM儲存引擎:mysql資料庫最常用的,適用於大量資料讀而少量資料更新的混合操作
            管理表對應檔案:
                格式檔案——儲存表的結構(mytable.frm)
                資料檔案——儲存表的資料(mytable.MYD)
                索引檔案——儲存表的索引(mytable.MYI)
            可轉換為壓縮,只讀表來節省空間
        InnoDB儲存引擎:mysql預設儲存引擎,適用於較多的資料更新
            每個InnoDB表在資料庫目錄中以.frm格式檔案表示
            InnoDB表空間tablespace被用來儲存表的內容
            提供一組用來記錄事務性活動的日誌檔案
            用COMMIT、SAVEPOINT以及ROLLBACK支援事物處理
            提供全部ACID相容(資料庫事物正確執行四個基本要素:原子性(Atomicity),一致性(Consistency),隔離性(Isolation),永續性(Durability))
            在mysql伺服器崩潰後提供自動恢復
            多版本(MVCC)和行級鎖定
            支援外來鍵及引用的完整性,包括級聯更新和刪除
        MEMORY儲存引擎:適用於儲存非永久需要的資料
            使用memory儲存引擎的表,資料儲存在記憶體中,且行的長度固定
            在資料庫目錄內,每個表均以.frm格式檔案表示
            表資料及索引被儲存在記憶體中
            表級鎖機制
            欄位屬性不能包含text或blob欄位
            memory儲存引擎之前被稱為heap引擎

事物Transaction

四個特性:
        原子性(Atomicity)
            事務是最小單位,不可再分
        一致性(Consistency)
            事務要求的DML語句操作的時候,必須保證同時完成或同時失敗
        隔離性(Isolation)
            一個事務不會影響其他事務的執行
        永續性(Durability)
            在事務完成之後,該事務對資料庫所做的更改將持久的儲存在資料庫中,並不會回滾
    開啟事務:start transaction
        任何一句DML語句執行,執行事務的開啟
    結束事務:end transaction
        提交或者回滾
    提交事務:commit transaction
    回滾事務:rollback transaction
    在事務進行過程中,未結束之前,DML語句不會修改底層資料庫檔案中的資料;只是將歷史操作記錄一下,在記憶體中完成記錄;只有在事務結束,而且成功結束時才會修改底層硬碟檔案中的資料;
    mysql預設事務:自動提交show variable like '%commit%';
事務隔離級別:
        read uncommitted    讀未提交(級別最低)  有髒讀產生
        read committed      讀已提交                讀到的資料會因為其他的事務而改變
        repeatable read     可重複讀(預設)        讀到的資料只會是開始讀的資料,不受其他事務影響
        serializable        序列化             使事務序列執行
檢視隔離級別:
        當前會話級隔離級別
            select @@tx_isolation;
            select @@session.tx_isolation;
        全域性隔離級別
            select @@global.tx_isolation;
設值伺服器預設隔離級別:
        修改my.ini配置檔案
            在my.ini檔案中的[mysqld]下面新增:
                transaction-isolation = READ-COMMITTED
            隔離級別:
                READ-UNCOMMITTED
                READ-COMMITTED
                REPEATABLE-READ
                SERIALIZABLE
        通過命令方式設值事務隔離級別
            set transaction isolation level isolation-level;
            isolation-level:
                READ-UNCOMMITTED
                READ-COMMITTED
                REPEATABLE-READ
                SERIALIZABLE
    設定隔離級別作用範圍:預設session
        set global transaction isolation level isolation-level;

索引

主鍵自動新增索引
    索引與表相同,儲存在硬碟檔案中,索引是表的一部分
    mysql資料庫中表的檢索方式:
        全表掃描
        通過索引檢索

檢視

    檢視也對應一個查詢結果,只是從不同的角度檢視資料
    語法類似於table
        create view 檢視名 as 查詢語句;
    檢視能隱藏表的實現細節
          提高檢索效率

DBA命令
資料庫底層授權操作


資料庫設計三正規化

    第一正規化:要求有主見,資料庫中不能出現重複記錄,每一個欄位是原子性不能再分;
    第二正規化:第二正規化是建立在第一正規化的基礎上,要求    資料庫中所有非主鍵欄位完全依賴主鍵,不能產生部分依賴;(儘量不要使用聯合外來鍵)
    第三正規化:建立在第二正規化基礎上,要求非主鍵欄位不能產生傳遞依賴於主鍵欄位;