MySQL语法基础

1.MySQL管理

1.1启动和关闭服务

# Linux
service mysqld start      # 启动
service mysqld stop      # 关闭
service mysql restart    # 重启

# Windows
net start mysql        # 启动
net stop mysql         # 关闭

1.2常用命令

  • 登录

mysql -u root -p[密码] [-P端口] [-h地址]

  • USE 数据库名

列出 MySQL 数据库管理系统的数据库列表

mysql> USE sql_test;
Database changed
  • SHOW DATABASES:

列出 MySQL 数据库管理系统的数据库列表

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)
  • SHOW TABLES:

显示指定数据库的所有表,使用该命令前需要使用 use 命令来选择要操作的数据库

mysql> SHOW TABLES;
+--------------------+
| Tables_in_sql_test |
+--------------------+
| runoob_tb1         |
+--------------------+
1 row in set (0.01 sec)
  • SHOW COLUMNS FROM 数据表:

显示数据表的属性,属性类型,主键信息 ,是否为 NULL,默认值等其他信息

mysql> SHOW COLUMNS FROM USER_PRIVILEGES;
+----------------+--------------+------+-----+---------+-------+
| Field          | Type         | Null | Key | Default | Extra |
+----------------+--------------+------+-----+---------+-------+
| GRANTEE        | varchar(292) | NO   |     |         |       |
| TABLE_CATALOG  | varchar(512) | NO   |     |         |       |
| PRIVILEGE_TYPE | varchar(64)  | NO   |     |         |       |
| IS_GRANTABLE   | varchar(3)   | NO   |     |         |       |
+----------------+--------------+------+-----+---------+-------+
4 rows in set (0.02 sec)
  • SHOW INDEX FROM 数据表:

显示数据表的详细索引信息,包括PRIMARY KEY(主键)

mysql> SHOW INDEX FROM runoob_tb1;
+------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| Table      | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression |
+------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| runoob_tb1 |          0 | PRIMARY  |            1 | runoob_id   | A         |           1 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
+------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
1 row in set (0.02 sec)
mysql> SHOW INDEX FROM runoob_tb1 \G      # 加上 \G,查询结果按列打印,注意加上\G就不用加";"了
*************************** 1. row ***************************
        Table: runoob_tb1
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: runoob_id
    Collation: A
  Cardinality: 1
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: BTREE
      Comment: 
Index_comment: 
      Visible: YES
   Expression: NULL
1 row in set (0.00 sec)
\G的作用

 

  • SHOW TABLE STATUS [FROM db_name] [LIKE 'pattern'] \G: 

该命令将输出Mysql数据库管理系统的性能及统计信息

mysql> SHOW TABLE STATUS  FROM sql_test;   # 显示数据库 RUNOOB 中所有表的信息

mysql> SHOW TABLE STATUS from sql_test LIKE 'runoob%';     # 表名以runoob开头的表的信息
mysql> SHOW TABLE STATUS from sql_test LIKE 'runoob%'\G    # 加上 \G,查询结果按列打印

2.数据库及表的管理

2.1创建数据库

mysql> CREATE DATABASE sql_test;
Query OK, 1 row affected (0.01 sec)


# root用户拥有最高权限,可以使用mysqladmin命令来创建数据库
[root@localhost ~]# mysqladmin -u root -p CREATE sql_test;
Enter password:******

2.2删除数据库

mysql> DROP DATABASE sql_test1;
Query OK, 0 rows affected (0.02 sec)


#  mysqladmin命令在终端来执行删除命令
[root@localhost ~]# mysqladmin -u root -p DROP sql_test1;
Enter password:******

2.3创建数据表

CREATE TABLE table_name (column_name column_type);

例:

mysql> CREATE TABLE IF NOT EXISTS runoob_tbl(
   -> runoob_id INT NOT NULL AUTO_INCREMENT,
   -> runoob_title VARCHAR(100) NOT NULL,
   -> runoob_author VARCHAR(40) NOT NULL,
   -> submission_date DATE,
   -> PRIMARY KEY ( runoob_id )
   -> )ENGINE=InnoDB DEFAULT CHARSET=utf8;

# ENGINE 设置存储引擎,CHARSET 设置编码

2.4删除数据表

DROP TABLE table_name;

2.5数据表的CRUD

  • 插入数据 INSERT INTO
# 语法:
INSERT INTO table_name ( field1, field2,...fieldN )
                       VALUES
                       ( value1, value2,...valueN );

