创建一张表
CREATE TABLE t_student(
no int,
name VARCHAR(32),
sex CHAR(1),
age INT(3),
email VARCHAR(255)
);
删除表
DROP TABLE t_student
当这张表不存在时就会报错
格式化数字
format(数字,‘格式’)
SELECT ENAME,FORMAT(SAL,'$999,999')AS sal FROM emp
str_to_data:字符串转换成日期类型
data_format:将data类型转换成varchar字符串
CREATE TABLE t_user(
id INT,
name VARCHAR(32),
birth DATE
)
mysql日期格式
%Y 年
%m 月
%d 日
%h 时
%i 分
%s 秒
INSERT INTO t_user (id ,name,birth)VALUES (1,'zhangsan',
STR_TO_DATE('01-10-1990','%d-%m-%Y'))
如果类型是%Y-%m-%d 就不需要str_to_date
将日期用特定的类型展示
SELECT id,name,DATE_FORMAT(birth,'%d/%m/%Y')AS birth
FROM t_user
date 和datetime的区别
date时短日期:只包括年月日
date_time是长日期类型
delete删除数据的原理:数据删除了,空间不会释放,还可以恢复数据
缺点:删除效率比较低
DELETE FROM t_user
truncate语句删除数据的原理
这种删除效率比较高,表被一次截断,物理删除
这种删除的缺点:不支持回滚
优点:速度快
删除表中的数据,表还在
删除表drop t_user
对表结构的增删改
在实际开发之中,需求一旦确定后,表一旦确定,很少对表的修改
开发进行之中,修改表的结构修改,成本就会变高
约束
创建表中的时候可以给字段创建一些约束,来保证表中的数据完整性,有效性!!
约束的作用就是为了保证:表中的数据有效性
约束包括
非空约束:not null
唯一性约束: unique
主键约束:primary key
外键约束:foreign key
两个字段联合唯一性
name和email联合唯一性
drop TABLE t_vip
DROP TABLE if EXISTS t_vip;
CREATE TABLE t_vip(
id INT,
NAME VARCHAR(255),
email VARCHAR(255),
UNIQUE (name,email)
);
INSERT INTO t_vip (id,NAME,email) VALUES (1,‘zs’,‘11@qq.com’)
INSERT into t_vip (id,NAME,email) VALUES (2,‘zs’,‘22@qq.com’)
添加多个字段需要用表级约束
unique 和not null联合
DROP TABLE if EXISTS t_svip;
CREATE TABLE t_svip(
id INT,
name VARCHAR(255) NOT null UNIQUE);
DESC t_svip
在mysql 之中,如果一个字段同时被not null 和 unique约束的话,该字段就会变为主键
主键约束
一个字段做主键叫单一主键
id和name同时做主键
drop TABLE IF EXISTS t_vipa;
CREATE TABLE t_vipa(
id int,
name VARCHAR(255),
email VARCHAR(255),
PRIMARY KEY (id,name)
);
INSERT INTO t_vipa (id,name,email)VALUES (1,‘zs’,‘zs@qq.com’);
INSERT INTO t_vipa(id,name,email) VALUES (1,‘ls’,‘ls@qq.com’);
SELECT * from t_vipa
在实际开发之中,不适合用复合主键
一张表主键约束只能添加一个。
主键值建议使用
int bigint char等类型
auto_increnment 自增
外键约束(foregin key)
设计一个数据库表,来设计"班级和学生"的信息
被引用的表为父表
删除表:先删子,再删父表
插入表:先添加父表,再加入子表
drop TABLE IF EXISTS t_student;
DROP TABLE IF EXISTS t_class;
CREATE TABLE t_class(
classno INT PRIMARY KEY,
classname VARCHAR(255)
);
CREATE TABLE t_student(
no INT PRIMARY KEY,
NAME VARCHAR(255),
cno INT,
FOREIGN KEY(cno) REFERENCES t_class(classno);
INSERT INTO t_class(classno,classname) VALUES (100,'上海市第三中学一班');
INSERT INTO t_class(classno,classname) VALUES (101,'上海市第三中学二班');
INSERT INTO t_student(no,NAME,cno) VALUES (1,'zs',100);
INSERT INTO t_student(no,NAME,cno) VALUES (2,'as',100);
INSERT INTO t_student(no,NAME,cno) VALUES (3,'ss',100);
INSERT INTO t_student(no,NAME,cno) VALUES (4,'ds',100);
)
SELECT classno AS '班级编号',
classname AS '班级名称',
no AS '学生编号',
NAME AS '学生名称'
FROM t_class,t_student
where t_class.classno= t_student.cno
只能添加这两个字段
字表的外键引用父表之中的某个字段,被引用的字段必须为主键吗?
不一定是主键,具有唯一性就可以
外键可以为空吗?
外键值可以为null
mysql支持的存储引擎
SHOW ENGINES
MySQL支持九个存储引擎
事务
一个事务就是完整的业务逻辑?
从A账户向B转钱1000
将A账户减去1000
将B账户加上1000
这就是完整的业务逻辑
这是最小的工作单元,要么同时成功,要么同时失败,不可再分。这两个update语句必须同时成功或者同时失败
只有DML数据才有事务,只有这三个语句才能操作数据
只有你的操作数据的增删改,就一定要考虑安全问题
在事务的执行过程之中,每一条DML操作都会记录在日志文件之中,我们可以提交事务,或者回滚
提交事务:
清空事务性活动的日志文件,将数据全部彻底持久化到数据库表中。
提交事务标志着,事务的结束,并且是一种全部失败的结束
mysql 在默认情况下是默认提交
每提交一条DML语句,则提交一次
回滚只会提交上次提交的点
也就是说你回滚(ROLLBACK)先要开启(START TRANSACTION),关闭提交机制。
举个例子:
SELECT * FROM t_vip
START TRANSACTION;
INSERT INTO t_vip (id,NAME,email) VALUES (2,'ls','ls@qq.com');
INSERT INTO t_vip (id,NAME,email) VALUES (3,'ww','ww@qq.com');
ROLLBACK;
SELECT * from t_vip;
结果还是这样,
commit提交事务
事务包括四个特性:
1.原子性:事务是最小单元,不可再分
2.一致性:所有的事务的操作必须同时成功,或者同时失败
3.隔离性:a事务操作一张表,另一个事务也操作这张表
4.持久性:事务最终结束的一个保障,事务提交,就相当于将没有保存到硬盘上的数据,保存到硬盘上。
事务的隔离级别:
事务和事务之间的隔离级别有哪些:
读未提交:read uncommitted (最低的隔离级别)
事务a可以读取b的未提交数据,可以读到脏数据(这种隔离级别是理论上的)
读以提交: read committed
事务a只能读取到b提交的数据,这种隔离级别解决了脏读现象,不可重复读取数据。在开启事务之后,第一次读取的数据和第二次读取的数据是不一样的所以成为不可重复读取。这种隔离级别
可重复读: repeatable read
事务a开启之后,不管多久,每一次在事务a中读取的数据都是一致的,即使事务b发生了修改,并且提交了,事务a读取到的数据还是没有发生改变,这就是可重复读
可重复读解决了不可重复读的问题,每一次拿到的数据不够真实。
序列化/串行化 : serializable (最高的隔离级别)
效率最低,但是解决了所有问题,表示事务排队,不能并发
在mysql数据库之中索引也需要排序这个排序结果和treeSET数据结构,treeset是一个平衡二叉树,在mysql之中索引是btree数据结构
遵循左小右大的原则,采用中序遍历原则
索引的创建(以t_vip表为例子)
CREATE INDEX t_vip_NAME_index ON t_vip(NAME)
删除索引
DROP INDEX t_vip_NAME_index ON t_vip
查看索引
EXPLAIN SELECT * FROM t_vip WHERE `NAME`='KING'
数据库三范式
第一范式:最核心,最重要的范式,所有表的设计都需要满足,必须有主键,每个字段原子性不可再分。
第二范式:建立在第一范式之上,要求所有非主键字段必须完全依赖主键,不要产生部分依赖。
第三范式:要求所有非主键必须都依赖主键,不要产生传递依赖。