二、 SQL介绍及数据定义DDL详解

本文转载至微信公众号:我们都是小青蛙

一、SQL简介

当面对一个陌生的数据库时, 通常需要一种方式与它进行交互, 以完成用户所需要的各种工作, 这个时候, 就要用到 SQL 语言了
SQL 是 Structure Query Language(结构化查询语言) 的缩写, 它是使用关系模型的数据库应用语言, 由 IBM 在 20 世纪 70 年代开发出来, 作为 IBM 关系数据库原型 System R 的原型关系语言, 实现了关系数据库中的信息检索。
20 世纪 80 年代初, 美国国家标准局(ANSI) 开始着手制定 SQL 标准, 最早的ANSI 标准于1986 年完成, 就被叫作 SQL-86。 标准的出台使 SQL 作为标准关系数据库语言的地位得到了加强。 SQL 标准目前已几经修改更趋完善。
正是由于 SQL 语言的标准化, 所以大多数关系型数据库系统都支持 SQL 语言, 它已经发展成为多种平台进行交互操作的底层会话语言。

二、SQL分类

SQL 语句主要可以划分为以下 3 个类别。
DDL(Data Definition Languages) 语句数据定义语言, 这些语句定义了不同的数据段、数据库、 表、 列、 索引等数据库对象的定义。 常用的语句关键字主要包括 create、 drop、 alter等。
DML(Data Manipulation Language) 语句数据操纵语句, 用于添加、 删除、 更新和查询数据库记录, 并检查数据完整性, 常用的语句关键字主要包括 insert、 delete、 udpate 和select 等。
DCL(Data Control Language) 语句数据控制语句, 用于控制不同数据段直接的许可和访问级别的语句。 这些语句定义了数据库、 表、 字段、 用户的访问权限和安全级别。 主要的语句关键字包括 grant、 revoke 等。

三、命令使用注意事项

我们知道MySQL的基本运行过程就是:通过客户端程序发送命令给服务器程序,服务器程序按照接收的命令去操作实际的数据。在我们使用黑框框启动了MySQL客户端程序之后,界面上会一直显示一行mysql>的提示符,你可以在它后边输入我们的命令然后按一下回车键,在书写命令的时候需要注意下边这几点:

1. 命令结束符号

在书写完一个命令之后需要以下边这几个符号之一结尾

;
\g
\G
比如说我们执行一个简单的查询当前时间的命令:

mysql> SELECT NOW();
+---------------------+
| NOW()               |
+---------------------+
| 2018-02-06 17:50:55 |
+---------------------+
1 row in set (0.00 sec)
mysql>

其中的SELECT意味着这是一个查询命令,NOW()是MySQL内置的函数,用于返回当前时间。不过我们现在并不是深究具体的某个命令是什么意思,只是想介绍一下书写命令时需要注意的一些事情。结果中1 row in set (0.00 sec)的意思是结果只有1行数据,用时0.00秒。使用\g可以起到一样的效果:

mysql> SELECT NOW()\g
+---------------------+
| NOW()               |
+---------------------+
| 2018-02-06 17:50:55 |
+---------------------+
1 row in set (0.00 sec)
mysql>

\G有一点特殊,它并不以表格的形式返回查询数据,而是以垂直的形式展现查询数据,这包含两个方面的意思:

如果查询结果中包含多个行的数据,各个行的数据之间会用一堆一星号*隔开。

每行中的每一个列的数据将按照列名: 列值的形式给出。

比如上边的查询用\G结尾的效果就是这样:

mysql> SELECT NOW()\G
*************************** 1. row ***************************
NOW(): 2018-02-06 17:51:51
1 row in set (0.00 sec)
mysql>

如果查询包含的列非常多的话,使用\G可以让我们看清结果。其实用哪个符号作为结束符号都是无所谓的,只是在展示结果的时候的格式不一样而已,所以一般我们平时都使用分号;作为命令结束符了~。