# 实例:
mysql> INSERT INTO runoob_tb1
    -> (runoob_title, runoob_author, submission_date)
    -> VALUES
    -> ("sql", "eric", NOW());
  • 查询数据通用的 SELECT 语法
# 语法:
SELECT column_name,column_name
FROM table_name
[WHERE Clause]
[LIMIT N][ OFFSET M]
    •   查询语句中你可以使用一个或者多个表,表之间使用逗号(,)分割,并使用WHERE语句来设定查询条件。
    •   SELECT 命令可以读取一条或者多条记录。
    •   你可以使用星号(*)来代替其他字段,SELECT语句会返回表的所有字段数据
    •   你可以使用 WHERE 语句来包含任何条件。
    •   你可以使用 LIMIT 属性来设定返回的记录数。
    •   你可以通过OFFSET指定SELECT语句开始查询的数据偏移量。默认情况下偏移量为0
# 实例:
mysql> SELECT * FROM runoob_tb1;
+-----------+--------------+---------------+-----------------+
| runoob_id | runoob_title | runoob_author | submission_date |
+-----------+--------------+---------------+-----------------+
|         1 | sql          | eric          | 2019-11-15      |
|         2 | redis        | alex          | 2019-11-16      |
+-----------+--------------+---------------+-----------------+
2 rows in set (0.00 sec)
# 语法:
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 表中的字段值来读取指定的数据



# 实例:
mysql> SELECT * FROM runoob_tb1 WHERE runoob_author='eric';
+-----------+--------------+---------------+-----------------+
| runoob_id | runoob_title | runoob_author | submission_date |
+-----------+--------------+---------------+-----------------+
|         1 | sql          | eric          | 2019-11-15      |
|         3 | mongo        | eric          | 2019-11-16      |
+-----------+--------------+---------------+-----------------+
2 rows in set (0.00 sec)

# MySQL 的 WHERE 子句的字符串比较是不区分大小写的。 你可以使用 BINARY 关键字来设定 WHERE 子句的字符串比较是区分大小写的。
mysql> SELECT * FROM runoob_tb1 WHERE BINARY runoob_title='Redis';
Empty set (0.01 sec)

mysql> SELECT * FROM runoob_tb1 WHERE BINARY runoob_title='redis';
+-----------+--------------+---------------+-----------------+
| runoob_id | runoob_title | runoob_author | submission_date |
+-----------+--------------+---------------+-----------------+
|         2 | redis        | alex          | 2019-11-16      |
|         4 | redis        | bobby         | 2019-11-16      |
+-----------+--------------+---------------+-----------------+
2 rows in set (0.00 sec)
WHERE子句

 

MySQL查询:

  • 更新数据的 UPDATE 语法
# 语法
UPDATE table_name SET field1=new-value1, field2=new-value2
[WHERE Clause]
# 即  update 表名称 set 列名称=新值 where 更新条件;



# 实例
mysql> UPDATE runoob_tb1 SET runoob_author='jack' WHERE runoob_author='alex';
Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> SELECT * FROM runoob_tb1 WHERE runoob_author='jack';
+-----------+--------------+---------------+-----------------+
| runoob_id | runoob_title | runoob_author | submission_date |
+-----------+--------------+---------------+-----------------+
|         2 | redis        | jack          | 2019-11-16      |
+-----------+--------------+---------------+-----------------+
1 row in set (0.00 sec)
  • 删除数据的 DELETE 语法
# 语法
DELETE FROM table_name [WHERE Clause]


# 实例
mysql> DELETE FROM runoob_tb1 WHERE runoob_id=1;
Query OK, 1 row affected (0.02 sec)

3.MySQL数据类型

4.JOIN的使用

数据库中多张表查询时需要用到JOIN

JOIN 按照功能大致分为如下三类:

  • INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
  • LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
  • RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。

4.1连接条件

使用ON关键字来设定连接条件,也可以使用WHERE来代替。

通常使用ON关键字来设定连接条件,使用WHERE关键字进行结果集记录的过滤。

4.2内连接 — INNER JOIN

# 语法:
tableA_reference INNER JOIN tableB_reference ON conditional_expr


# 实例
mysql> SELECT * FROM runoob_tb1;
+-----------+--------------+---------------+-----------------+
| runoob_id | runoob_title | runoob_author | submission_date |
+-----------+--------------+---------------+-----------------+
|         2 | redis        | jack          | 2019-11-16      |
|         3 | mongo        | eric          | 2019-11-16      |
|         4 | redis        | bobby         | 2019-11-16      |
+-----------+--------------+---------------+-----------------+
3 rows in set (0.00 sec)

