mysql多表查询与事务的操作

  • 1、表连接查询
  • 1.1多表查询的分类
  • 1.2笛卡尔积现象
  • 1.2.1什么是笛卡尔积现象
  • 1.2.2 清除笛卡尔积
  • 1.3 内连接
  • 1.3.1隐式内连接
  • 1.3.2显式内连接
  • 1.3.3总结内连接查询步骤:
  • 1.4 左外连接
  • 1.5 右外连接
  • 2、子查询
  • 2.1 什么是子查询
  • 2.2 子查询小结
  • 3、事务
  • 3.1 手动提交事务
  • 3.1.1 手动提交事务使用过程
  • 3.2 自动提交事务
  • 3.3.1 取消自动提交
  • 3.3 事务原理
  • 3.3.1原理图
  • 3.3.2事务的步骤:
  • 3.4 回滚点
  • 3.4.1 什么是回滚点
  • 3.4.2 回滚点的操作语句
  • 3.5 事务的隔离级别
  • 3.5.1 事务的四大特性ACID
  • 3.3.2事务的隔离级别
  • 3.6.3MySQL数据库有四种隔离级别
  • 3.6.4MySQL事务隔离级别相关的命令
  • 4、DCL
  • 4.1创建用户
  • 4.1.1语法
  • 4.1.2关键字说明
  • 4.1.3具体操作
  • 4.2给用户授权
  • 4.2.1语法
  • 4.2.2关键字说明
  • 4.2.3具体操作
  • 4.3撤销授权
  • 4.3.1语法
  • 4.3.2具体操作
  • 4.4查看权限
  • 4.4.1语法
  • 4.4.2 具体操作
  • 4.5删除用户
  • 4.5.1语法
  • 4.5.2具体操作
  • 4.6修改管理员密码
  • 4.6.1语法
  • 4.6.2具体操作:
  • 4.7修改普通用户密码
  • 4.7.1语法
  • 4.7.2具体操作


1、表连接查询

1.1多表查询的分类

mysql查看事务id mysql 查询事务_mysql

1.2笛卡尔积现象

1.2.1什么是笛卡尔积现象

  • 什么是笛卡尔积:
    –需求:查询所有的员工和所有的部门
    select*fromemp,dept;
  • 结果分析:

1.2.2 清除笛卡尔积

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

1.3 内连接

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

1.3.1隐式内连接

  • 隐式内连接:看不到JOIN关键字,条件使用WHERE指定
SELECT 字段名 FROM 左表,右表 WHERE 条件
select * from emp,dept where emp.`dept_id` = dept.`id`;

1.3.2显式内连接

  • 显示内连接:使用INNER JOIN…ON语句,可以省略INNER
SELECT 字段名 FROM 左表 [INNER] JOIN 右表 ON 条件
  • 查询唐僧的信息,显示员工id,姓名,性别,工资和所在的部门名称,我们发现需要联合2张表同时才能查询出需要的数据,使用内连接
  • mysql查看事务id mysql 查询事务_mysql_02


  1. 确定查询哪些表
select * from emp inner join dept;

mysql查看事务id mysql 查询事务_内连接_03

  1. 确定表连接条件,员工表.dept_id=部门表.id的数据才是有效的
select * from emp e inner join dept d on e.`dept_id`=d.`id`;

mysql查看事务id mysql 查询事务_子查询_04

  1. 确定查询条件,我们查询的是唐僧的信息,员工表.name=‘唐僧’
select * from emp e inner join dept d on e.`dept_id`=d.`id` where e.`name`='唐僧
';

mysql查看事务id mysql 查询事务_子查询_05

  1. 确定查询字段,查询唐僧的信息,显示员工id,姓名,性别,工资和所在的部门名称
select e.`id`,e.`name`,e.`gender`,e.`salary`,d.`name`from emp e inner join dept d
on e.`dept_id`=d.`id` where e.`name`='唐僧';

