mysql数据库、表、索引操作练习

mysql数据库、表、索引操作练习

库操作

创建数据库

查看创建数据库的帮助:

mysql> HELP CREATE DATABASE;
Name: 'CREATE DATABASE'
Description:
Syntax:
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name
    [create_specification] ...
//格式:CREATE 表示要执行创建动作;{DATABASE | SCHEMA} 表示创建的是数据库,关键字可以是DATABASE或者SCHEMA;[IF NOT EXISTS] 表示如果不存在,再创建;db_name 表示要创建的数据库的名字;[create_specification] 表示一些额外选项,如字符集和排序规则,在下面有专门解释
create_specification:
    [DEFAULT] CHARACTER SET [=] charset_name    //[DEFAULT] 表示默认,可以不写;CHARACTER SET 关键子表示设置字符集; charset_name 表示具体的字符集格式;可以使用 SHOW CHARACTER SET;来查看当前版本mysql支持的字符集;
  | [DEFAULT] COLLATE [=] collation_name    //COLLATE 关键字表示设置排序规则;collation_name 表示具体的排序规则格式;可以使用SHOW COLLATION;来查看当前版本mysql支持的排序规则

1,创建一个名为classes的数据库,用来存放班级信息;设置字符集为gbk,排序规则为gbk_chinese_ci


mysql> CREATE DATABASE IF NOT EXISTS classes CHARACTER SET = 'gbk' COLLATE = 'gbk_chinese_ci';
Query OK, 1 row affected (0.00 sec)

这时,可以在自己的mysql data目录下,查看到创建了一个classes的目录,用来存放该库的所有信息:


[root@mysql classes]# pwd   //我的data目录在/mysql,可以看到创建了一个classes的目录,起始就是数据库名
/mysql/classes
[root@mysql classes]# ls    //查看到空的数据库,里面已经有了一个.opt文件
db.opt
[root@mysql classes]# cat db.opt    //里面具体内容是存放的字符集和排序规则
default-character-set=gbk
default-collation=gbk_chinese_ci
[root@mysql classes]# file db.opt   //文加格式是ASCII test
db.opt: ASCII text

在mysql交互模式下,查看创建的数据库:


mysql> USE classes  //表示使用classes库,这是一个客户端命令,所以不用加分号
Database changed
mysql> SHOW TABLES; //使用SHOW命令,表示查看该库的所有表,此时classes库内容为空
Empty set (0.00 sec)

为了实验,将继续演示修改表和删除表,这两个结束后,会重新创建一个classes数据库,为后续表操作做基础。

修改库

一般来说,针对库修改,可以修改的有库的字符集和排序规则,后期还有升级数据字典名称等;库名称也可以修改,但是不建议,因为修改库名称的过程其实是重新创建一个新库,然后将数据重新写入新库的过程,在实际环境中这无疑是很消耗资源的

提示:可以关闭服务器,在数据目录对文件重命名;

查看修改库的帮助:


mysql> HELP ALTER DATABASE
Name: 'ALTER DATABASE'
Description:
Syntax:
ALTER {DATABASE | SCHEMA} [db_name]
    alter_specification ...
    //格式一:ALTER 关键字表示要执行修改操作; {DATABASE | SCHEMA} 表示对数据库进行修改操作,关键字可以是DATABASE或SCHEMA; [db_name] 表示数据库具体名字 ; alter_specification 表示修改的具体选项,下面有对该选项的具体解释
ALTER {DATABASE | SCHEMA} db_name
    UPGRADE DATA DIRECTORY NAME
    
alter_specification:
    [DEFAULT] CHARACTER SET [=] charset_name    //表示修改字符集具体格式
  | [DEFAULT] COLLATE [=] collation_name        //表示修改排序规则具体格式

2,修改classes数据库,将数据库的字符集更改为utf8,排序规则更改为utf8_bin


mysql> ALTER DATABASE classes CHARACTER SET = 'utf8' COLLATE = 'utf8_bin';
Query OK, 1 row affected (0.00 sec)

此时,可以去mysqldata目录,查看classes目录中的.opt文件中的内容发生了改变:


[root@mysql classes]# pwd 
/mysql/classes
[root@mysql classes]# cat db.opt 
default-character-set=utf8
default-collation=utf8_bin

删除库

