3.mysql多表查询与事务的操作

1、表连接查询

1.1多表查询的分类

1

1.2笛卡尔积现象

1.2.1什么是笛卡尔积现象

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

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张表同时才能查询出需要的数据,使用内连接
    3
  1. 确定查询哪些表
select * from emp inner join dept;

4

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

2

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

5

  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`='唐僧';

6

  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`='唐僧';

3

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`;

2

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`;

1

2、子查询

2.1 什么是子查询

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

2.2 子查询小结

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

3、事务

3.1 手动提交事务

1

3.1.1 手动提交事务使用过程

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

3.2 自动提交事务

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

3.3.1 取消自动提交

  • 查看MySQL是否开启自动提交事务
    1
  • 取消自动提交事务
    2
  • 执行更新语句,使用SQLYog查看数据库,发现数据并没有改变
  • 在控制台执行commit提交任务
    2

3.3 事务原理

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

3.3.1原理图

1

3.3.2事务的步骤:

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

3.4 回滚点

3.4.1 什么是回滚点

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

3.4.2 回滚点的操作语句

2

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

3.5 事务的隔离级别

3.5.1 事务的四大特性ACID

1

3.3.2事务的隔离级别

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

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

上面的级别最低,下面的级别最高。“是”表示会出现这种问题,“否”表示不会出现这种问题。
1
隔离级别越高,性能越差,安全性越高。

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关键字说明

1

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表中可以查看到,密码经过了加密。

1

4.2给用户授权

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

4.2.1语法

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

4.2.2关键字说明

1

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’;‘用户名’@‘主机
    名’;
    1

4.3.2具体操作

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

4.4查看权限

4.4.1语法

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

4.4.2 具体操作

  • 查看user1用户的权限
    1
    注: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
  • 要求输入旧密码
  • 使用新密码登录
    1

4.7修改普通用户密码

4.7.1语法

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

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

4.7.2具体操作

  • 将’user1’@‘localhost’的密码改成’666666’
  • 使用新密码登录,老密码登录不了
    1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值