本帖最后由 黑马11期 于 2018-12-10 14:45 编辑
数据库知识汇总
一,数据库的基本概念 :
1, 数据库的英文单词 : DataBase 简称 : DB
2, 什么是数据库 :
1) 用于存储和管理数据的仓库
3, 数据库的特点 (存储数据,按照一定的规则来做):
1)数据库内容存储到硬盘中,[一直存在]
2)对数据进行增删改查
3)MYSOL(数据库软件)
1)很多数据库 --很多表(TABLE) --很多列(COLUMN) --具体数据
2)列:横着的数据代表一条完整的数据, 竖着的数据代表具体的值
4)DBMS(数据管理系统)
很多数据库--很多列--具体数据
5)持久化存储数据的,其实就是数据库就是一个文件系统
6)方便存储和管理数据(和TXT文本的区别)
7)使用了统一的方式从操作数据库 --SQL
4, 常见的数据库软件 :(数据库只是一个基本概念,软件是对数据库的具体实现)
5, 常用数据库 :Mysql ,oracle ,DB2
二,MySQL数据库软件
1,安装 :参照视频
2,卸载 : 1 ,去mysql的安装目录找到my.ini文件
0,卸载mysql
3 ,删除c:/ProgramData目录
3,Mysql配置 :
1,手动
2,cmd-->services.msc 打开服务窗口
3,cmd使用管理员打开mysql:
*net start mysql :启动mysql服务
*net stop mysql :关闭mysql服务
4,查看状态 :
1) Win+R : services.msc
2) netstat -ano | findStr "3306" 如果开启就会连接成功,如果关闭 就会等待
5,关闭mysql :
1) 以管理员身份运行cmd命令行,然后输入 taskkill/F/PID 6976
(强制关闭)
2) *net stop mysql :关闭mysql服务
3) exit (正常关闭)
4) quit (正常关闭)
6,登录 范式 :设计数据库表的结构,为了让表的设计更合理
*概念 : 设计数据库时,需要遵循的一些规范,必须遵循前面所有范式规则
*分类 :第一范式(1NF) :每一列都是不可分割的原子数据项,
第二范式(2NF) :在1NF的基础上,非码属性必须完全依赖于候选码(在1NF基础上取消非主属性对主码的部分函数依赖)
第三范式(3NF) :在3NF的基础上,非码属性必须完全依赖于候选码
一,第一范式 :
1)存在的问题 :
*存在非常严重的数据冗余(重复)
*数据添加存在问题 : 数据不合法
*删除数据存在问题
二,第二范式 :
1)概念 :
*函数依赖 : A-->B,如果通过A属性(属性组)的值,可以确定唯一B的属性的值,则称B依赖于A
*例如 : 学号 -->姓名 (学号,课程名称) -- > 分数
*完全函数依赖 :A-->B ,如果A是一个属性组 ,则 B属性值得确定需要依赖于A属性组所有的属性值
*例如 :(学号,课程名称) -->分数
*部分函数依赖 :A-->B , 如果A是一个属性组 ,则B属性值得确定只需要依赖于A属性组中某一些值即可
*例如 :(学号,课程名称) -- >姓名
*传递函数依赖 : A-->B,B-->C,如果通过A属性(属性组)的值,可以确定唯一B属性的值,在通过B属性(属性组)的值可以确定唯一C属性的值,则称C传递函数依赖于A
*例如 : 学生-->系名,系名-->系主任
*码 : 如果在一张表中,一个属性或者属性组,被其他所有属性锁完全依赖,则称这个属 性(属性组)为该表的码
*例如 :该表中码为 : (学号,课程名称)
*主属性 : 码属性组中的所有属性
*非主属性 : 除过码属性组的属性
*存在问题 :
* 数据添加存在问题
*删除数据时存在问题
*解决了冗余问题
三,第三范式 :(在2NF的基础上消除传递依赖)
语法 :
*内连接
*做外链接
*右外链接
多表查询 :
*语法和单表查询一样,只是from后多加了几个表,但表和表之间都是有关系的
*笛卡尔积 : (A集合,B集合的乘积)--取A集合和B集合所有的组合情况
*多表查询的用途 : 消除无用的数据(消除无用的笛卡尔积)
*多表查询的分类 :
*内连接查询
*隐式内连接
*显式内连接
*外链接查询
*子查询
一,内连接 :
*隐式内连接 :使用where条件来消除无用的数据
*例如 :
查询所有员工信息和对应的部门信息
select * from empt , dept where empt.'dept_id; - dept.'id'
*引号可写可不写
*如果后面还有条件,就在关联条件后用and连接
*查询员工表的名称 ,性别 和部门名称
select
t1.name,
t1.gender,
t2.name,
from
empt t1,
dept t2
where
t1.'dept_id = t2.'id' ;
*显示内连接 :
*语法 : select 字段列表 from 表名1 /inner/ join 表名2 on 条件
*inner :可以省略不写
*例如 : select * from emp join dept on emp . dept_id = dept.id
*如果还有其他普通条件,在关联条件后加where 条件
二,外链接
*左外链接:select * from emp lift [outer] join dept on emp . dept_id = dept.id
*左外链接查询的是左表所有数据以及其交集
*右外链接:select * from emp right [outer] join dept on emp . dept_id = dept.id
*右外链接查询的是右表所有数据以及交集
和内连接的区别 : 内连接取的是两个表中共有的数据<------>外链接以其中的一张表为主,代表其中一张表多出来的部分和与另外表交集的部分
三,子查询 :查询中嵌套查询,称嵌套的查询为子查询
例如 : 查询工资最高的员工信息
*1,查询最高的工资是多少
select max(salary) from emp;
*2,查询员工信息,并且等于最高的
select * from emp where emp.salary = 9000 ;
使用子查询 : 一条sql语句完成这个操作
*select * from emp where emp.salary = (select max(salary) from emp) ;
子查询不同情况 :
*1,子查询的结果是单行单列的 :
* 子查询可以作为条件,使用运算符去判断
*使用的运算符 : > , < , >= ,<= ,<>
*2,子查询的结果是多行单列的 :
*子查询可以作为条件 ,可以使用运算度in来判断
*3,子查询的结果是多行多列的 :
*如果是多行多列的,那么子查询作为一张虚拟表
*条件 : 一定要保证子查询多行多列的虚拟表必须要提供关联条件
事物的四大特性 :
*原子
*一致
*隔离
*持久
四大隔离级别 :
read uncommitted(效率是最高的,但是问题也是最大的)
*脏读,不可重复读,虚读,幻读
read committed(oracle)
*不可重复读,虚读,幻读
repeatable read(musql)
*虚读,幻读
serializable
*没有问题,但是效率太低
事物的特点 :
*开启事物
*提交事物(把数据更新到数据库中)/回滚事物(将事物过程中所有改变的数据进行还原)
事物的基本介绍:
*1,概念 :
*如果一个包含多个步骤的业务操作,被事物管理那么这些操作要么同时成功,要么同时失败
*例如 :张三给李四转五百元
*分析 :
1,查询张三账户余额是否大于五百
2,张三账户 金额 -500
3,李四账户 金额 +500
--如果没有被事物管理,就有可能到某个步骤出现异常,那么就不会执行下步操作
--如果被事物管理,要么同时成功要么同时失败,如果出现异常就会回滚
*步骤 :
*开启事务 :start transaction
*回滚 : rollback
*提交事物 : commit
提交方式(手动/自动) : 事物一般会关闭自动提交
*MySQL数据库中事物默认自动提交
*一条DML(增删改)事物默认自动提交
*手动提交需要开启事物在提交
*mysql就是自动提交--一条DML语句会自动提交一次事物
*查看提交方式 -- 查看事物的默认提交方式 : @@autommit ,如果是等1代表自动,0代表手动
*修改提交方式 -- set @@autommit = 0 ; 修改成手动提交
*Oracle 数据库默认是手动提交事物的
事物的四大特征
*原子性 : 不可分割的最小操作单位,要么同时成功,要么同时失败
*持久性 : 当事物提交或者回滚后,数据库会持久化的保存数据
*隔离型 : 多个事物之间,相互独立,
*一致性 : 事物操作前后,数据总量不变
事物的隔离级别 :
*概念 : 多个事物之间隔离的,相互独立的,但是如果多个事物,操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题
*存在的问题 :
*1,脏读 : 一个事物读取到另一个事物中没有提交的数据被称为脏读
*2,不可重复读 : 在同一个事物中两次读取到的数据不一样,
*3,幻读 : 一个事物操作(DML)数据表中所有的记录,另一个事物添加了一条数据,则第一个事物查询不到自己的修改.
*隔离级别 :
*read uncommitted :读未提交
*产生的问题 : 脏读 ,不可重复读 ,幻读 ,虚读
*read committed :读以提交
*产生的问题 : 不可重复读 ,幻读
*repeatable read : 可重复复
*产生的问题 :幻读
*serializable :串行化
*可以解决所有的问题,但是效率低
*注意 :隔离级别从小到大,安全性越来越高,但是效率越来越低
DCL ,是由DBA(数据库管理员)
JDBC: 定义了所有关系型数据库的规则(接口)
1)概念 " Java Database Connectivity" Java 数据库连接,Java语言操作数据库
*本质 : 其实就是官方(SUN公司)定义了一套操作所有关系型数据库的规则.即接口.各个数据库厂商去实现这套接口,提供数据库驱动jar包.我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动,jar包中的实现类(驱动)-->面向接口编程(多态)
2)快速入门 :
*步骤 :
*1,导入1驱动jar包
*复制mysql-connector
*2,注册驱动 --> DriverManager
*3,获取数据库连接对象 :Connection
*4,定义sql语句并创建执行sql的对象
*5,获取执行sql语句的对象 Statement <-->PrepareStatement
*6,便利结果,对结果进行操作
*7,释放资源
*导入三方jar包
*在module下创建libs目录
*拷贝jar包到该目录
*右键 jar Add As Libirary
二,各个对象-->Class.forName("com.mysql.jdbc.Driver") 更简洁,只注册一次 *DriverManager :qu驱动管理对象
*1,功能 |
|