前言

SQL的语言分类主要包含如下几种:

DDL 数据定义语言 create、drop、alter 数据定义语言 create、drop、alter 语句 。
DML 数据操纵语言 insert、delete、update 定义对数据库记录的增、删、改操作。
DQL 数据库查询语言 select 定义对数据库记录的查询操作。
DCL 数据库控制语言 grant、remove

定义对数据库、表、字段、用户的访问权限和安全级别。

(授权grant,收回权限revoke等)。

TCL 事务控制语言

set autocommit=0、

start transaction、

savepoint、commit、rollback

定义对数据库的事务操作。

这小节主要了解下数据定义语言DDL(Data Define Language)。我们用它对数据库、表进行一些管理操作(创建、删除、修改等),比如:建库、删库、建表、修改表、删除表、对字段的增删改等,库表结构的管理。

接下来我们逐一来说明(下文[]中的内容属于可选项)。

数据库管理

创建数据库

1 create database [if not exists] dbname;

删除数据库

drop databases [if exists] dbname;

完整的写法如下:

1 drop databases [if exists] o_dbname;
2 create database n_dbname;

o_dbname 代表旧的数据库名,n_dbname 代表新的数据库名。

测试一下:

 1 mysql> show databases;
2 +--------------------+
3 | Database |
4 +--------------------+
5 | information_schema |
6 | buyerparty |
7 | buyerparty1 |
8 | git_jeeshop |
9 | jz |
10 | kdmy |
11 | kdmygf |
12 | localsdk |
13 | mgrcentercontrol |
14 | mysql |
15 | performance_schema |
16 | stroke_data |
17 | test |
18 +--------------------+
19 13 rows in set
20
21 mysql> drop database if exists test1;
22 Query OK, 0 rows affected
23
24 mysql> create database test1;
25 Query OK, 1 row affected
26
27 mysql> create database test1;
28 1007 - Can't create database 'test1'; database exists

通过上面的测试可以知道:删除之前要先判断数据库是否存在,否则会报出异常;同时创建之前也要判断是否存在,如果存在则会提示已存在。

表管理

创建表

在数据库中一张表的基本语法格式如下:

1 create table tbname(
2 column_name_1 column_type_1[(n)] [constraints] [comment 'comment1'],
3 column_name_2 column_type_2[(n)] [constraints] [comment 'comment2'],
4 column_name_3 column_type_3[(n)] [constraints] [comment 'comment3']
5 )[table_options];
语法说明

1、column_name是指字段名;column_type指的是字段类型(CHAR、INT等);n代表字段宽度,可选;constraints 约束,可选;comment 为字段备注,可以对字段详细描述。

2、同一个表里面,column_name不能相同

3、字段名和类型为必选,其他均为可选参数

4、类型限制了 字段 的存储格式,必须以给定的数据类型来存储,并可以额外添加的约束

约束说明
not null:非空约束
1 mysql> use test;
2 Database changed
3
4 mysql> create table if not exists `user1`(age int comment '年龄',name char(5) comment '姓名' not null);
5 Query OK, 0 rows affected
6
7 mysql> insert into user1 values(8,null);
8 1048 - Column 'name' cannot be null

建表的时候,对name字段做了非空约束,这时候传入的值为null,就会有错误提示。所以非空约束的目的是保证字段不为空。

default value:提供字段默认值
 1 mysql> use test;
2 Database changed
3
4 mysql> create table if not exists `user2`(age int not null default 0 comment '年龄',name char(50) comment '姓名' not null);
5 Query OK, 0 rows affected
6
7 mysql> insert into user2(name) values('brand');
8 Query OK, 1 row affected
9 mysql> select * from user2;
10 +-----+-------+
11 | age | name |
12 +-----+-------+
13 | 0 | brand |
14 +-----+-------+
15 1 row in set

设置了默认值之后,如果在写入数据时,不指定值,他会自动取默认值0。

primary key:标识主键约束

