-
在进行表操作之前,一定要use选中数据库
-
注释:在SQL中可以使用
--空格
+描述 来表示注释说明 -
CRUD 即增加(Create)、查询(Retrieve)、更新(Update)、删除(Delete)四个单词的首字母。
数据库约束
数据库约束可以理解成数据库提供的一种针对 数据合法性 验证的机制
约束类型
- NOT NULL - 指示某列不能存储 NULL 值,表里的内容是必填项
- UNIQUE - 保证某列的每行必须是唯一的值(不能重复),每次插入/修改都会先触发查询,如果值已经存在,就会插入/修改失败
- DEFAULT - 指定没有被赋值的列的默认值。不进行任何指定,默认值就是NULL
- PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。(相当于一条记录的身份标识)
- FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。
- CHECK - 保证列中的值符合指定的条件。MySQL数据库对CHECK子句进行分析,但是忽略CHECK子句。也就是不会报错,但是也不会生效。check指定条件,插入/修改数据时数据符合条件才能插入/修改成功;不符合条件则失败
NOT NULL约束
指定某列不为空:
UNIQUE:唯一约束
指定列的内容唯一的、不重复的:
DEFAULT:默认值约束
指定不插入数据时的默认值:
PRIMARY KEY:主键约束
- 不能为null
- 不能重复
相当于NOT NULL 和 UNIQUE 的结合
指定id列为主键:
一般给表设定主键使用数字(整数形式),很少使用字符串.
-
一个表只能有一个主键
-
一个主键不一定只针对一个列(联合主键----把多个列的内容联合到一起,共同构成一个主键),很少使用这个功能
-
当某个列集合了
not null
和unique
就成为主键了
一般使用整数 id 作为主键,但id的值该如何选择呢?
MySQL提供了"自增主键", 对于整数类型的主键,常配搭自增长auto_increment来使用。插入数据对应字段不给值时,赋值为最大值+1。
- auto:自动
- increment:增加
此时插入数据,主键的值就不用手动指定了
当然还可以手动指定,不一定依赖自增主键
如果把 id = 100 和 id = 101 删去,按理来说是从102开始自增,但不知道为啥我的会跳号
4~102这一批id,如果不手动指定就浪费了,如果不想浪费可以不依赖自动增键主动添加
自增主键本质 是MySQL服务器存储了当前表中最大的id,再进一步进行累加的。基于分布式系统存储数据的时候,MySQL自增主键就无能为力了.
在分布式系统中,如何生成唯一id?
最简单最朴素的方式: 时间戳 + 机器编号 + 随机数
再计算哈希值得到一个整数,这个整数可以作为id
简单介绍用
md5
计算hash值的特性
- 定长. 无论输入的字符串多长,最终计算的hash值都是一样长的(作为校验和的一种方式)
- 分散. 输入的字符串,哪怕只有一点点不一样,得到的 hash值 都会差异很大(成为hash 算法的根本)
- 不可逆. 计算出的hash值理论上无法还原成原来的字符串(可以作为一种加密手段)
FOREIGN KEY:外键约束
外键用于关联其他表的主键或唯一键,语法:
foreign key (字段名) references 主表(列)
案例:
插入 student 表的classId 必须要在 class 表的classId中存在,插入的学生才有意义(从属于某个班级)
此时,外键就让student 的 classId 就和 class 表的 classId 建立了联系.也就是student classId 中的值,必须要在 class 表的 classId 中存在. class 表就对 student 表产生了制约
- 父表中被引用的列必须是主键或是 unique
- 把 class 表(制约别人的表) 称为"父表"(parent table)
- 把 student 表(被制约的表) 称为"子表"(child table)
父表可以删除/修改没有被子表引用的记录,但如果被引用了就不能删除/修改了.
子表不能随意插入/修改(外键必须在父表中)
CHECK约束(了解)
MySQL使用时不报错,但忽略该约束:
drop table if exists test_user;
create table test_user (
id int,
name varchar(20),
sex varchar(1),
check (sex ='男' or sex='女')
);
新增(Create)
全列插入
insert into 表名 values (值, 值...);
- 可以省略into
- values是关键字
一次插入多行记录
insert into 表名 values(值, 值...), (值, 值...), (值, 值...)...;
一次插入多条记录往往比一次插入一条记录,分多次插入的效率要高
MySQL是客户端 - 服务器结构的程序
客户端中执行的每个操作,都会通过网络请求发送给服务器,而服务器返回一个响应内容
虽然请求中包含了更多的数据,但网络开销更小了.网络开销对效率的影响大
指定列插入
insert into 表名(列名, 列名...) values(值, 值...);
列名个数和顺序无需和表头信息一致,只需保证列名是存在的
插入时间
'2024-04-22 11:13:00'
是一个标准的时间格式化写法
有时,插入的数据要指定当前系统的时间,MySQL有一个专门的函数now()
来获取
插入查询结果(不用values关键字)
需要确保查询到的结果集合(列数/类型/顺序),要和待插入表的列数/类型/顺序匹配
语法:
INSERT INTO 表名 [列名,列名...] SELECT .