2. 命令可以随意换行

并不是按了回车键就提交命令了,只要按回车键的时候输入的语句里没有;、\g或者\G就算是语句没结束。比如上边查询当前时间的命令还可以这么写:

mysql> SELECT
    -> NOW()
    -> ;
+---------------------+
| NOW()               |
+---------------------+
| 2018-02-06 17:57:15 |
+---------------------+
1 row in set (0.00 sec)
mysql>

3. 可以一次提交多个命令

我们可以在一条语句里写多个命令(命令之间用上面说的结束符分隔),比如这样:

mysql> SELECT NOW(); SELECT NOW(); SELECT NOW();
+---------------------+
| NOW()               |
+---------------------+
| 2018-02-06 18:00:05 |
+---------------------+
1 row in set (0.00 sec)
+---------------------+
| NOW()               |
+---------------------+
| 2018-02-06 18:00:05 |
+---------------------+
1 row in set (0.00 sec)
+---------------------+
| NOW()               |
+---------------------+
| 2018-02-06 18:00:05 |
+---------------------+
1 row in set (0.00 sec)
mysql>

连着输入了3个查询当前时间的命令,只要没按回车键,就不会提交命令。

小贴士:

后边我们还会介绍把命令都写在文件里,然后再批量执行文件中的命令,那个感觉更爽!

4. 使用\c清除本次操作

如果你想放弃本次编写的命令,可以使用\c来清除,比如这样:

mysql> SELECT NOW()\c
mysql>

如果不使用\c,那客户端会以为这是一个多行命令,还在一直傻傻的等你输入命令~

5. 大小写问题

MySQL默认对命令的大小写并没有限制,也就是说我们这样查询当前时间也是可以的:

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2018-02-06 18:23:01 |
+---------------------+
1 row in set (0.00 sec)
mysql>

不过按照习俗,这些命令、函数什么的都是要大写的,而一些名称类的东西,比如数据库名,表名、列名啥的都是要小写的,更多具体的书写规范等我们遇着再详细介绍。

6. 字符串的表示

在命令里有时会使用到字符串,我们可以使用单引号''或者双引号""把字符串内容引起来,比如这样:

mysql> SELECT 'aaa';
+-----+
| aaa |
+-----+
| aaa |
+-----+
1 row in set (0.00 sec)
mysql> SELECT "aaa";
+-----+
| aaa |
+-----+
| aaa |
+-----+
1 row in set (0.00 sec)
mysql>

这个语句只是简单的把字符串’aaa’又输出来了而已。但是一定要在字符串内容上加上引号,不然的话MySQL服务器会把它当作列名,比如这样就会返回一个错误:

mysql> SELECT aaa;
ERROR 1054 (42S22): Unknown column 'aaa' in 'field list'
mysql>

但是MySQL中有一种叫ANSI_QUOTES的模式,如果开启了这种模式,双引号就有其他特殊的用途了,可能你并不能看懂我在说什么,但是这都不重要,重要的是建议你最好使用单引号来表示字符串

当一条命令发送给了MySQL服务器之后,服务器处理完后就会给你发送回来响应的结果,然后显示到界面上。然后你就可以接着输入下一条命令了。

四、 DDL(Data Definition Languages) 语句:数据定义语言

1、数据库相关操作

MySQL中把某种类型的表的集合称为一个数据库,MySQL服务器管理着若干个数据库,每个数据库下都可以有若干个表,画个图就是这样:
在这里插入图片描述

在我们刚刚安装好MySQL的时候,它已经内建了许多数据库和表了,我们可以使用下边这个命令来看一下都有哪些数据库:

SHOW DATABASES;
我自己的电脑上安装的MySQL版本是5.7.21,看一下在这个版本里内建了哪些数据库(启动客户端软件,用你的用户名和密码登录后输入命令):

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.01 sec)
mysql>

