二、数据库

配合随堂笔记一起查看,不懂重新来过。
在这里插入图片描述
数据类型中:
varchar和char区别
varchar长度是可变地,char是固定的。比如,varchar(10)的value是"abc",那么varchar长度是3;char(10)的value是“abc”,那么长度还是10。
英文是占有1个字节;中文是2个字节。
1- truncasr table :先删除表,再创建个空表

2-select from 表明 order by 列名1​ asc ,列名2 asc:
先执行最第一个排序命令,如果前面的属性有一样的时候,再执行第二个
3-​count*主要有一行不是为空,都算null
count count(ifnull 列名,0)把那个列名为null值改为0
用count计算非空列(主建)
4-分组的查询语句中,只能出现被分组的字段(列名)和聚合函数

5-where和having区别。前者是对分组前进行筛选,满足才参与分组;后者是对分组后的结果进行筛选。
where后面不能跟聚合函数判断,having可以。
而且having可以使用查询聚合函数命令的别名来简化代码。
select sex,count(id),avg(math) 人数 from student where math >70 group by sex having 人数>=2

6-limit 从哪开始显示,每页显条数 --第1页
其中,"从哪开始显示"=(当时页数-1)×每页显示条数

7-对于非空约束,一般分2种方式来添加:
one.创建表的时候,加非空约束
two.创建完表再用alter修改约束

8-唯一约束不能使用alter modify来删除(添加可以),要使用alter …drop index 列名

9-主键=非空+唯一。删除主键:alter table 表名 drop primary key

自动增长

在这里插入图片描述
自动增长是什么?
答:如果某一列是数值类型的,使用auto_increment 可以来完成值得自动增长
注意:当设置了自动增长,我insert inito value时是可以设置null的,但是设置null不是null,而是根据表的列中最后一位进行自动增长。
为什么用自动增长?
答:一般id是连续的数值,如果没有设置,自己要一个一个地加,那是不是很麻烦?

外键

在这里插入图片描述
在这里插入图片描述
“主表名称”一般为主键。
(外键)级联操作:

什么是级联?
用来设计“一对多”关系。多要关联一,一什么它们就是什么。
为什么要设置关联?
比如:有1张员工表(姓名、年龄、部门),另一张表部门表(部门ID)
如果员工表没有设置级联操作,那么它设置“部门”的时候,要一个一个打自己打。那表中数据多了,是不是很蛋疼?所以,当我设置了级联操作之后,“员工表”中的“部门”关联了“部门表中“的”部门ID”,”员工表“中的”部门“就自动填补了关联的数据。

如图,不使用级联的情况。先把dep_id设置为空(它 是表中外键,里面的值除非是关联表中的主键值or NULL,其他值不行。)

在这里插入图片描述

怎么设置联动操作?
在设置外键的时候设置,如图

在这里插入图片描述
级联更新
当设置了级联更新的时候,如果主键的值修改了,那么外键的值也对应修改。

级联删除 —【谨慎】
当设置了级联删除,如果主键的值删除了,那么对应的外键的信息全部删除。

多表关系

在这里插入图片描述
一对多
在这里插入图片描述
多对多
在这里插入图片描述
一对一
在这里插入图片描述
一对一关系的表很少很少这样,如果有我们为什么不把它拼在一起。
在这里插入图片描述
案列
主要是:

  • 知道【实体】就是一个表
  • 找到表与表之间的关系(一对一,一对多,多对多)

在这里插入图片描述
中间件的联合主键
在这里插入图片描述
在这里插入图片描述

三大范式

在这里插入图片描述
第一范式:要求每一组数据要有独立的列名。(原子:不可分割)
第二范式:在第一范式的基础上消除非主属性对码的部分依赖。
第三范式:在第二范式的基础上小出传递依赖。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

数据库备份与恢复

在这里插入图片描述

多表查询

笛卡儿积
在这里插入图片描述
A与B的笛卡儿积的表列数=A表列书*B表列数
使用笛卡儿积,会存在无用的数据,所以下面要进行消除无用的数据。

内连接

  • 隐式内连接:

语句:
select * from 表1,表2 where 表1.字段 = 表2.字段
常用格式:
select
别名.列名表, ----注释这是什么东东
from 表1 as 别名 ,表2 as 别名
where
别名1.字段 = 别名2.字段

  • 显示内连接:

