数据库知识点笔记整理

JVM

JVM:Java Virtual Machine Java虚拟机

JDBC

JDBC Java Database Connectivity

三层架构

UI (User Interface)表现层; BLL(Business Logic Layer)业务逻辑层;
DAL(Data Access Layer) 数据访问层; Model 实体类库

Database

简单SQL语句 ObjectOutPutStream–>java 对象(张三 20 …)–>序列化到文件当中
使用–》反序列化
new Java对象
readObject()
writeObject()

常见数据库管理系统(DBMS)

  1. IBM–>eclipse–>idea
  2. Oracle甲骨文(收购SUN) 做数据库起家
  3. Oracle收购MySQL(AB公司)
    Oracle(性能好) MySQL(轻量级 免费) DB2 Sybase MS SqSever

MySQL

DB:(database 数据库:实际上在硬盘上以文件的形式存在)
SQL:结构化查询语言 是一门标准通用的语言。标准的额SQL适用于所有的数据库产品 属于高语言
DBMS负责执行SQL语句 通过执行SQL语句操作DB中的数据。

表 table

行:数据/记录(data) 列:字段(column)
表table:是数据库的基本组成单元 所有的数据都以表格的形式组织,非常直观

1. 每一个字段应该包括哪些属性

字段名 数据类型(eg.int varchar) 相关的约束(eg.非空)

2. 通用SQL语句
增删改查
2.1 DQL:(数据查询语言)查询语句            		select
2.2 DML:(数据操作语言)增删改               		insert delete update,
2.3 DDL:(数据定义语言)对**表结构**的增删改 		create drop alter
2.4 TCL:(事务(transaction)控制语言)commit 提交事务   	rollback 回滚事务
2.5 DCL:(数据控制语言):grant授权 revoke撤销权限操作   	root超管-->创建其他用户
3. 导入数据(针对MySQL)
3.1 登录(cmd->  mysql -uroot -p)
3.2 查看有哪些数据库(show database)
3.3 创建新数据库(create database xxxxx)
3.4 使用(use xxxxx)
3.5 查看当前数据库中的表格(show tables)
3.6 初始化数据(source +该数据库文件(SQL脚本)所在路径) __source命令__
3.7 查看表的结构(desc 表中的结构)
3.8 查看当前数据库(xxxxx)中a表的数据: select * from a
3.9 常用命令
3.10 查看创建表的语句 show create table emp
3.11 简单的查询语句(DQL) 
 **select 字段名1,字段名2,字段名3,...from表名;**
提示:任何一条SQL语句以“;”结尾
      SQL语句不区分大小写
	 字段可以参与数学运算 汉字用单引号括起来'年薪'
	 select empno,ename,sal*12 as yearal from emp;
3.12条件查询 .... where+条件
注: between and 是闭区间(数值)  左闭右开(字符) 左小右大
    在数据库中NULL不是一个值,代表什么也没有 为空,空不是一个值,不能等号来衡量 
    (用is)-->is NULL 
    注意优先级 记得加小括号
    in等同于or:找出工作岗位是Manager和Salesman的员工:
	select ename,job from emp where job in('salesman','manager');		
	select ename,job from emp where job='salesman' or job='manager';
    not in 不在这几个值里的
3.13模糊查询 like (必须掌握两个特殊符号 %:代表任意多个字符 _:代表任意一个字符)
转义加斜杠
3.14查询后排序 ...order by xxx(默认升序 从小到大)   后加 asc升序   desc降序

总结

select 
			字段              	3
		from                   
			表名              	1
		where
			条件              	2
		orderby
			...			4order by最后执行)
3.15分组函数
count 计数
sum 求和
avg 平均值 
max 最大值
min 最小值

注意:where后面不能跟分组函数

3.16 group by和having
group by:按照某个字段或者某些字段进行分组(任何一个分组函数都是在group by语句执行结束之后执行的)
having:having是对分组之后的数据进行再次过滤

3.17 总结一个完整的DQL语句
☆☆☆

select	 
	...			5.将数据提出
from
	...			1.找表
where
	...         		2.找列
group by
	...			3.列中对各字段进行分组
havng
	...			4.再次过滤
order by
	...         		6.将提出的数据重新排列...输出
		

查询结果集的去重 select distinct…(后面所有字段联合起来去重)

4. 连接查询
冗余问题-->关系型数据库
4.1连接查询的分类
语法出现的年代来划分:
SQL92(一些老的DBA)
SQL99
根据表的连接方式来划分:
	内连接
		等值连接
		非等值连接
		自连接
	外连接
		左(外)连接
		右(外)链接
	全连接(很少用)

