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、子查询
-
- 3、事务
-
- 3.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.4查看权限
-
- 4.5删除用户
-
- 4.6修改管理员密码
-
- 4.7修改普通用户密码
-
1、表连接查询
1.1多表查询的分类
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张表同时才能查询出需要的数据,使用内连接
- 确定查询哪些表
select * from emp inner join dept;
- 确定表连接条件,员工表.dept_id=部门表.id的数据才是有效的
select * from emp e inner join dept d on e.`dept_id`=d.`id`;
- 确定查询条件,我们查询的是唐僧的信息,员工表.name=‘唐僧’
select * from emp e inner join dept d on e.`dept_id`=d.`id` where e.`name`='唐僧
';
- 确定查询字段,查询唐僧的信息,显示员工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`='唐僧';
- 我们发现写表名有点长,可以给表取别名,显示的字段名也使用别名
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`='唐僧';
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`;
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`;
2、子查询
2.1 什么是子查询
- 子查询的概念:
一个查询的结果做为另一个查询的条件
有查询的嵌套,内部的查询称为子查询
子查询要使用括号
2.2 子查询小结
- 子查询结果只要是单列,则在WHERE后面作为条件
- 子查询结果只要是多列,则在FROM后面作为表进行二次查询
3、事务
3.1 手动提交事务
3.1.1 手动提交事务使用过程
- 执行成功的情况:开启事务–> 执行多条SQL语句–> 成功提交事务
- 执行失败的情况:开启事务–>执行多条SQL语句–>事务的回滚
3.2 自动提交事务
- MySQL默认每一条DML(增删改)语句都是一个单独的事务,每条语句都会自动开启一个事务,语句执行完毕自动提交事务,MySQL默认开始自动提交事务
3.3.1 取消自动提交
- 查看MySQL是否开启自动提交事务
- 取消自动提交事务
- 执行更新语句,使用SQLYog查看数据库,发现数据并没有改变
- 在控制台执行commit提交任务
3.3 事务原理
- 事务开启之后,所有的操作都会临时保存到事务日志中,事务日志只有在得到commit命令才会同步到数据表中,其他任何情况都会清空事务日志(rollback,断开连接)
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事务隔离级别相关的命令
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关键字说明
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表中可以查看到,密码经过了加密。
4.2给用户授权
用户创建之后,没什么权限!需要给用户授权
4.2.1语法
GRANT 权限1,权限2...ON 数据库名.表名 TO '用户名'@'主机名';
4.2.2关键字说明
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’;‘用户名’@‘主机
名’;
4.3.2具体操作
- 撤销user1用户对test数据库所有表的操作的权限
revoke all on test.* from 'user1'@'localhost';
注:用户名和主机名要与创建时相同,各自要加上单引号
4.4查看权限
4.4.1语法
SHOW GRANTS FOR '用户名'@'主机名';
4.4.2 具体操作
- 查看user1用户的权限
注:usage是指连接(登陆)权限,建立一个用户,就会自动授予其usage权限(默认授予)。
4.5删除用户
4.5.1语法
DROP USER '用户名'@'主机名';
4.5.2具体操作
drop user 'user2'@'%';
4.6修改管理员密码
4.6.1语法
mysqladmin -uroot -ppassword 新密码
注意:需要在未登陆MySQL的情况下操作,新密码不需要加上引号
。
4.6.2具体操作:
- 将root管理员的新密码改成123456
- 要求输入旧密码
- 使用新密码登录
4.7修改普通用户密码
4.7.1语法
set password for '用户名'@'主机名'=password('新密码');
注意:需要在登陆MySQL的情况下操作,新密码要加单引号。
4.7.2具体操作
- 将’user1’@‘localhost’的密码改成’666666’
- 使用新密码登录,老密码登录不了