MySQL中DDL和DML
MySQL中DDL和DML
一、SQL
1.SQL是什么?
- SQL指结构化查询语言,全称是Structured Query Language。
- SQL可以访问和处理数据库,包括数据查询,插入,更新和删除。
- SQL在1986年成为ANSI的一项标准,在1987成为国际化标准组织标准。
2.SQL能做什么?
- SQL可以从数据库中查询数据,插入数据,更新和删除数据。
- SQL可以创建新数据库,新的表和创建存储过程。
- SQL可以创建视图,并设置表,存储过程,视图的权限等。
注意:
- SQL对大小写不敏感,SELECT和select是一样。但是SQL引擎通常会把语句都转换为大写字符来执行。
- 某些数据库系统要求每条SQL语句的末端使用分号,有些不要求。
3.SQL分类
1.数据库查询语言(DML)
-- 主要用于数据库的查询,基本结构是:select 子句 from 子句 where 子句 ...
-- 组合查询一条或多条数据
2.数据库操作语言(DML)
-- 主要针对数据的操作(增删改操作)
-- 主要包括:insert(增),delete(删) ,update(改)
3.数据库定义语言(DDL)
-- 主要对数据库对象(数据库、表、索引、视图)进行创建,修改,和删除操作
-- 主要包括:create(创建),alter(修改),drop(删除)
4.数据库控制语言(DCL)
-- 用来授予或回收访问数据库的权限
-- 主要包括:grant(授予用户某种权限),revoke(回收授予的某种权限)
5.事务控制语言(TCL)
-- 用于对数据库的事务管理
-- 主要包括:start transaction(开启事务),set transaction(设置事务属性),commit(提交事务),rollback(回滚事务)
二、DDL操作数据库表
1.MySQL中常见的数据类型
1.1.整数型
| 类型 | 描述 |
|---|---|
| tinyint | 十分小的整数,范围(-128,127) |
| smallint | 较小的整数,范围(-32768,32767) |
| mediumint | 中等大小的整型,范围(-8388608,8388607) |
| int(常用) | 标准型,范围(-214748364,2147483647) |
| bigint(工作常用) | 大整型,范围(-9233372036854775808,9223372036854775807) |
1.2.浮点型
| 浮点数类型 | 大小 | 作用 |
|---|---|---|
| float | 4字节 | 单精度浮点数值 |
| double | 8字节 | 双精度浮点数值 |
注意
1.一般不推荐使用浮点型,用decimal类型
2.浮点数类型有个缺陷,就是不精准。例如:
我们设计一个表,有f1,f2 这两个个字段,都分别插入值0.47, 0.44, 0.19,我们期待对f1求和后的结果是:0.47 + 0.44 + 0.19 = 1.1。而使用sum之后查询:

查询结果是 1.0999999999999999。虽然误差很小,但确实有误差。
如果把数据类型改成 float,然后运行求和查询,得到的是, 1.0999999940395355。显然,误差更大了。