库的删除是一个比较危险的动作,毕竟对于互联网行业,重中之中就是用户数据了。

查看删除库的帮助:


mysql> HELP DROP DATABASE
Name: 'DROP DATABASE'
Description:
Syntax:
DROP {DATABASE | SCHEMA} [IF EXISTS] db_name
/格式:DROP 关键字表示要执行删除动作; {DATABASE | SCHEMA} 表示对数据库进行删除操作,关键字可以是DATABASE或SCHEMA; {IF EXISTS} 表示如果存在,则执行; db_name 表示具体的数据库

3,删除classes数据库:


mysql> DROP DATABASE classes;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| fsx                |
| mysql              |
| performance_schema |
| students           |
| test               |
+--------------------+
6 rows in set (0.00 sec)

此时,在mysql的数据目录中,classes目录也就被删除了

表操作

创建表

创建表,有很多的选项参数,是相当复杂的,因此一定要看懂创建表的帮助信息,得容易得

查看创建表的帮助:

创建表具体有三种方法,每个方法下都很很多很多得选项参数

当工作在非常大的表上时,你可能偶尔需要运行很多查询获得一个大量数据的小的子集,不是对整个表运行这些查询,而是让MySQL每次找出所需的少数记录,将记录选择到一个临时表可能更快些,然后在这些表运行查询。


mysql> HELP CREATE TABLE
Name: 'CREATE TABLE'
Description:
Syntax:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    (create_definition,...)
    [table_options]
    [partition_options]
//方法一:格式: CREATE 表示要执行创建命令; [IF NOT EXISTS] 表示当要创建的表不存在时,才进行创建; tbl_name 表示创建的表的名字 [(create_definition)]表示对表中的列名,包括列属性,具体属性有:列名称,列存储的数据的数据类型,约束有:存储引擎,最大存放字数,是否使用自增长函数以及是否为主键、是否为唯一键; 
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    [(create_definition,...)]
    [table_options]
    [partition_options]
    [IGNORE | REPLACE]
    [AS] query_expression
//方法二:格式: CREATE 表示要执行创建命令; [IF NOT EXISTS] 表示当要创建的表不存在时,才进行创建; tbl_name 表示创建的表的名字 {}
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    { LIKE old_tbl_name | (LIKE old_tbl_name) }
//方法三:格式: CREATE 表示要执行创建命令; [TEMPORARY]表示是创建临时表 ; [IF NOT EXISTS] 表示当要创建的表不存在时,才进行创建; tbl_name 表示创建的表的名字 {}
create_definition:
    col_name column_definition
  | [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name,...)
      [index_option] ...
  | {INDEX|KEY} [index_name] [index_type] (index_col_name,...)
      [index_option] ...
  | [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY]
      [index_name] [index_type] (index_col_name,...)
      [index_option] ...
  | {FULLTEXT|SPATIAL} [INDEX|KEY] [index_name] (index_col_name,...)
      [index_option] ...
  | [CONSTRAINT [symbol]] FOREIGN KEY
      [index_name] (index_col_name,...) reference_definition
  | CHECK (expr)

column_definition:
    data_type [NOT NULL | NULL] [DEFAULT default_value]
      [AUTO_INCREMENT] [UNIQUE [KEY]] [[PRIMARY] KEY]
      [COMMENT 'string']
      [COLUMN_FORMAT {FIXED|DYNAMIC|DEFAULT}]
      [STORAGE {DISK|MEMORY|DEFAULT}]
      [reference_definition]