4.2笛卡尔积现象
当两张表进行连接查询的时候,没有条件限制下,最终的查询结果条数是两张表记录条数的乘积
避免该现象:加条件过滤              
表的别名:select e.ename,d.dname from emp e,dept d;(执行效率高 可读性好)

4.3 内连接之等值连接
最大特点:条件上等量关系
select 					语法:
	e.ename,d.dname			...
from 						A表 
	emp e				join
(inner) join					B表
	dept d				on
on 						连接条件
	e.deptno=d.deptno;		where
						...
						
4.4 内连接之非等值连接,最大的特点是,连接条件中的关系是非等量关系

4.5 自连接 最大的特点是:一张表看成两张表,自己连自己
select 
	a.ename,b.ename
from
	emp a
join 
	emp b
on 	
	a.mgr=b.empno;
4.6 外连接 (两张表中一张表是主表另一张是附副表 主要查询主表中的数据 稍带着查询副表,当副表中的数据没有和主表中的数据匹配上,副表自动模拟出NULL与之匹配)
左外连接(左边是主表)
右外连接(右边是主表)
左连接有右连接的写法 右连接也有左连接的写法

示例
内连接:

select
	a.ename '员工',b.ename '领导'
from
	emp a
join
	emp b
on
	a.mgr=b.empno;
	

外连接:

select
	a.ename '员工',b.ename '领导'
from 
	emp a
left join
	emp b
on
	a.mgr=b.empno;

(NULL也可匹配上 left表示左外连接 a是主表 如果把left换成right 则b是主表) 也可以这么记:上左下右
外连接最重要的特点是:主表的数据无条件的全部查询出来

4.7 全连接(基本不用)

4.8 三张表怎么连接

...
	A 
join
	B
join
	C
on
...

5. 子查询
5.1 子查询:select语句中嵌套select语句,被嵌套的select语句是子查询
子查询可以出现在哪里?
select
	..(select)
from
	..(select)
where
	..(select)
	
5.2 where子句中使用子查询
案例:找出高于平均薪资的员工信息。
第一步:找出平均薪资
select avg(sal) from emp;       //得出结果2073
第二部:where过滤
select * from emp where sal>2073;

第一步与第二步合并:
select * from emp where sal>(select avg(sal) from emp);

5.3 from后面嵌套子查询(重要)
规则:from后面跟的是一张表 所以用()里面加select语句构成一张临时的新表

5.4 select后面嵌套子查询
6. union的用法(可以将查询结果集相加)
7. limit(重中之重,分页查询全靠它)
7.1 limit是MySQL特有的 其他数据库中没有(Oracle中有一个相同的机制叫做rownum)
7.2 limit取结果集中的部分数据
7.3 limit语法机制
	limit startIndex,length
	startIndex 表示起始位置
	length 表示取几个
案例:取出工资排名前五名的员工
select ename,sal from emp order by sal desc limit 0,5;

7.4 limit是sql中最后一个执行的环节
7.5 案例:取出工资排名在第四到第九的员工
select ename,sal from emp order by sal desc limit 3,6;

7.6 通用标准 分页SQL
每页显示pagesize条记录:
第pageno页:(pageNo - 1)*pagesize,pagesize

So: java 代码

{
	int pageNo = 2;
	int pageSize = 10;
}
8. 表的创建
建表语句的语法格式:
create table 表名
{
	字段名1 数据类型;
	字段名2 数据类型;
	字段名3 数据类型;
}
关于数据类型:(只说常见的)(括号中为对应Java中的)
int 		整数型(int)
bigint		长整型(long)
float		浮点型(float  double)	
char		定长字符串(String)
varchar		不定长字符串(动态) (StringBUffer StringBuilder最多255)
date		日期类型(对应Java中的 Java.sql.date类型)
BLOB		二进制大对象(存储图片 视频等流媒体信息Object)Binary Large Object
CLOB		字符大对象(存储较大的文本 比如 可以存储4G的字符串)character Large OBject
8.1 	char和varchar如何选择?
	char通常用于定长
	varchar通常用于不定长
8.2 BLOB和CLOB类型的使用?
案例:
电影表:t_movie

id(int) name(varchar) playtime(date/char) poster(BLOB)	detail(CLOB)
------------------------------------------------------------------------------------
1	spiderman
2
3
insert ...
注:表名在数据库当中一般建议以:t_ 或者tbl_ 开始

建表

create table t_student{
	no bigint,
	name varchar(255),
	sex char(1) default 1,(default 1 表示默认值是1)
	classno varchar(255),
	birth char(10)
};
8.3 表中插入数据
语法格式:
	insert into 表名(字段名1,字段名2,字段名3,...)values(值1,值2,值3,..)