那么,为什么会存在这样的误差呢?问题还是出在 MySQL 对浮点类型数据的存储方式上。
MySQL 用 4 个字节存储 FLOAT 类型数据,用 8 个字节来存储 DOUBLE 类型数据。无论哪个,都是采用二进制的方式来进行存储的。比如 9.625,用二进制来表达,就是 1001.101,或者表达成 1.001101×23。如果尾数不是 0或5(比如9.624),你就无法用一个二进制数来精确表达。进而,就只好在取值允许的范围内进行四舍五入。
注意:在编程中,如果用到浮点数,要特别注意误差问题,因为浮点数是不准确的,所以我们要避免使用“=”来判断两个数是否相等。同时,在一些对精确度要求较高的项目中,千万不要使用浮点数(一般用decimal),不然会导致结果错误,甚至是造成不可挽回的损失。
1.3.字符串类型
| 字符串类型 | 大小 | 描述 |
|---|---|---|
| char(m) | 0~255个字符 | 允许长度0~M个字符的定长字符串 |
| varchar(m) | 0~65535字符 | 允许长度0~M个字符的变长字符串,常用 |
| binary | 0~255字节 | 允许长度0~M个字节的定长二进制字符串 |
| varbinary | 0~65535字节 | 允许长度0~M个字节的变长二进制字符串 |
| tinyblob | 0~255字节 | 二进制形式的短文本数据(长度为不超过255个字符) |
| tinytext | 0~255字节 | 短文本数据 |
| mediumtext | 0~16777215字节 | 中等长度文本数据 |
| longblob | 0~4294967295字节 | 二进制形式的极大文本数据 |
| longtext | 0~4294967295字节 | 极大文本数据 |
CHAR和VARCHAR类型相似,均用于存于较短的字符串,主要的不同之处在于存储方式。CHAR类型长度固定,VARCHAR类型的长度可变。因为VARCHAR类型能够根据字符串的实际长度来动态改变所占字节的大小,所以在不能明确该字段具体需要多少字符时推荐使用VARCHAR类型,这样可以大大地节约磁盘空间、提高存储效率。
1.4.日期类型
| 类型 | 格式 | 取值范围 |
|---|---|---|
| time | 'HH:MM:SS' | '-838:59:59’, ‘838:59:59' |
| date | 'YYYY-MM-DD' | '1000-01-01','9999-12-31' |
| year | YYYY | 1901,2155 |
| datetime | 'YYYY-MM-DD HH:MM:SS' | '1000-01-01 00:00:00', '9999-12-31 23:59:59' |
| timestamp | 'YYYY-MM-DD HH:MM:SS' | '1970-01-01 00:00:01’UTC,'2038-01-19 03:14:07' UTC |
2.创建数据库表
1.1.语法
create table 表名(
字段1 数据类型,
字段2 数据类型(长度)
);
-- 注意:最后一个字段不要加逗号,可以给字段的数据类型指定长度
-- 例如
-- 创建一个商品(category) 表
create table category(
cid int,
cname varchar(20)
);
-- 创建一个学生表
/* 要求:
表名:student
表中的字段:
学号:sid,整型
姓名:sname,字符串类型,长度为10
性别:sex,字符串类型,长度为1
年龄:age,整型
入学日期:createdate,日期类型
班级:class,字符串类型,长度为15
邮箱:email,字符串类型,长度为25
*/
create table student(
sid int,
sname varchar(10),
sex varchar(1),
age int,
createdate date,
class varchar(15),
email varchar(25)
);
3.DDL常用语法
| 描述 | 语法 | 案例 |
|---|---|---|
| DDL-查看数据库表 | show tables; | 显示当前数据库的所有的表:show tables; |
| desc 表名; | 显示student表的结构:desc student; | |
| show create table 表名 | 查看student表完整的建表语句:show create table student; | |
| DDL-删除数据库表 | drop table 表名 | 删除当前数据库中的student表:drop table student; |
| DDL-修改表名 | rename table 旧表名 to 新表名; | 修改student表名为stu: rename table student to stu; |
| DDL-向表中添加字段 | alter table 表名 add 添加字段的名称 字段类型; | 向表stu中添加字段address,长度为50: 默认添加到最后:alter table stu add address varchar(50); 添加到第一个:alter table stu add address varchar(50) first; 添加到age字段之后:alter table stu add address varchar(50) after age; |
| DDL_修改表中字段属性 | alter table 表名 modify 字段名称 字段类型; | 将表stu中的address字段长度改为30: alter table stu modify address varchar(30); |
| DDL_修改表中字段名字及属性 | alter table 表名 change 旧字段名 新字段名 类型(长度); | 将表stu中的address字段,修改为city,长度为10: alter table stu change address city varchar(10); |
| DDL_删除表中字段 | alter table 表名 drop 字段名; | 删除stu表中 address2字段: alter table stu drop address2; |
三、DML数据操作语言
1.增加数据
1.1.语法:
-- 这种方式是给表中所有字段都添加数据,值1,值2,值3.... 都需要和表中字段顺序相对应
-- 比如:stu表中字段为:sid,sname,address 那么下面的值1要和sid对应,值2要和aname对应,值3要和address对应
insert into 表名 values(值1,值2,值3,......);
-- 只给某字段添加数据
insert into 表名(字段1,字段2,字段3,....) values(字段1的值,字段2的值,字段3的值,.....);
-- 一次性插入多条数据,插入的数据用 , 隔开
insert into 表名 values(值1,值2,值3,......),(值1,值2,值3,......),(值1,值2,值3,......),.......;
insert into 表名(字段1,字段2,字段3,...) values(字段1的值,字段2的值,字段3的值,...),(字段1的值,字段2的值,字段3的值,...),.....;
1.2.案例
-- 1.给stu所有字段添加数据 stu表中的字段:sid,sname,address
insert into stu values(1,'王小二','北京');
-- 2.给stu表中的 sname字段、address字段 添加数据
insert into stu(sname,address) values('王小三','河北');
-- 3.给stu表中所有字段一次性添加多条数据
insert into stu values(3,'王小四','山东'),(4,'王小伍','黑龙江'),(5,'王小六','辽宁');
-- 如果sid字段是自增的话,可以这样写
insert into stu values(null,'王小四','山东'),(null,'王小伍','黑龙江'),(null,'王小六','辽宁');
-- 4.给stu表中字段:sname、address 一次性添加多条数据
insert into stu(sname,address) values('王多鱼','沈阳'),('王少鱼','内蒙'),('王多多','宁夏');
1.3.注意事项:
- 值与字段必须要对应,个数相同、数据类型相同
- 值的数据大小,必须在字段指定的长度范围内
- varchar char date类型的值必须使用单引号,或者双引号包裹
- 如果要插入空值,可以忽略不写,或者写null
- 如果插入指定字段的值,必须要上写列名(字段名)
- 字符串日期类型支持 "2000-12-23" "2000/12/23" "2000.12.23"
2.删除数据
2.1.语法:
-- 语法格式
-- delete from 表名 where 条件;
-- delete from 表名; -- 慎用:删除表中的所有数据
-- truncate table 表名; -- 慎用:删除表中的所有数据
-- 案例1:删除sid=5的学生信息
delete from stu where sid=5;
-- 案例2:删除stu表中所有的数据
-- 方式一:
delete from stu;
-- 方式二:
truncate table stu; -- 推荐使用
2.2.truncate 和 delete的对比:
这两种操作都可以删除表中的数据
- delete为数据操作语言DML;truncate 为数据定义语言DDL。
- delete操作是将表中所有记录一条一条删除直到删除完;truncate 操作则是保留了表的结构,重新创建了这个表,所有的状态都相当于新表。因此,truncate 操作的效率更高。
- delete操作可以回滚(可以通过事务回滚);truncate 操作会导致隐式提交,因此不能回滚。
- delete操作执行成功后会返回已删除的行数(如删除4行记录,则会显示“affected rows:4”);truncate 操作不会返回已删的行量,结果通常是“affected rows:0”。
- delete操作删除表中记录后,再次向表中添加新记录时,对于设置有自增约束字段的值会从删除前表中该字段的最大值加1开始自增;truncate 操作会重新从1开始自增。
3.修改数据
-- 语法格式
-- update 表名 set 字段1=值1,字段2=值2,...,字段n=值n where 条件;
-- update 表名 set 字段1=值1,字段2=值2,...,字段n=值n; -- 慎用:不加条件会修改所有的数据
-- 案例1:将stu表中sid=1的学生,address修改为 上海
update stu set address='上海' where sid=1;
-- 案例2:将sid=2的学生name(姓名)改为 张老三 ,address(住址) 改为 深圳
update stu set name='张老三',address='深圳' where sid=2;

浙公网安备 33010602011771号