data_type:  //字段类型,就这么多,哈哈
    BIT[(length)]
  | TINYINT[(length)] [UNSIGNED] [ZEROFILL] //微整型
  | SMALLINT[(length)] [UNSIGNED] [ZEROFILL]//短整型
  | MEDIUMINT[(length)] [UNSIGNED] [ZEROFILL]//中整型
  | INT[(length)] [UNSIGNED] [ZEROFILL]//整型
  | INTEGER[(length)] [UNSIGNED] [ZEROFILL]//也是整型
  | BIGINT[(length)] [UNSIGNED] [ZEROFILL]//长整型
  | REAL[(length,decimals)] [UNSIGNED] [ZEROFILL]//实数型
  | DOUBLE[(length,decimals)] [UNSIGNED] [ZEROFILL]//双精度浮点型
  | FLOAT[(length,decimals)] [UNSIGNED] [ZEROFILL]//浮点型
  | DECIMAL[(length[,decimals])] [UNSIGNED] [ZEROFILL]
  | NUMERIC[(length[,decimals])] [UNSIGNED] [ZEROFILL]
  | DATE
  | TIME
  | TIMESTAMP
  | DATETIME
  | YEAR//都是时间类型
  | CHAR[(length)]//CHAR型
      [CHARACTER SET charset_name] [COLLATE collation_name]
  | VARCHAR(length)
      [CHARACTER SET charset_name] [COLLATE collation_name]
  | BINARY[(length)]
  | VARBINARY(length)
  | TINYBLOB
  | BLOB[(length)]
  | MEDIUMBLOB
  | LONGBLOB
  | TINYTEXT
      [CHARACTER SET charset_name] [COLLATE collation_name]
  | TEXT[(length)]
      [CHARACTER SET charset_name] [COLLATE collation_name]
  | MEDIUMTEXT
      [CHARACTER SET charset_name] [COLLATE collation_name]
  | LONGTEXT
      [CHARACTER SET charset_name] [COLLATE collation_name]
  | ENUM(value1,value2,value3,...)
      [CHARACTER SET charset_name] [COLLATE collation_name]
  | SET(value1,value2,value3,...)
      [CHARACTER SET charset_name] [COLLATE collation_name]
  | spatial_type

index_col_name:
    col_name [(length)] [ASC | DESC]

index_type:
    USING {BTREE | HASH}

index_option:
    KEY_BLOCK_SIZE [=] value
  | index_type
  | WITH PARSER parser_name
  | COMMENT 'string'

reference_definition:
    REFERENCES tbl_name (index_col_name,...)
      [MATCH FULL | MATCH PARTIAL | MATCH SIMPLE]
      [ON DELETE reference_option]
      [ON UPDATE reference_option]

reference_option:
    RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT

table_options:
    table_option [[,] table_option] ...

table_option:
    AUTO_INCREMENT [=] value
  | AVG_ROW_LENGTH [=] value
  | [DEFAULT] CHARACTER SET [=] charset_name
  | CHECKSUM [=] {0 | 1}
  | [DEFAULT] COLLATE [=] collation_name
  | COMMENT [=] 'string'
  | CONNECTION [=] 'connect_string'
  | {DATA|INDEX} DIRECTORY [=] 'absolute path to directory'
  | DELAY_KEY_WRITE [=] {0 | 1}
  | ENGINE [=] engine_name
  | INSERT_METHOD [=] { NO | FIRST | LAST }
  | KEY_BLOCK_SIZE [=] value
  | MAX_ROWS [=] value
  | MIN_ROWS [=] value
  | PACK_KEYS [=] {0 | 1 | DEFAULT}
  | PASSWORD [=] 'string'
  | ROW_FORMAT [=] {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT}
  | TABLESPACE tablespace_name [STORAGE {DISK|MEMORY|DEFAULT}]
  | UNION [=] (tbl_name[,tbl_name]...)

partition_options:
    PARTITION BY
        { [LINEAR] HASH(expr)
        | [LINEAR] KEY [ALGORITHM={1|2}] (column_list)
        | RANGE{(expr) | COLUMNS(column_list)}
        | LIST{(expr) | COLUMNS(column_list)} }
    [PARTITIONS num]
    [SUBPARTITION BY
        { [LINEAR] HASH(expr)
        | [LINEAR] KEY [ALGORITHM={1|2}] (column_list) }
      [SUBPARTITIONS num]
    ]
    [(partition_definition [, partition_definition] ...)]

partition_definition:
    PARTITION partition_name
        [VALUES
            {LESS THAN {(expr | value_list) | MAXVALUE}
            |
            IN (value_list)}]
        [[STORAGE] ENGINE [=] engine_name]
        [COMMENT [=] 'string' ]
        [DATA DIRECTORY [=] 'data_dir']
        [INDEX DIRECTORY [=] 'index_dir']
        [MAX_ROWS [=] max_number_of_rows]
        [MIN_ROWS [=] min_number_of_rows]
        [TABLESPACE [=] tablespace_name]
        [NODEGROUP [=] node_group_id]
        [(subpartition_definition [, subpartition_definition] ...)]