要求:字段的数量和值的数量相同,并且数据类型要对应相同。

8.4 表的删除
drop table if exists t_student;//当这个表存在的话删除6

8.5 表的复制
create table emp1 as select * from emp;//全部复制
create table emp2 as select empno,ename from emp;//部分复制
语法:
	create table 表名 as select语句;
将查询结果当做表创建出来。

8.6 将查询结果插入到一张表中
语法:
	insert into 表名 + select语句

8.7 修改表中的数据
语法格式:
	update 表名 set 字段名1=值1,字段名2=值2,,... where 条件;
注:没有条件表示全部更新

8.8 删除表中数据
语法格式:
	delete from 表名 where 条件;

如何删除大表中的数据?(重点)
delete可回滚 但是效率较低(删亿级数据会很慢)
truncate table 表名;(表被截断,不可回滚,永久丢失)

8.9 表结构的修改
(实用工具完成即可)
9. 约束(constraint)
非空约束(保证数据的合法性 有效性 合理性)
常见的约束:
	非空约束(not null)                           1364错:插入没有赋值
	唯一约束(unique)
	主键约束(primary key):约束的字段既不能为NULL  又不能重复(简称pk)
	外键约束(foreign key):				     (简称fk)
	检查约束(check)              注:Oracle数据库有该约束,MySQL没有;

9.1 唯一性约束(unique)
不能重复,但可以为null
 xxxxxxxxxxx unique;                                      //列级约束
注:两个字段联合起来的重复情况:unique(字段1,字段2);          //表级约束
111 zs
222 zs
 111 cs     //允许发生,因为联合唯一
注:not null 只有列级约束 没有表级约束

 9.2 主键约束
主键既不能为空也不能重复;
**表的设计三范式中有要求,第一范式就要求任何一张表都应该有主键**
 -主键的作用:是一行记录的唯一标识
 -案例:
 drop table if exits t_user;
 create table t_user(
	id int primary key,       //列级约束
	username varchar(255),
	email varchar(255)
 );
 insert into t_user(id,username,mail) values(1,'zs','[email protected]');
 insert into t_user(id,username,mail) values(2,'ls','[email protected]');
 insert into t_user(id,username,mail) values(3,'ww','[email protected]');
 select * from t_user;
 -主键相关的术语:
主键约束:primary key
主键字段:id
主键值:1

 -主键的分类:
根据主键字段的数量来划分:
	单一主键(推荐 常用)
	复合主键(多个字段联合起来添加一个主键约束)(不建议使用 违背三范式(产生部分依赖))
根据主键的性质来划分:
	自然主键(推荐)                                                                     
	业务主键(主键值和系统的业务挂钩:比如银行卡的卡号 身份证的号码)(不推荐使用)	
注:最好不要拿着和业务挂钩的字段做主键,因为一旦以后业务发生变化之后,主键值也有可能随之发生变化
注:一张表的主键约束只能有一个!!主键值最好是一个和业务没有关系的自然数
-MySQL提供的主键自增(重要)
 案例:
	id int primary key auto_increment,
 提示:
	oracle中也提供了一个自增机制,叫做:序列(sequence)
	
9.3外键约束
 -关于外键约束的相关术语:
	外键约束:foreign key
	外键字段
	外键值	
注:
	1.外键值可以为NULL吗?
	可以。
	2.外键字段2引用其他表的某个字段的时候,被引用的字段必须是主键吗?
	被引用的字段不一定是主键,但至少具有unique约束。
-业务背景:
请设计数据库表,用来维护学生和班级的信息
第一种方案:一张表存储所有数据:

no          name          classno        classname 
---------------------------------------------------------------
1            srz             102            njau162
2            lzx             102            njau162	 
3            ljn             101            njau161
缺点:冗余

☆ 第二种方案(推荐):两张表(班级表和学生表)
t_class班级表 ->父表
cno(pk) cname
-----------------
101 njau161
102 njau162

t_student学生表                                  ->子表
no(pk)         name          classno(该字段添加外键约束fk)
----------------------------------------------------
1              srz            102
2              lzx            102
3              ljn            101

-将方案二中的建表语句写出来:
t_ student中的classno字段引用 t_ class表中的cno字段,此时 t_ student表叫做子表,t_ class表叫做父表
需要注意的是,在删表的时候先子再父
创建表的时候先父再子
同样,删除数据的时候先子再父
添加数据的时候先父再子

create table t_class(
	cno int primary key,
	cname varchar(255)
);