设置该字段为表的主键,全局唯一标识录,插入重复时报错。

有两种表现方式:一种是直接在字段约束中跟上;一种是字段都声明完了之后,在结尾加上,与上一个字段之间用逗号隔开。

 1 mysql> use test;
2 Database changed
3
4 mysql> create table if not exists `user3`(id int primary key,age int not null default 0 comment '年龄',name char(50) comment '姓名' not null);
5 Query OK, 0 rows affected
6
7 mysql> insert into user3 values(1,20,'brand');
8 Query OK, 1 row affected
9
10 mysql> insert into user3 values(1,22,'sol');
11 1062 - Duplicate entry '1' for key 'PRIMARY'
12
13 mysql> insert into user3 values(2,22,'sol');
14 Query OK, 1 row affected
15
16 mysql> select * from user3;
17 +----+-----+-------+
18 | id | age | name |
19 +----+-----+-------+
20 | 1 | 20 | brand |
21 | 2 | 22 | sol |
22 +----+-----+-------+
23 2 rows in set

如上,主键必须保持值的唯一性,如果插入重复值,会提示违反主键约束

另外一种方式是在字段声明的尾部,可以支持多个主键,用逗号隔开并且不可重复,格式:primary key(字段1,字段2,字段n),这种叫组合主键(或复合主键),举个栗子:

1  create table if not exists `user4`(id int,age int not null default 0 comment '年龄',name char(50) comment '姓名' not null,primary key(id,name));
foreign key:标识外键约束

语法:foreign key(t1_columnname) references t2(columnname),t1 为当前表,t2为外键表,当前表和外键表有一个字段约束成外键。

 1 mysql> create table if not exists `class`(classid int primary key,classname varchar(50));
2 Query OK, 0 rows affected
3
4 mysql> create table if not exists `user4`(id int primary key,age int comment '年龄',name char(50) comment '姓名',cid int not null,foreign key(cid) references class(classid));
5 Query OK, 0 rows affected
6
7 mysql> insert into `user4` values(1,20,'brand',1);
8 1452 - Cannot add or update a child row: a foreign key constraint fails (`test`.`user4`, CONSTRAINT `user4_ibfk_1` FOREIGN KEY (`cid`) REFERENCES `class` (`classid`))
9
10 mysql> insert into `class` values(1,'grad 3');
11 Query OK, 1 row affected
12
13 mysql> insert into `user4` values(1,20,'brand',1);
14 Query OK, 1 row affected
15
16 mysql> select a.age as '年龄',a.name as '学生姓名',b.classname as '班级' from user4 a left join class b on a.cid = b.classid;
17 +------+----------+--------+
18 | 年龄 | 学生姓名 | 班级 |
19 +------+----------+--------+
20 | 20 | brand | grad 3 |
21 +------+----------+--------+
22 1 row in set

几点说明:

1、插入user4表的时候,会检查关联的外键classid的值是否存在,如果不存在就会报错误。如上述代码中第三段,classid=1的值在class表中不存在。

2、建立外键关系的两张表的对应字段,类型需要保持一致。

3、设置为外键的字段不能为本表的主键,而关联表的字段需要为主键。(所以外键cid关联到class表的classid字段为主键)。

unique key:标识唯一值约束

可以设置一个到多个字段,不允许重复值,重复会报违反唯一约束,导致插入失败。

同样的有两种定义方式,一种是直接在字段后设置,一种是定义完所有字段之后再设置。以下例子:

 1 mysql> create table `user5` (id int primary key,name varchar(50),ident char(18) unique key);
2 Query OK, 0 rows affected
3
4 mysql> create table `user6` (id int primary key,name varchar(50),ident char(18) not null,sex int not null,unique key(ident,sex));
5 Query OK, 0 rows affected
6
7 mysql> insert into `user5` values(1,'brand','012345678901234567');
8 Query OK, 1 row affected
9 mysql> insert into `user5` values(2,'sol','012345678901234567');
10 1062 - Duplicate entry '012345678901234567' for key 'ident'