subpartition_definition:
    SUBPARTITION logical_name
        [[STORAGE] ENGINE [=] engine_name]
        [COMMENT [=] 'string' ]
        [DATA DIRECTORY [=] 'data_dir']
        [INDEX DIRECTORY [=] 'index_dir']
        [MAX_ROWS [=] max_number_of_rows]
        [MIN_ROWS [=] min_number_of_rows]
        [TABLESPACE [=] tablespace_name]
        [NODEGROUP [=] node_group_id]

query_expression:
    SELECT ...   (Some valid select or union statement)

第一种方式创建表

1,在clasees库中创建courses表,包含一个cid,一个subject,一个level


mysql> CREATE TABLE courses(cid TINYINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,subject VARCHAR(30) NOT NULL,level ENUM('学位课','非学位课') NOT NULL) ENGINE=InnoDB;
Query OK, 0 rows affected (0.18 sec)
//courses中,创建了三列;
//第一列:列名为cid,TINYINT UNSIGNED表示字段类型是无符号微整型,NOT NULL表示不可为空,AUTO_INCREMENT表示自增长,PRIMARY KEY 表示该列为主键;
//第二列:列名为subject,VARCHAR(30)表示存储字段类型为varchar类型,占30字节;NOT NULL表示不可为空
//第三列:列名为level,ENUM('学位课','非学位课')表示为枚举类型,可填只有"学位课"或"非学位课",NOT NULL 表示不可为空
ENGINE=InnoDB 表示存储引擎使用InnoDB
mysql> SHOW TABLES;
+-------------------+
| Tables_in_classes |
+-------------------+
| courses           |
+-------------------+
1 row in set (0.01 sec)
表中插入数据

当创建好表之后,就可以在表中插入数据了。查看插入数据的帮助:


mysql> HELP INSERT 
Name: 'INSERT'
Description:
Syntax:
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
    [INTO] tbl_name
    [(col_name [, col_name] ...)]
    {VALUES | VALUE} (value_list) [, (value_list)] ...
    [ON DUPLICATE KEY UPDATE assignment_list]
    //INSERT 表示要号子型插入命令; [LOW_PRIORITY | DELAYED | HIGH_PRIORITY]是表示插入数据的级别; [IGNORE]表示忽略; [INTO] 关键字表示插入; tbl_name 表示插入的表的名字; [(col_name [, col_name] ...)] 表示表中的列名,可以是很多列; {VALUES | VALUE} (value_list) [, (value_list)] VALUE关键字是表示插入的具体数据,后面()中填写具体数据

INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
    [INTO] tbl_name
    SET assignment_list
    [ON DUPLICATE KEY UPDATE assignment_list]

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

value:
    {expr | DEFAULT}

value_list:
    value [, value] ...

assignment:
    col_name = value

assignment_list:
    assignment [, assignment] ...

1,给courses插入数据