可以看到,这一版本的MySQL已经为我们内建了4个数据库,这些数据库都是给MySQL自己使用的,如果我们想使用MySQL存放自己的数据的话,首先需要创建一个属于自己的数据库。

1.1 创建数据库

创建数据库的语法贼简单:

CREATE DATABASE 数据库名;
来实际操作一下:

mysql> CREATE DATABASE xiaohaizi;
Query OK, 1 row affected (0.00 sec)

mysql>

我把我的名字xiaohaizi作为了数据库名称,敲完命令回车之后提示了一个Query OK, 1 row affected (0.00 sec)说明数据库创建成功了。然后我们再用SHOW DATABASES的命令查看一下现在有哪些数据库:

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| xiaohaizi          |
+--------------------+
5 rows in set (0.00 sec)
mysql>

看到我们自己创建的数据库xiaohaizi就已经在列表里了。

IF NOT EXISTS

我们在一个数据库已经存在的情况下再使用CREATE DATABASE去创建这个数据库会产生错误:

mysql> CREATE DATABASE xiaohaizi;
ERROR 1007 (HY000): Can't create database 'xiaohaizi'; database exists
mysql>

执行结果提示了一个ERROR,意思是数据库xiaohaizi已经存在!所以如果我们并不清楚数据库是否存在,可以使用下边的语句来创建数据库:

CREATE DATABASE IF NOT EXISTS 数据库名;
这个命令的意思是如果指定的数据库不存在的话就创建它,否则什么都不做。我们试一试:

mysql> CREATE DATABASE IF NOT EXISTS xiaohaizi;
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql>

可以看到语句执行成功了,报的ERROR错误也没有了,只是结果中有1个warning而已。这个warning只是MySQL善意的提醒我们数据库xiaohaizi已存在而已,并不会影响语句的执行。

小贴士:

前边说过MySQL的命令可以多条一起执行,可以在黑框框中一次输入多个命令,也可以把好多命令放到一个文件中执行。如果某一条命令的执行结果是产生了一个ERROR,MySQL不会停止执行该命令之后的命令,而是会继续执行,每条命令的执行结果都会打印出来。在执行结果中有warning的话,是不会中断执行的。
切换当前数据库

对于每一个连接到MySQL服务器的客户端,都有一个当前数据库的概念,我们创建的表默认都会被放到当前数据库中,切换当前数据库的命令也贼简单:

USE 数据库名称;
所以在介绍创建表之前,我们应该把当前数据库切换到刚刚创建的数据库xiaohaizi上:

mysql> USE xiaohaizi;
Database changed
mysql>

看到显示了Database changed说明当前数据库已经切换成功了。需要注意的是,在退出当前客户端之后,也就是你输入了exit或者quit命令之后或者直接把当前的黑框框页面关掉,当你再次调用mysql -h 主机名 -u 用户名 -p 密码的时候,相当于重新开启了一个客户端,需要重新调用USE 数据库名称的命令来选择一下当前数据库。

1.2 删除数据库

如果你创建的数据库没用了,我们还可以把它删掉,语法如下:

DROP DATABASE 数据库名;
在真实的工作环境里,在删除数据库之前你需要先拿体温计量量是不是发高烧了,然后再找至少两个人核实一下自己是不是发烧了,然后你才敢执行删除数据库的命令。删除数据库意味着里边的表就都被删除了,也就意味着你的数据都没了,所以是个极其危险的操作,使用时需要极其谨慎。不过我们这是学习环境,而且刚刚创建了xiaohaizi数据库,什么表都没往里头放,删了就删了吧:

mysql> DROP DATABASE xiaohaizi;
Query OK, 0 rows affected (0.01 sec)

mysql>

然后看一下现在还有哪些数据库:

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.01 sec)
mysql>

可以看到我们前边创建的xiaohaizi数据库就没有啦。

IF EXISTS