mysql查看事务id mysql 查询事务_子查询_06

  1. 我们发现写表名有点长,可以给表取别名,显示的字段名也使用别名
select e.`id`编号,e.`name`姓名,e.`gender`性别,e.`salary`工资,d.`name`部门名字from emp e inner join dept d on e.`dept_id`=d.`id` where  e.`name`='唐僧';

mysql查看事务id mysql 查询事务_内连接_07

1.3.3总结内连接查询步骤:

  • 确定查询哪些表
  • 确定表连接的条件
  • 确定查询的条件
  • 确定查询的字段

1.4 左外连接

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

mysql查看事务id mysql 查询事务_子查询_08

1.5 右外连接

  • 右外连接:使用RIGHT OUTER JOIN…ON,OUTER 可以省略
SELECT 字段名 FROM 左表 RIGHT [OUTER] JOIN 右表ON 条件
  • 用右边表的记录去匹配左边表的记录,如果符合条件的则显示;否则,显示NULL可以理解为:在内连接的基础上保证右表的数据全部显示
--使用右外连接查询
select * from dept right join emp on dept.`id`=emp.`dept_id`;

mysql查看事务id mysql 查询事务_mysql查看事务id_09

2、子查询

2.1 什么是子查询

  • 子查询的概念:
    一个查询的结果做为另一个查询的条件
    有查询的嵌套,内部的查询称为子查询
    子查询要使用括号

2.2 子查询小结

  • 子查询结果只要是单列,则在WHERE后面作为条件
  • 子查询结果只要是多列,则在FROM后面作为表进行二次查询
3、事务

3.1 手动提交事务

mysql查看事务id mysql 查询事务_子查询_10

3.1.1 手动提交事务使用过程

  1. 执行成功的情况:开启事务–> 执行多条SQL语句–> 成功提交事务
  2. 执行失败的情况:开启事务–>执行多条SQL语句–>事务的回滚
  3. mysql查看事务id mysql 查询事务_内连接_11


3.2 自动提交事务

  • MySQL默认每一条DML(增删改)语句都是一个单独的事务,每条语句都会自动开启一个事务,语句执行完毕自动提交事务,MySQL默认开始自动提交事务

3.3.1 取消自动提交

  • 查看MySQL是否开启自动提交事务
  • mysql查看事务id mysql 查询事务_子查询_12


  • 取消自动提交事务
  • mysql查看事务id mysql 查询事务_子查询_13


  • 执行更新语句,使用SQLYog查看数据库,发现数据并没有改变
  • 在控制台执行commit提交任务
  • mysql查看事务id mysql 查询事务_子查询_14


3.3 事务原理

  • 事务开启之后,所有的操作都会临时保存到事务日志中,事务日志只有在得到commit命令才会同步到数据表中,其他任何情况都会清空事务日志(rollback,断开连接)

3.3.1原理图

mysql查看事务id mysql 查询事务_mysql_15

3.3.2事务的步骤:

  • 客户端连接数据库服务器,创建连接时创建此用户临时日志文件
  • 开启事务以后,所有的操作都会先写入到临时日志文件中
  • 所有的查询操作从表中查询,但会经过日志文件加工后才返回
  • 如果事务提交则将日志文件中的数据写到表中,否则清空日志文件。

3.4 回滚点

3.4.1 什么是回滚点

在某些成功的操作完成之后,后续的操作有可能成功有可能失败,但是不管成功还是失败,前面操作都已经成功,可以在当前成功的位置设置一个回滚点。可以供后续失败操作返回到该位置,而不是返回所有操作,这个点称之为回滚点。

3.4.2 回滚点的操作语句

mysql查看事务id mysql 查询事务_子查询_16

  • 总结:设置回滚点可以让我们在失败的时候回到回滚点,而不是回到事务开启的时候。

3.5 事务的隔离级别

3.5.1 事务的四大特性ACID

