表连接查询
什么是多表查询
多表查询的作用:
比如:我们想查询孙悟空的名字和他所在的部门的名字,则需要使用多表查询。
如果一条 SQL 语句查询多张表,因为查询结果在多张不同的表中。每张表取 1 列或多列。
多表查询的分类
笛卡尔积现象
如何清除笛卡尔积现象的影响
我们发现不是所有的数据组合都是有用的,只有员工表.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语句 à事务的回滚
事务的隔离级别
事务的四大特性 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 |
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登录。