第二段中演示了支持多字段,用逗号隔开,语法格式:unique key(字段1,字段2,字段n);

第三段重复输入了ident的值,他就提示重复输入了。

auto_inc:标识自动增长
mysql> create table `user7` (id int auto_increment primary key,name varchar(50));
Query OK, 0 rows affected mysql> insert into `user7`(name) values ('brand'),('sol'),('helen');
Query OK, 3 rows affected Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from `user7`;
+----+-------+
| id | name |
+----+-------+
| 1 | brand |
| 2 | sol |
| 3 | helen |
+----+-------+
3 rows in set

auto_increment 说明:

1、auto_increacement 的字段为自动增长,默认值从1开始,每次+1

2、自动增长字段的初始值、步长可以在mysql中进行设置,比如设置初始值为1万,步长每次增长10

3、自增列当前值存储在内存中,数据库重启后,会查询当前表中自增列max为当前值。

4、如果表数据被清空并重启数据库,自增列会从初始值开始。

删除表

1 drop table [if exists] tname;

修改表名、备注

1 alter table o_tname rename [to] n_tname;
2 alter table tname comment 'memo'; 

复制表

仅复制架构
1 create table tname like from_tname; 
 1 mysql> select * from `user7`;
2 +----+-------+
3 | id | name |
4 +----+-------+
5 | 1 | brand |
6 | 2 | sol |
7 | 3 | helen |
8 +----+-------+
9 3 rows in set
10
11 mysql> create table `user8` like `user7`;
12 Query OK, 0 rows affected
13
14 mysql> select * from `user8`;
15 Empty set
复制架构+数据
1 create table tname [as] select column1,column2,... from from_tname [where condition]; 
mysql> select * from `user7`;
+----+-------+
| id | name |
+----+-------+
| 1 | brand |
| 2 | sol |
| 3 | helen |
+----+-------+
3 rows in set mysql> create table `user9` select id,name from `user7`;
Query OK, 3 rows affected
Records: 3 Duplicates: 0 Warnings: 0 mysql> select * from `user9`;
+----+-------+
| id | name |
+----+-------+
| 1 | brand |
| 2 | sol |
| 3 | helen |
+----+-------+
3 rows in set

数据和架构都被复制过来了,这个超实用。

管理字段

添加字段

1 alter table tname add column column_name column_type [constraints];
 1 mysql> select * from `user9`;
2 +----+-------+
3 | id | name |
4 +----+-------+
5 | 1 | brand |
6 | 2 | sol |
7 | 3 | helen |
8 +----+-------+
9 3 rows in set
10
11 mysql> alter table `user9` add column newcolumn int not null default 0;
12 Query OK, 0 rows affected
13 Records: 0 Duplicates: 0 Warnings: 0
14
15 mysql> select * from `user9`;
16 +----+-------+-----------+
17 | id | name | newcolumn |
18 +----+-------+-----------+
19 | 1 | brand | 0 |
20 | 2 | sol | 0 |
21 | 3 | helen | 0 |
22 +----+-------+-----------+
23 3 rows in set 

修改字段

1 alter table tname modify column col_name new_col_type [constraints]; -- 修改类型、约束,不能修改字段名
2 alter table tname change column col_name new_col_name new_col_type [constraints]; -- 修改字段名、类型、约束

以下分别是modify和change示例:

 1 mysql> desc `user9`;