create table t_student(
	sno int,
	sname varchar(255),
	classno int,
	foreign key(classno) references t_class(cno)
);

insert into t_class values(101,'njau161');
insert into t_class values(102,'njau162');
insert into t_student values(1,'srz',102);
insert into t_student values(2,'lzx',102);
insert into t_student values(3,'ljn',101);
10. 存储引擎(了解)
描述表的存储方式 例如:ENGINE InnoDB
-常见的存储引擎
1 存储引擎只在MySQL中存在(Oracle中有对应点的机制,但不叫存储引擎。叫 存储方式)
2 MySQL支持很多存储引擎,每一个存储引擎都对应了一种不同的存储方式每一个存储引擎都有自己的优缺点,要因地制宜
3 常见的存储引擎
3.1 MyISAM  (不支持transactions(事务) 是MySQL最常用的存储引擎)
	使用三个文件来表示每一个表:
	·格式文件--存储表结构的定义(mytable.frm)
	·数据文件--存储表行的内容(mytable.MYD)
	·索引文件--存储表上索引(mytable.MYI)
	优点:可被压缩 节省空间 而且可以转换为只读表 提高检索效率
	缺点:不支持事务
3.2 InnoDB   (MySQL默认的存储引擎)
	·表的结构存储在xxx.frm中
	·表的数据存储在tablespace这样的表空间中(逻辑概念 无法被压缩)
	优点:支持事务,行级锁,外键 /这种存储引擎最安全,数据的安全 /在数据库崩溃之后提供自动恢复机制 /级联更新,级联删除
	缺点:因为内容存储于tablespace表空间 所以无法被压缩
3.3 MEMORY   (以前叫HEPA引擎)
	缺点:不支持事务。数据容易丢失,因为数据和索引都存储在内存当中
	优点:查询速度最快 不能包含TEXT BLOB字段
	
(练习)1.取得每个部门最高薪水的人员名称
第一步:取得每个部门的最高薪水
select deptno,max(sal) as maxsal from emp group by deptno;
第二步 将以上结果当做临时表t,t表和emp e表进行连接,条件是:t.deptno=e.deptno and t.maxsal=e.sal
select 
	e.ename,t.*
from
	(select deptno,max(sal) as maxsal from emp group by deptno)t
join
	emp e
on
	t.deptno=e.deptno and t.maxsal=e.sal;
11. 事务transaction(重要)
一个事务是一个完整的业务逻辑单元 不可再分
-比如:
	银行转账
	update t_act set balance=blance-10000 where actno='act-001';
	update t_act set balance=blance+10000 where actno='act-002';	
必须同时发生!不能一条成功一条失败
所以需要‘事务’机制
-和事务相关的语句只有:DML语句(insert delete update)
因为他们三个语句都是和数据库表当中的数据相关的。
事务的存在是为了保证数据的完整性 安全性

11.1 事务的原理
流程:
开启事务机制(开始)
执行多条语句(此时的执行结果只保存记录一下历史操作,不会真正修改硬盘上的数据)
提交事务或者回滚事务(结束)   (提交事务commit:历史缓存中清空,将修改数据存入硬盘中;回滚事务rollback:历史中的缓存清空)
DQL
DML
DDL
TCL(事务:commit rollback  savepoint(保存点))
DCL(授权)

11.2 事务的特性
-事务的四大特性:ACID
A:原子性  事务是最小的工作单元 不可再分
C:一致性  事务必须保证多条DML语句同时成功或者同时失败
I:隔离性  事务A与事务B之间具有隔离
D:持久性  持久性说的是最终数据必须持久化到硬盘文件中,事务才算成功的结束

11.3 事务的隔离性
存在隔离级别 理论上隔离级别包括4个:
第一级别:读未提交(read uncommitted)
	 对方事务未提交 我们当前事务可以读取到对方未提交的数据
	 读未提交存在脏读(Dirty Read)现象:表示读到了脏的数据
第二级别:读已提交(read committed)
	 对方提交之后的数据我方可以读取到
	 这种隔离级别解决了脏读现象
	 读已提交存在的问题是:不可重复读
第三级别:可重复读(repeatable read)
	 这种隔离级别解决了:不可重复读的问题。
	 这种隔离级别存在的问题是:读取到的数据是幻象
第四级别:序列化读/串行化读
	 解决了所有问题
	 效率低 需要事务排队

注:
Oracle数据库默认的隔离级别是:读已提交
MySQL数据库默认的隔离级别是:可重复

11.4 演示事务
-MySQL事务默认情况下是自动提交的(只要执行任意一套DML语句则提交一次)
-如何关闭自动提交?  start transaction;
               		 ....
		   commit;
