数据库总结笔记
数据库概述
1.什么是数据库database
按照一定的格式存储数据的一些的文件的组合,存储数据的仓库,实际上就是一堆文件
2.什么是数据库管理系统DBMS
数据库管理系统就是专门来管理数据库中的数据的,数据库管理系统可以对数据库中的数据进行增删查改
常见的数据库管理系统有,mysql,oracle,ms sqlserver,DB2,sybase
3.什么是SQL:结构化查询语言
4.sql的分类
DQL: 数据查询语言(select)
DML:数据操作语言(insert,delete,update)
DDL:数据定义语言(create,drop,alter)
TCL:事务控制语言
DCL:数制控制语言(grant授权,revoke撤销授权)
5.登录,创建用户,修改用户的信息,删除用户
mysql -u root -p
mysql -h10.0.3.129 -u kkk -p 123
select user(); 查看当前登录的用户
#创建用户,修改用户的信息,删除用户
create user kkk@localhost identified by '123';
update mysql.user set host ='%' where user='kkk';
alter user kkk@localhost identified by '111'
show grants for kkk@localhost;
grant all on *.* to kkk@localhost;
all:所有权限
select:查询权限
insert:插入权限
delete:删除权限
drop user 用户名
6.数据库管理
#展示,创建,使用,删除数据库
show databases;
create database store;
user store
drop database store;
7.表的管理
#查看当前数据库中的所有的表
show tables;
#创建表
create table goods(id int,name varchar(20),price double,count int);
#查看表的结构
desc goods;
#删除表
drop table goods;
#截断表(删除表后会创建一个新的表)
truncate table goods
#创建和某表结构一样的表
create table goodss like store.goods;
#修改列的类型
alter table goods change id id int;
alter table goods modify id int
#删除列
alter table goods drop id
#重命名列
rename table goods to goods1
8.表中的数据的管理
select * from goods where id =1;
select id as 'ID' from goods where id = 1
select distinct * from goods
insert into goods(id,name,price,count) values(1,'1',11);
update goods set id = 2 where name ='11';
delete from goods where id =1;
delete from goods;
9.约束
约束是为了保证进入数据库的数据都是有效的,可靠的
查看约束:show create table good
1.主键约束PK:
主键约束是不允许重复的,不接受null值
设置为主键:alter table good add constraint pk_name primary key(id)
修改某一列为主键:alter table good modify column id int primary key;
删除主键约束:alter table good drop primary key;
1.1自增长列(表示列)关键字来标识自增长列,在mysql中自增长列必须是主键列
标识符必须和一个key值匹配
一个表最多有一个标识符
标识符的类型只能是数值型
标识符可以通过auto_increment_increment = 3,设置全局步长
alter table good modify column id int auto_increment;
删除:alter table good modify column id int;
2.唯一约束:对于非主列键中的值也要求唯一性的时候,就需要唯一约束
唯一约束也许有多个null值
alter table good modify column id int unique;
alter table good drop id
3.默认约束default
alter table good modify column id int default 0;
删除alter table good modify column id int;
4.非空约束:非空,用于保证该字段的值不能为空
not null
alter table good modify column id int not null;
删除altet table good modify column id int
外键约束
表中的值来自另外一张表的主键或者唯一键的列称为外键FK,将被引用值的表称为主表或者父表
将应用值的表称为从表或者自表
alter table goods constraint fk_name_id foreign key(id) references catagory(no);
【特点】1.外键的类型应该与引用的列的类型一致
2.一个表可以有多个外键
3.从表的列可以随表的删
4.删除主表的时候,会先检查从表中有没有对此数据的关联,如果有的话就不能直接删除
5.可以添加on delete cascade/on update cascade
on delete set null/on update set null
10.条件查询
SELECT * FROM 表名 WHERE 字段 = value;
# WHERE 字句表示查询的条件
[value1, value2]
SELECT * FROM 表名 WHERE 字段 BETWEEN value1 AND value2;
字段在[value1,value2]任意一个就可以
SELECT * FROM 表名 WHERE 字段 IN(value1, value2, value3);
字段不在[value1,value2,value3]中
SELECT * FROM 表名 WHERE 字段 NOT IN(value1, value2, value3);
-- &
SELECT * FROM 表名 WHERE 条件1 AND 条件2;
-- |
SELECT * FROM 表名 WHERE 条件1 OR 条件2;
# NULL 值只能无法通过等值操作查询
# NULL值指的是未填值,注意跟空字符串做区分
SELECT * FROM 表名 WHERE 字段 IS NULL;
SELECT * FROM 表名 WHERE 字段 IS NOT NULL;
# ORDER BY 对结果集排序 DESC 降序 ASC 升序(默认)
SELECT * FROM 表名 ORDER BY 字段 DESC;
SELECT * FROM 表名 ORDER BY 字段 ASC;
11.子查询
子查询分为:
单列子查询: 返回单行单列数据的子查询
单行子查询: 返回单行多列数据的子查询
多行子查询: 返回数据是多行单列的数据
关联子查询: 子查询中如果使用了外部主SQL中的表或列,就说这个子查询跟外
部SQL是相关的
12.连接查询
mysql 中内置了5种聚合函数,分别是sum,max,min,avg,count
group by 是对数据进行分组,分组的时候能,表中相同的值分为一组
having是对group by 分组后的结构进行筛选
【笛卡尔乘积现象 】表查询中的笛卡尔乘积现象:多行表在查询时,如果定义了无效连接或者漏写了连接 条件,就会产生笛卡尔乘积现象,所谓的笛卡尔乘积及时每个表的每一行都和其他表 的每一行组合。笛卡尔乘积现象
1.等值连接查询
2.自连接查询
3.内连接查询
4.外连接
经典例题
13.单行函数
14.索引
索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构, 它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻 辑指针清单
不同的存储引擎支持的索引类型也不一样 :
InnoDB : 支持 B-tree、Full-text 等索引,不支持 Hash索引;
MyISAM : 支持 B-tree、Full-text 等索引,不支持 Hash 索引;
Memory : 支持 B-tree、Hash 等索引,不支持 Full-text 索引;
NDB : 支持 Hash 索引,不支持 B-tree、Full-text 等索引; Archive : 不支持 B-tree、Hash,Full-text 等索引;
创建索引:create index index_id on good(id);
修改表(添加索引)alter table good add index index_id(id);
测试索引 explain select * from good where id =1;
索引的分类:
- 普通索引
- 唯一索引:是索引列的值必须唯一,但允许有空值
- 主键索引:它是一种特殊的唯一索引,但不允许有空值
- 全文索引:
- 组合索引
索引的优缺点:
【优点】 索引由数据库中一列或多列组合而成,其作用是提高对表中数据的查询速度 索引的优点是可以提高检索数据的速度
【缺点】 索引的缺点是创建和维护索引需要耗费时间 索引可以提高查询速度,会减慢写入速度。索引并不是越多越好,索引固然可以提高 相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索 引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必 要。
注意索引失效:
- 模糊查询
- 复合索引的时候没有采用左侧的列查找
- 使用or
- 在where当中索引参加了运算,where中使用了函数
15.存储过程procedure
是事先经过编译并存储在数据库中的一段 SQL 语句的集 合。调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务 器之间的传输,对于提高数据处理的效率是有好处的。
简单说就是一组SQL语句集,功能强大,可以实现一些比较复杂的逻辑功 能,类似于JAVA语言中的方法;存储过程跟触发器有点类似,都是一组 SQL集,但是存储过程是主动调用的,且功能比触发器更加强大,触发器 是某件事触发后自动调用;
create procedure pro_good(in id int,in name varchar(20))
begin
end;
删除存储过程:drop procedure pro_good
调用存储过程:call 存储过程名(参数);
# 存储过程的参数分为in\out\inout三种类型
# in 输入参数,表示该参数的值必须由调用程序指定
# out 输出参数,表示该参数的值经存储过程计算后,将out参数的计算结果返回给调用
程序
# inout 既是输入参数、又是输出参数,表示该参数的值既可以由调用程序指定,也可以将inout参数的计算结果返回给调用程序
# 存储过程中的语句必须包含在begin和end之间
存储过程中的控制语句
if case while
create procedure pro_good(in id int)
#if
begin
declare c varchar(200)
if id = 0 then set c = 'hhhhh'
elseif id =1 then set c ='kkkkk'
else set c ='lllll'
end if
select c
end;
#case
begin
declare c varchar(500);
case id
when o then set c = 'hhhhh'
when 1 then set c = 'kkkkk'
else set c ='llllll'
end case
select c
end;
#whlie
create procedure pro_good(in id int)
begin
declare c int
declare s int
set c = 0
set s = 0
while c <= id do
set s = s+c
set c = c+1
end while
select s
end
16.事务
一个事务就是一个完整的业务逻辑,是一个最小的工作单元,不可再分
在事务的执行过程中,每一条DML语句都会记录到“事务性活动的文件"中,在事务执行的过程中,可以提交事务,也可以回滚事务
- 提交事务:清空事务性活动的日志文件,将数据全部传递持久化到数据库中,标志着事务成功的结束
- 回滚事务:将之前所有的DML操作全部撤销,并且清空事务性活动的日志文件,标志着事务失败的结束
事务的4个特性:ACID
- 原子性:说明事务是最小的工作单元
- 一致性:在同一个事务中,所有的操作必须同时成功,或者同时失败
- 隔离性:A事务在操作一张表的时候,另一个事务也操作这张表会怎样
- 持久性:事务最终结束的一个保障
事务的隔离性:
- 读未提交:事务A可以读取到事务B未提交的数据——存在脏读现象
- 读已提交:事务A只能读事务B提交之后的数据——解决了脏读的现象,不可重复的读取数据
- 可重复读:不管多久,每一次在事务A中读到的数据都是一致的,不可重复的读取数据,即使事务B将数据已经修改,并且提交,事务A读到的数据还是没有发生改变,可能会出现幻读的现象,不够的真实
- 序列化:不能并发,效率最低,解决了所有的问题,事务是排队的
set global transaction isolation level 隔离级别;
read uncommited
read commited
repeatable read
serializable
17.触发器
监视某种情况,并触发某种操作,它是提供给程序员和数据分析 员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不 是由程序调用,也不是手工启动,而是由事件来触发,触发器具有以下的特点:
- 与表相关联
- 自动激活触发器
- 不能直接调用
- 作为事务的一部分
18.数据库设计的三范式
数据库设计范式:数据库表的设计依据,教你怎么进行数据库表的设计
- 第一范式:要求任何一张表都必须有主键,每一个字段的原子性不可再分
- 第二范式:要求所有的非主键字段完全依赖主键,在第一范式的基础上,不要产生部分依赖
- 第三范式:在第二范式的基础上,要求所有的非主键字段直接依赖主键,不要产生传递依赖
多对多时:三张表,关系表两个外键
一对多时:两张表,多的表加外键
19.视图
视图是基于查询的虚拟表,是一个逻辑表,本身并不包含数据。同真实的表一样,视 图包含一系列带有名称的列和行数据,在使用视图时动态生成。通俗的理解,视图就 是一条SELECT语句执行后返回的结果集。 SELECT语句所查询的表称为视图的基表,而查询的结果集称为虚拟表,视图本身并 不存储具体的数据,视图的数据存在于视图的基表中,基本表数据发生了改变,视图 的数据也会跟着改变。
CREATE VIEW 视图名
AS
SELECT列1,列2 .
FROM 表;