mysql> SELECT * FROM runoob_tb1;
+-----------+--------------+---------------+-----------------+
| runoob_id | runoob_title | runoob_author | submission_date |
+-----------+--------------+---------------+-----------------+
|         2 | redis        | jack          | 2019-11-16      |
|         3 | mongo        | eric          | 2019-11-16      |
|         4 | redis        | bobby         | 2019-11-16      |
|         5 | python       | eric          | 2019-11-16      |
|         6 | linux        | alex          | 2019-11-16      |
+-----------+--------------+---------------+-----------------+
5 rows in set (0.00 sec)

mysql> SELECT a.runoob_id,a.runoob_author,b.runoob_count FROM 
    -> runoob_tb1 AS a INNER JOIN count_tb1 AS b ON a.runoob_id=b.runoob_id;
+-----------+---------------+--------------+
| runoob_id | runoob_author | runoob_count |
+-----------+---------------+--------------+
|         2 | jack          |           20 |
|         3 | eric          |           25 |
|         4 | bobby         |           15 |
+-----------+---------------+--------------+
3 rows in set (0.00 sec)

4.2左外连接 — LEFT JOIN

LEFT JOIN 会读取左边数据表的全部数据,即便右边表无对应数据。

以 runoob_tbl 为左表,tcount_tbl 为右表:

mysql> SELECT a.runoob_id,a.runoob_author,b.runoob_count FROM
    -> runoob_tb1 AS a LEFT JOIN count_tb1 AS b ON a.runoob_author=b.runoob_author;
+-----------+---------------+--------------+
| runoob_id | runoob_author | runoob_count |
+-----------+---------------+--------------+
|         3 | eric          |           10 |
|         5 | eric          |           10 |
|         6 | alex          |           20 |
|         2 | jack          |           25 |
|         4 | bobby         |           15 |
|         7 | siri          |         NULL |
+-----------+---------------+--------------+
6 rows in set (0.01 sec)

4.2右外连接 — RIGHT JOIN

以 runoob_tbl 为左表,tcount_tbl 为右表:

mysql> SELECT a.runoob_id,a.runoob_author,b.runoob_count FROM
    -> runoob_tb1 AS a RIGHT JOIN count_tb1 AS b ON a.runoob_author=b.runoob_authoor;
+-----------+---------------+--------------+
| runoob_id | runoob_author | runoob_count |
+-----------+---------------+--------------+
|         2 | jack          |           25 |
|         3 | eric          |           10 |
|         4 | bobby         |           15 |
|         5 | eric          |           10 |
|         6 | alex          |           20 |
|      NULL | NULL          |           23 |
+-----------+---------------+--------------+
6 rows in set (0.00 sec)

5.NULL 值处理

MySQL 使用 SQL SELECT 命令及 WHERE 子句来读取数据表中的数据,但是当提供的查询条件字段为 NULL 时,该命令可能就无法正常工作。

为了处理这种情况,MySQL提供了三大运算符:

  • IS NULL: 当列的值是 NULL,此运算符返回 true。
  • IS NOT NULL: 当列的值不为 NULL, 运算符返回 true。
  • <=>: 比较操作符(不同于=运算符),当比较的的两个值为 NULL 时返回 true。

关于 NULL 的条件比较运算是比较特殊的。你不能使用 = NULL 或 != NULL 在列中查找 NULL 值 。

在 MySQL 中,NULL 值与任何其它值的比较(即使是 NULL)永远返回 false,即 NULL = NULL 返回false 。

MySQL 中处理 NULL 使用 IS NULL 和 IS NOT NULL 运算符。

实例:先在count_tb1中插入一个runoob_count为NULL的数据,然后:

mysql> SELECT * FROM count_tb1;
+-----------+---------------+--------------+
| runoob_id | runoob_author | runoob_count |
+-----------+---------------+--------------+
|         1 | eric          |           10 |
|         2 | alex          |           20 |
|         3 | jack          |           25 |
|         4 | bobby         |           15 |
|         5 | mary          |           23 |
|         6 | wang          |         NULL |
+-----------+---------------+--------------+
6 rows in set (0.00 sec)

# 以下实例中你可以看到 = 和 != 运算符是不起作用的:
mysql> SELECT * FROM count_tb1 WHERE runoob_count=NULL;
Empty set (0.01 sec)

