前言
上一节我们看到DQL查询语言,这节学习其他两个语言DDL和DML,那么上一节的博客在这里,没看过的小伙伴可以先看看查询语言,再来看本节。
MySQL之DQL——查询语言_秋雨绵绵-CSDN博客
目录
一、DDL——数据库定义语言
1.1、数据库的操作
1.2、数据表的操作
二、MySQL中常见的数据类型
2.1、数值型
2.2、字符型
三、MySQL常用约束
3.1、约束的定义
3.2、约束的使用
四、DML语言——数据操作语言
4.1、添加数据
4.2、修改数据
4.3、删除数据
五、标识列
数据库定义语言( Data Definition Language):它用来定义我们的数据库对象,可以创建,删除和修改数据库和表结构。
数据库定义语言的两个操作
一、创建数据库
创建数据库
create database 数据库名称;
创建数据库,判断不存在,再创建
create database if not exists 数据库名称;
创建数据库,并指定字符集
create database 数据库名称 character set 字符集名;
二、查询数据库
查询某个数据库的字符集:查询某个数据库的创建语句
show create database 数据库名称;
查询所有数据库的名称:
show databases
三、修改数据库
修改数据库的字符集
alter database 数据库名称 character set 字符集名称;
四、删除数据库
删除数据库
drop database 数据库名称;
判断数据库存在,存在再删除
drop database if exists 数据库名称;
五、使用数据库
查询当前正在使用的数据库名称
select database();
使用数据库
use 数据库名称;
一、创建数据表
语法
create table 表名(
列名 列的类型【(长度) 约束】,
列名 列的类型【(长度) 约束】,
列名 列的类型【(长度) 约束】,
...
列名 列的类型【(长度) 约束】
);
注意:最后一列语句不加逗号
二、修改表
语法
alter table 表名 add|drop|modify|change column 列名 【列类型 约束】;
add: 添加新列
drop: 删除列
change: 修改列名
modify :修改列的约束或类型
rename to:修改表名
三、删除表
语法
drop table if exists 表名;
如果要创建新表通用的写法
库
drop database if exists 旧库名;
cerate database 新库名;
表
drop database if exists 旧表名;
create table 表名();意思是先把旧的删掉,再创建新的库或者表
四、表的复制
1、仅仅复制表的结构
create table 复制名 like 原表名;
2、复制表的结构加数据
create table 复制名 select * from 原表名;
3、只复制部分数据
create table 复制名 select 复制的字段1,2.. from 原表名 where 筛选条件;
4、仅仅复制某些字段
create table 复制名 select 相关字段1,2.... from 表名 where 0;
这里的0代表条件不成立,也就是只会复制字段,不会复制任何的值
在MySQL中数值型数据分为整形和小数型,整型就是int,小数就是我们熟知的float,double。
具体分类如下表所示:
其中整形数据在MySQL使用中具有以下特点:
① 如果不设置无符号还是有符号,默认是有符号,如果想设置无符号,需要添加unsigned关键字
② 如果插入的数值超出了整型的范围,会报out of range异常,并且插入临界值
③ 如果不设置长度,会有默认的长度长度代表了显示的最大宽度,如果不够会用0在左边填充,但必须搭配zerofill使用!
小数型
小数类型的分类
浮点型
float(M,D)
double(M,D)
定点数类型
DEC(DEcimal)(M,D): 精确度较高
其中括号里面的M,D表示的含义如下:
M:整数部位数+小数部位的位数
D:小数部位的位数
如果超过范围,则插入临界值M和D都可以省略
如果是decimal,则M默认为10,D默认为0
如果是float和double,则会根据插入的数值的精度来决定精度定点型的精确度较高,如果要求插入数值的精度较高如货币运算等则考虑使用
较短的文本
char(M)
M代表最大的字符数,他可以省略,默认为1
代表固定长度的字符
相对比较耗费空间
效率较高
varchar(M)
代表可变长度的字符
M代表最大的字符数,不可以省略
比较节省空间
效率较低
enum(枚举类型)
要求插入的值必须是列表中指定的值之一
set类型(集合)
要求插入的值是指定列表中的多个或一个
较长的文本
text:长文本数据
blob:二进制形式的长文本数据
2.3、日期和时间类型
date
只保存日期
datetime
精确到秒
timetemp
受时区影响的精确到秒的日期类型
time
只保存时间
year
只保存年
什么是约束呢?
定义:对表中的数据进行限定,保证数据的正确性、有效性和完整性。
分类:
NOT NULL
:非空,用于保证该字段的值不能为空
比如姓名、学号等
DEFAULT
:默认,用于保证该字段有默认值
比如性别
PRIMARY KEY
:主键,用于保证该字段的值具有唯一性,并且非空
比如学号、员工编号等
UNIQUE
:唯一,用于保证该字段的值具有唯一性,可以为空
比如座位号
CHECK
:检查约束【mysql中不支持】
比如年龄、性别
FOREIGN KEY
:外键,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值
在从表添加外键约束,用于引用主表中某列的值
比如学生表的专业编号,员工表的部门编号,员工表的工种编号
注意:
1.主键和唯一两大约束的区别:
①、主键和唯一键均保证唯一性
②、主键是允许值为空的,而唯一键是不允许值为空的。
③、一个表中至多只能有一个主键,而唯一键可以存在多个
④、二者均可以组合使用,但不推荐,因为无意义。
外键的特点:
1、要求在从表设置外键关系
2、从表的外键列的类型和主表的关联列的类型要求一致或兼容,名称无要求
3、主表的关联列必须是一个key(一般是主键或唯一)
4、插入数据时,先插入主表,再插入从表
删除数据时,先删除从表,再删除主表
了解完约束的诸多定义之后,我们怎么去使用约束呢?这里要用到DML语言,那么我先在这里进行演示,大家不知道的可以先往下看一下DML语言,然后再回来看约束。
1、在创建表时,我们可以添加约束,添加列级约束或者表级约束
添加列级约束在列后象添加数据类型一样直接添加即可,而且添加列级约束六大约束语法上都支持,但外键约束没有效果; 而添加表级约束除了非空、默认,其他的都支持,其语法为:
在各个字段的最下面
【constraint 约束名】 约束类型(字段名)
2、同样我们也可在修改表时添加或者删除约束
添加列级约束的语法
alter table 表名 modify column 字段名 字段类型 新约束;
添加表级约束的语法
2、添加表级约束
alter table 表名 add 【constraint 约束名】 约束类型(字段名) 【外键的引用】;
删除约束就是不写约束条件修改表的列就行了。
DML(Data Manipulate Language): 数据操纵语言,用于添加、删除、修改数据库记录,并检查数据完整性。
语法:
insert into 表名(列名1,列名2,...列名n) values(值1,值2,...值n);
可以看到上面我创建的表的各个约束在表的结构中都是可以看出来的,这就是约束的作用。
由于我的MySQL版本是5.5所以他用不了表级约束 ,可以用的可以使用语法试试。
注意项目:
1、插入的值的类型要与列的类型一致或兼容
2、不可以为null的值必须插入值,可以为null的值可以插入值也可以不插入值(默认为默认值或者null)
3、列的顺序可以调换,但是值必须一一对应,且列和值的个数必须一致
4、除了数字类型,其他类型需要使用引号(单双引号都可以,推荐单引号)引起来
5、如果表名后面不定义列名,则默认给所有列添加值
语法:
一、修改单表:
update 表名 set 列名1 = 值1, 列名2 = 值2,... [where 条件];
注意:
修改的值的顺序可以不一致
可以同时修改多个值
二、修改多表
update 表1 别名1,表2 别名2 set 字段=新值,字段=新值 where 连接条件 and 筛选条件
sql92
update 表1 别名,表2 别名
set 列=值,...
where 连接条件
and 筛选条件;
sql99
update 表1 别名
inner|left|right join 表2 别名
on 连接条件
set 列=值,...
where 筛选条件;
注意:
1. 如果不加任何条件,则会将表中所有记录全部修改
语法
语法一:
单表的删除
delete from 表名 where 筛选条件
注意
1. 如果不加条件,则删除表中所有记录。
2. 如果要删除所有记录
多表的删除
sql92语法
delete 表1的别名,表2的别名
from 表1 别名,表2 别名
where 连接条件
and 筛选条件;sql99语法
delete 表1的别名,表2的别名
from 表1 别名
inner|left|right join 表2 别名 on 连接条件
where 筛选条件;语法二:
truncate table 表名:表示清空数据
面试题:truncate 和delete的区别
1.delete 可以加where 条件,truncate不能加
2.truncate删除,效率高一丢丢
3.假如要删除的表中有自增长列,如果用delete删除后,再插入数据,自增长列的值从断点开始,而truncate删除后,再插入数据,自增长列的值从1开始。
4.truncate删除没有返回值,delete删除有返回值
5.truncate删除不能回滚,delete删除可以回滚.
定义:又称为自增长列,可以不用手动的插入值,系统提供默认的序列值,关键字是auto_increment,用法和约束,数据类型相似,直接添加到后面就行
特点
1、标识列不一定是和主键列搭配,但要求是一个key
2、一个表至多只有一个标识列
3、标识列的类型只能是数值型
4、标识列可以通过 SET auto_increment_increment=3;设置步长可以通过 手动插入值,设置起始值
写在最后
感谢各位小伙伴的收看,也欢迎各位指出不足之处互相学习,下次总结的是事务语言。