select 字段名 from 表1 [inner] join 表2 on 表1.字段 = 表2.字段

  • 注意:
    1、从哪2个表中查询
    2、连接条件式是什么?(等值连接)
    3、查询哪些字段?(一般不会全部列属性都查询)

在这里插入图片描述
左外连接

查询的是左表已存在数据和右边合并的数据(左表数据全部保留),如果右表没有匹配的数据就显示null或者直接忽视掉。(左表向右表寻找匹配并且合并,如果没有匹配到就显示空值)

在这里插入图片描述
有外连接

查询的是右表已存在数据和左边合并的数据(右表数据全部保留),如果右表没有匹配的数据就显示null或者直接忽视掉。(左表向右表寻找匹配并且合并,如果没有匹配到就显示空值)
在这里插入图片描述

子查询

子查询概述
在这里插入图片描述
使用子查询的几种情况

所谓的子查询结果,就是使用select后查询的表是单行单列,还是咋地。

  1. 子查询的结果是单行单列:

子查询可以作为条件,使用运算符去判断。(>,<,<=,<>…)

  1. 子查询的结果是多行单列

子查询可以作为条件,使用运算符in来判断

在这里插入图片描述
4. 子查询的结果是多行多列

子查询可以作为一张虚拟表参与查询

在这里插入图片描述

多表查询的注意事项:

  • 先找需要查询的字段是在哪些表中,多个表用内连接
2.查询员工编号,员工姓名,工资,职务名称,职务描述,部门名称,部门位置
			
				分析:
					1. 员工编号,员工姓名,工资 emp  职务名称,职务描述 job  部门名称,部门位置 dept
					2. 条件: emp.job_id = job.id and emp.dept_id = dept.id
			*/
			
			SELECT 
				t1.`id`, -- 员工编号
				t1.`ename`, -- 员工姓名
				t1.`salary`,-- 工资
				t2.`jname`, -- 职务名称
				t2.`description`, -- 职务描述
				t3.`dname`, -- 部门名称
				t3.`loc` -- 部门位置
			FROM 
				emp t1, job t2,dept t3
			WHERE 
				t1.`job_id` = t2.`id` AND t1.`dept_id` = t3.`id`;

多表查询练习

2个没有关联的表
当2个表没有关联的时候(主键与外键连接),条件不能够是等值连接

-- 3.查询员工姓名,工资,工资等级
	分析:
	1.员工姓名,工资 emp  工资等级 salarygrade
	2.条件 emp.salary >= salarygrade.losalary and emp.salary <= salarygrade.hisalary
	【emp.salary的值在salarygrade.losalary之间】

4个表查询

-- 4.查询员工姓名,工资,职务名称,职务描述,部门名称,部门位置,工资等级

	分析:
		1. 员工姓名,工资 emp , 职务名称,职务描述 job 部门名称,部门位置,dept  工资等级 salarygrade
		2. 条件: emp.job_id = job.id and emp.dept_id = dept.id and emp.salary BETWEEN salarygrade.losalary and salarygrade.hisalary
		【4个表4个条件】
-------------------------------------------------------------
	

在这里插入图片描述
子查询(虚拟表)+分组

-- 5.查询出部门编号、部门名称、部门位置、部门人数

				分析:
					1.部门编号、部门名称、部门位置 dept 表。 部门人数 emp表
					2.使用分组查询。按照emp.dept_id完成分组,查询count(id)
					3.使用子查询将第2步的查询结果和dept表进行关联查询
					
			*/
			SELECT 
				t1.`id`,t1.`dname`,t1.`loc` , t2.total
			FROM 
				dept t1,(SELECT dept_id,COUNT(id) total FROM emp GROUP BY dept_id) t2
			WHERE t1.`id` = t2.dept_id;

表的自关联映射关系
把一个表使用不同别名当成2个表。

