MysQL表相關操做

======MySQL表相關操做=====

目錄:
    - 1、存儲引擎介紹
    - 2、表介紹
    - 3、建立表
    - 4、查看錶結構
    - 5、數據類型
    - 6、表完整性約束
    - 7、修改表ALTER TABLE
    - 8、複製表
    - 9、刪除表


1、存儲引擎介紹
    - 什麼是存儲引擎
    - MySQL支持的存儲引擎
    - 使用存儲引擎

存儲引擎即表類型,mysql根據不一樣的表類型會有不一樣的處理機制
    - 什麼是存儲引擎
        mysql中創建的庫===>文件夾
        庫中創建的表===>文件

        現實生活中咱們用來存儲數據的文件有不一樣的類型,每種文件類型對應各自不一樣的處理機制:好比處理文本用txt類型,處理表格用excel,處理圖片用png等
        數據庫中的表也應該有不一樣的類型,表的類型不一樣,會對應mysql不一樣的存取機制,表類型又稱爲存儲引擎。

        存儲引擎說白了就是如何存儲數據、如何爲存儲的數據創建索引和如何更新、查詢數據等技術的實現方
        法。由於在關係數據庫中數據的存儲是以表的形式存儲的,因此存儲引擎也能夠稱爲表類型(即存儲和
        操做此表的類型)

        在Oracle 和SQL Server等數據庫中只有一種存儲引擎,全部數據存儲管理機制都是同樣的。而MySql
        數據庫提供了多種存儲引擎。用戶能夠根據不一樣的需求爲數據表選擇不一樣的存儲引擎,用戶也能夠根據
        本身的須要編寫本身的存儲引擎

        SQL 解析器、SQL 優化器、緩衝池、存儲引擎等組件在每一個數據庫中都存在,但不是每 個數據庫都有這麼
        多存儲引擎。MySQL 的插件式存儲引擎可讓存儲引擎層的開發人員設 計他們但願的存儲層,例如,有的應
        用須要知足事務的要求,有的應用則不須要對事務有這 麼強的要求 ;有的但願數據能持久存儲,有的只但願
        放在內存中,臨時並快速地提供對數據 的查詢。

    - MySQL支持的存儲引擎
        - show engines\G;    #產看全部支持的存儲引擎
        - show variables like 'storage_engine%'; #查看正在使用的存儲引擎

        - MySQL存儲引擎介紹
            - #InnoDB 存儲引擎
                支持事務,其設計目標主要面向聯機事務處理(OLTP)的應用。其特色是行鎖設計、支持外鍵,並支
                持相似 Oracle 的非鎖定讀,即默認讀取操做不會產生鎖。 從 MySQL 5.5.8 版本開始是默認
                的存儲引擎。InnoDB 存儲引擎將數據放在一個邏輯的表空間中,這個表空間就像黑盒同樣由 InnoDB
                存儲引擎自身來管理。從 MySQL 4.1(包括 4.1)版本開始,能夠將每一個 InnoDB 存儲引擎的 表單獨
                存放到一個獨立的 ibd 文件中。此外,InnoDB 存儲引擎支持將裸設備(row disk)用 於創建其表空間。
                InnoDB 經過使用多版本併發控制(MVCC)來得到高併發性,而且實現了 SQL 標準 的 4 種隔離級別,默認
                爲 REPEATABLE 級別,同時使用一種稱爲 netx-key locking 的策略來 避免幻讀(phantom)現象的產生。
                除此以外,InnoDB 存儲引擎還提供了插入緩衝(insert buffer)、二次寫(double write)、自適應哈希索
                引(adaptive hash index)、預讀(read ahead) 等高性能和高可用的功能。
                對於表中數據的存儲,InnoDB 存儲引擎採用了彙集(clustered)的方式,每張表都是按 主鍵的順序進行存儲的,
                若是沒有顯式地在表定義時指定主鍵,InnoDB 存儲引擎會爲每一 行生成一個 6 字節的 ROWID,並以此做爲主鍵。
                InnoDB 存儲引擎是 MySQL 數據庫最爲經常使用的一種引擎,Facebook、Google、Yahoo 等 公司的成功應用已經
                證實了 InnoDB 存儲引擎具有高可用性、高性能以及高可擴展性。對其 底層實現的掌握和理解也須要時間和技術
                的積累。若是想深刻了解 InnoDB 存儲引擎的工做 原理、實現和應用,能夠參考《MySQL 技術內幕:InnoDB 存儲引擎》一書。

            - #MyISAM 存儲引擎
                不支持事務、表鎖設計、支持全文索引,主要面向一些 OLAP 數 據庫應用,在 MySQL 5.5.8 版本以前是默認的存儲引擎(除 Windows 版本外)。
                數據庫系統 與文件系統一個很大的不一樣在於對事務的支持,MyISAM 存儲引擎是不支持事務的。究其根 本,這也並不難理解。用戶在全部的應用中
                是否都須要事務呢?在數據倉庫中,若是沒有 ETL 這些操做,只是簡單地經過報表查詢還須要事務的支持嗎?此外,MyISAM 存儲引擎的 另外一個與衆
                不一樣的地方是,它的緩衝池只緩存(cache)索引文件,而不緩存數據文件,這與 大多數的數據庫都不相同。

            - #NDB 存儲引擎
                2003 年,MySQL AB 公司從 Sony Ericsson 公司收購了 NDB 存儲引擎。 NDB 存儲引擎是一個集羣存儲引擎,相似於 Oracle 的 RAC 集羣,
                不過與 Oracle RAC 的 share everything 結構不一樣的是,其結構是 share nothing 的集羣架構,所以能提供更高級別的 高可用性。NDB 存
                儲引擎的特色是數據所有放在內存中(從 5.1 版本開始,能夠將非索引數 據放在磁盤上),所以主鍵查找(primary key lookups)的速度極快,而且
                可以在線添加 NDB 數據存儲節點(data node)以便線性地提升數據庫性能。因而可知,NDB 存儲引擎是高可用、 高性能、高可擴展性的數據庫集羣
                系統,其面向的也是 OLTP 的數據庫應用類型。

            - #Memory 存儲引擎
                正如其名,Memory 存儲引擎中的數據都存放在內存中,數據庫重 啓或發生崩潰,表中的數據都將消失。它很是適合於存儲 OLTP 數據庫應用中臨時
                數據的臨時表,也能夠做爲 OLAP 數據庫應用中數據倉庫的維度表。Memory 存儲引擎默認使用哈希 索引,而不是一般熟悉的 B+ 樹索引。

            - #Infobright 存儲引擎
                第三方的存儲引擎。其特色是存儲是按照列而非行的,所以很是 適合 OLAP 的數據庫應用。其官方網站是 http://www.infobright.org/,上面
                有很多成功的數據 倉庫案例可供分析。

            - #NTSE 存儲引擎
                網易公司開發的面向其內部使用的存儲引擎。目前的版本不支持事務, 但提供壓縮、行級緩存等特性,不久的未來會實現面向內存的事務支持。

            - #BLACKHOLE
                黑洞存儲引擎,能夠應用於主備複製中的分發主庫。

            MySQL 數據庫還有不少其餘存儲引擎,上述只是列舉了最爲經常使用的一些引擎。若是 你喜歡,徹底能夠編寫專屬於本身的引擎,這就是開源賦予咱們的能力,也是開源的魅 力所在。


    - 使用存儲引擎
        - 方法一:建表時指定
            - create table innodb_t1(id int,name char)engine=innodb;
            - create table innodb_t2(id int)engine=innodb;
            - show create table innodb_t1;
            - show create table innodb_t2;

        - 方法二:在配置文件中指定默認的存儲引擎
            /etc/my.cnf
            [mysqld]
            default-storage-engine=iNNODB
            innodb_file_pre=1