2 +-----------+-------------+------+-----+---------+-------+
3 | Field | Type | Null | Key | Default | Extra |
4 +-----------+-------------+------+-----+---------+-------+
5 | id | int(11) | NO | | 0 | |
6 | name | varchar(50) | YES | | NULL | |
7 | newcolumn | int(11) | NO | | 0 | |
8 +-----------+-------------+------+-----+---------+-------+
9 3 rows in set
10
11 mysql> alter table `user9` modify column name varchar(100);
12 Query OK, 3 rows affected
13 Records: 3 Duplicates: 0 Warnings: 0
14
15 mysql> desc `user9`;
16 +-----------+--------------+------+-----+---------+-------+
17 | Field | Type | Null | Key | Default | Extra |
18 +-----------+--------------+------+-----+---------+-------+
19 | id | int(11) | NO | | 0 | |
20 | name | varchar(100) | YES | | NULL | |
21 | newcolumn | int(11) | NO | | 0 | |
22 +-----------+--------------+------+-----+---------+-------+
23 3 rows in set
 1 mysql> desc `user9`;
2 +-----------+--------------+------+-----+---------+-------+
3 | Field | Type | Null | Key | Default | Extra |
4 +-----------+--------------+------+-----+---------+-------+
5 | id | int(11) | NO | | 0 | |
6 | name | varchar(100) | YES | | NULL | |
7 | newcolumn | int(11) | NO | | 0 | |
8 +-----------+--------------+------+-----+---------+-------+
9 3 rows in set
10
11 mysql> alter table `user9` change column name name1 varchar(100);
12 Query OK, 0 rows affected
13 Records: 0 Duplicates: 0 Warnings: 0
14
15 mysql> desc `user9`;
16 +-----------+--------------+------+-----+---------+-------+
17 | Field | Type | Null | Key | Default | Extra |
18 +-----------+--------------+------+-----+---------+-------+
19 | id | int(11) | NO | | 0 | |
20 | name1 | varchar(100) | YES | | NULL | |
21 | newcolumn | int(11) | NO | | 0 | |
22 +-----------+--------------+------+-----+---------+-------+
23 3 rows in set

删除字段

1 alter table tname drop column col_name; 
 1 mysql> desc `user9`;
2 +-----------+--------------+------+-----+---------+-------+
3 | Field | Type | Null | Key | Default | Extra |
4 +-----------+--------------+------+-----+---------+-------+
5 | id | int(11) | NO | | 0 | |
6 | name1 | varchar(100) | YES | | NULL | |
7 | newcolumn | int(11) | NO | | 0 | |
8 +-----------+--------------+------+-----+---------+-------+
9 3 rows in set
10
11 mysql> alter table `user9` drop column newcolumn;
12 Query OK, 0 rows affected
13 Records: 0 Duplicates: 0 Warnings: 0
14
15 mysql> desc `user9`;
16 +-------+--------------+------+-----+---------+-------+
17 | Field | Type | Null | Key | Default | Extra |
18 +-------+--------------+------+-----+---------+-------+
19 | id | int(11) | NO | | 0 | |
20 | name1 | varchar(100) | YES | | NULL | |
21 +-------+--------------+------+-----+---------+-------+
22 2 rows in set

为了表示严谨性,每一个都尝试一遍,确实很耗时,写到现在。