-- 6.查询所有员工的姓名及其直接上级的姓名,没有领导的员工也需要查询
			

				分析:
					1.姓名 emp, 直接上级的姓名 emp
						* emp表的id 和 mgr 是自关联
					2.条件 emp.id = emp.mgr
					3.查询左表的所有数据,和 交集数据
						* 使用左外连接查询
				
			*/
			/*
			select
				t1.ename,
				t1.mgr,
				t2.`id`,
				t2.ename
			from emp t1, emp t2
			where t1.mgr = t2.`id`;
			
			*/
			
			SELECT 
				t1.ename,
				t1.mgr,
				t2.`id`,
				t2.`ename`
			FROM emp t1
			LEFT JOIN emp t2
			ON t1.`mgr` = t2.`id`;

新理解:左外连接就是,左边表的部份要保持完整。

事务管理

  1. 事务的基本介绍
    1. 概念:

      • 如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。
    2. 操作:

      1. 开启事务: start transaction; 【转账之前】
      2. 回滚:rollback; 【出现了问题之后,重新恢复到“开启事务”之前】
      3. 提交:commit; 【没有出现异常,那么就把事务管理后的数据上交】

案列简介:

张三给李四转账:

  1. 张三账户扣500
  2. 李四账户加三百

如果在张三李四的转账之间出现错误,那么可能导致张三账户扣了500,李四钱没到账。开启了事务管理之后,张三李四转账过程,不再看成2部分,看成一个整体,如果有出错,就在出错之后,设置回滚,数据就回到开启事务之前;如果没有出现错误,那么就提交数据才真真改变。


默认提交和自动提交

* 事务提交的两种方式:
			* 自动提交:
				* mysql就是自动提交的
				* 一条DML(增删改)语句会自动提交一次事务。
			* 手动提交:
				* Oracle 数据库默认是手动提交事务
				* 需要先开启事务,再提交
		* 修改事务的默认提交方式:
			* 查看事务的默认提交方式:SELECT @@autocommit; -- 1 代表自动提交  0 代表手动提交
			* 修改默认提交方式: set @@autocommit = 0;

开启事务就相当于使用手动的提交事务。 也就是说,要commit提交

注意的是:

  • Oracle是默认手动提交事务的
  • 手动提交事务一定要commit才会生效【增删改等操作】,没提交数据都是临时的。

事务的四大特征:

在这里插入图片描述
其中,隔离性是事务之间相互独立的,但实际上是会互相影响的,所以我们要了解一下事务隔离级别。

隔离级别简介

MySQL不会出现幻读
在这里插入图片描述
案列设置:
打开2个数据库:1个是张三转账,1个是李四查账
脏读:
李四向张三借500,张三用脏读的方式借给李四,即开启事务进行转账操作,但是没有提交;然后,他叫李四去另外的数据库查看余额。李四看了余额觉都没问题就写了欠条。张三拿到借条后,又在那个没有提交的事务管理上使用回滚,把钱恢复到开启事务之前,结果李四钱没借着,反而还要还张三500。
-----------------提交和回滚可以看作某个事务管理的结束操作

出现脏读的时候,也会出现不可重复读的问题:(重复读不一样的数据)
比如,
张三在转账操作后的时候(没提交),李四查账是符合结果意愿的,即数据合理。
张三又把转账操作进行回滚,转账事务管理操作结束,李四查账的数据变动了,变得不合理。
而,李四在同一个事务操作的过程种,读取到了2次不同的数据。


可重复读

可重复读是解决不可重复的。
具体操作过程:
张三李四分别2个数据库运行并开启事务管理,张三进行了转账操作,而且没有提交;这时的李四不再是以前的李四了,查询余额,钱还在,大家都没变;张三,发现没得逞就提交算了,李四再次查询余额,钱还是没变。李四在一次事务中又2次读取余额是一样的(可重复),当李四提交事务管理后,转账才真真生效。


串行化
意思:当数据库设置了串行化的时候,一个数据库在开启事务进行操作的时候,其他数据库不能对该数据库进行操作、查询,其他数据库都被锁起来了,除了正在操作的数据库提交事务。

管理用户

在这里插入图片描述
一般管理用户不要在视图表中直接搞,要用语法。
主机名:
localhost:是指当前本地主机
% :是指所有主机,本地和远程


修改密码以及管理员root密码忘记的解决方案
在这里插入图片描述
授予权限

发布了65 篇原创文章 · 获赞 1 · 访问量 1482

猜你喜欢

转载自blog.csdn.net/weixin_45097731/article/details/104488512