如果某个数据库并不存在,我们仍旧调用DROP DATABASE语句去删除它,会报错的:

mysql> DROP DATABASE xiaohaizi;
ERROR 1008 (HY000): Can't drop database 'xiaohaizi'; database doesn't exist
mysql>

如果想避免这种报错,可以使用这种形式的语句来删除数据库:

DROP DATABASE IF EXISTS 表名;
再次删除一下xiaohaizi:

mysql> DROP DATABASE IF EXISTS xiaohaizi;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql>

这回就不会报错啦!演示完删除数据库的流程之后还是把xiaohaizi数据库创建出来并且切换到当前数据库吧,毕竟我们之后还要在这个数据库里创建各种表呢:

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

mysql>

2、表的相关操作

数据库建好之后,我们就可以接着创建真正存储数据的表了。创建表的时候首先需要描述清楚这个表长什么样,它有哪些列,这些列都是用来存什么类型的数据等等,这些对表的描述称为表的结构。有了表的结构之后,我们就可以着手把数据塞到这个表里了。表中的每一行也叫做一条记录,每一列也叫做一个字段

2.1 创建表

基本语法

创建一个表需要至少要完成下列事情:

给表起个名。
给表定义一些列,并且给这些列都起个名。
每一个列都需要定义一种数据类型,来规范它能存储的数据。
如果有需要的话,可以给这些列定义一些列的属性,比如不许为空,设置默认值等等,这些属性也叫做列的约束性条件,具体有哪些列的属性我们稍后会详细唠叨。
MySQL中创建表的基本语法就是这样的:

CREATE TABLE 表名 (
列名1 列的类型 [列的属性],
列名2 列的类型 [列的属性],

列名n 列的类型 [列的属性]
);
也就是说,我们在CREATE TABLE后写清楚我们定义的表的表名,然后在小括号()中定义上这个表的各个列的信息,包括列的列名、类型,如果有需要的话也可以定义这个列的属性,其中列的属性用中括号[]引起来的意思是可选的,也就是说可以有也可以没有,列名、列的类型、列的属性之间用空白字符分开就好,然后各个列的信息之间用逗号,分隔开。

小贴士:

建表语句书写的形式没啥太大要求,我们也可以把这个创建表的语句都放在一行里(也就是把换行删掉),上边例子中的建表语句分成多行并且加上缩进仅仅是为了美观而已~
废话不多说,赶紧创建一个超级简单的表瞅瞅:

CREATE TABLE first_table (
first_column INT,
second_column VARCHAR(100)
);

我们新创建的这个表的名字叫做first_table,它有两个列,第一个列的列名是first_column,列的类型是INT,意味着只能存放整数型数据,第二个列的列名是second_column,列的类型是VARCHAR(100),意味着这个列可以存放长度不超过100个字符的字符串。我们在客户端执行一下这个语句(当前数据库是xiaohaizi):

mysql> CREATE TABLE first_table (
->
 first_column INT,
-> second_column VARCHAR(100)
-> );
Query OK, 0 rows affected (0.02 sec)
mysql>

输出Query OK, 0 rows affected (0.02 sec)意味着创建成功了,并且耗时0.02秒。

有了创建first_table的经验,我们就可以着手用MySQL把之前提到的学生基本信息表和成绩表给创建出来了,先把学生信息表搬下来看看:

学生基本信息表

很显然,这个表有学号、姓名、性别、身份证号、学院、专业、入学时间这几个列,其中的学号是整数类型的,入学时间是日期类型的,由于身份证号是固定的18位,我们可以把身份证号这一列定义成固定长度的字符串类型,性别一列只能填男或女,所以我们这里把它定义为ENUM类型的,其余各个字段都是可变的字符串类型的。看一下创建学生基本信息表的语句:

CREATE TABLE student_info (
number INT,
name VARCHAR(5),
sex ENUM(‘男’, ‘女’),
id_number CHAR(18),
department VARCHAR(30),
major VARCHAR(30),
enrollment_time DATE
);