mysql> INSERT INTO courses (subject,level) VALUES('密码学基础','学位课'),('走进 通信','非学位课'),('JAVA编程','非学位课');
Query OK, 3 rows affected (0.41 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM courses;
+-----+-----------------+--------------+
| cid | subject         | level        |
+-----+-----------------+--------------+
|   1 | 密码学基础      | 学位课       |
|   2 | 走进通信        | 非学位课     |
|   3 | JAVA编程        | 非学位课     |
+-----+-----------------+--------------+
3 rows in set (0.00 sec)

第二种方式创建表

第二中创建表的方式的核心思想:仿照已经存在的表,创建一个新表,但是某些属性并没有继承母表


mysql> CREATE TABLE courses_2 SELECT * FROM courses WHERE cid <= 2;
Query OK, 2 rows affected (0.44 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM courses;
+-----+-----------------+--------------+
| cid | subject         | level        |
+-----+-----------------+--------------+
|   1 | 密码学基础      | 学位课       |
|   2 | 走进通信        | 非学位课     |
|   3 | JAVA编程        | 非学位课     |
+-----+-----------------+--------------+
3 rows in set (0.00 sec)
mysql> select * from courses_2;
+-----+-----------------+--------------+
| cid | subject         | level        |
+-----+-----------------+--------------+
|   1 | 密码学基础      | 学位课       |
|   2 | 走进通信        | 非学位课     |
+-----+-----------------+--------------+
2 rows in set (0.00 sec)
mysql> desc courses;
+---------+----------------------------------+------+-----+---------+----------------+
| Field   | Type                             | Null | Key | Default | Extra          |
+---------+----------------------------------+------+-----+---------+----------------+
| cid     | tinyint(3) unsigned              | NO   | PRI | NULL    | auto_increment |
| subject | varchar(30)                      | NO   |     | NULL    |                |
| level   | enum('学位课','非学位课')        | NO   |     | NULL    |                |
+---------+----------------------------------+------+-----+---------+----------------+
3 rows in set (0.09 sec)

mysql> desc courses_2;
+---------+----------------------------------+------+-----+---------+-------+
| Field   | Type                             | Null | Key | Default | Extra |
+---------+----------------------------------+------+-----+---------+-------+
| cid     | tinyint(3) unsigned              | NO   |     | 0       |       |
| subject | varchar(30)                      | NO   |     | NULL    |       |
| level   | enum('学位课','非学位课')        | NO   |     | NULL    |       |
+---------+----------------------------------+------+-----+---------+-------+
3 rows in set (0.01 sec)

注意:这种方式创建新的表,并没有继承母表的属性。

第三种方式创建表

第三种方式创建表的核心思想:完全仿照母表,创建一个新的表,继承的是母表的属性,但是不继承目标的数据


mysql> CREATE TABLE courses_3 LIKE courses;
Query OK, 0 rows affected (0.13 sec)

mysql> SELECT * FROM courses_3;
Empty set (0.00 sec)
mysql> DESC courses_3;
+---------+----------------------------------+------+-----+---------+----------------+
| Field   | Type                             | Null | Key | Default | Extra          |
+---------+----------------------------------+------+-----+---------+----------------+
| cid     | tinyint(3) unsigned              | NO   | PRI | NULL    | auto_increment |
| subject | varchar(30)                      | NO   |     | NULL    |                |
| level   | enum('学位课','非学位课')        | NO   |     | NULL    |                |
+---------+----------------------------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

可以看到,继承了母表所有的属性,但是是一个空表

创建表总结:根据不同需求去创建不同的表,三种方式个有千秋,但是最主要的还是掌握如何使用HELP命令去查看怎么创建表

修改表

所谓修改表,就是对已经存在的表的二次操作;修改表就是对表中的字段、索引、甚至索引进行添加、删除、修改等

查看修改表的帮助:

mysql> HELP ALTER TABLE
Name: 'ALTER TABLE'
Description:
Syntax:
ALTER [ONLINE|OFFLINE] [IGNORE] TABLE tbl_name
    [alter_specification [, alter_specification] ...]
    [partition_options]
    //格式:ALTER 表示进行修改的操作; [ONLINE|OFFLINE] 表示在线还是离线修改; [IGNORE] 忽略; TABLE 表示要对一个表进行修改操作; tabl_name 表示操作的表名; [alter_specification [, alter_specification] ...] 表示一些修改的选项,如ADD(进行添加操作),CHANGE(进行修改操作),DROP(进行删除操作); 
//使用HELP ALERT TABLE 命令下面还有很多对选项参数的使用方法,这里就不一一罗列,自己掌握常用的即可

1,给classes表添加一个字段,为开课时间time_start


mysql> ALTER TABLE courses ADD (time_start TIME NOT NULL);
Query OK, 3 rows affected (0.27 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM courses;
+-----+-----------------+--------------+------------+
| cid | subject         | level        | time_start |
+-----+-----------------+--------------+------------+
|   1 | 密码学基础      | 学位课       | 00:00:00   |
|   2 | 走进通信        | 非学位课     | 00:00:00   |
|   3 | JAVA编程        | 非学位课     | 00:00:00   |
+-----+-----------------+--------------+------------+
3 rows in set (0.00 sec)

已经添加成功了time_start字段,如何添加数据呢?这里可以和修改密码的方式一样,进行更新数据


mysql> UPDATE courses SET time_start='08:00:00' WHERE cid=1;
Query OK, 1 row affected (0.15 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> SELECT * FROM courses;
+-----+-----------------+--------------+------------+
| cid | subject         | level        | time_start |
+-----+-----------------+--------------+------------+
|   1 | 密码学基础      | 学位课       | 08:00:00   |
|   2 | 走进通信        | 非学位课     | 00:00:00   |
|   3 | JAVA编程        | 非学位课     | 00:00:00   |
+-----+-----------------+--------------+------------+
3 rows in set (0.00 sec)
//同样,可以修改每一门课的上课时间

mysql> UPDATE courses SET time_start='10:15:00' WHERE cid=2;
Query OK, 1 row affected (0.08 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> UPDATE courses SET time_start='16:45:00' WHERE cid=3;
Query OK, 1 row affected (0.15 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> SELECT * FROM courses;
+-----+-----------------+--------------+------------+
| cid | subject         | level        | time_start |
+-----+-----------------+--------------+------------+
|   1 | 密码学基础      | 学位课       | 08:00:00   |
|   2 | 走进通信        | 非学位课     | 10:15:00   |
|   3 | JAVA编程        | 非学位课     | 16:45:00   |
+-----+-----------------+--------------+------------+
3 rows in set (0.00 sec)

2,修改courses表中,time_starttime_start,并且属性为NOT NULL TIMESTAMP


mysql> ALTER TABLE courses CHANGE time_start time_start TIMESTAMP NOT NULL;
Query OK, 3 rows affected, 3 warnings (0.27 sec)
Records: 3  Duplicates: 0  Warnings: 3

mysql> SELECT * FROM courses;
+-----+-----------------+--------------+---------------------+
| cid | subject         | level        | time_start          |
+-----+-----------------+--------------+---------------------+
|   1 | 密码学基础      | 学位课       | 0000-00-00 00:00:00 |
|   2 | 走进通信        | 非学位课     | 0000-00-00 00:00:00 |
|   3 | JAVA编程        | 非学位课     | 0000-00-00 00:00:00 |
+-----+-----------------+--------------+---------------------+
3 rows in set (0.00 sec)
//注意,如果修改了属性。原本的数据就会消失,所以这也是个很操心的动作。所以,演示完成后,经过一番操作,我又把数据改了回去;
mysql> SELECT * FROM courses;
+-----+-----------------+--------------+------------+
| cid | subject         | level        | time_start |
+-----+-----------------+--------------+------------+
|   1 | 密码学基础      | 学位课       | 08:00:00   |
|   2 | 走进通信        | 非学位课     | 10:15:00   |
|   3 | JAVA编程        | 非学位课     | 16:45:00   |
+-----+-----------------+--------------+------------+
3 rows in set (0.00 sec)

3,删除courses表中的time_start字段

注意:这里说的删除,是删除表中的字段、索引等,不是说删除表!!!所以还是属于对表的ALTER操作


mysql> ALTER TABLE courses DROP time_start;
Query OK, 3 rows affected (0.28 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM courses;
+-----+-----------------+--------------+
| cid | subject         | level        |
+-----+-----------------+--------------+
|   1 | 密码学基础      | 学位课       |
|   2 | 走进通信        | 非学位课     |
|   3 | JAVA编程        | 非学位课     |
+-----+-----------------+--------------+
3 rows in set (0.00 sec)

辛辛苦苦创建,轻轻松松删除,还是那句话,数据最珍贵,尽量不要去DROP

删除表

删除十个很危险的动作,特别是在数据库上。不是十分把握,还是不要删除,想想rm -rf的动作多危险,这个动作就有多危险。

查看删除表的帮助:

mysql> HELP DROP TABLE
Name: 'DROP TABLE'
Description:
Syntax:
DROP [TEMPORARY] TABLE [IF EXISTS]
    tbl_name [, tbl_name] ...
    [RESTRICT | CASCADE]
//格式: DROP 关键字表示要执行删除操作; [TEMPORARY] 表示临时操作; TABLE 表示要对表进行该操作; tbl_name 表示表的名字,具体到操作哪个表; [RESTRICT | CASCADE] 这是两个关键字,RESTRICT表示检查外键约束,CASCADE表示连同约束外键的表也进行DROP操作;CASCADE这个关键字更加危险,还是不要用,简直就是株连九族

1,删除classes_2classes_3


mysql> DROP TABLE courses_2
    -> ;
Query OK, 0 rows affected (0.11 sec)

mysql> DROP TABLE courses_3;
Query OK, 0 rows affected (0.10 sec)

mysql> SHOW TABLES;
+-------------------+
| Tables_in_classes |
+-------------------+
| courses           |
+-------------------+
1 row in set (0.00 sec)

索引操作

数据库索引用来提高数据库表的数据访问速度。索引不能被修改,只能创建,删除,或者查看,索引本身是一个结构体实例化

注意:如果要修改索引,那就是两段式了,先删除再创建就可以达到修改索引的效果

创建索引

一个表中某一个字段,可以创建多个索引

查看创建索引的帮助:

mysql> HELP CREATE INDEX
Name: 'CREATE INDEX'
Description:
Syntax:
CREATE [ONLINE|OFFLINE] [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name
    [index_type]
    ON tbl_name (index_col_name,...)
    [index_option] ...
    //格式:CREATE 表示进行创建操作; [ONLINE|OFFLINE] 表示在线或者离线操作; [UNIQUE|FULLTEXT|SPATIAL] 表示创建的索引类型,分别表示唯一索引、全文索引、空间索引三种不同的索引类型; index_name 表示索引的名称,由用户自行定义,以便于以后对该索引进行修改等管理操作; [index_type] 表示索引的具体实现方式,在MySQL中,有两种不同形式的索引——BTREE索引和HASH索引,而存储引擎为MyISAM和InnoDB的表中只能使用BTREE,其默认值就是BTREE,存储引擎为MEMORY或者HEAP的表中可以使用HASH和BTREE两种类型的索引,其默认值为HASH;ON tbl_name (index_col_name,...) 表示在哪个表上进行创建索引,index_col_name 表示需要创建索引的字段名称,可以针对多个字段创建复合索引,只需要在多个字段名称之间以英文逗号隔开即可

index_col_name:
    col_name [(length)] [ASC | DESC]

index_option:
    KEY_BLOCK_SIZE [=] value
  | index_type
  | WITH PARSER parser_name
  | COMMENT 'string'

index_type:
    USING {BTREE | HASH}

mysql> SHOW INDEXES FROM courses\G
*************************** 1. row ***************************
        Table: courses
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: cid
    Collation: A
  Cardinality: 3
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: BTREE
      Comment: 
Index_comment: 
1 row in set (0.00 sec)
//在创建索引之前,查看courses表的索引信息

1,为courses表的subject字段创建索引

mysql> CREATE INDEX sub_index ON courses (subject) USING BTREE;
Query OK, 0 rows affected (0.56 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> SHOW INDEXES FROM courses\G
*************************** 1. row ***************************
        Table: courses
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: cid
    Collation: A
  Cardinality: 3
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: BTREE
      Comment: 
Index_comment: 
*************************** 2. row ***************************
        Table: courses
   Non_unique: 1
     Key_name: sub_index
 Seq_in_index: 1
  Column_name: subject
    Collation: A
  Cardinality: 3
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: BTREE
      Comment: 
Index_comment: 
2 rows in set (0.00 sec)
//此时可以看到,成功的为subject字段创建了一个新的索引。Key_name为sub_index

删除索引

查看删除索引的帮助:

mysql> HELP DROP INDEX
Name: 'DROP INDEX'
Description:
Syntax:
DROP [ONLINE|OFFLINE] INDEX index_name ON tbl_name
//格式: DROP 表示进行删除操作; [ONLINE|OFFLINE] 表示在线或者离线操作; INDEX 关键字表示对索引进行删除操作; index_name 表示要删除的索引的名字; ON tbl_name 表示删除的表的名字

1,删除courses表中subject字段的sub_index索引


mysql> DROP INDEX sub_index ON courses;
Query OK, 0 rows affected (0.17 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> SHOW INDEXES FROM courses\G
*************************** 1. row ***************************
        Table: courses
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: cid
    Collation: A
  Cardinality: 3
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: BTREE
      Comment: 
Index_comment: 
1 row in set (0.00 sec)

总结

学习对mysql的库、表、索引的操作,一定要学会如何使用HELP命令;操作有四种

  • 增:CREATE

  • 删:DROP

  • 改:ALTER

  • 查:SELECT

即最主要学会的是HELP CREATE|DRPO|ALTER|SELECT DATABSE|TABLE|INDEX相关操作,然后通过HELP得到的帮助进行具体操作。

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页