目录
创建条件(范式、事物、隔离)
这个是对于有一定了解的,如果新手可以先跳过这个,后面一定要回头看(很重要)
范式
设计的越详细,操作越好,但不一定能用到
第一范式:满足所有字段不可再拆分。
例:字段A是地址,可拆分为国、省、市……
第二范式:满足除主键外,其余每个字段都依赖主键;(除联合主键外)
t_name(
字段A主键
字段B
字段A_1 );(因B与A没关系应剔除,否则做联合主键)
第三范式:必须先满足第二范式,除主键以外,其他字段不能有依赖关系
***********************************************
事务
保持两工作能够同步完成;要么同时成功,要么同时失败
1*利用mysql事务
查看事务状态:SELECT @@autocommit;
SET autocommit=0;
查询事务状态:0为关1为开,当事务自动提交关闭后,若关闭,需要手动提交,否则无法储存
事务创建:语句1;语句2;
事务回滚:rollback;可恢复事务前的状态(事务回滚需要MYSQL 的自动提交关闭;)
事务提交:commit;提交后,数据将持久保存
2*手动开一个事务
事务创建:1、begin;
语句1;语句2;
2、start TRANSACTION ;
语句1;语句2;
事务回滚:rollback;无需关心自动提交
事务提交:commit;提交后,数据将持久保存
---------------------------
事务四特征:原子性、一致性、隔离性、持久性
**********************************************
隔离
数据库的隔离性:脏读、不可重复读、幻读、串行化
查看数据库的隔离级别:8.x @@global.transaction_isolation;
5.x
select @@global.tx_isolation, @@tx_isolation;
修改隔离级别
help ISOLATION
Name: 'ISOLATION'
Description:
Syntax:
SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL
{
REPEATABLE READ
| READ COMMITTED
| READ UNCOMMITTED
| SERIALIZABLE
}
**********************************************
对库操作
这个就是最基本的操作了,对数据库(表、字段)的增删改查
查询数据库:show datebases;
创建数据库:create database db_name;
选择数据库:use 数据库名;
退出:exit;
查看所有表:show tables;
创建表:create TABLE biao_name(
字段 类型,
字段 类型,
……
字段 类型);
查表详情:DESC biao_name;(describe)
添加数据:insert INTO biao_name VALUES("","","",……,"");
数据类型:……
删除数据:delete FROM biao_name WHERE 条件;
修改数据:update biao_name SET 字段='' WHERE 条件;
查询数据:select 字段 FROM biao_name WHERE 条 件;
*************************************************
键表约束:
这个就是利用数据库自身的功能,对入库的数据进行检查,如果数据不对则操作失败,但是一般在大项目中尽量减少键表约束,会造成数据库资源问题,一般都是利用代码级别去验证
主键:此字段不能重复,且非空,
1、 CREATE TABLE biao_name(
字段 类型 PRIMARY key,
……);
联合主键里:只要主键值加起来不重复
2、 CREATE TABLE biao_name(
字段1 类型 ,
字段2 类型 ,
……,
PRIMARY KEY(字段1,字段2)
);
自增,辅助与主键使用,实现自增长 ,自动生成
3、CREATE TABLE biao_name(
字段 类型 PRIMARY KEY auto_increment,
……);
后加主键
4、alter TABLE biao_name ADD PRIMARY KEY(字段);
删除主键:
5、alter TABLE biao_name DROP PRIMARY KEY;
修改:
6、alter TABLE biao_name modify 字段 类型 PRIMARY KEY;
-------------------------------
外键:两表,在添加数据时,应先添加主表数据,若主表内无其字段,则报错,如果附表使用了主表数据,主表改数据也无法删除
CREATE TABLE biao_name(
字段1 类型 ,
字段2 类型 ,
……,
FOREIGN KEY (本表字段) REFERENCES 主表名(主表字段)
);
-----------------------------------
唯一:约束字段的值不可以重复
1、 CREATE TABLE biao_name(
字段1 类型 ,
字段2 类型 ,
……,
UNIQUE(字段1,字段2)
);
2、ALTER TABLE biao_name UNIQUE(字段);
3、删除:
alter TABLE biao_name DROP INDEX 字段;
4、修改:
alter TABLE biao_name modify 字段 类型 UNIQUE;
-------------------------------------------
非空:约束字段不能为空
1、 CREATE TABLE biao_name(
字段1 类型 NOT NULL ,
字段2 类型 ,
……
);
--------------------------------------------
默认:如果没有给值,就会使用默认值 CREATE TABLE biao_name(
字段1 类型 DEFAULT 值 ,
字段2 类型 ,
……
);
***********************************************
查表
这就是数据库最重要的查表了,查表其实是最难的,在一堆数据中取出自己想要的,
聚合函数
结果集:fun_name 表示要做的聚合操作,即聚合函数,常用的有
平均值 AVG(结果)
最大 MAX(结果) 最小值(min)。
总和:count(结果)
日期 :年year(日期型结果)
命名 原名 AS 新名
任意一个ANY(结果集)
所有 all(结果集)
去重复 DISTINCT(结果)
求和sum,
GROUP BY 关键字表示要进行分类聚合的字段
WITH ROLLUP 表明是否对分类聚合后的结果进行再汇总
HAVING 关键字表示对分类后的结果在进行条件的过滤
条件:
求区间 1、字段 BETWEEN 最小值 AND 最大值;
2、字段 >最小值 AND 字段>最大值;
定值查询(或) 1、字段 IN(值1,值2,……);<NOT IN() >
2、字段1=值1 OR 字段2=值2;
升序(默认):order by 字段 asc 降序:order by 字段 desc
升降混用:order by 字段 asc,字段 desc;
分组:group BY 字段;
交集 结果1 UNION 结果2; 查询1 UNION 查询2;
****************************************************
多表查询:
1、俩表查值
SELECT t1.a,t2.b FROM t1,t2 WHERE t1.a=t2.a;
2、仨表查询
SELECT t1.a,t2.b,t3.c FROM t1,t2,t3 WHERE t1.a=t2.a AND t2.b=t3.b;
3、左连接:(left join左边的表是要全部显示的)
select id,dep_name from deployee left join department on deployee.dep_id = department.dep_id;
4、右连接:(right join 右边的表要全部显示)
select id,dep_name from department right join deployee on deployee.dep_id = department.dep_id;
*********************************************
子查询:
关键字in,not in,= ,!=,exists,not exists
select * from deployee where deployee.dep_id in (select dep_id from department);
如果子查询只有一条记录,in可以用等号
***************************************
联合
如果要求将两个表的数据按照一定的查询条件查询出来后,将结果合并到一起显示出来,需要使用union和union all关键字来实现。
关键字:union和union all
union 和 union all的主要区别是union all是把结果集直接合并在一起,而union 是将union all后的结果进行一次distinct,去除重复的记录。
例:示例:
将deployee表和department表中的dep_id字段合并后查询出来:
select dep_id from deployee union all select dep_id from department;
里面有重复项,就是将两个表的数据直接加一起,如果使用过 union :
select dep_id from deployee union select dep_id from department;
就完美解決了
***************************************
视图:
视图来自表,视图更改,主图也会更改;
create VIEW myview AS
SELECT * FROM myview WHERE id=4;
存储过程:create PROCEDURE mypro AS
bigin
END
***********************************************
几个例子:
去掉重复:
SELECT distinct username FROM user;
升序:
SELECT * FROM user order by id asc;
显示前几条
SELECT * FROM user order by id asc limit 2;