前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MYSQL多表查询与事务

MYSQL多表查询与事务

作者头像
嘘、小点声
发布2019-09-29 16:00:04
9630
发布2019-09-29 16:00:04
举报
文章被收录于专栏:嘘、小点声嘘、小点声

多表查询

避免笛卡尔积

select * from emp,dept where emp.`dept_id` = dept.`id`;#设置过滤条件(隐式内连接)

select emp.`name`, dept.`name` from emp,dept where emp.`dept_id` = dept.`id`;#查询姓名和部门

select * from emp e inner join dept d on e.`dept_id` = d.`id`;#显式内连接

select * 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`='唐僧';显式内连接并显示指定列

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 * from dept d left join emp e on d.`id` = e.`dept_id`;#左外连接查询。

select * from dept right join emp on dept.`id` = emp.`dept_id`;#右外连接查询

嵌套查询

select * from emp where dept_id = (select id from dept where name='市场部');#使用子查询

子查询只有一个值的时候

select * from emp where salary = (select max(salary) from emp);#查询最高薪水对应的姓名

select * from emp where salary < (select avg(salary) from emp);#小于平均工资的员工

子查询有多个值的时候使用in

select name from dept where id in (select dept_id from emp where salary > 5000);#薪水大于5k的部门

select * from emp where dept_id in (select id from dept where name in('开发部','财务部'));#查询部门人员

子查询是多行多列的时候使用FROM后面作为表进行二次查询

select * from dept d, (select * from emp where join_date >='2011-1-1') e where d.`id`= e.dept_id ;#子查询作为表需要取别名,否则这张表没有名称则无法访问表中的字段

或:

select * from emp inner join dept on emp.`dept_id` = dept.`id` where join_date >='2011-1-1';

select * from emp inner join dept on emp.`dept_id` = dept.`id` and join_date >='2011-1-1';

事务

手动提交事务

start transaction;

update account set balance = balance - 500 where name='张三';

update account set balance = balance + 500 where name='李四';

commit;#执行完commit数据才真正发生改变

start transaction;

update account set balance = balance - 500 where name='张三';

rollback;#执行过程中使用rollback表示执行错误并回滚到原始状态

自动提交事务

查看是否自动提交:

select @@autocommit;# @@表示全局变量,结果为1表示开启,0表示关闭。

set @@autocommit=0;#关闭自动提交

update account set balance=balance+500 where id=2;

commit;#手动提交

回滚点

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

事务与隔离

set global transaction isolation level read uncommitted;#设置事务隔离级别为读未提交

读未提交时,当A对数据进行操作但未提交时,B读取的信息是未提交信息,可能不一致。

读已提交时,当A对数据进行操作但未提交时,B读取的信息是原始信息,不出现脏读。

读已提交时,当A对数据进行操作已提交时,B读取的信息在A提交前后两次读取不一致,出现不可重复读。

使用serializable隔离级别,一个事务没有执行完,其他事务的SQL执行不了,可以挡住幻读

DCL语句

mysqld是MySQL的主程序,服务器端。mysql是MySQL的命令行工具,客户端。

创建用户user1密码123只能在本机使用:

create user 'user1'@'localhost' identified by '123';

创建用户user1密码123可以在任何计算机使用:

create user 'user2'@'%' identified by '123';

grant create,alter,insert,update,select on test.* to 'user1'@'localhost';#给user1分配到test数据库的部分权限

grant all on *.* to 'user2'@'%';#给user2分配到所有数据库的所有表权限

revoke all on test.* from 'user1'@'localhost';#撤销user1用户对test数据库所有表的操作权限

show grants for 'user1'@'localhost';#查询用户权限,usage是指登录权限

drop user 'user1'@'localhost';#删除用户user1

mysqladmin -uroot -p password 1#修改管理员的用户密码为1(登出状态使用)

set password for 'user2'@'%'=password('1');#修改普通用户user1的密码为1

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-09-05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 多表查询
  • 嵌套查询
  • 事务
  • 手动提交事务
  • 自动提交事务
  • 回滚点
  • 事务与隔离
  • DCL语句
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档