http://t.csdnimg.cn/KiFjehttp://t.csdnimg.cn/KiFje接上一篇MySQL基础速成2——DML、DQL
目录
一、MySQL的引擎
1.1 MySQL引擎简介
MySQL有多种引擎,能执行create table、select等命令,在数据量不多时,使用任何引擎都没什么关系。
但是,在大数据开发期间,要处理海量数据,就需要来了解MySQL的多种引擎了。,MySQL的引擎在整个流程中可以说是属于汽车的发动机,有着至关重要的作用。MySQL引擎:启动器。
MySQL的引擎作用:
(1)当你使用create table语句时,该引擎用于创建表;
(2)当在你使用select语句或进行其他数据操作时,该引擎在内部处理各种命令请求;
(3)在多数时候,数据库引擎都隐藏在MySQL软件内,开发者不需要过多地关注它,但通常SQL内部数据出现问题时, 就是引擎导致的。
MySQL具有多种引擎,并且它已打包多个引擎,且都隐藏在MySQL软件中。在MySQL中,有3类引擎:
(1)InnoDB是一个可靠的事务处理引擎,但是它不支持全文搜索; [逻辑单元]
(2)MyISAM是一个性能极高的引擎,它支持全文搜索,但不支持[事务]处理;
(3)Memory在功能等同于MyISAM,但由于数据存储在内存中,速度很快,但占用内存大,因此几乎不使用此引擎。
常见的两引擎:MyISAM 和 InnoDB。它们的区别如下:
1.2 设定MySQL引擎
设定引擎的语法:
create table 表名(
字段名 数据类型(长度) [约束],
...
) engine = 引擎名 default charset utf8;
# engine 的意思是 引擎
例如,使用命令完成:
(1)在MySQL中新建一个数据库班级
db_student,并设定编码为utf8;
(2)新建一个包含姓名、年龄的学生表1,默认MySQL引擎;
(3)新建一个包含姓名、年龄的学生表2,并给数据表指定为InnoDB引擎及设定默认编码为utf8;
(4)使用查看创建表命令,观察两张表的编码及引擎信息。
########################设置引擎##################################
# 1.新建库
create database if not exists db_student charset utf8;
# 2.使用库
use db_student;
# 3.创建默认引擎的表
create table if not exists student1(
name varchar(10),
age int
);
# 4.创建InnoDB引擎的表 【规范标准】
# a.新建表
# b.设置引擎+判断
# c.字段
create table if not exists student2(
name varchar(20),
age int
) engine = InnoDB default charset utf8;
# 5.查看创建命令
show create table student1;
show create table student2;
1.3 清空数据的区别
清空数据有两种不同的方式:
# 删除数据表数据
delete from 表名;
# 销毁及删除数据表数据
truncate [table] 表名;
delete和truncate删除表的区别:
delete与truncate的主要区别有:
(1)delete删除数据时,是一条一条的删除数据记录,效率低;
(2)truncate删除数据时,是将整个表销毁,然后再创建一张一模一样的表,并且用auto_increment修饰的字段将重置为0重新开始计算。
例如,使用命令完成:
(1)分别创建student、teacher表,字段包含:整型自动增长、主键的id编号、字符型的name姓名、整型的age年龄;
(2)分别给两个表添加两条数据;
(3)分别使用两种删除方式清空数据;
(4)再插入一条新数据并查询,对比数据并观察id编号效果。
##########################清空数据##############################
# 1.使用库
use db_student;
# 2.创建表student
create table if not exists student(
id int primary key auto_increment,
name varchar(20),
age int
) engine = InnoDB default charset utf8;
# 3.创建表teacher
create table if not exists teacher(
id int primary key auto_increment,
name varchar(20),
age int
) engine = InnoDB default charset utf8;
# 4.delete对student表操作
insert into student(name,age) values('张三',18);
insert into student(name,age) values('李四',21);
delete from student;
insert into student(name,age) values('张三222',18);
insert into student(name,age) values('李四222',21);
# 5.truncate对teacher表操作
insert into teacher(name,age) values('王五',19);
insert into teacher(name,age) values('赵六',39);
truncate table teacher;
insert into teacher(name,age) values('王五666',19);
insert into teacher(name,age) values('赵六666',39);
当要求删除大量无效数据时,优先考虑使用 truncate
二、SQL约束
2.1 SQL 约束简介
我们通过前面对表的操作已了解创建数据表语法:
create table 表名(
字段名1 数据类型(长度) [约束],
字段名2 数据类型(长度) [约束],
字段名3 数据类型(长度) [约束],
...
) engine = 引擎名 default charset utf8;
我们会发现字段名的结尾处可以添加SQL约束。
SQL约束是用于指定字段数据的规则,可以保证数据更加精确、可靠。
通俗地说,SQL约束就是数据在类型的基础上【增加了额外要求】。
常见的SQL约束:
对于SQL约束,要注意:
(1)SQL约束不是必须的,而是为了让SQL更加规范而存在;
(2)在学习SQL过程中,为了便于初学者更好的理解SQL约束,会单独讲解SQL约束;
(3)在实际应用中,可以对字段同时设定多个SQL约束,且都是在创建数据表时进行设定。
2.2 主键约束
添加主键约束语法:
create table 表名(
字段名 数据类型(长度) primary key [其他约束],
...
) engine = 引擎名 default charset utf8;
(1)给primary key主键约束的字段设定值时,不允许出现重复值;[唯一性]
(2)主键约束列不能包含null值;[非空]
(3)每个表都应该有一个主键约束,且每个表只能有一个主键。
除了可以在数据表添加主键约束外,还可以单独添加主键约束,语法:
# 创建表后,使用alter table关键字添加主键
alter table 表名 add primary key(字段名);
例如,使用命令完成:
(1)在MySQL中新建一个数据库班级
db_game1,并设定编码为utf8;
(2)在库中创建游戏表game1,有4个字段:id编号、first_name曾用名、last_name姓名、skill技能;
(3)在创建表时,给id编号添加主键约束;
(4)当建表成功后,使用desc命令查看表结构;
(5)注意:当id这一列在Key字段对应的值为PRI,则表示主键约束已经添加成功。
######################添加主键约束#################################
# 1.新建库
create database if not exists db_game charset utf8;
# 2.使用库
use db_game;
# 3.创建表:新增主键约束
# create table if not exists 【】(
# id int,
# first_name varchar(20),
# last_name varchar(20),
# skill varchar(255)
# ) engine = InnoDB default charset utf8;
create table if not exists game1(
id int primary key,
first_name varchar(20),
last_name varchar(20),
skill varchar(255)
) engine = InnoDB default charset utf8;
# 4.查看表结构
desc game1;
# 5.扩展:单独添加 student
create table if not exists student(
id int,
first_name varchar(20),
last_name varchar(20),
skill varchar(255)
) engine = InnoDB default charset utf8;
# 修改主键
alter table student add primary key(id); # 了解
desc student;
通常情况下,当主键约束的字段为int时,还会设定自动增长auto_increment。(下一小节会介绍)
2.3 删除主键约束
当不需要主键约束时,则可以删除。
删除主键约束,语法:
# 使用alter table关键字删除主键
alter table 表名 drop primary key;
例如,使用命令完成:
(1)先在库中创建游戏表game2,有4个字段:id编号[主键约束]、first_name曾用名、last_name姓名、skill技能;
(2)删除库中的游戏表game2的主键约束;
(3)当删除成功后,使用desc命令查看表结构,观察结果;
####################删除主键约束##########################
# 1.使用库
use db_game;
# 2.创建表
create table game2(
id int primary key,
first_name varchar(20),
last_name varchar(20),
skill varchar(255)
) engine = InnoDB default charset utf8;
# 查看主键
desc game2;
# 3.删除主键约束
alter table game2 drop primary key;
# 查看表结构
desc game2;
# 4.修改为空值
alter table game2 modify id int null;
2.4 自动增长
让主键约束字段为自动增长[auto],语法:
create table 表名(
字段名 数据类型(长度) primary key auto_increment,
...
) engine = 引擎名 default charset utf8;
/*
说明:
(1)自动增长列的数据类型必须是整型;
(2)自动增长列必须为X键(比如主键、外键)。
*/
例如,使用命令完成:
(1)在库中创建游戏表game3,有4个字段:id编号、first_name曾姓名、last_name姓名、skill技能;
(2)在创建表时,给id编号添加主键约束,整型且自动增长;
(3)给游戏表game3添加2条数据,且都不添加id值,查看数据结果;
(4)思考1:当添加数据时,给主键id传递null值,效果如何?
(5)思考2:当添加一条设定id = 10的数据后,再不给主键id传值并添加一条新数据,效果如何?
########################自动增长###################################
# 1.使用库
use db_game;
# 2.创建表:自增
create table game3(
id int primary key auto_increment,
first_name varchar(20),
last_name varchar(20),
skill varchar(255)
) engine = InnoDB default charset utf8;
# 3.添加2条数据
insert into game3(first_name,last_name,skill) values('乔峰','萧峰','背着音箱');
insert into game3(first_name,last_name,skill) values('虚竹','尊主','天山折梅手');
# 4.给id=null
insert into game3 values(null,'段誉','段誉','凌波微步');
# 5.id=10,增加数据
insert into game3(id,first_name,last_name,skill) values(10,'阿紫','阿紫','阴险');
insert into game3(first_name,last_name,skill) values('慕容复','慕容复','移花接木');
2.5 验证逐渐约束效果
当给数据字段设定了主键约束后,则:
(1)值是唯一的;unique
(2)值是非空的。not null
例如,使用命令完成:
(1)使用desc命令查看游戏表game1的表结构,观察id字段;
(2)给游戏表game1插入两条id=1的数据,观察结果;
(3)给游戏表game1插入一条id=null的数据,观察结果;
(4)思考:若要允许可以给主键约束字段添加null,且会自动设定值,该怎么做?
#######################验证主键约束的效果#########################
# 1.使用库
use db_game;
# 2.验证唯一
insert into game1 values(1,'孙猴子','孙悟空','七十二变');
# insert into game1 values(1,'孙猴子2','孙悟空','七十二变'); # 报错
# 注意
# a.建议同学们写SQL语句时, 要使用单引号把字符串内容引起来
# b.若使用双引号把字符串内容引起来后, 会显示错误, 但能正常执行SQL, 不建议
# insert into game1 values(2,"天蓬元帅","猪八戒","九齿钉耙");
# 3.验证非空
# insert into game1 values(null,'玄奘','唐僧','念紧箍咒'); # 报错
2.6 非空约束
添加非空约束,语法:
create table 表名(
字段名 数据类型(长度) [其他约束] not null,
...
) engine = 引擎名 default charset utf8;
当设定为非空约束后,则:
(1)not null约束强制字段不接受null值;
(2)not null约束强制字段传递数据时,必须有数值。
例如,使用命令完成:
(1)在库中创建游戏表game4,有4个字段:id编号、first_name曾姓名、last_name姓名、skill技能;
(2)在创建表时,给id编号添加主键约束、整型且自动增长;
(3)给last_name姓名字段设定为非空约束;
#######################非空约束#################################
# 1.使用库
use db_game;
# 2.创建表:非空
create table game4(
id int primary key auto_increment not null,
first_name varchar(20),
last_name varchar(20) not null, # 非空
skill varchar(255)
) engine = InnoDB default charset utf8;
# 3.传递值 --正确
insert into game4(first_name, last_name, skill) values ('卷帘大将','沙和尚','摇人');
# 4.不传值
# insert into game4(first_name, skill) values ('红孩儿','三昧真火'); # 报错
# 5.传递空值
insert into game4(first_name, last_name, skill) values ('白骨精',null,'变身');
# 结论: 给设定为非空的字段必须添加非空的数值。
desc game4;
2.7 唯一约束
当在创建表时给某字段添加唯一约束,语法:
create table 表名(
字段名 数据类型(长度) [其他约束] unique,
...
) engine = 引擎名 default charset utf8;
每个表可以有多个unique唯一约束,但是每个表只能有一个primary key主键约束;
设定为非空约束后,要了解:
(1)unique约束用于唯一标识数据表中的每条数据;
(2)primary key字段默认唯一;
(3)unique和primary key约束均为列提供了唯一性保证。
当给数据字段设定了唯一约束后,则:
(1)值是唯一的。
例如,使用命令完成:
(1)在库中创建游戏表game5,有4个字段:id编号、first_name曾姓名、last_name姓名、skill技能;
(2)在创建表时,给id编号添加主键约束、整型且自动增长;
(3)给last_name字段设定为唯一约束;
(4)思考:在操作游戏表game5时,先后给last_name姓名字段传递两个一样的值,效果如何?
######################唯一约束##############################
# 1.使用库
use db_game;
# 2.创建表:唯一
create table game5(
id int primary key auto_increment unique not null, # 默认唯一且非空
first_name varchar(20),
last_name varchar(20) unique,
skill varchar(255)
) engine = InnoDB default charset utf8;
# 3.插入值
insert into game5(first_name,last_name) values('宋江','宋江');
insert into game5(first_name,last_name) values('及时雨',' 宋江 ');
insert into game5(first_name,last_name) values('及时雨','宋江'); # 报错
# 设定为唯一约束后, 该字段值不能重复
2.8 默认值约束
当在创建表时给某字段添加默认值约束,语法:
create table 表名(
字段名 数据类型(长度) [其他约束] default 值,
...
) engine = 引擎名 default charset utf8;
当设定为默认值约束后,则:
(1)有了默认值约束后, 当不传递字段对应的值时,会使用默认值;
(2)有了默认值约束后, 当传递字段对应的值时,会传递的具体值为准。
例如,使用命令完成:
(1)在库中创建游戏表game6,有4个字段:id编号、first_name曾姓名、last_name姓名、skill技能;
(2)在创建表时,给id编号添加主键约束、整型且自动增长;
(3)给skill字段设定为默认值约束,设定为轻功水上漂~
;
(4)思考1:添加一条数据,并给字段skill技能传递值,观察效果;
######################默认值约束#############################
# 1.使用库
use db_game;
# 2.创建表:默认
create table game6(
id int primary key auto_increment,
first_name varchar(20),
last_name varchar(20),
skill varchar(255) default '轻功水上漂~'
) engine = InnoDB default charset utf8;
desc game6;
show create table game6;
# 3.添加值, 传递值
insert into game6(first_name, last_name, skill) values ('木婉清','木婉清','剑术~~~');
# 4.不传递值
insert into game6(first_name, last_name) values ('王语嫣','王语嫣');
感谢大家的点赞收藏和关注,下一篇将继续介绍关于DQL更高级的查询,上一篇介绍的比较简单的DQL给大家一个适应过程,然后先了解一下约束和引擎后面继续介绍DQL高级查询以及多表查询。