然后再看一下学生成绩表:

这个表有学号、科目、成绩这几个列,学号和成绩是整数类型的,科目是字符串类型的,所以我们创建一下这个表:

CREATE TABLE student_score (
number INT,
subject VARCHAR(30),
score TINYINT
);

赶紧到你的客户端里填写创建这两个表的命令吧~

展示当前数据库中的表

我们刚才在xiaohaizi数据库里创建了几个表,那我们怎么查看xiaohaizi数据库下都有哪些表呢?MySQL提供了这样的一个命令:

SHOW TABLES;
该命令会展示出当前数据库中都有哪些表,我们执行一下:

mysql> SHOW TABLES;
±--------------------+
| Tables_in_xiaohaizi |
±--------------------+
| first_table |
| student_info |
| student_score |
±--------------------+
3 rows in set (0.01 sec)
mysql>

我们刚才创建的表就都被展示出来了。

IF NOT EXISTS

和重复创建数据库一样,如果创建一个已经存在的表的话是会报错的,我们来试试重复创建一下first_table表:

mysql> CREATE TABLE first_table (
-> first_column INT,
-> second_column VARCHAR(100)
-> );
ERROR 1050 (42S01): Table ‘first_table’ already exists
mysql>

执行结果提示了一个ERROR,意思是first_table已经存在!所以如果想要避免这种尴尬,我们可以在创建表的时候使用这种形式:

CREATE TABLE IF NOT EXISTS 表名( 各个列信息的定义 … );
加入了IF NOT EXISTS的语句表示如果指定的表名不存在则创建这个表,如果不存在那就什么都不做。我们使用这种IF NOT EXISTS的语法再来创建一遍first_table表:

mysql> CREATE TABLE IF NOT EXISTS first_table (
-> first_column INT,
-> second_column VARCHAR(100)
-> );
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql>

可以看到语句执行成功了,报的ERROR错误也没有了,只是结果中有1个warning而已。

2.2 删除表

如果一个表不用了,就可以删掉了,在真实环境中删除表一定要慎重谨慎,失去了的就再也回不来了~ 看一下删除的语法:

DROP TABLE 表1, 表2, …, 表n;
也就是说我们可以同时删除多个表。我们现在把first_table表给删掉看看:

mysql> DROP TABLE first_table;
Query OK, 0 rows affected (0.01 sec)
mysql> SHOW TABLES;
±--------------------+
| Tables_in_xiaohaizi |
±--------------------+
| student_info |
| student_score |
±--------------------+
2 rows in set (0.00 sec)
mysql>

可以看到现在数据库xiaohaizi中没有了first_table表,说明删除成功了!

IF EXISTS

如果我们尝试删除某个不存在的表的话会报错:

mysql> DROP TABLE first_table;
ERROR 1051 (42S02): Unknown table ‘xiaohaizi.first_table’
mysql>

提示我们要删除的表并不存在,如果想避免报错,可以使用这种删除语法:

DROP TABLE IF EXISTS 表名;
然后再删除一下不存在的first_table表:

mysql> DROP TABLE IF EXISTS first_table;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql>

这样就不报错了~

2.3 修改表

对于已经创建好的表, 尤其是已经有大量数据的表, 如果需要对表做一些结构上的改变, 我们可以先将表删除(drop), 然后再按照新的表定义重建表。 这样做没有问题, 但是必然要做一些额外的工作, 比如数据的重新加载。 而且, 如果有服务在访问表, 也会对服务产生影响。
因此, 在大多数情况下, 表结构的更改一般都使用 alter table 语句, 以下是一些常用的命令。
例如, 创建一个名称为 emp 的表。 ename(姓名), hiredate(雇用日期)、sal(薪水):

mysql> create table emp(ename varchar(10),hiredate date,sal decimal(10,2),deptno int(2));
Query OK, 0 rows affected (0.02 sec)