12. 索引
12.1 概念
相当于一本书的目录
-示例:
	select ename,sal from emp where ename = 'SMITH';
当ename字段上没有添加索引的时候 以上SQL语句会进行全表扫描,扫描ename字段中所有的值

12.2 怎么创建索引对象 怎么删除索引对象
创建索引对象:
	create index 索引名称 on 表名(字段名);
删除索引对象:
	drop index 索引名称;

12.3 什么时候考虑给字段添加索引(满足什么条件)
数据量庞大          	(根据客户的需求)
该字段很少的DML操作 	(因为字段进行修改操作 索引也需要维护)
该字段经常出现在where语句中(经常根据哪个字段查询)

12.4 注意! 主键和具有unique约束的字段自动会添加索引
	    根据主键查询效率较高,尽量根据主键检索

12.5 索引底层采用的数据结构是 B+ Tree

12.6 索引的实现原理
创建索引/ 排序/ B+ Tree/ 找物理地址

12.7 索引的分类
	单一索引 给单个字段添加索引
	复合索引 给多个字段联合起来添加索引
	主键索引	主键上会自动添加索引
	唯一索引 有unique约束的字段上会自动添加索引

12.8 索引什么时候失效
	select ename from emp where ename like '%A%';
	模糊查询的时候 第一个通配符使用的是%,这个时候索引是失效的
13. 视图(view)
13.1 什么是视图
	站在不同的角度去看到数据(同一张表的数据通过不同的角度去看待)
13.2 如何创建视图 如何删除视图
	create view myview as select empno,ename from emp;
	drop view myview;
注意:只有DQL语句才能以视图对象的方式创建出来。

13.3 对视图进行曾删改查会影响到原表数据(通过视图影响原表数据的 不是直接操控原表)
     可以对视图进行CRUD操作

13.4 面向视图操作

13.5 视图的作用
	视图可以隐藏表的实现细节 保密级别较高的系统,数据库只对外提供相关的视图 
	Java程序员只对视图对象进行CRUD
14. DBA命令
14.1 导入导出
导出:mysqldump xxxxxxxx>路径 xxxx.sql  -u root -p 333
导入:create database xxxxxx;
     use xxxxxx;
     source 路径xxxxx.sql;
15. 数据库设计三范式(重点内容 面试经常问)
15.1 什么是设计范式
依照表的依据,按照三范式设计的表不会出现数据冗余。
15.2 三范式都是哪些?
第一范式: 任何一张表都有主键,且每一个字段原子性不可再分。
第二范式: 建立在第一范式的基础之上,所有非主键字段完全依赖主键,不能产生部分依赖
    多对多?三张表,关系表两个外键。
-案例:
	t_student 学生表
	sno(pk)    sname
	----------------
	  1         张三
	  2         李四
	  3         王五
	  
	t_teacher 讲师表
	tno(pk)    tname
	----------------
	  1        王老师
	  2        张老师 
	  3        李老师
	  
	t_student_teacher_relation 学生讲师关系表
	----------------------------------------
	id(pk)      sno(fk)       tno(fk)
	  1          1             3
	  2			 1             1
	  3          2             2
	  4          2             3
	  5          3             1
	  6          3             3
	  
第三范式:建立在第二范式之上,所有非主键字段直接依赖主键字段。(不能产生传递依赖)
一对多?两张表 多的表加外键
班级t_class
cno(pk)         cname
----------------------
1                 a 
2                 b

学生t_student
sno(pk)         sname         classno(fk)
-----------------------------------------
101              张1             1
102              张2             1
103              张3             2
104              张4             2
105              张5             2

总结
一范:必须有主键
二范:不能产生部分依赖
三范:不能产生传递依赖
都是为了解决数据冗余

提醒:在实际开发中,以满足客户的需求为主,有的时候会拿冗余换执行速度

16. 表的设计经典设计方案
一对一如何设计?
一对一设计有两种方案:

  1. 主键共享
t_user_login 用户登录表
 id(pk)        username          password
 -----------------------------------------
   1              zs               123
   2	          ls               456

t_user_detail 用户详细信息表
 id(pk+fk)     realname            tel
----------------------------------------
            	 张三             111111
		 李四             534564
			 
2. 外键唯一			 
t_user_login 用户登录表
 id(pk)        username          password
 -----------------------------------------
 1              zs               123
 2	        ls               456

t_user_detail 用户详细信息表
 id(pk)     realname       tel        userid(fk+unique)
--------------------------------------------------------
1         张三            111111              2
2	  李四            534564	              1 

你可能感兴趣的:(数据库知识点笔记整理)