本文转载至微信公众号:我们都是小青蛙
一、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产生。
表的相关操作