mysql查看事务id mysql 查询事务_内连接_17

3.3.2事务的隔离级别

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


3.6.3MySQL数据库有四种隔离级别

上面的级别最低,下面的级别最高。“是”表示会出现这种问题,“否”表示不会出现这种问题。

mysql查看事务id mysql 查询事务_子查询_19


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

3.6.4MySQL事务隔离级别相关的命令

  • 查询全局事务隔离级别
--查询隔离级别
select @@tx_isolation;
  • 设置事务隔离级别,需要退出MySQL再重新登录才能看到隔离级别的变化
--设置隔离级别
set global transaction isolation level 级别字符串;
4、DCL
  • DDL:create/alter/drop
  • DML:insert/update/delete
  • DQL:select/show
  • DCL:grant/revoke

4.1创建用户

4.1.1语法

CREATE USER '用户名'@'主机名'IDENTIFIED BY'密码';

4.1.2关键字说明

mysql查看事务id mysql 查询事务_mysql查看事务id_20

4.1.3具体操作

  • 创建user1用户,只能在localhost这个服务器登录mysql服务器,密码为123
create user 'user1'@'localhost'identified by '123';
  • 创建user2用户可以在任何电脑上登录mysql服务器,密码为123
create user 'user2'@'%'identified by '123';
注:创建的用户名都在mysql数据库中的user表中可以查看到,密码经过了加密。

mysql查看事务id mysql 查询事务_子查询_21

4.2给用户授权

用户创建之后,没什么权限!需要给用户授权

4.2.1语法

GRANT 权限1,权限2...ON 数据库名.表名 TO '用户名'@'主机名';

4.2.2关键字说明

mysql查看事务id mysql 查询事务_mysql查看事务id_22

4.2.3具体操作

  • 给user1用户分配对test这个数据库操作的权限:创建表,修改表,插入记录,更新记录,查询
grant create,alter,insert,update,select on test.* to 'user1'@'localhost';

注:用户名和主机名要与上面创建的相同,要加单引号。

  • 给user2用户分配所有权限,对所有数据库的所有表
grant all on *.* to 'user2'@'%';

4.3撤销授权

4.3.1语法

  • REVOKE 权限1,权限2…ON 数据库.表名revoke all on test.* from ‘user1’@‘localhost’;‘用户名’@‘主机
    名’;
  • mysql查看事务id mysql 查询事务_内连接_23


4.3.2具体操作

  • 撤销user1用户对test数据库所有表的操作的权限
revoke all on test.* from 'user1'@'localhost';
注:用户名和主机名要与创建时相同,各自要加上单引号

4.4查看权限

4.4.1语法

SHOW GRANTS FOR '用户名'@'主机名';

4.4.2 具体操作

  • 查看user1用户的权限
  • mysql查看事务id mysql 查询事务_mysql查看事务id_24

  • 注:usage是指连接(登陆)权限,建立一个用户,就会自动授予其usage权限(默认授予)。

4.5删除用户

4.5.1语法

DROP USER '用户名'@'主机名';

4.5.2具体操作

  • 删除user2
drop user 'user2'@'%';

4.6修改管理员密码

4.6.1语法

mysqladmin -uroot -ppassword 新密码

注意:需要在未登陆MySQL的情况下操作,新密码不需要加上引号

4.6.2具体操作:

  • 将root管理员的新密码改成123456
  • 要求输入旧密码
  • 使用新密码登录
  • mysql查看事务id mysql 查询事务_隔离级别_25


4.7修改普通用户密码

4.7.1语法

set password for '用户名'@'主机名'=password('新密码');

注意:需要在登陆MySQL的情况下操作,新密码要加单引号。

4.7.2具体操作

  • 将’user1’@‘localhost’的密码改成’666666’
  • 使用新密码登录,老密码登录不了
  • mysql查看事务id mysql 查询事务_内连接_26