MySQL全面瓦解4:数据定义-DDL的更多相关文章

  1. MySQL语法一:数据定义语句

    MySQL语句语法主要分为以下三大类: 一.数据定义语句DDL(CREATE,ALTER,DROP,DECLARE) 数据定义语句是用于修改表结构的. 一).语法提炼: 二).由上图可知,数据定义语句 ...

  2. <MySQL>入门三 数据定义语言 DDL

    -- DDL 数据定义语言 /* 库和表的管理 一.库的管理:创建.修改.删除 二.表的管理:创建.修改.删除 创建:create 修改:alter 删除:drop */ 1.库的管理 -- 库的管理 ...

  3. mysql DDL数据定义语言

    DDL数据定义语言 本节涉及MySQL关键字:create.alter(rename,add,chang,modify,drop).drop.delete.truncate等. -- 创建表:-- 数 ...

  4. 【MySQL】DDL数据定义语言的基本用法create、drop和alter(增删改)

    DDL 的基础语法 文章目录 DDL 的基础语法 对数据库进行定义 对数据表进行定义 创建表结构(数据表) 设计工具 修改表结构 小结 参考资料 简单复习一波 SQL必知必会 DDL 的英文全称是 D ...

  5. MySQL之数据定义语言(DDL)

    写在前面 本文中 [ 内容 ] 代表啊可选项,即可写可不写. SQL语言的基本功能介绍 SQL是一种结构化查询语言,主要有如下几个功能: 数据定义语言(DDL):全称Data Definition L ...

  6. SQL DDL 数据定义语句

    前言 DDL(Data Definition Language)语句:数据定义语句,这些语句定义了不同的数据段.数据库.表.列.索引等数据库对象.常用的语句关键字主要包括 create.drop.al ...

  7. DDL数据定义语言

    DDL数据定义语言 (一)概述 DDL(Data Definition Language):数据定义语言,用来定义数据库对象,库.表.列等:创建.删除.修改 库,表结构.主要分为操作数据库的DDL和操 ...

  8. MySQL高级查询与编程笔记 • 【第2章 数据定义和操作】

    全部章节   >>>> 本章目录 2.1 数据定义语言和数据操作语言 2.1.1 设计"优乐网"数据库 2.1.2 数据定义语言 2.1.3 数据操作语言 ...

  9. Oracle language types(语言种类) 表的相关操作 DDL数据定义语言

    数据定义语言 Data Definition Language Statements(DDL)数据操纵语言 Data Manipulation Language(DML) Statements事务控制 ...

随机推荐

  1. Helm部署和体验jenkins

    如何快速且简单的部署 通过helm可以快速且简单的部署多种应用,关于helm的安装和使用请参考 环境信息 本次实战的环境信息如下: kubernetes集群:三台CentOS7.7服务器 kubern ...

  2. Jquery的一键上传组件OCUpload及POI解析Excel文件

    第一步:将js文件引入页面 <script type="text/javascript" src="${pageContext.request.contextPat ...

  3. spring-boot-route(六)整合JApiDocs生成接口文档

    上一篇文章中介绍了使用Swagger生成接口文档,非常方便,功能也十分强大.如果非要说Swaager有什么缺点,想必就是注解写起来比较麻烦.如果我说有一款不用写注解,就可以生成文档的工具,你心动了吗? ...

  4. c++ 十进制、十六进制和BCD的相互转换,与打印printf,与函数调用

    转载: https://blog.csdn.net/sjhuangx/article/details/49947179   c++ 十进制.十六进制和BCD的相互转换 https://blog.csd ...

  5. P4231 三步必杀

    题目描述 问题摘要: N个柱子排成一排,一开始每个柱子损伤度为0. 接下来勇仪会进行M次攻击,每次攻击可以用4个参数l,r,s,e来描述: 表示这次攻击作用范围为第l个到第r个之间所有的柱子(包含l, ...

  6. 【SSO】一个简单的单点登录演示实现

    业务系统的管理后台往往数量众多,且各自需要一套用户名密码来进行登录,不方便使用.因此花了点时间研究如何实现一套单点登录系统. 众所周知,SSO系统设计中,往往需要想办法解决cookie不能跨域的问题, ...

  7. MySQL计算月份间隔的函数

    要求忽视具体日期,即 2020-01-31 与 2020-02-01 的月份间隔为:1 -- 格式必须为: '%Y%m' SELECT PERIOD_DIFF("202008" , ...

  8. Apache HttpClient 4.5 在Springboot中使用

    ConnectionRequestTimeout httpclient使用连接池来管理连接,这个时间就是从连接池获取连接的超时时间,可以想象下数据库连接池 ConnectTimeout 连接建立时间, ...

  9. ansible-playbook简介

    1. ansible-playbook简介 • Playbooks 与 adhoc 相比,是一种完全不同的运用 ansible 的方式,是非常之强大的. • 简单来说,playbooks 是一种简单的 ...

  10. Kafka单机安装

    一.Kafka简介 Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写.Kafka是一种高吞吐量的 分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作 ...