表创建完毕后, 如果需要查看一下表的定义, 可以使用如下命令:
DESC tablename
例如, 查看 emp 表, 将输出以下信息:

mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| ename | varchar(10) | YES | | | |
| hiredate | date | YES | | | |
| sal | decimal(10,2) | YES | | | |
| deptno | int(2) | YES | | | |
+----------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

虽然 desc 命令可以查看表定义, 但是其输出的信息还是不够全面, 为了查看更全面的表定义信息, 有时就需要通过查看创建表的 SQL 语句来得到, 可以使用如下命令实现:

mysql> show create table emp \G;
*************************** 1. row ***************************
Table: emp
Create Table: CREATE TABLE `emp` (
`ename` varchar(20) DEFAULT NULL,
`hiredate` date DEFAULT NULL,
`sal` decimal(10,2) DEFAULT NULL,
`deptno` int(2) DEFAULT NULL,33
KEY `idx_emp_ename` (`ename`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
1 row in set (0.02 sec)
ERROR:
No query specified
mysql>

从上面表的创建 SQL 语句中,除了可以看到表定义以外,还可以看到表的 engine (存储引擎)和 charset(字符集) 等信息。“\G” 选项的含义是使得记录能够按照字段竖着排列, 对于内容比较长的记录更易于显示。

(1) 修改表类型

语法如下:
ALTER TABLE tablename MODIFY [COLUMN] column_definition [FIRST | AFTER col_name]
例如, 修改表 emp 的 ename 字段定义, 将 varchar(10)改为 varchar(20):

mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| ename | varchar(10) | YES | | | |
| hiredate | date | YES | | | |
| sal | decimal(10,2) | YES | | | |
| deptno | int(2) | YES | | | |
+----------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
mysql> alter table emp modify ename varchar(20);
Query OK, 0 rows affected (0.03 sec)34
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| ename | varchar(20) | YES | | | |
| hiredate | date | YES | | | |
| sal | decimal(10,2) | YES | | | |
| deptno | int(2) | YES | | | |
+----------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

(2) 增加表字段

语法如下:
ALTER TABLE tablename ADD [COLUMN] column_definition [FIRST | AFTER col_name]
例如, 表 emp 上新增加字段 age, 类型为 int(3):

mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| ename | varchar(20) | YES | | | |
| hiredate | date | YES | | | |
| sal | decimal(10,2) | YES | | | |
| deptno | int(2) | YES | | | |
+----------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
mysql> alter table emp add column age int(3);
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| ename | varchar(20) | YES | | | |
| hiredate | date | YES | | | |
| sal | decimal(10,2) | YES | | | |
| deptno | int(2) | YES | | | |
| age | int(3) | YES | | | |
+----------+---------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

(3) 删除表字段

语法如下:
ALTER TABLE tablename DROP [COLUMN] col_name
例如, 将字段 age 删除掉:

mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| ename | varchar(20) | YES | | | |
| hiredate | date | YES | | | |
| sal | decimal(10,2) | YES | | | |
| deptno | int(2) | YES | | | |
| age | int(3) | YES | | | |
+----------+---------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
mysql> alter table emp drop column age;
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| ename | varchar(20) | YES | | | |
| hiredate | date | YES | | | |
| sal | decimal(10,2) | YES | | | |
| deptno | int(2) | YES | | | |
+----------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

(4) 字段改名

语法如下:
ALTER TABLE tablename CHANGE [COLUMN] old_col_name column_definition
[FIRST|AFTER col_name]
例如, 将 age 改名为 age1, 同时修改字段类型为 int(4):

mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| ename | varchar(20) | YES | | | |
| hiredate | date | YES | | | |
| sal | decimal(10,2) | YES | | | |
| deptno | int(2) | YES | | | |
| age | int(3) | YES | | | |
+----------+---------------+------+-----+---------+-------+
mysql> alter table emp change age age1 int(4) ;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc emp
-> ;36
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| ename | varchar(20) | YES | | | |
| hiredate | date | YES | | | |
| sal | decimal(10,2) | YES | | | |
| deptno | int(2) | YES | | | |
| age1 | int(4) | YES | | | |
+----------+---------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

注意: change 和 modify 都可以修改表的定义, 不同的是 change 后面需要写两次列名, 不方便。但是 change 的优点是可以修改列名称, modify 则不能。

(5) 修改字段排列顺序

前面介绍的的字段增加和修改语法(ADD/CNAHGE/MODIFY) 中, 都有一个可选项 first|after column_name, 这个选项可以用来修改字段在表中的位置, 默认 ADD 增加的新字段是加在表的最后位置, 而 CHANGE/MODIFY 默认都不会改变字段的位置。
例如, 将新增的字段 birth date 加在 ename 之后:

mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| ename | varchar(20) | YES | | | |
| hiredate | date | YES | | | |
| sal | decimal(10,2) | YES | | | |
| deptno | int(2) | YES | | | |
| age | int(3) | YES | | | |
+----------+---------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
mysql> alter table emp add birth date after ename;
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| ename | varchar(20) | YES | | | |
| birth | date | YES | | | |
| hiredate | date | YES | | | |
| sal | decimal(10,2) | YES | | | |
| deptno | int(2) | YES | | | |
| age | int(3) | YES | | | |
+----------+---------------+------+-----+---------+-------+37
6 rows in set (0.00 sec)

修改字段 age, 将它放在最前面:

mysql> alter table emp modify age int(3) first;
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| age | int(3) | YES | | | |
| ename | varchar(20) | YES | | | |
| birth | date | YES | | | |
| hiredate | date | YES | | | |
| sal | decimal(10,2) | YES | | | |
| deptno | int(2) | YES | | | |
+----------+---------------+------+-----+---------+-------+
6 rows in set (0.00 sec)

注意: CHANGE/FIRST|AFTER COLUMN 这些关键字都属于 MySQL 在标准 SQL 上的扩展, 在其他数据库上不一定适用。

(6) 表改名

语法如下:
ALTER TABLE tablename RENAME [TO] new_tablename
例如, 将表 emp 改名为 emp1, 命令如下:

mysql> alter table emp rename emp1;
Query OK, 0 rows affected (0.00 sec)
mysql> desc emp;
ERROR 1146 (42S02): Table 'sakila.emp' doesn't exist
mysql> desc emp1;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| age | int(3) | YES | | | |
| ename | varchar(20) | YES | | | |
| birth | date | YES | | | |
| hiredate | date | YES | | | |
| sal | decimal(10,2) | YES | | | |
| deptno | int(2) | YES | | | |
+----------+---------------+------+-----+---------+-------+
6 rows in set (0.00 sec)

三、总结

MySQL的基本运行过程是:客户端程序发送命令给服务器程序,服务器程序按照接收的命令去操作实际的数据,然后把结果返回到客户端。

在MySQL客户端输入命令时有一些注意事项:

;、\g、\G都可以作为命令结束符号。

只要按回车键的时候输入的语句里没有;、\g或者\G就算是语句没结束,可以换行后继续输入命令。

可以一次提交多个命令。

使用\c清除本次操作。

MySQL默认对命令的大小写并没有限制。

字符串可以被单引号’或者双引号"引起来,但是我们推荐使用单引号’。

MySQL服务器可以包含若干数据库,每个数据库中可以包含若干个表。

数据库相关操作如下:

展示数据库:SHOW DATABASES;
创建数据库:CREATE DATABASE 数据库名;
切换当前数据库:USE 数据库名
删除数据库:DROP DATABASE 数据库名
IF EXISTS 和 IF NOT EXISTS在创建和删除数据库时使用可以避免ERROR产生。
表的相关操作

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值