目录
一、创建表
1、建表语法:
creat table 表名(
字段名 数据类型 [约束] [默认值] ,
字段名 数据类型 [约束] ,
字段名 数据类型
)
注意:最后一个字段后面不加 逗号
2、常用数据类型:
(1)数值类型:
int :整数,4B,存储数据的范围 -2147483648~2147483647
double : 小数, 双精度 ,8B
(2) 字符串类型 :
a. char(n):固定长度的字符串
char(5):字符串长度为,'abc'利用空进行填充,实际长度为5
b. varchar(n):不固定长度的字符串
varchar(5):'abc',实际长度为3
存储:手机电话(固定长度为11位,char(11))
账户用户名(字符个数不固定,varchar(50))
身份号(固定长度18位,char(18))
(3) 日期类型:
date:年月日,默认格式为 YYYY-MM-DD.
datetime:年月日时分秒,YYYY-MM-DD HH:MM:SS 精确到秒
TIMESTAMP: 年月日时分秒,时间戳
(4) 布尔类型:mysql中不支持
a. 利用 int 中 1代表 true; 0 false
b. 利用 char(1) 中'y' 代表 true, n 代表false
c. 利用 char(3) 中 '是' 代表 true, '否'代表 false
注意:utf-8中汉字占 2~3个字节
3、默认值
(1) 作用:标识该字段不给数据时,系统会根据指定的内容默认赋值
(2) 语法:
字段名 数据类型 default 值
(3) 注意:
指定默认的值,必须和该字段的数据类型匹配
4、约束
(1) 主键约束:primary key , pk
a. 作用:用于标识表中每一行数据,例如:学号|工号|id等
b. 特点:唯一、非空
c. 语法:字段名 数据类型 primary key
d. 注意:实际开发时,通常每一张表都会设置一个主键列
(2) 唯一约束:unique ,un
a. 作用:用于标识该字段中的内容不允许重复,例如身份号、电话
b. 特点:唯一、可以为空
c. 语法:字段名 数据类型 unique
(3) 非空约束:not null , nn
a. 作用:用于标识该字段的内容不能为空,必须有内容,例如:学生名
b. 特点:不能为空、可以重复
c. 语法:字段名 数据类型 not null
(4) 外键约束:简称 fk
a. 作用:用于标识当前字段的值不能随意输入,需要跟从于另一张表的主键列或是唯一列的值
b. 注意:设置外键列的表被称为从表;被从表指定的表称为主表
从表中的外键列数据跟从于主表中的指定列中的数据
c. 特点:可以重复、可以为空(null)
d. 语法:references 主表表名(主表中主键列名/唯一列列名)
二、增删改
1、增:往数据库表中添加一条数据,insert into
(1) 语法:insert into 表名 (字段名1,字段名2,字段名3) values (值1,值2,值3) -- 部分字段赋值
(2) 注意:
a. 此种语法可以对表中的部分字段赋值,但是选择的字段中必须包含表中主键列和非空列
b. 后面给定值的顺序、数据类型、个数需要和前面字段一致
c. 给定值时,需要遵循对应字段约束(唯一、非空、主键、外键)
d. 前面指定字段的顺序和表中字段顺序没有强制要求
(3) 案例:
(4) 语法2:insert into 表名 values(值1,值2,值3) --给所有的字段赋值
a. 注意:此语法必须为表中所有的字段一一赋值
b. ()中给的值顺序、个数、数据类型取决于 表结构
(5)利用工具对主键自动维护唯一性:
insert into t_student (stu_name,sex,email,birthday)
values('欢欢',2,'hh@qq.com','2000-10-27')
2、删:从数据库表中删除指定的数据
(1) 语法:delete from 表名 where 过滤条件 -- 删除符合过滤条件的数据
(2) 注意:删除数据时,根据开发需求指定过滤条件,如果没有加过滤条件,删除表中所有的数据
(3) -- 给定一个删除指定id对应的数据
delete from t_student where stu_id=16 -- 采用唯一主键删除,等值判断最多删除一条
注意:如果没有符合过滤条件的数据,则不删除任何一条数据
(4) -- 删除班级
delete from t_clazz where cls_id=3
如果被删除的主表中的数据被从表占用,则不能直接删除,解决方案分为以下两种:
-- 第一个解决方案:删除被占用的子项中的对应数据(直接删除调用当前班级的学生)
delete from t_student where cls_id=3
-- 第二种解决方案:先将占用的子项中对应的数据修改到其他的数据上
-- 先将学生调整其他班级中,清空当前班级学生
update t_student set cls_id = 1 where cls_id=3
delete .....
3、修改:update,将指定数据内容进行修改
(1) 语法:update 表名 set 字段名 = 新值,字段名2=新值2 where 过滤条件
(2) 案例:
(3) 注意:
a. 修改的新值需要对应字段数据类型
b. 修改时需要遵循字段约束
4、扩充
(1) 如果 delete的过程没有加过滤条件,则将指定表中所有的数据删除
delete from 表名
注意:对表中的所有数据进行一条条删除(删除数据效率相对低);表结构依然存在
(2) 语法:truncate table 表名
本质: 直接将存储表数据部分的空间,直接清除,进而删除数据[非DML]
特点: 效率远远高于delete
(3) 删除表:drop table aa
将表中的数据删除的同时,表结构也被删除
三、事务
1、事务:
通常由一条或是多条sql组成,这多条sql看成整体,如果执行所有事务中sql都会执行,事务执行成功,提交事务(commit);只要有一条sql没有执行成功(或是没有执行到),事务执行失败(撤销已经执行过的sql),回滚事务(rollback)
事务在开发中是最小执行单元;
在navicat中以一条sql为一个事务,执行一条sql自动完成提交,需要设置为手动控制事务时,执行
set autocommit=false,可以利用 commit和 rollback让客户端应用者自己控制事务提交的时机
2、事务执行的原理
数据库会为每一个客户端都分配一个独有的回滚段,如果客户端发送的为insert/delete/update操作时,先将操作的结果存储在客户端对应回滚段中,如果执行到 commit,将客户端对应回滚段中的数据同步到数据库中,但是如果执行到 rollback(回滚),则将回滚段中的数据撤销,此时数据库不会被同步,被回滚的数据结果不会被其他客户端查询到 。
3、事务的大小:
(1) 事务的大小由业务决定,不同的业务下,需要事务sql数量不同。
(2) 案例:
-- 开户业务:由1条sql组成 --> 事务
insert into accounts ....
-- 转账业务:由2条sql组成 --> 事务
update account set balance=balance-money where numId = 8298349
update account set balance=balance+money where numId = 8990909
(3)事务的边界
a. 开始:从第一条sql开始执行,事务开始
b. 结束:执行的sql为insert/delete/update时
第一种情况:commit:事务提交
第二种情况:rollback:事务回滚
注意:select查询语句无需控制事务
4、事务的底层安全
(1) 事务底层基于锁对数据库安全进行保证
(2) 在一个事务中 insert/update/delete 数据时,会获取该数据的锁标记,直到该事务结束(commit/rollback)才会释放锁标记;在一个事务持有数据的锁标记时,多事务并发操作,其他事务不能对该数据进行 insert/update/delete 操作,直到获取到锁标记为止,但是可以进行select查询操作,查询操作默认不参与事务。
5、事务的特点(ACID)
(1) 事务的原子性(Atomic):
事务中的多个sql语句是一个整体, 要么全部成功,要么全部失败。
(2) 事务的一致性(Consistency):
(数据的合理性),事务执行前后(无论失败还是成功),最终数据是合理的。
(3) 事务的隔离型(Isolation):
多个事务并发时,事务之间相互独立,互不影响。
(4) 事务的持久性(Durability):
事务结束(成功或失败),对数据库的数据修改时永久性的。