2、表介紹
    
    -表至關於文件,表中的一條記錄就至關於文件的一行內容,不一樣的是,表中的一條記錄有對應的標題,稱爲表的字段。

3、建立表
    
    -語法
        create table 表名(
            字段名1 類型(寬度) 約束條件,
            字段名2 類型(寬度) 約束條件,
            ......
            );
            注:表中最後一個字段不要加逗號

        注意:
            - 在同一張表中,字段名是不能相同
            - 寬度和約束條件可選
            - 字段名和類型是必須得

4、產看錶結構
    
    - describe 表名; #查看錶結構,可簡寫成爲 desc 表名

    - show create table 表名\G;   #查看錶詳細結構,可加\G

5、數據類型
    - 介紹
    - 數值類型
    - 日期類型
    - 字符創類型
    - 枚舉類型與集合類型


    - 介紹
        - 存儲引擎決定了表的類型,而表內存放的數據也要有不一樣的類型,每種數據類型都有本身的寬度,但寬度是可選的

        - MySQL經常使用數據類型概述
            - 數字
                - 整形:tinyinit int bigint
                - 小數:
                    - float:在位數比較短的狀況下不許確
                    - double:在位數較長的狀況下不許確
                    - decimal:精確(若是是小數,則推薦使用decimal)-內部原理是以字符串的形式去存

            - 字符串
                - char(10):簡單粗暴,浪費空間,存儲速度塊   root存成root000000
                - varchar:準確,節省空間,存儲速度慢
                - sql優化:
                    - 建立表時,定長的類型往前放,變長的日後放
                    - >255個字符,超了就把文件路徑存放在數據庫中

            - 時間類型
                - 最經常使用:datetime

            - 枚舉類型與集合類型

    - 數據類型
        - 整數類型
            整數類型:TINYINT SMALLINT MEDIUMINT INT BIGINT
            做用:存儲年齡,等級,id,各類號碼等

            注:用zerofill測試整數類型的顯示寬度

            create table t7(x int(3) zerofill);
            insert into t7 values(1),(11),(111),(1111);
            select * from t7;
            +------+
            | x    |
            +------+
            |  001 |
            |  011 |
            |  111 |
            | 1111 | #超過寬度限制仍然能夠存
            +------+

            注意:爲該類型指定寬度時,僅僅只是指定查詢結果的顯示寬度,與存儲範圍無關
                其實咱們徹底不必爲整數類型指定顯示寬度,使用默認的就能夠了
                默認的顯示寬度,都是在最大值的基礎上加1


            int的存儲寬度是4個Bytes,即32個bit,即2**32
            無符號最大值爲:4294967296-1
            有符號最大值:2147483648-1
            有符號和無符號的最大數字須要的顯示寬度均爲10,而針對有符號的最小值則須要11位才能顯示徹底,因此int類型默認的顯示寬度爲11是很是合理的
            最後:整形類型,其實沒有必要指定顯示寬度,使用默認的就ok

        - 浮點數
            定點數類型  DEC等同於DECIMAL  
            浮點類型:FLOAT DOUBLE
            做用:存儲薪資、身高、體重、體質參數等

        - 位類型(瞭解)
            BIT(M)能夠用來存放多位二進制數,M範圍從1~64,若是不寫默認爲1位。
                注意:對於位字段須要使用函數讀取
                    bin()顯示爲二進制
                    hex()顯示爲十六進制

    - 日期類型
        DATE TIME DATETIME TIMESTAMP YEAR 
        做用:存儲用戶註冊時間,文章發佈時間,員工入職時間,出生時間,過時時間等

        YEAR
            YYYY(1901/2155)

        DATE
            YYYY-MM-DD(1000-01-01/9999-12-31)

        TIME
            HH:MM:SS('-838:59:59'/'838:59:59')

        DATETIME

            YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59    Y)

        TIMESTAMP

            YYYYMMDD HHMMSS(1970-01-01 00:00:00/2037 年某時)

        ============注意啦,注意啦,注意啦===========
        1. 單獨插入時間時,須要以字符串的形式,按照對應的格式插入
        2. 插入年份時,儘可能使用4位值
        3. 插入兩位年份時,<=69,以20開頭,好比50,  結果2050      
                            >=70,以19開頭,好比71,結果1971

        datetime與timestamp的區別
        
        在實際應用的不少場景中,MySQL的這兩種日期類型都可以知足咱們的須要,存儲精度都爲秒,但在某些狀況下,會展示出他們各自的優劣。下面就來總結一下兩種日期類型的區別。

        1.DATETIME的日期範圍是1001——9999年,TIMESTAMP的時間範圍是1970——2038年。
        2.DATETIME存儲時間與時區無關,TIMESTAMP存儲時間與時區有關,顯示的值也依賴於時區。在mysql服務器,操做系統以及客戶端鏈接都有時區的設置。
        3.DATETIME使用8字節的存儲空間,TIMESTAMP的存儲空間爲4字節。所以,TIMESTAMP比DATETIME的空間利用率更高。
        4.DATETIME的默認值爲null;TIMESTAMP的字段默認不爲空(not null),默認值爲當前時間(CURRENT_TIMESTAMP),若是不作特殊處理,而且update語句中沒有指定該列的更新值,則默認更新爲當前時間。         


    - 字符串類型
        #注意:char和varchar括號內的參數指的都是字符的長度

        #char類型:定長,簡單粗暴,浪費空間,存取速度快
            字符長度範圍:0-255(一箇中文是一個字符,是utf8編碼的3個字節)
            存儲:
                存儲char類型的值時,會往右填充空格來知足長度
                例如:指定長度爲10,存>10個字符則報錯,存<10個字符則用空格填充直到湊夠10個字符存儲

            檢索:
                在檢索或者說查詢時,查出的結果會自動刪除尾部的空格,除非咱們打開pad_char_to_full_length SQL模式(SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';)

        #varchar類型:變長,精準,節省空間,存取速度慢
            字符長度範圍:0-65535(若是大於21845會提示用其餘類型 。mysql行最大限制爲65535字節,字符編碼爲utf-8:https://dev.mysql.com/doc/refman/5.7/en/column-count-limit.html)
            存儲:
                varchar類型存儲數據的真實內容,不會用空格填充,若是'ab  ',尾部的空格也會被存起來
                強調:varchar類型會在真實數據前加1-2Bytes的前綴,該前綴用來表示真實數據的bytes字節數(1-2Bytes最大表示65535個數字,正好符合mysql對row的最大字節限制,即已經足夠使用)
                若是真實的數據<255bytes則須要1Bytes的前綴(1Bytes=8bit 2**8最大表示的數字爲255)
                若是真實的數據>255bytes則須要2Bytes的前綴(2Bytes=16bit 2**16最大表示的數字爲65535)
            
            檢索:
                尾部有空格會保存下來,在檢索或者說查詢時,也會正常顯示包含空格在內的內容

        瞭解兩個函數
        length:查看字節數
        char_length:查看字符數

        1. char填充空格來知足固定長度,可是在查詢時卻會很不要臉地刪除尾部的空格(裝做本身好像沒有浪費過空間同樣),而後修改sql_mode讓其現出原形
        2. 雖然 CHAR 和 VARCHAR 的存儲方式不太相同,可是對於兩個字符串的比較,都只比 較其值,忽略 CHAR 值存在的右填充,即便將 SQL _MODE 設置爲 PAD_CHAR_TO_FULL_ LENGTH 也同樣,,但這不適用於like
        3.總結:
            #InnoDB存儲引擎:建議使用VARCHAR類型
            單從數據類型的實現機制去考慮,char數據類型的處理速度更快,有時甚至能夠超出varchar處理速度的50%。

            但對於InnoDB數據表,內部的行存儲格式沒有區分固定長度和可變長度列(全部數據行都使用指向數據列值的頭指針),所以在本質上,使用固定長度的CHAR列不必定比使用可變長度VARCHAR列性能要好。
            於是,主要的性能因素是數據行使用的存儲總量。因爲CHAR平均佔用的空間多於VARCHAR,所以使用VARCHAR來最小化須要處理的數據行的存儲總量和磁盤I/O是比較好的。

            #其餘字符串系列(效率:char>varchar>text)
            TEXT系列 TINYTEXT TEXT MEDIUMTEXT LONGTEXT
            BLOB 系列    TINYBLOB BLOB MEDIUMBLOB LONGBLOB 
            BINARY系列 BINARY VARBINARY

            text:text數據類型用於保存變長的大字符串,能夠組多到65535 (2**16 − 1)個字符。
            mediumtext:A TEXT column with a maximum length of 16,777,215 (2**24 − 1) characters.
            longtext:A TEXT column with a maximum length of 4,294,967,295 or 4GB (2**32 − 1) characters.


    - 枚舉類型與集合類型
        字段的值只能在給定範圍中選擇,如單選框,多選框
        enum 單選    只能在給定的範圍內選一個值,如性別 sex 男male/女female
        set 多選 在給定的範圍內能夠選擇一個或一個以上的值(愛好1,愛好2,愛好3...)

            枚舉類型(enum)
            An ENUM column can have a maximum of 65,535 distinct elements. (The practical limit is less than 3000.)
            示例:
                CREATE TABLE shirts (
                    name VARCHAR(40),
                    size ENUM('x-small', 'small', 'medium', 'large', 'x-large')
                );
                INSERT INTO shirts (name, size) VALUES ('dress shirt','large'), ('t-shirt','medium'),('polo shirt','small');

  

            集合類型(set)
            A SET column can have a maximum of 64 distinct members.
            示例:
                CREATE TABLE myset (col SET('a', 'b', 'c', 'd'));
                INSERT INTO myset (col) VALUES ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d');

6、表完整性約束
    下篇單獨介紹

7、修改表ALTER
    
    - 語法
        - 修改表名
            ALTER TABLE 表名 RENAME 新代表;
        - 增長字段
            ALTER TABLE 表名 ADD 字段名 數據類型 [完整性約束條件...],ADD 字段名 數據類型 [完整性約束條件];
            ALTER TABLE 表名 ADD 字段名 數據類型 [完整性約束條件...] FIRST;
            ALTER TABLE 表名 ADD 字段名 數據類型 [完整性約束條件...] AFTER 字段名;
        - 刪除字段
            ALTER TABLE 表名 DROP 字段名;
        - 修改字段
            ALTER TABLE 表名 MODIFY 字段名 數據類型 [完整性約束條件...];
            ALTER TABLE 表名 CHANGE 舊字段名 新字段名 舊數據類型 [完整性約束條件...];
            ALTER TABLE 表名 CHANGE 舊字段名 新字段名 新數據類型 [完整性約束條件...];


        例子:
            1. 修改存儲引擎
            mysql> alter table service 
                -> engine=innodb;

            2. 添加字段
            mysql> alter table student10
                -> add name varchar(20) not null,
                -> add age int(3) not null default 22;
                
            mysql> alter table student10
                -> add stu_num varchar(10) not null after name;                //添加name字段以後

            mysql> alter table student10                        
                -> add sex enum('male','female') default 'male' first;          //添加到最前面

            3. 刪除字段
            mysql> alter table student10
                -> drop sex;

            mysql> alter table service
                -> drop mac;

            4. 修改字段類型modify
            mysql> alter table student10
                -> modify age int(3);
            mysql> alter table student10
                -> modify id int(11) not null primary key auto_increment;    //修改成主鍵

            5. 增長約束(針對已有的主鍵增長auto_increment)
            mysql> alter table student10 modify id int(11) not null primary key auto_increment;
            ERROR 1068 (42000): Multiple primary key defined

            mysql> alter table student10 modify id int(11) not null auto_increment;
            Query OK, 0 rows affected (0.01 sec)
            Records: 0  Duplicates: 0  Warnings: 0

            6. 對已經存在的表增長複合主鍵
            mysql> alter table service2
                -> add primary key(host_ip,port);        

            7. 增長主鍵
            mysql> alter table student1
                -> modify name varchar(10) not null primary key;

            8. 增長主鍵和自動增加
            mysql> alter table student1
                -> modify id int not null primary key auto_increment;

            9. 刪除主鍵
            a. 刪除自增約束
            mysql> alter table student10 modify id int(11) not null; 

            b. 刪除主鍵
            mysql> alter table student10                                 
                -> drop primary key;

8、複製表
    - 複製表結構+記錄 (key不會複製: 主鍵、外鍵和索引)
        mysql> create table new_service select * from service;

        只複製表結構
        mysql> select * from service where 1=2;        //條件爲假,查不到任何記錄
        Empty set (0.00 sec)
        mysql> create table new1_service select * from service where 1=2;  
        Query OK, 0 rows affected (0.00 sec)
        Records: 0  Duplicates: 0  Warnings: 0

        mysql> create table t4 like employees;


9、刪除表

    - DROP TABLE 表名;
相關文章
相關標籤/搜索