mysql> SELECT * FROM count_tb1 WHERE runoob_count!=NULL;
Empty set (0.00 sec)

# 查找数据表中 runoob_test_tbl 列是否为 NULL,必须使用 IS NULL 和 IS NOT NULL,如下实例:
mysql> SELECT * FROM count_tb1 WHERE runoob_count IS NULL;
+-----------+---------------+--------------+
| runoob_id | runoob_author | runoob_count |
+-----------+---------------+--------------+
|         6 | wang          |         NULL |
+-----------+---------------+--------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM count_tb1 WHERE runoob_count IS NOT NULL;
+-----------+---------------+--------------+
| runoob_id | runoob_author | runoob_count |
+-----------+---------------+--------------+
|         1 | eric          |           10 |
|         2 | alex          |           20 |
|         3 | jack          |           25 |
|         4 | bobby         |           15 |
|         5 | mary          |           23 |
+-----------+---------------+--------------+
5 rows in set (0.00 sec)

6.MySQL 正则表达式

MySQL可以通过 LIKE ...% 来进行模糊匹配。

MySQL 同样也支持其他正则表达式的匹配, MySQL中使用 REGEXP 操作符来进行正则表达式匹配。

查找name字段中以'st'为开头的所有数据:

mysql> SELECT name FROM person_tbl WHERE name REGEXP '^st';
更多:https://www.runoob.com/mysql/mysql-regexp.html

7.MySQL 事务

事务是由一步或几步数据库操作序列组成逻辑执行单元,这系列操作要么全部执行,要么全部放弃执行。程序和事务是两个不同的概念。一般而言:一段程序中可能包含多个事务。(说白了就是几步的数据库操作而构成的逻辑执行单元

  • 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
  • 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
  • 事务用来管理 insert,update,delete 语句

事务的4个特性(ACID):原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)

  • 原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

  • 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。

  • 隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读已提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。

  • 持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT 操作。因此要显式地开启一个事务务须使用命令 BEGIN 或 START TRANSACTION,或者执行命令 SET AUTOCOMMIT=0,用来禁止使用当前会话的自动提交。

事务控制语句:

  • BEGIN 或 START TRANSACTION 显式地开启一个事务;

  • COMMIT 也可以使用 COMMIT WORK,不过二者是等价的。COMMIT 会提交事务,并使已对数据库进行的所有修改成为永久性的;

  • ROLLBACK 也可以使用 ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;

  • SAVEPOINT identifier,SAVEPOINT 允许在事务中创建一个保存点,一个事务中可以有多个 SAVEPOINT;

  • RELEASE SAVEPOINT identifier 删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;

  • ROLLBACK TO identifier 把事务回滚到标记点;

  • SET TRANSACTION 用来设置事务的隔离级别。InnoDB 存储引擎提供事务的隔离级别有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE。

MYSQL 事务处理主要有两种方法:

1、用 BEGIN, ROLLBACK, COMMIT来实现

  • BEGIN 开始一个事务
  • ROLLBACK 事务回滚
  • COMMIT 事务确认

2、直接用 SET 来改变 MySQL 的自动提交模式:

  • SET AUTOCOMMIT=0 禁止自动提交
  • SET AUTOCOMMIT=1 开启自动提交

实例:

mysql> CREATE TABLE runoob_transaction_test(id INT(5)) ENGINE=InnoDB;
Query OK, 0 rows affected, 1 warning (0.03 sec)

mysql> SELECT * FROM runoob_transaction_test;
Empty set (0.01 sec)

# 开始一个事务
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into runoob_transaction_test value (3);
Query OK, 1 row affected (0.00 sec)

mysql> insert into runoob_transaction_test (id) value (5);
Query OK, 1 row affected (0.00 sec)

# 提交事务
mysql> commit;
Query OK, 0 rows affected (0.01 sec)

mysql> SELECT * FROM runoob_transaction_test;
+------+
| id   |
+------+
|    3 |
|    5 |
+------+
2 rows in set (0.00 sec)

# 开始一个事务
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into runoob_transaction_test (id) value (7);
Query OK, 1 row affected (0.00 sec)

mysql> insert into runoob_transaction_test (id) value (9);
Query OK, 1 row affected (0.00 sec)

# 回滚
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)

# 回滚以后数据并没有插入成功
mysql> SELECT * FROM runoob_transaction_test;
+------+
| id   |
+------+
|    3 |
|    5 |
+------+
2 rows in set (0.00 sec)

