Data Definition Language 数据定义语言
dbName 数据库名
## 显示当前mysql中的数据库列表
show databases;## 显示指定名称的数据的创建的SQL指令
show create database 数据库名;
## 创建数据库
create database ;## 创建数据库,当指定名称的数据库不存在时执行创建
create database if not exists ;## 在创建数据库的同时指定数据库的字符集
## 字符集:数据存储在数据库中采用的编码格式 (utf8 gbk)
create database character set utf8;
## 修改数据库的字符集
alter database character set utf8; # utf8 gbk
## 删除数据库
drop database ;## 如果数据库存在则删除数据库
drop database is exists ;
use
tableName 数据表
名字+类型+类型+范围+约束(int没有范围)
create table students(stu_num char(8) not null unique,stu_name varchar(20) not null,stu_gender char(2) not null,stu_age int not null,stu_tel char(11) not null unique,stu_qq varchar(11) unique
);
show tables;
desc ;
## 删除数据表
drop table ;## 当数据表存在时删除数据表
drop table if exists ;
## 修改表名
alter table rename to ;## 添加列(字段)
alter table add varchar(200);## 只修改列(字段)类型
alter table modify ;
create table classes(class_id int primary key auto_increment,class_name varchar(40) not null unique,class_remark varchar(200)
);
create table students(stu_num char(8) primary key,stu_name varchar(20) not null,stu_gender char(2) not null,stu_age int not null,cid int,##设置 级联修改 和 级联删除constraint FK_STUDENTS_CLASSES foreign key(cid) references classes(class_id) ON UPDATE CASCADE ON DELETE CASCADE
);
Data Manipulation Language 数据操作/操纵语言
insert into (columnName,columnName....) values(value1,value2....);## 向数据表中指定的列添加数据(不允许为空的列必须提供数据)
insert into stus(stu_num,stu_name,stu_gender)
values('20210101','张三','男');
delete from [where conditions];## 删除学号为20210102的学生信息
delete from stus where stu_num='20210102';
update set columnName=value [where conditions]## 将学号为20210105的学生姓名修改为“孙七”(只修改一列)
update stus set stu_name='孙七' where stu_num='20210105';## 如果update语句没有where子句,则表示修改当前表中所有行(记录)
update stus set stu_name='Tom';
Data Query Language 数据查询语言
##查询所有
select * from user;
between a and b [a,b]
and 并且 or 或者 not 取反
select * from user where sage between 10 and 20;
示例
# 查询学生姓名中第二个字母为o的学生信息
select * from stus where stu_name like '_o%';
as 取别名 distinct 消除重复行
select distinct stu_age as 年龄 from stus;
## 查询年龄 >15岁的所有学生信息,并按性别升序 年龄降序排序
select * from stus where stu_age>15 order by stu_gender asc,stu_age desc;
语句执行顺序:
1、where条件:限制从数据库中查询的记录
2、group by对查询记录进行分组
3、having:对(分组后)的数据进行筛选
4、最后order by
# 查询性别为'男'的学生,按年龄进行分组,然后分别统计每组的人数,再筛选当前组人数>1的组,再按年龄升序显示出来select sage,count(snum) from stus where sgender='男' group by sage
having count(snum)>1 order by sage;
select …
from …
where …
limit param1,param2
select * from from where limit 1,2;
笛卡尔积 :总数=A*B
select ... from tableName1 inner join tableName2;
-- 使用where设置过滤条件:先生成笛卡尔积再从笛卡尔积中过滤数据(效率很低)
select * from students INNER JOIN classes where students.cid = classes.class_id;-- 使用ON设置连接查询条件:先判断连接条件是否成立,如果成立两张表的数据进行组合生成一条结果记录
select * from students INNER JOIN classes ON students.cid = classes.class_id;
显示左表中的所有数据,如果在有右表中存在与左表记录满足匹配条件的数据,则进行匹配;如果右表中不存在匹配数据,则显示为Null
-- 左连接 : 显示左表中的所有记录
select * from students LEFT JOIN classes ON students.cid = classes.class_id;
-- 右连接 :显示右表中的所有记录
select * from students RIGHT JOIN classes ON students.cid = classes.class_id;
单列单行用 = / != 单列多行用 in / not in
select * from students where cid = (select class_id from classes where class_name='Java2105');
Data Control Language 数据控制语言
什么是一个完整的业务逻辑?
假设转账,从A账户向B账户中转账1000 .
将A账户的钱减去1000 ( update语句)
将B账户的钱加上1000( update语句)
这就是一个完整的业务逻辑。
以上的操作是一个最小的工作单元,要么同时成功,要么同时失败,不可再
这两个update语句要求必须同时成功或者同时失败,这样才能保证钱是正确的
只有DML语句才会有事务这一说,其它语句和事务无关!!!
insert
delete
update
只有以上的三个语句和事务有关系,其它都没有关系。
因为只有以上的三个语句是数据库表中数据进行增、删、改的。
只要你的操作一旦涉及到数据的增、删、改,那么就一定要考虑安全问题。
数据安全第一位!!!
假设所有的业务,只要一条DML语句就能完成,还有必要存在事务机制吗?
正是因为做某件事的时候,需要多条DM语句共同联合起来才能完成,
所以需要事务的存在。如果任何一件复杂的事儿都能一条DM语句搞定,那么事务则没有存在的价值了。
到底什么是事务呢?
说到底,说到本质上,一个事务其实就是多条DML语句同时成功,或者同时失败!
事务:就是批量的DML语句同时成功,或者同时失败!
事务是怎么做到多条DML语句同时成功和同时失败的呢?
InnoDB存储引擎:提供一组用来记录事务性活动的日志文件
事务开启了:
insert
insert
insert
delete
update
update
update
事务结束了!
在事务的执行过程中,每一条DML的操作都会记录到"事务性活动的日志文件"中。
在事务的执行过程中,我们可以提交事务,也可以回滚事务。
提交事务?
清空事务性活动的日志文件,将数据全部彻底持久化到数据表中。
提交事务标志着,事务的结束。并且是一种全部成功的结束。
回滚事务?
将之前所有的DML操作全部撤销,并且清空事务性活动的日志文件
回滚事务标志着,事务的结束。并且是一种全部失败的结束。
怎么提交事务,怎么回滚事务?
(回滚永远都是只能回滚到上一次的提交点!)
事务对应的英语单词是: transaction
测试一下,在mysql当中默认的事务行为是怎徉的?
mysql默认情况下是支持自动提交事务的。(自动提交)
什么是自动提交?
每执行一条DML语句,则提交一次!
这种自动提交实际上是不符合我们的开发习惯,因为一个业务通常是需要多条DML语句共同执行才能完成的,为了保证数据的安全,必须要求同时成功之后再提交,所以不能执行一条就提交一条。
怎么将mysql的自动提交机制关闭掉呢?
先执行这个命令:start transaction;
A:原子性
说明事务是最小的工作单元。不可再分。
c:一致性
所有事务要求,在同一个事务当中,所有操作必须同时成功,或者同时失败,以保证数据的一致性。
I:隔离性
A事务和B事务之间具有一定的隔离。
教室A和教室B之间有一道墙,这道墙就是隔离性。
A事务在操作一张表的时候,另一个事务B也操作这张表会那样???
D:持久性
事务最终结束的一个保障。事务提交,就相当于将没有保存到硬盘上的数据保存到硬盘上
重点研究一下事务的隔离性!!!
A教室和B教室中间有一道墙,这道墙可以很厚,也可以很薄。这就是事务的隔离级别这道墙越厚,表示隔离级别就越高。
read uncommitted(最低的隔离级别)《没有提交就读到了》
什么是读未提交?
事务A可以读取到事务B未提交的数据。
这种隔离级别存在的问题就是:
脏读现象!(Dirty Read)我们称读到了脏数据。
这种隔离级别一般都是理论上的,大多数的数据库隔离级别都是二档起步!
: read conmitted《提交之后才能读到》
什么是读已提交?
事务A只能读取到事务B提交之后的数据。
这种隔离级别解决了什么问题?
解决了脏读的现象。
这种隔离级别存在什么问题?
不可重复读取数据。
什么是不可重复读取数据呢?
在事务开启之后,第一次读到的数据是3条,当前事务还没有结束,可能第二次再读取的时候,读到的数据是4条,3不等于4称为不可重复读取。
这种隔离级别是比较真实的数据,每一次读到的数据是绝对的真实。oracle数据库默认的隔离级别是:read committed
repeatable read《提交之后也读不到,永远读取的都是刚开启事务时的数据》
什么是可重复读取?
事务A开启之后,不管是多久,每一次在事务A中读取到的数据都是一致的。即使事务B将数据已经修改,并且提交了,事务A读取到的数据还是没有发生改变,这就是可重复读
可重复读解决了什么问题?
解决了不可重复读取数据。
可重复读存在的问题是什么?
可以会出现幻影读。每一次读取到的数据都是幻象。不够真实!
早晨9点开始开启了事务,只要事务不结束,到晚上9点,读到的数据还是那样!读到的是假象。不够绝对的真实。
mysql中默认的事务隔离级别就是这个!! ! ! ! ! ! ! ! ! !
: serializable(最高的隔离级别)
这是最高隔离级别,效率最低。解决了所有的问题。
这种隔离级别表示事务排队,不能并发!
synchronized,线程同步(事务同步)
每一次读取到的数据都是最真实的,并且效率是最低的。
什么是数据库设计范式?
数据库表的设计依据。教你怎么进行数据库表的设计。
3个
第一范式:要求任何一张表必须有主键,每一个字段原子性不可再分。
第二范式:建立在第一范式的基础之上,要求所有非主键字段完全依赖主键,不要生部分依赖。
第三范式:建立在第二范式的基础之上,要求所有非主键字段直接依赖主键,不要产生传递依赖。
声明:三范式是面试官经常问的,所以一定要熟记在心!
设计数据库表的时候,按照以上的范式进行,可以避免表中数据的冗余,空间的浪费。