深入浅出MySQL-DDL语句
DDL语句
DDL是数据定义语言的缩写,简单来说,就是对数据库内部的对象进行创建、删除、修改等操作的语言。它和DML(数据操纵语言)的最大区别是DML知识对表内部的数据操作,而不涉及表的定义、结构的修改,更不会涉及其他对象。DDL语句更多地由数据库管理员(DBA)使用,开发人员一般很少使用。
| DDL | 数据定义语言 | create |
| DML | 数据操纵语言 | insert、delete、update |
| DCL | 数据库控制语言 | grant、remove |
| DQL | 数据库查询语言 | select |
1.创建数据库
语法如下所示:
create database dbname;
mysql> create database test1;
Query OK, 1 row affected (0.00 sec)
可以发现,执行完创建命令后,下面一行会提示"Query OK, 1 row affected (0.05 sec)",这段提示可以分为3部分。"Query OK"表示上面的命令执行成功,但是这又不是执行查询操作,为什么显示查询成功?其实这是MySQL的一个特点,所有的DDL和DML(不包括select)操作执行成功之后都会显示"Query OK",这里理解为执行成功就可以了。"1 row affected "表示操作只影响了数据库中一行的记录。"(0.05 sec)"则记录了操作执行的时间。
如果已经存在这个数据库,系统会提示:
mysql> create database test1;
ERROR 1007 (HY000): Can't create database 'test1'; database exists
这个时候,如果需要知道系统中都存在哪些数据库,可以用以下命令来看:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mybatis |
| mysql |
| performance_schema |
| sys |
| test1 |
+--------------------+
6 rows in set (0.00 sec)
选择数据库test1:
use test1;
然后用以下命令来查看test1数据库中创建的所有数据表:
show tables;
2.删除数据库
删除数据库的语法很简单,如下所示:
drop database dbname;
注意:数据库删除后,下面的所有表数据都会全部删除,所以删除之前一定要仔细检查并做好相应的备份。
3.创建表
在数据库中创建一张表的基本语法如下:
create table tablename(
column_name_1 column_type_1 constraints,
column_name_2 column_type_2 constraints,
.........
)
因为MySQL的表明是以目录的形式存在于磁盘上的,所以表名的字符可以用任何目录名允许的字符。column_name是列的名字;column_type是列的数据类型;constraints是这个列的约束条件。
例如创建一个名称为emp的表,表中包括ename(姓名),hiredate(雇用日期)和salary(薪水)3个字段,字段类型分别为varchar(10),date,int(2)。
mysql> create table emp( ename varchar(10),hiredate date,salary decimal(10,2),deptno int(2));
Query OK, 0 rows affected (0.25 sec)
表创建完毕后,如果需要查看一下表的定义,可以使用如下命令:
desc tablename;
如查看emp表,将输出以下信息:
mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| ename | varchar(10) | YES | | NULL | |
| hiredate | date | YES | | NULL | |
| salary | decimal(10,2) | YES | | NULL | |
| deptno | int(2) | YES | | NULL | |
+----------+---------------+------+-----+---------+-------+
4 rows in set (0.01 sec)
虽然desc命令可以查看表定义,但是其输出的信息还是不够全面。为了得到更全面地表的定义信息,有时就需要查看创建表的SQL语句:
mysql> show create table emp \G;
*************************** 1. row ***************************
Table: emp
Create Table: CREATE TABLE `emp` (
`ename` varchar(10) DEFAULT NULL,
`hiredate` date DEFAULT NULL,
`salary` decimal(10,2) DEFAULT NULL,
`deptno` int(2) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec) ERROR:
No query specified
除了可以看到表的定义以外,还可以看到表的engine(存储引擎)和charset(字符集)等信息。"\G"选项的含义是使得记录能按照字段竖向排列,以便更好地显示内容较长的记录。
4.删除表
表的删除命令如下:
drop table tablename;
5.修改表
对于已经创建好的表,尤其是已经有大量数据的表,如果需要做一些结构上的改变,可以先将表删除(drop),然后再按照新的表定义重建表。这样做没有问题,但是必然要做一些额外的工作,比如数据的重新加载。而且,如果有服务在访问表,也会对服务产生影响。因此大多数情况下,表结构的更改都使用alter table语句,以下是一些常用的命令。
(1)修改表类型,语法如下:
alter table tablename modify column_name columen_definition;
例如修改emp表的ename字段,将var(10)改为var(20):
mysql> alter table emp modify ename varchar(20);
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 | | NULL | |
| hiredate | date | YES | | NULL | |
| salary | decimal(10,2) | YES | | NULL | |
| deptno | int(2) | YES | | NULL | |
+----------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
(2)增加表字段,语法如下:
alter table emp add column_name column_definition;
例如在表emp中新增加字段age,类型为int(3):
mysql> alter table emp add age int(3);
Query OK, 0 rows affected (0.76 sec)
Records: 0 Duplicates: 0 Warnings: 0 mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| ename | varchar(20) | YES | | NULL | |
| hiredate | date | YES | | NULL | |
| salary | decimal(10,2) | YES | | NULL | |
| deptno | int(2) | YES | | NULL | |
| age | int(3) | YES | | NULL | |
+----------+---------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
(3)删除表字段,语法如下:
alter table tablename drop column column_name;
例如,将字段age删除掉:
mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| ename | varchar(20) | YES | | NULL | |
| hiredate | date | YES | | NULL | |
| salary | decimal(10,2) | YES | | NULL | |
| deptno | int(2) | YES | | NULL | |
| age | int(3) | YES | | NULL | |
+----------+---------------+------+-----+---------+-------+
5 rows in set (0.00 sec) mysql> alter table emp drop column age;
Query OK, 0 rows affected (0.29 sec)
Records: 0 Duplicates: 0 Warnings: 0 mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| ename | varchar(20) | YES | | NULL | |
| hiredate | date | YES | | NULL | |
| salary | decimal(10,2) | YES | | NULL | |
| deptno | int(2) | YES | | NULL | |
+----------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
(4)字段改名,语法如下:
alter table emp change column_name column_newname;
例如,将age 改名为age1,同时修改字段类型为int(4):
mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| ename | varchar(20) | YES | | NULL | |
| hiredate | date | YES | | NULL | |
| salary | decimal(10,2) | YES | | NULL | |
| deptno | int(2) | YES | | NULL | |
| age | int(3) | YES | | NULL | |
+----------+---------------+------+-----+---------+-------+
5 rows in set (0.00 sec) mysql> alter table emp change age age1 int(4);
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 | | NULL | |
| hiredate | date | YES | | NULL | |
| salary | decimal(10,2) | YES | | NULL | |
| deptno | int(2) | YES | | NULL | |
| age1 | int(4) | YES | | NULL | |
+----------+---------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
注意:change和modify都可以修改表的定义,不同的是change后面需要写两次列名,不方便,但是change的优点是可以修改列的命长,而modify不能。
(5)修改字段排列顺序
前面介绍的字段增加和修改语法中,都可以加上一个可选项first|after column_name,这个选项可以用来修改字段在表中的位置,add增加的新字段默认是加在表的最后位置,而change/modify默认都不会改变字段的位置。
例如,将新增的字段birth date,加在ename之后:
mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| ename | varchar(20) | YES | | NULL | |
| hiredate | date | YES | | NULL | |
| salary | decimal(10,2) | YES | | NULL | |
| deptno | int(2) | YES | | NULL | |
| age1 | int(4) | YES | | NULL | |
+----------+---------------+------+-----+---------+-------+
5 rows in set (0.00 sec) mysql> alter table emp add birth date after ename;
Query OK, 0 rows affected (1.21 sec)
Records: 0 Duplicates: 0 Warnings: 0 mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| ename | varchar(20) | YES | | NULL | |
| birth | date | YES | | NULL | |
| hiredate | date | YES | | NULL | |
| salary | decimal(10,2) | YES | | NULL | |
| deptno | int(2) | YES | | NULL | |
| age1 | int(4) | YES | | NULL | |
+----------+---------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
修改age字段,将他放在最前面:
mysql> alter table emp modify age1 int(3) first;
Query OK, 0 rows affected (0.25 sec)
Records: 0 Duplicates: 0 Warnings: 0 mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| age1 | int(3) | YES | | NULL | |
| ename | varchar(20) | YES | | NULL | |
| birth | date | YES | | NULL | |
| hiredate | date | YES | | NULL | |
| salary | decimal(10,2) | YES | | NULL | |
| deptno | int(2) | YES | | NULL | |
+----------+---------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
(6)更改表名,语法如下:
alter table tablename reaname new_tablename;
例如将表emp改名为emp1,命令如下:
mysql> alter table emp rename emp1;
Query OK, 0 rows affected (0.06 sec) mysql> show tables;
+-----------------+
| Tables_in_test1 |
+-----------------+
| emp1 |
+-----------------+
1 row in set (0.00 sec)
深入浅出MySQL-DDL语句的更多相关文章
- mysql DDL语句
sql语言分为三个级别. 1.ddl 语句 ,数据定义语句,定义了数据库.表.索引等对象的定义.常用语句包含:create.drop.alter. 2.dml 语句 ,数据操纵语句,用于添加.删除.更 ...
- MySQL的DDL语句、DML语句与DCL语句
背景:近几年,开源数据库逐渐流行起来.由于具有免费使用.配置简单.稳定性好.性能优良等优点,开源数据库在中低端应用上占据了很大的市场份额,而 MySQL 正是开源数据库中的杰出代表.MySQL 数据库 ...
- 详解MySQL第一篇—MySQL简要介绍及DDL语句
背景:近几年,开源数据库逐渐流行起来.由于具有免费使用.配置简单.稳定性好.性能优良等优点,开源数据库在中低端应用上占据了很大的市场份额,而 MySQL 正是开源数据库中的杰出代表.MySQL 数据库 ...
- mysql一个事务中有DDL语句的binlog情况
在autocommit=1的情况下,开启一个事务,如果里面有DDL语句,那么事务开始到DDL语句之间的DML语句都会被提交.再开启新的事务.可以从binlog中看出 session语句: 09 ...
- MySQL基础(二)——DDL语句
MySQL基础(二)--DDL语句 1.什么是DDL语句,以及DDL语句的作用 DDL语句时操作数据库对象的语句,这些操作包括create.drop.alter(创建.删除.修改)数据库对象. 2.基 ...
- mysql系统表加trigger和对特定的库禁用 DDL 语句
给 mysql 系统表加上 trigger 1 Reply 默认情况下,mysql 是不能给系统表,例如 mysql.user 加上触发器的.会提示 ERROR 1465 (HY000): Trigg ...
- MySQL之使用DDL语句创建表
一.使用DDL语句创建表 DDL语言全面数据定义语言(Data Define Language) 主要的DDL动词: CREATE(创建).DROP(删除).ALTER(修改) TRUNCATE(截断 ...
- mysql语句-DDL语句
SQL分类 1.DDL语句:数据定义语句,用来定义不同的数据段.数据库,表,列,索引等数据表对象,常用语句:create.drop.alter等. 2.DML语句:数据操作语句,用于添加.删除.更新和 ...
- MySQL使用DDL语句创建表
一.使用DDL语句创建表 DDL语言全面数据定义语言(Data Define Language) 主要的DDL动词: CREATE(创建).DROP(删除).ALTER(修改) TRUNCATE(截断 ...
- Navicat批量导出mysql的DDL语句
工作中有的时候需要将某个库中的表.视图.函数.存储过程等创建语句导出,又不需要表中的数据.同时最好放在同一个文件里面,这样方便拷贝. 方法一:需要拷贝的创建语句条数不多,不至于让你拷到头脑发晕的地步, ...
随机推荐
- C#调用SQL Server有参的存储过程
一.使用SqlParameter的方式 代码: using System; using System.Collections.Generic; using System.ComponentModel; ...
- HIbernate與不支持boolean的數據庫之間的映射
http://soft-development.iteye.com/blog/1225274 ————————————————————————————————————————————————————— ...
- Linux 高频工具快速教程
全书分为三个部分: 第一部分为基础篇,介绍我们工作中常用的工具的高频用法: 第二部分为进阶篇,介绍的工具更多的适合程序员使用,分为程序构建.程序调试及程序优化: 第三部分是工具参考篇,主要介绍实用工具 ...
- 【BZOJ】1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居(set+并查集+特殊的技巧)
http://www.lydsy.com/JudgeOnline/problem.php?id=1604 这题太神了... 简直就是 神思想+神做法+神stl.. 被stl整的我想cry...首先,, ...
- 【BZOJ】1615: [Usaco2008 Mar]The Loathesome Hay Baler麻烦的干草打包机(模拟+bfs)
http://www.lydsy.com/JudgeOnline/problem.php?id=1615 这种题..... #include <cstdio> #include <c ...
- Git神器sourceTreesetup,让你的git效率迅速提升
image.png 小编之前在简书和公众号发不过idea如何git clone,git add,创建分支,创建码云的操作idea和Webstorm上使用git和github,码云最近又找到一款git神 ...
- 隐马尔可夫树(HMT模型)
HMT(Hidden Markov Tree)隐马尔可夫树 [论文] 小波变换与HMT模型的图像插值算法-郭昌-中山大学学报(自然科学版)
- VC++ Debug条件断点使用
If you're trying to reproduce a rare event and getting too many false positives with your breakpoint ...
- MySQL------如何卸载与安装
1.安装 转载:http://wenda.so.com/q/1471475177723102?src=140 2.卸载 转载:http://jingyan.baidu.com/article/3d69 ...
- 九度OJ 上剑指 offer 习题目录
<剑指Offer>面试题集收录汇总 面试题1 赋值运算符函数 不适合在线模式 面试题2 实现Singleton模式 不适合在线模式 面试题3 二维数组中的查找 已收录 面试题4 替换空格 ...