数据库学习之旅——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…

Guess you like

Origin blog.csdn.net/weixin_42218582/article/details/100846792