數據庫學習之旅——Mysql

  • 引入

MySQL 是最流行的關係型數據庫管理系統,在 WEB 應用方面 MySQL 是最好的 RDBMS(Relational Database Management System:關係數據庫管理系統)應用軟件之一。

  • RDBMS術語

    • 數據庫: 數據庫是一些關聯表的集合。
    • 數據表: 表是數據的矩陣。在一個數據庫中的表看起來像一個簡單的電子表格。
    • : 一列(數據元素) 包含了相同類型的數據, 例如郵政編碼的數據。
    • :一行(=元組,或記錄)是一組相關的數據,例如一條用戶訂閱的數據。
    • 冗餘:存儲兩倍數據,冗餘降低了性能,但提高了數據的安全性。
    • 主鍵:主鍵是唯一的。一個數據表中只能包含一個主鍵。你可以使用主鍵來查詢數據。
    • 外鍵:外鍵用於關聯兩個表。
    • 複合鍵:複合鍵(組合鍵)將多個列作爲一個索引鍵,一般用於複合索引。
    • 索引:使用索引可快速訪問數據庫表中的特定信息。索引是對數據庫表中一列或多列的值進行排序的一種結構。類似於書籍的目錄。
    • 參照完整性: 參照的完整性要求關係中不允許引用不存在的實體。與實體完整性是關係模型必須滿足的完整性約束條件,目的是保證數據的一致性。

  • 管理MySQL的命令

    • USE 數據庫名 :
      選擇要操作的Mysql數據庫,使用該命令後所有Mysql命令都只針對該數據庫。

      mysql> use mysql;
      Database changed
      
    • SHOW DATABASES:
      列出 MySQL 數據庫管理系統的數據庫列表。

      mysql> show databases;
      +--------------------+
      | Database           |
      +--------------------+
      | django數據庫       |
      | information_schema |
      | jdbc_test          |
      | mysql              |
      | performance_schema |
      | sakila             |
      | sys                |
      | world              |
      | 爬蟲數據庫         |
      +--------------------+
      12 rows in set (0.01 sec)
      
    • SHOW TABLES:
      顯示指定數據庫的所有表,使用該命令前需要使用 use 命令來選擇要操作的數據庫。

      mysql> use 爬蟲數據庫;
      Database changed
      mysql> show tables;
      +----------------------+
      | Tables_in_爬蟲數據庫 |
      +----------------------+
      | douban               |
      | url_list             |
      +----------------------+
      2 rows in set (0.00 sec)
      
    • SHOW COLUMNS FROM 數據表:
      顯示數據表的屬性,屬性類型,主鍵信息 ,是否爲 NULL,默認值等其他信息。

      mysql> SHOW COLUMNS FROM douban;
      +---------------+---------------+------+-----+---------+-------+
      | Field         | Type          | Null | Key | Default | Extra |
      +---------------+---------------+------+-----+---------+-------+
      | serial_number | varchar(32)   | NO   | PRI | NULL    |       |
      | movie_name    | varchar(255)  | YES  |     | NULL    |       |
      | introduce     | varchar(1000) | YES  |     | NULL    |       |
      | star          | varchar(10)   | YES  |     | NULL    |       |
      | evaluate      | varchar(255)  | YES  |     | NULL    |       |
      | describe      | varchar(255)  | YES  |     | NULL    |       |
      +---------------+---------------+------+-----+---------+-------+
      6 rows in set (0.00 sec)
      
    • SHOW INDEX FROM 數據表:
      顯示數據表的詳細索引信息,包括PRIMARY KEY(主鍵)。

      mysql> SHOW INDEX FROM douban;
      +--------+------------+----------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
      | Table  | Non_unique | Key_name | Seq_in_index | Column_name   | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression |
      +--------+------------+----------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
      | douban |          0 | PRIMARY  |            1 | serial_number | A         |         250 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
      +--------+------------+----------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
      1 row in set (0.01 sec)
      
    • SHOW TABLE STATUS LIKE [FROM db_name] [LIKE ‘pattern’] \G:
      該命令將輸出Mysql數據庫管理系統的性能及統計信息。

      mysql> SHOW TABLE STATUS FROM 爬蟲數據庫;    # 顯示數據庫 爬蟲數據庫 中所有表的信息
      +----------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+--------------------+----------+----------------+---------+
      | Name     | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time | Check_time | Collation          | Checksum | Create_options | Comment |
      +----------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+--------------------+----------+----------------+---------+
      | douban   | InnoDB |      10 | Dynamic    |  250 |            393 |       98304 |               0 |            0 |         0 |           NULL | 2019-04-28 01:30:48 | NULL        | NULL       | utf8mb4_0900_ai_ci |     NULL |                |         |
      | url_list | InnoDB |      10 | Dynamic    |   13 |           1260 |       16384 |               0 |            0 |         0 |             17 | 2019-04-14 16:08:28 | NULL        | NULL       | utf8mb4_0900_ai_ci |     NULL |                |         |
      +----------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+--------------------+----------+----------------+---------+
      
      mysql> SHOW TABLE STATUS FROM 爬蟲數據庫 LIKE 'url%';     # 表名以url開頭的表的信息
      +----------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+--------------------+----------+----------------+---------+
      | Name     | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time | Check_time | Collation          | Checksum | Create_options | Comment |
      +----------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+--------------------+----------+----------------+---------+
      | url_list | InnoDB |      10 | Dynamic    |   13 |           1260 |       16384 |               0 |            0 |         0 |             17 | 2019-04-14 16:08:28 | NULL        | NULL       | utf8mb4_0900_ai_ci |     NULL |                |         |
      +----------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+--------------------+----------+----------------+---------+
      1 row in set (0.00 sec)
      
      mysql> SHOW TABLE STATUS FROM 爬蟲數據庫 LIKE 'url%' \G ;   # 加上 \G,查詢結果按列打印
      *************************** 1. row ***************************
                 Name: url_list
               Engine: InnoDB
              Version: 10
           Row_format: Dynamic
                 Rows: 13
       Avg_row_length: 1260
          Data_length: 16384
      Max_data_length: 0
         Index_length: 0
            Data_free: 0
       Auto_increment: 17
          Create_time: 2019-04-14 16:08:28
          Update_time: NULL
           Check_time: NULL
            Collation: utf8mb4_0900_ai_ci
             Checksum: NULL
       Create_options:
              Comment:
      1 row in set (0.00 sec)
      

  • MySQL 創建數據庫

    • 我們可以在登陸 MySQL 服務後,使用 create 命令創建數據庫,語法如下:

      CREATE DATABASE 數據庫名;
      # 例子:
      mysql> CREATE DATABASE test;
      Query OK, 1 row affected (0.01 sec)
      
    • 使用 mysqladmin 創建數據庫
      使用普通用戶,你可能需要特定的權限來創建或者刪除 MySQL 數據庫。
      所以我們這邊使用root用戶登錄,root用戶擁有最高權限,可以使用 mysql mysqladmin 命令來創建數據庫。
      以下命令簡單的演示了創建數據庫的過程,數據名爲 test2:

      C:\Users\Administrator> mysqladmin -u root   -p create test2
      Enter password: ****
      # 進入數據庫 查看是否創建了 test2數據庫
      C:\Users\Administrator>mysql -uroot -p
      Enter password: ****
      Welcome to the MySQL monitor.  Commands end with ; or \g.
      Your MySQL connection id is 19
      Server version: 8.0.15 MySQL Community Server - GPL		
      Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
      Oracle is a registered trademark of Oracle Corporation and/or its
      affiliates. Other names may be trademarks of their respective
      owners.		
      Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
      
      mysql> SHOW DATABASES;
      +--------------------+
      | Database           |
      +--------------------+
      | database           |
      | information_schema |
      | jdbc_test          |
      | mysql              |
      | performance_schema |
      | sakila             |
      | sys                |
      | test               |
      | test2             |
      | world              |
      +--------------------+
      10 rows in set (0.00 sec)
      

  • MySQL 刪除數據庫

    • 使用普通用戶登陸 MySQL 服務器,你可能需要特定的權限來創建或者刪除 MySQL 數據庫,所以我們這邊使用 root 用戶登錄,root 用戶擁有最高權限。在刪除數據庫過程中,務必要十分謹慎,因爲在執行刪除命令後,所有數據將會消失。

    • drop 命令刪除數據庫
      drop 命令格式:

      drop database <數據庫名>;
      # 例如刪除名爲 test1 的數據庫:
      mysql> drop database test;
      Query OK, 0 rows affected (0.01 sec)
      
    • 使用 mysqladmin 刪除數據庫

      C:\Users\Administrator>mysqladmin -u root -p drop test
      Enter password: ****
      Dropping the database is potentially a very bad thing to do.
      Any data stored in the database will be destroyed.
      
      Do you really want to drop the 'test' database [y/N] y
      Database "test" dropped
      

  • MySQL 數據類型

    MySQL中定義數據字段的類型對你數據庫的優化是非常重要的。

    MySQL支持多種類型,大致可以分爲三類:數值、日期/時間和字符串(字符)類型

    • 數值類型:

        MySQL支持所有標準SQL數值數據類型。
      
        這些類型包括嚴格數值數據類型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似數值數據類型(FLOAT、REAL和DOUBLE PRECISION)。
        
        關鍵字INT是INTEGER的同義詞,關鍵字DEC是DECIMAL的同義詞。
        
        BIT數據類型保存位字段值,並且支持MyISAM、MEMORY、InnoDB和BDB表。
        
        作爲SQL標準的擴展,MySQL也支持整數類型TINYINT、MEDIUMINT和BIGINT。下面的表顯示了需要的每個整數類型的存儲和範圍。
      

    • 日期和時間類型:

        表示時間值的日期和時間類型爲DATETIME、DATE、TIMESTAMP、TIME和YEAR。
      
        每個時間類型有一個有效值範圍和一個"零"值,當指定不合法的MySQL不能表示的值時使用"零"值。
        
        TIMESTAMP類型有專有的自動更新特性,將在後面描述。
      

    • 字符串類型:

        字符串類型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。
      

      CHAR 和 VARCHAR 類型類似,但它們保存和檢索的方式不同。它們的最大長度和是否尾部空格被保留等方面也不同。在存儲或檢索過程中不進行大小寫轉換。
      
      BINARY 和 VARBINARY 類似於 CHAR 和 VARCHAR,不同的是它們包含二進制字符串而不要非二進制字符串。
      
      也就是說,它們包含字節字符串而不是字符字符串。這說明它們沒有字符集,並且排序和比較基於列值字節的數值值。
      
      BLOB 是一個二進制大對象,可以容納可變數量的數據。有 4 種 BLOB 類型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它們區別在於可容納存儲範圍不同。
      
      有 4 種 TEXT 類型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。對應的這 4 種 BLOB 類型,可存儲的最大長度不同,可根據實際情況選擇。
      
    • 關於漢字佔多少個字節問題:

        MySQL 5.0 以上的版本:
        
        1、一個漢字佔多少長度與編碼有關:
        
        UTF-8:一個漢字=3個字節
        
        GBK:一個漢字=2個字節
        
        2、varchar(n) 表示 n 個字符,無論漢字和英文,Mysql 都能存入 n 個字符,僅是實際字節長度有所區別
        
        3、MySQL 檢查長度,可用 SQL 語言來查看:
      
           select LENGTH(fieldname) from tablename
      

  • MySQL 創建數據表

      創建MySQL數據表需要以下信息:
      
      表名
      表字段名
      定義每個表字段
    
    • 語法,以下爲創建MySQL數據表的SQL通用語法:

      CREATE TABLE table_name (column_name column_type);
      

      以下例子中我們將在 test 數據庫中創建數據表test_tbl:

      CREATE TABLE IF NOT EXISTS `test_tbl`(
         `id` INT UNSIGNED AUTO_INCREMENT,
         `title` VARCHAR(100) NOT NULL,
         `author` VARCHAR(40) NOT NULL,
         `submission_date` DATE,
         PRIMARY KEY ( `id` )
      )ENGINE=InnoDB DEFAULT CHARSET=utf8;
      

      實例解析

      如果你不想字段爲 NULL 可以設置字段的屬性爲 NOT NULL, 在操作數據庫時如果輸入該字段的數據爲NULL ,就會報錯。

      AUTO_INCREMENT定義列爲自增的屬性,一般用於主鍵,數值會自動加1。

      PRIMARY KEY關鍵字用於定義列爲主鍵。 可以使用多列來定義主鍵,列間以逗號分隔。

      ENGINE 設置存儲引擎,CHARSET 設置編碼。

    • 通過命令提示符創建表

      通過 mysql> 命令窗口可以很簡單的創建MySQL數據表。你可以使用 SQL 語句 CREATE TABLE 來創建數據表。

    • 實例
      以下爲創建數據表 test_tbl 實例:

      mysql> use test;
      Database changed
      mysql> use test;
      Database changed
      mysql> CREATE TABLE `test_tb1`(
          -> `id` INT UNSIGNED AUTO_INCREMENT,
          -> `title` VARCHAR(100) NOT NULL,
          -> `author` VARCHAR(40) NOT NULL,
          -> `submission_date` DATE,
          -> PRIMARY KEY(`id`)) ENGINE InnoDB DEFAULT CHARSET=utf8;
      Query OK, 0 rows affected, 1 warning (0.05 sec)
      

      注意:MySQL命令終止符爲分號 ; 。

      注意: -> 是換行符標識,不要複製。

    • PS:

      創建 MySql 的表時,表名和字段名外面的符號 ` 不是單引號,而是英文輸入法狀態下的反單引號,也就是鍵盤左上角 esc 按鍵下面的那一個 ~ 按鍵,坑慘了。

      反引號是爲了區分 MySql 關鍵字與普通字符而引入的符號,一般的,表名與字段名都使用反引號。


  • MySQL 刪除數據表

      MySQL中刪除數據表是非常容易操作的, 但是你再進行刪除表操作時要非常小心,
    
      因爲執行刪除命令後所有數據都會消失。
    
    • 語法,以下爲刪除MySQL數據表的通用語法:

          DROP TABLE table_name ;
      
    • 在命令提示窗口中刪除數據表:

      # 刪除 test 數據庫中的 test_tb1表
      mysql> use test;
      Database changed
      mysql> DROP TABLE test_tb1;
      Query OK, 0 rows affected (0.03 sec)
      
      
    • 執行成功後,我們使用以下命令,就看不到 test_tb1 表了:

      mysql> show tables;
      Empty set (0.01 sec)
      
      

  • MySQL 插入數據

MySQL 表中使用 INSERT INTO SQL語句來插入數據。

你可以通過 mysql> 命令提示窗口中向數據表中插入數據,或者通過Python腳本來插入數據(關於python腳本後期會寫一篇博客)。

以下爲向MySQL數據表插入數據通用的 INSERT INTO SQL語法:

INSERT INTO table_name ( field1, field2,...fieldN )
                       VALUES
                       ( value1, value2,...valueN );

如果數據是字符型,必須使用單引號或者雙引號,如:“value”。

  • 通過命令提示窗口插入數據

    以下我們將使用 SQL INSERT INTO 語句向 MySQL 數據表 test_tb1 插入數據:

    mysql> use test_tbl;
    Database changed
    mysql> INSERT INTO test_tbl
        -> (title,author,submission_date)
        -> VALUES                    ());
        -> ("學習Python","松本剛",NOW());
    Query OK, 1 row affected, 1 warning (0.01 sec)
    
    
    mysql> INSERT INTO test_tbl
        -> (title,author,submission_date)
        -> VALUES
        -> ("學習Mysql","松本剛",NOW());
    Query OK, 1 row affected, 1 warning (0.03 sec)
    
    

    注意: 使用箭頭標記 -> 不是 SQL 語句的一部分,它僅僅表示一個新行,如果一條SQL語句太長,我們可以通過回車鍵來創建一個新行來編寫 SQL 語句,SQL 語句的命令結束符爲分號 ;。

    在以上實例中,我們並沒有提供 id 的數據,因爲該字段我們在創建表的時候已經設置它爲 AUTO_INCREMENT(自動增加) 屬性。 所以,該字段會自動遞增而不需要我們去設置。實例中 NOW() 是一個 MySQL 函數,該函數返回日期和時間。

    接下來我們可以通過以下語句查看數據表數據:

    mysql> SELECT * FROM test_tbl;
    +----+------------+--------+-----------------+
    | id | title      | author | submission_date |
    +----+------------+--------+-----------------+
    |  1 | 學習Python | 松本剛 | 2019-09-16      |
    |  2 | 學習Mysql  | 松本剛 | 2019-09-16      |
    +----+------------+--------+-----------------+
    2 rows in set (0.00 sec)
    
    
  • INSERT 插入多條數據

    INSERT INTO table_name  (field1, field2,...fieldN)  VALUES 
     (valueA1,valueA2,...valueAN),
     (valueB1,valueB2,...valueBN),
     (valueC1,valueC2,...valueCN)......;
    
  • 添加數據的時候可以規定列進行添加

    如果所有的列都要添加數據可以不規定列進行添加數據:

    mysql> INSERT INTO runoob_tbl
        -> VALUES
        -> (0, "JAVA 教程", "JAVA.COM", '2019-09-06');
    

    第一列如果沒有設置主鍵自增(PRINARY KEY AUTO_INCREMENT)的話添加第一列數據比較容易錯亂,要不斷的查詢表看數據。

    如果添加過主鍵自增(PRINARY KEY AUTO_INCREMENT)第一列在增加數據的時候,可以寫爲0或者null,這樣添加數據可以自增, 從而可以添加全部數據,而不用特意規定那幾列添加數據。


  • MySQL 查詢數據

     MySQL 數據庫使用SQL SELECT語句來查詢數據。	
    你可以通過 mysql> 命令提示窗口中在數據庫中查詢數據,或者通過Python腳本來查詢數據。
    

    語法,以下爲在MySQL數據庫中查詢數據通用的 SELECT 語法:

    SELECT column_name,column_name
    FROM table_name
    [WHERE Clause]
    [LIMIT N][ OFFSET M]
    

    查詢語句中你可以使用一個或者多個表,表之間使用逗號(,)分割,並使用WHERE語句來設定查詢條件。
    SELECT 命令可以讀取一條或者多條記錄。
    你可以使用星號(*)來代替其他字段,SELECT語句會返回表的所有字段數據
    你可以使用 WHERE 語句來包含任何條件。
    你可以使用 LIMIT 屬性來設定返回的記錄數。
    你可以通過OFFSET指定SELECT語句開始查詢的數據偏移量。默認情況下偏移量爲0。

    • 通過命令提示符獲取數據:

      以下實例我們將通過 SQL SELECT 命令來獲取 MySQL 數據表 test_tbl 的數據:

      mysql> SELECT * FROM test_tbl;
      +----+------------+--------+-----------------+
      | id | title      | author | submission_date |
      +----+------------+--------+-----------------+
      |  1 | 學習Python | 松本剛 | 2019-09-16      |
      |  2 | 學習Mysql  | 松本剛 | 2019-09-16      |
      |  3 | 學習php    | 大隱   | 2019-09-18      |
      +----+------------+--------+-----------------+
      3 rows in set (0.00 sec)
      

  • MySQL WHERE 子句

    我們知道從 MySQL 表中使用 SQL SELECT 語句來讀取數據。

    如需有條件地從表中選取數據,可將 WHERE 子句添加到 SELECT 語句中。

    以下是 SQL SELECT 語句使用 WHERE 子句從數據表中讀取數據的通用語法:

    SELECT field1, field2,...fieldN FROM table_name1, table_name2...
    [WHERE condition1 [AND [OR]] condition2.....
    

    查詢語句中你可以使用一個或者多個表,表之間使用逗號, 分割,並使用WHERE語句來設定查詢條件。

    你可以在 WHERE 子句中指定任何條件。

    你可以使用 AND 或者 OR 指定一個或多個條件。

    WHERE 子句也可以運用於 SQL 的 DELETE 或者 UPDATE 命令。

    WHERE 子句類似於程序語言中的 if 條件,根據 MySQL 表中的字段值來讀取指定的數據。

  • 從命令提示符中讀取數據:

    我們將在SQL SELECT語句使用WHERE子句來讀取MySQL數據表 runoob_tbl 中的數據:

    實例

    以下實例將讀取 test_tbl 表中 author 字段值爲 松本剛 的所有記錄:

    SELECT * from test_tbl WHERE author='松本剛';
    
    
    mysql> SELECT * from test_tbl WHERE author='松本剛';
    +----+------------+--------+-----------------+
    | id | title      | author | submission_date |
    +----+------------+--------+-----------------+
    |  1 | 學習Python | 松本剛 | 2019-09-16      |
    |  2 | 學習Mysql  | 松本剛 | 2019-09-16      |
    +----+------------+--------+-----------------+
    2 rows in set (0.00 sec)
    
    
    • MySQL 的 WHERE 子句的字符串比較是不區分大小寫的。 你可以使用 BINARY 關鍵字來設定 WHERE 子句的字符串比較是區分大小寫的。

  • MySQL UPDATE 更新

      如果我們需要修改或更新 MySQL 中的數據,我們可以使用 SQL UPDATE 命令來操作。
    

    以下是 UPDATE 命令修改 MySQL 數據表數據的通用 SQL 語法:

    UPDATE table_name SET field1=new-value1, field2=new-value2
    [WHERE Clause]
    

    你可以同時更新一個或多個字段。

    你可以在 WHERE 子句中指定任何條件。

    你可以在一個單獨表中同時更新數據。

    當你需要更新數據表中指定行的數據時 WHERE 子句是非常有用的。

    • 通過命令提示符更新數據

    • 以下我們將在 SQL UPDATE 命令使用 WHERE 子句來更新 test_tbl 表中指定的數據:

      以下實例將更新數據表中 id 爲 3 的 title 字段值:

      mysql> UPDATE test_tbl SET title='學習前端' WHERE id=3;
      Query OK, 1 row affected (0.01 sec)
      Rows matched: 1  Changed: 1  Warnings: 0
      
      mysql> SELECT * FROM test_tbl;
      +----+------------+--------+-----------------+
      | id | title      | author | submission_date |
      +----+------------+--------+-----------------+
      |  1 | 學習python | 松本剛 | 2019-09-16      |
      |  2 | 學習Java   | 松本剛 | 2019-09-16      |
      |  3 | 學習前端   | 大隱   | 2019-09-18      |
      +----+------------+--------+-----------------+
      3 rows in set (0.00 sec)
      

  • MYSQL DELETE 刪除語句

    語法

    DELETE FROM table_name [WHERE Clause]
    
      1. 如果沒有指定 WHERE 子句,MySQL 表中的所有記錄將被刪除。
      
      2. 你可以在 WHERE 子句中指定任何條件
      
      3. 您可以在單個表中一次性刪除記錄。
    
      ps:當你想刪除數據表中指定的記錄時 WHERE 子句是非常有用的。
    

    實例:

      以下將刪除 test_tbl表中 id=3 的記錄:
    
      mysql> DELETE FROM test_tbl WHERE id=3;
      
      Query OK, 1 row affected (0.23 sec)
      
      mysql> select * from test_tbl;
      +----+------------+--------+-----------------+
      | id | title      | author | submission_date |
      +----+------------+--------+-----------------+
      |  1 | 學習python | 松本剛 | 2019-09-16      |
      |  2 | 學習Java   | 松本剛 | 2019-09-16      |
      +----+------------+--------+-----------------+
      2 rows in set (0.00 sec)
    

    筆記

      delete,drop,truncate 都有刪除表的作用,區別在於:
    
       1、delete 和 truncate 僅僅刪除表數據,drop 連表數據和表結構一起刪除,打個比方,delete 是單殺,truncate 是團滅,drop 是把電腦摔了。
       2、delete 是 DML 語句,操作完以後如果沒有不想提交事務還可以回滾,truncate 和 drop 是 DDL 語句,操作完馬上生效,不能回滾,打個比方,delete 是發微信說分手,後悔還可以撤回,truncate 和 drop 是直接扇耳光說滾,不能反悔。
       3、執行的速度上,drop>truncate>delete,打個比方,drop 是神舟火箭,truncate 是和諧號動車,delete 是自行車。
    

  • ALTER 命令

      當我們需要修改數據表名或者修改數據表字段時,就需要使用到MySQL ALTER命令。
    
      首先創建一張表,表名爲:testalter_tbl 
    
      	mysql> CREATE TABLE testalter_tbl(
      -> i INT,
      -> c CHAR(1)
      -> );
      Query OK, 0 rows affected (0.04 sec)
    
      mysql> SHOW COLUMNS FROM testalter_tbl;
      +-------+---------+------+-----+---------+-------+
      | Field | Type    | Null | Key | Default | Extra |
      +-------+---------+------+-----+---------+-------+
      | i     | int(11) | YES  |     | NULL    |       |
      | c     | char(1) | YES  |     | NULL    |       |
      +-------+---------+------+-----+---------+-------+
      2 rows in set (0.00 sec)
    
    • 刪除,添加或修改表字段:

        如下命令使用了 ALTER 命令及 DROP 子句來刪除以上創建表的 i 字段:
        
        mysql> ALTER  TABLE  testalter_tbl DROP i;
        Query OK, 0 rows affected (0.07 sec)
        Records: 0  Duplicates: 0  Warnings: 0
      

      如果數據表中只剩餘一個字段則無法使用DROP來刪除字段。

        MySQL 中使用 ADD 子句來向數據表中添加列,如下實例在表 testalter_tbl 中添加 i 字段,並定義數據類型:
        
        mysql> ALTER TABLE testalter_tbl ADD i INT;
        Query OK, 0 rows affected (0.02 sec)
        Records: 0  Duplicates: 0  Warnings: 0
      

      執行以上命令後,i 字段會自動添加到數據表字段的末尾。

        mysql> SHOW COLUMNS FROM testalter_tbl;
        +-------+---------+------+-----+---------+-------+
        | Field | Type    | Null | Key | Default | Extra |
        +-------+---------+------+-----+---------+-------+
        | c     | char(1) | YES  |     | NULL    |       |
        | i     | int(11) | YES  |     | NULL    |       |
        +-------+---------+------+-----+---------+-------+
        2 rows in set (0.00 sec)
      

    如果你需要指定新增字段的位置,可以使用MySQL提供的關鍵字 FIRST (設定位第一列), AFTER 字段名(設定位於某個字段之後)。

    嘗試以下 ALTER TABLE 語句, 在執行成功後,使用 SHOW COLUMNS 查看錶結構的變化:

    ALTER TABLE testalter_tbl DROP i;
    ALTER TABLE testalter_tbl ADD i INT FIRST;
    ALTER TABLE testalter_tbl DROP i;
    ALTER TABLE testalter_tbl ADD i INT AFTER c;
    
    • 修改字段類型及名稱:

      如果需要修改字段類型及名稱, 你可以在ALTER命令中使用 MODIFY 或 CHANGE 子句 。

      例如,把字段 c 的類型從 CHAR(1) 改爲 CHAR(10),可以執行以下命令:

        mysql> ALTER TABLE testalter_tbl MODIFY c CHAR(10);
        Query OK, 0 rows affected (0.07 sec)
        Records: 0  Duplicates: 0  Warnings: 0
      

      使用 CHANGE 子句, 語法有很大的不同。 在 CHANGE 關鍵字之後,緊跟着的是你要修改的字段名,然後指定新字段名及類型。嘗試如下實例:

        mysql> ALTER TABLE testalter_tbl CHANGE i j BIGINT;
        Query OK, 0 rows affected (0.07 sec)
        Records: 0  Duplicates: 0  Warnings: 0
        mysql> SHOW COLUMNS FROM testalter_tbl;
        +-------+------------+------+-----+---------+-------+
        | Field | Type       | Null | Key | Default | Extra |
        +-------+------------+------+-----+---------+-------+
        | c     | char(10)   | YES  |     | NULL    |       |
        | j     | bigint(20) | YES  |     | NULL    |       |
        +-------+------------+------+-----+---------+-------+
        2 rows in set (0.00 sec)
      
    • ALTER TABLE 對 Null 值和默認值的影響:

        mysql> ALTER TABLE testalter_tbl CHANGE j i INT NOT NULL DEFAULT 1000;
        Query OK, 0 rows affected (0.06 sec)
        Records: 0  Duplicates: 0  Warnings: 0
      
        mysql> SHOW COLUMNS FROM testalter_tbl;
        +-------+----------+------+-----+---------+-------+
        | Field | Type     | Null | Key | Default | Extra |
        +-------+----------+------+-----+---------+-------+
        | c     | char(10) | YES  |     | NULL    |       |
        | i     | int(11)  | NO   |     | 1000    |       |
        +-------+----------+------+-----+---------+-------+
        2 rows in set (0.00 sec)
      
      
        如果你不設置默認值,MySQL會自動設置該字段默認爲 NULL。
      
    • 修改字段默認值:

      你可以使用 ALTER 來修改字段的默認值,嘗試以下實例:

        mysql> ALTER TABLE testalter_tbl ALTER i SET DEFAULT 100;
        Query OK, 0 rows affected (0.01 sec)
        Records: 0  Duplicates: 0  Warnings: 0
      
        mysql> SHOW COLUMNS FROM testalter_tbl;
        +-------+----------+------+-----+---------+-------+
        | Field | Type     | Null | Key | Default | Extra |
        +-------+----------+------+-----+---------+-------+
        | c     | char(10) | YES  |     | NULL    |       |
        | i     | int(11)  | NO   |     | 100     |       |
        +-------+----------+------+-----+---------+-------+
        2 rows in set (0.01 sec)
      

      你也可以使用 ALTER 命令及 DROP子句來刪除字段的默認值,如下實例:

        mysql> ALTER TABLE testalter_tbl ALTER i DROP DEFAULT;
        Query OK, 0 rows affected (0.01 sec)
        Records: 0  Duplicates: 0  Warnings: 0
      
        mysql> SHOW COLUMNS FROM testalter_tbl;
        +-------+----------+------+-----+---------+-------+
        | Field | Type     | Null | Key | Default | Extra |
        +-------+----------+------+-----+---------+-------+
        | c     | char(10) | YES  |     | NULL    |       |
        | i     | int(11)  | NO   |     | NULL    |       |
        +-------+----------+------+-----+---------+-------+
        2 rows in set (0.00 sec)
      
    • 修改數據表類型,可以使用 ALTER 命令及 TYPE 子句來完成。嘗試以下實例,我們將表 testalter_tbl 的類型修改爲 MYISAM :

      注意:查看數據表類型可以使用 SHOW TABLE STATUS 語句。

        mysql> ALTER TABLE testalter_tbl ENGINE= MYISAM;
        Query OK, 0 rows affected (0.06 sec)
        Records: 0  Duplicates: 0  Warnings: 0
      
        mysql> SHOW TABLE STATUS LIKE 'testalter_tbl' \G;
        *************************** 1. row ***************************
                   Name: testalter_tbl
                 Engine: MyISAM
                Version: 10
             Row_format: Fixed
                   Rows: 0
         Avg_row_length: 0
            Data_length: 16384
        Max_data_length: 0
           Index_length: 0
              Data_free: 0
         Auto_increment: NULL
            Create_time: 2019-10-10 19:59:37
            Update_time: NULL
             Check_time: NULL
              Collation: utf8mb4_0900_ai_ci
               Checksum: NULL
         Create_options:
                Comment:
        1 row in set (0.00 sec)
      
    • 修改表名:

      如果需要修改數據表的名稱,可以在 ALTER TABLE 語句中使用 RENAME 子句來實現。

      嘗試以下實例將數據表 testalter_tbl 重命名爲 alter_tbl:

        mysql> ALTER TABLE testalter_tbl RENAME TO alter_tbl;
        Query OK, 0 rows affected (0.01 sec)
        
        mysql> SHOW TABLES;
        +----------------+
        | Tables_in_test |
        +----------------+
        | alter_tbl      |
        | test_tbl       |
        +----------------+
        2 rows in set (0.00 sec)
      

end…

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