表连接查询

什么是多表查询

多表查询的作用:

比如:我们想查询孙悟空的名字和他所在的部门的名字,则需要使用多表查询。
如果一条 SQL 语句查询多张表,因为查询结果在多张不同的表中。每张表取 1 列或多列。

多表查询的分类

image.png

笛卡尔积现象

如何清除笛卡尔积现象的影响


我们发现不是所有的数据组合都是有用的,只有员工表.dept_id = 部门表.id 的数据才是有用的。所以需要通过条件过滤掉没用的数据。

内连接

用左边表的记录去匹配右边表的记录,如果符合条件的则显示。如:从表.外键=主表.主键

隐式内连接

隐式内连接:看不到 JOIN关键字,条件使用 WHERE指定
select from emp,dept where emp.dept_id = dept.id;
— 隐式内连接查询
select
from emp,dept where emp.dept_id = dept.id;

显式内连接

显示内连接:使用 INNERJOIN … ON语句, 可以省略 INNER
select from emp e inner join dept d on e.dept_id = d.id;
— 显示内连接查询,也是会产生笛卡尔积现象,所以也要找他们的等式关系
select
from emp inner join dept;

select from emp inner join dept on emp.dept_id = dept.id where emp.name = ‘孙悟空’;
# 上下两句代码形式上有些区别,但是在结果上没有区别
select
from emp,dept where emp.dept_id = dept.id and emp.name = ‘孙悟空’;

左外连接

左外连接:
使用 LEFT OUTERJOIN … ON,OUTER可以省略
用左边表的记录去匹配右边表的记录,如果符合条件的则显示;否则,显示 NULL
可以理解为:在内连接的基础上保证左表的数据全部显示(左表是部门,右表员工)
— 使用左外连接查询[以左表为主表,右表为从表]
select * from dept d left join emp e on d.id = e.dept_id;

右外连接

右外连接:
使用 RIGHT OUTERJOIN … ON,OUTER可以省略
用右边表的记录去匹配左边表的记录,如果符合条件的则显示;否则,显示 NULL
可以理解为:在内连接的基础上保证右表的数据全部显示
# 右外连接[以右表为主表,左表为从表]
select * from dept d right join emp e on d.id = e.dept_id;

mysql 不支持全链接查询(full join),所以只能使用一个替换方案来达到全连接查询效果(并集查询)
select from dept d right join emp e on d.id = e.dept_id
union
select
from dept d left join emp e on d.id = e.dept_id;

子查询

什么是子查询
子查询的概念:
1) 一个查询的结果做为另一个查询的条件
2) 有查询的嵌套,内部的查询称为子查询
3) 子查询要使用括号

子查询的结果是一个值的时候

子查询结果只要是单行单列,肯定在 WHERE后面作为条件,父查询使用:比较运算符,如:> 、<、<>、= 等
select * from emp where dept_id = (select id from dept where name=’开发部’);

子查询结果是多行单列的时候

子查询结果是单例多行,结果集类似于一个数组,父查询使用 IN运算符
select * from dept where id in
(select distinct dept_id from emp where salary > 5000 and dept_id is not null)

子查询的结果是多行多列

子查询结果只要是多列,肯定在 FROM 后面作为表
子查询作为表需要取别名,否则这张表没有名称则无法访问表中的字段

事务

什么是事务:

在实际的开发过程中,一个业务操作如:转账,往往是要多次访问数据库才能完成的。转账是一个用户扣钱,另一个用户加钱。如果其中有一条 SQL语句出现异常,这条 SQL就可能执行失败。
事务执行是一个整体,所有的 SQL 语句都必须执行成功。如果其中有 1 条SQL 语句出现异常,则所有的SQL 语句都要回滚,整个业务执行失败。

手动提交事务

MYSQL 中可以有两种方式进行事务的操作:
1) 手动提交事务
2) 自动提交事务

手动提交事务的 SQL语句

功能 SQL语句
开启事务 start transaction;
提交事务 commit;
回滚事务 rollback;

手动提交事务使用过程:

1) 执行成功的情况: 开启事务 à执行多条 SQL语句 à成功提交事务
2) 执行失败的情况: 开启事务 à执行多条 SQL语句 à事务的回滚
image.png

事务的隔离级别

事务的四大特性 ACID

事务特性 含义
原子性(Atomicity) 每个事务都是一个整体,不可再拆分,事务中所有的 SQL 语句要么都执行成功,
要么都失败。
一致性(Consistency) 事务在执行前数据库的状态与执行后数据库的状态保持一致。如:转账前2 个人的
总金额是 2000,转账后 2 个人总金额也是 2000
隔离性(Isolation) 事务与事务之间不应该相互影响,执行时保持隔离的状态。
持久性(Durability) 一旦事务执行成功,对数据库的修改是持久的。就算关机,也是保存下来的。

事务的隔离级别

事务在操作时的理想状态: 所有的事务之间保持隔离,互不影响。因为并发操作,多个用户同时访问同一个数据。可能引发并发访问的问题:

并发访问的问题 含义
脏读 一个事务读取到了另一个事务中尚未提交的数据
不可重复读 一个事务中两次读取的数据内容不一致,要求的是一个事务中多次读取时数据是一致的,这
是事务 update 时引发的问题
幻读 一个事务中两次读取的数据的数量不一致,要求在一个事务多次读取的数据的数量是一致
的,这是 insert 或 delete 时引发的问题

MySQL数据库有四种隔离级别

级别 名字 隔离级别 脏读 不可重复读 幻读 数据库默认隔离级别
1 读未提交 read uncommitted
2 读已提交 read committed Oracle 和 SQL Server



3




可重复读



repeatable read












MySQL
image.png
4 串行化 serializable

隔离级别越高,性能越差,安全性越高。

MySQL——修改root密码的4种方法(以windows为例)
方法1: 用SET PASSWORD命令
首先登录MySQL。
格式:mysql> set password for 用户名@localhost = password(‘新密码’);
例子:mysql> set password for root@localhost = password(‘123’);

方法2:用mysqladmin
格式:mysqladmin -u用户名 -p旧密码 password 新密码
例子:mysqladmin -uroot -p123456 password 123

方法3:用UPDATE直接编辑user表
首先登录MySQL。
mysql> use mysql;
mysql> update user set password=password(‘123’) where user=’root’ and host=’localhost’;
mysql> flush privileges;

方法4:在忘记root密码的时候,可以这样
以windows为例:
1. 关闭正在运行的MySQL服务。
2. 打开DOS窗口,转到mysql\bin目录。
3. 输入mysqld —skip-grant-tables 回车。—skip-grant-tables 的意思是启动MySQL服务的时候跳过权限表认证。
4. 再开一个DOS窗口(因为刚才那个DOS窗口已经不能动了),转到mysql\bin目录。
5. 输入mysql回车,如果成功,将出现MySQL提示符 >。
6. 连接权限数据库: use mysql; 。
6. 改密码:update user set password=password(“123”) where user=”root”;(别忘了最后加分号) 。
7. 刷新权限(必须步骤):flush privileges; 。
8. 退出 quit。
9. 注销系统,再进入,使用用户名root和刚才设置的新密码123登录。