SQL:
SQL是Structured Query Language:结构化查询语言
可操作所有关系型数据库的规则。
分类:
1.DDL(Data Definition Language)数据定义语言
定义数据库对象:数据库,表,列等;关键字:create,drop,alter等;
2.DML(Data Manipulation Language)数据操作语言
对数据库中表的数据进行增删改。关键字:insert,delete,update;
3.DQL(Data Query Language)数据查询语言
用来查询数据库中表的记录。关键字:select,where;
4.DCL(Data Control Language)
DDL:CRUD
1.Create 创建数据库
2.Retrieve:查询
3.Update:修改
4.Delete:删除
5.使用数据库:Use
DQL:
1.排序查询
Order by字句
order by 排序字段 排序方式
排序方式:
ASC:升序
DESC:降序
2.聚合函数:将一列数据作为一个整体,进行纵向计算(排除非空)
count:计算个数,一般选择非空的列:主键;
max:计算最大值
min:计算最小值
3.分组查询
语法:group by 分组字段
注意:
分组之后的查询字段:分组字段,聚合函数;
where与having的区别:
作用域不同:
where在分组前进行限定,如果不满足条件,则不参与分组。having在分组之后进行限定,如果不满足结果,则不会被查询出来;
where不可以进行聚合函数的判断,having可以进行聚合函数的判断;
4.分页查询
语法:
limit:开始的索引,每页查询的条数
公式:开始的索引=(当前的页码-1)*每页显示的条数
分页操作是一个方言;
DQL:
语法:
select
字段列表
select 字段名1,字段名2…from 表名;
注意:
查询所有字段,可使用*替代字段列表
取出重复:distinct
计算列:数值型值可使用简单的四则运算;
注意:IFNULL(表达式1,表达式2):null参与的运算,计算结果都是null;
表达式1:哪个字段需要判断是否为null;
表达式2:如果表达式1中为null,使用2替换null;
from
表明列表
where
条件列表
group by
分组字段
having
分组之后的条件
order by
排序
limit
分页限定
约束:
对表中数据进行限定,保证数据正确性,有效性以及完整性;
分类:
1. 主键约束:primary key(非空且唯一);
一张表只能有一个字段为逐渐
逐渐就是表中记录的唯一标识
创建表时,添加主键约束:
create table stu(
id int primary key,#给id添加逐渐约束
name varchar
);
删除主键:alter table stu drop primary key;
自动增长:
create table stu(
id int primary key auto_increment,
name varchar(20)
);
2. 非空约束:not null;
创建时可设置
或 alter table 表名 modify 列名 类型名 NOT NULL;
3. 唯一约束:unique;
删除唯一约束:alter table 表名 drop index 列名;
添加唯一约束: alter table 表名 modify 列名 类型名 UNIQUE;
4. 外键约束:foreign key,使表与表产生关系,从而保证数据的正确性。
在创建表时,可以添加外键
语法:
create Table 表名(
...
外键列
constraint 外键名称 foreign key(外键列名称) references 主表名称(主表列名称)
);
删除外键:
alter table employee drop foreign key emp_dept_fk;
添加外键:
alter table employee add constraint emp_dept_fk foreign key (外键字段名称) references 主表名称(主表列名称);
级联操作
添加,删除级联操作:
alter table employee add CONSTRAINT emp_dep foreign key (dep_id) REFERENCES department(id) on UPDATE CASCADE on DELETE CASCADE;
数据库的设计
多表之间的关系
1.一对一的关系;
在任意一方添加外键指向另一方的主键,并且使主键唯一;
2.一对多或多对一的关系;
在多的地方的外键指向一的数据库的主键
3.多对多的关系;
借助第三张表,中间表至少包含两个字段,两个字段作为第三张表的外键,分别指向两张表的主键;
范式:
设计关系数据库时,遵循一些规范。
第一范式(1NF):
每一列都是不可分割原子项;
第二范式(2NF):
在1NF基础上,非码属性必须完全依赖于码(在1NF基础上消除非主属性对主码的部分函数依赖);消除冗余
函数依赖:属性之间呈现自变量与因变量的关系
完全函数依赖:一个属性依赖于一个属性组(多个属性)
部分函数依赖:相对于完全函数依赖,一个属性只依赖于一个属性组的中的一部分
传递函数依赖:A-->B,B-->C;C传递函数依赖A;
码:一个表中,一个属性或属性组,被其他所有属性所完全依赖,则称这个属性为该表的码。
第三范式(3NF):
在2NF基础上,任何非主属性不依赖于其他非主属性(在2NF基础上消除传递依赖)
数据库备份及还原
备份:mysqldump -u用户名 -p密码 数据库名称 >保存的路径
还原:
1.登录数据库;
2.创建数据库;
3.使用数据库;
4.执行文件,source 文件路径
多表查询:
隐式内联结:使用where消除无用数据
例子:
SELECT t1.name
,t1.gender,t2.name
FROM emp t1,dept t2
WHERE t1.dept_id=t2.id;
显式内连接:select * from 表名 INNER JOIN 表名2 表名2主键=表名1外键;
外连接查询:
左外连接:Select 字段列表 from 表1 left [outer] join 表2 on 条件;
查询是左表所有数据以及其交集
右外连接:Select 字段列表 from 表1 left [outer] join 表2 on 条件;
子查询:
概念:查询中嵌套查询,称嵌套查询为子查询
1.子查询结果是单行单列的:
子查询可以作为条件,使用运算符去判断。
SELECT * from emp where emp.salary=(SELECT MAX(salary) FROM emp);
2.子查询结果是多行单列的
SELECT * from emp WHERE emp.dept_id in (SELECT id FROM dept WHERE name=‘市场部’ or name=‘财务部’);
3.子查询结果是多行多列的
子查询可以作为一张虚拟表
事务:
概念:一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败
操作:
开启事务:start transaction;
回滚:rollback;
提交:commit;
Mysql自动事务:
一条DML语句,会自动提交一次事务;
手动提交
Oracle 数据库默认手动提交
需要开启事务,再提交
SELECT @@autocommit; -- 1代表自动提交 0代表手动提交
事务四大特征:
1.原子性:是不可分割的最小操作单位,要么同时成功,要么同时失败
2.持久新:当事务提交或回滚后,数据库会持久化保持数据
3.隔离性:多个事务之间,相互独立
4.一致性:事务操作前后,数据总量不变
并发访问的问题:并发访问中,多个用户同时访问同一个数据
脏读:一个事务读取到另一个事务中尚未提交的数据
不可重复读:一个事务中两次读取的数据内容不一致,要求是一个事务中多次读取时数据是一致的,这是由于事务update时引发的问题
幻读:一个事务中两次读取的数据的数量不一致,要求在一个事务多次读取的数据的数量是一致的,这是由于insert或者delete引发的
数据库四种隔离级别:
1.读未提交 read uncommitted:
2.读已提交 read committed;消除脏读
3.可重复读:repeatable read 避免脏读以及不可重复读
4.串行化:serializable 避免脏读,不可重复读,幻读
隔了级别越高,性能越差,安全性越高。