使用保留点 SAVEPOINT

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into runoob_transaction_test (id) value (11);
Query OK, 1 row affected (0.00 sec)

# 创建一个保存点
mysql> savepoint point1;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into runoob_transaction_test (id) value (13);
Query OK, 1 row affected (0.00 sec)

# 回滚到保存点
mysql> rollback to point1;
Query OK, 0 rows affected (0.00 sec)

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM runoob_transaction_test;
+------+
| id   |
+------+
|    3 |
|    5 |
|   11 |
+------+
3 rows in set (0.00 sec)

8. ALTER命令

修改数据表名或者修改数据表字段时,就需要使用到MySQL ALTER命令。

先创建一张表,表名为:testalter_tbl。

mysql> create table if not exists testalter_tb1(
    -> id INT,
    -> c CHAR(2)
    -> );
Query OK, 0 rows affected (0.06 sec)

mysql> show columns from testalter_tb1;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | YES  |     | NULL    |       |
| c     | char(2) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.01 sec)

8.1删除,添加表字段

 使用ALTER 命令及 DROP 子句来删除以上创建表的 id 字段:

mysql> ALTER TABLE testalter_tb1 DROP id;

如果数据表中只剩余一个字段则无法使用DROP来删除字段。

使用 ADD 子句来向数据表中添加列,如下实例在表 testalter_tbl 中添加 id 字段,并定义数据类型:

mysql> ALTER TABLE testalter_tb1 ADD id INT;

执行以上命令后,id 字段会自动添加到数据表字段的末尾。

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

如果你需要指定新增字段的位置,可以使用MySQL提供的关键字 FIRST (设定位第一列), AFTER 字段名(设定位于某个字段之后)。

尝试以下 ALTER TABLE 语句, 在执行成功后,使用 SHOW COLUMNS 查看表结构的变化:

ALTER TABLE testalter_tbl DROP id;
ALTER TABLE testalter_tbl ADD id INT FIRST;
ALTER TABLE testalter_tbl DROP id;
ALTER TABLE testalter_tbl ADD id INT AFTER c;

8.2 修改字段类型及名称

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

例如,把字段 c 的类型从 CHAR(1) 改为 CHAR(10),可以执行以下命令:

mysql> ALTER TABLE testalter_tb1 MODIFY c CHAR(10);

使用 CHANGE 子句, 语法有很大的不同。 在 CHANGE 关键字之后,紧跟着的是要修改的字段名,然后指定新字段名及类型:

mysql> ALTER TABLE testalter_tb1 CHANGE id num BIGINT;

mysql> ALTER TABLE testalter_tb1 CHANGE num num INT;

8.3 ALTER对 Null 值和默认值的影响

当修改字段时,可以指定是否包含值或者是否设置默认值。

以下实例,指定字段 num为 NOT NULL 且默认值为50:

mysql> ALTER TABLE testalter_tb1 ALTER num SET DEFAULT 50;
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

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

你也可以使用 ALTER 命令及 DROP子句来删除字段的默认值:

mysql> ALTER TABLE testalter_tb1 ALTER num DROP DEFAULT;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> SHOW COLUMNS FROM testalter_tb1;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| c     | char(10) | YES  |     | NULL    |       |
| num   | int(11)  | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.01 sec)

8.4 修改数据表类型及表明

修改数据表类型,可以使用 ALTER 命令及 TYPE 子句来完成。尝试以下实例,我们将表 testalter_tbl 的类型修改为 MYISAM :

注意:查看数据表类型可以使用 SHOW TABLE STATUS 语句。

mysql> SHOW TABLE STATUS LIKE 'testalter_tb1' \G
*************************** 1. row ***************************
           Name: testalter_tb1
         Engine: MyISAM
        Version: 10
     Row_format: Fixed
           Rows: 0
 Avg_row_length: 0
    Data_length: 0
Max_data_length: 12666373951979519
   Index_length: 1024
      Data_free: 0
 Auto_increment: 1
    Create_time: 2019-11-17 15:03:32
    Update_time: 2019-11-17 15:03:32
     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_tb1 RENAME TO alter_tb1;
Query OK, 0 rows affected (0.01 sec)

8.5 删除外键约束

外键约束:keyName是外键别名

alter table tableName drop foreign key keyName;

 9.索引

https://www.jianshu.com/p/f7187a47d522

posted @ 2019-11-17 17:43  一男、  阅读(331)  评论(0编辑  收藏  举报