MYSQL多表查询与事务
多表查詢
?
避免笛卡爾積
?
?
?
select * from emp,dept where emp.`dept_id` = dept.`id`;#設(shè)置過濾條件(隱式內(nèi)連接)
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`;#顯式內(nèi)連接
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`='唐僧';顯式內(nèi)連接并顯示指定列
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);#查詢最高薪水對應(yīng)的姓名
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('開發(fā)部','財務(wù)部'));#查詢部門人員
?
子查詢是多行多列的時候使用FROM后面作為表進(jìn)行二次查詢
?
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';
?
?
事務(wù)
?
?
?
?
?
手動提交事務(wù)
start transaction;
update account set balance = balance - 500 where name='張三';
update account set balance = balance + 500 where name='李四';
commit;#執(zhí)行完commit數(shù)據(jù)才真正發(fā)生改變
?
start transaction;
update account set balance = balance - 500 where name='張三';
rollback;#執(zhí)行過程中使用rollback表示執(zhí)行錯誤并回滾到原始狀態(tài)
?
自動提交事務(wù)
?
?
?
查看是否自動提交:
select @@autocommit;# @@表示全局變量,結(jié)果為1表示開啟,0表示關(guān)閉。
set @@autocommit=0;#關(guān)閉自動提交
update account set balance=balance+500 where id=2;
commit;#手動提交
?
?
?
?
回滾點(diǎn)
?
?
?
在某些成功的操作完成之后,后續(xù)的操作有可能成功有可能失敗,但是不管成功還是失敗,前面操作都已經(jīng)成功,可以在當(dāng)前成功的位置設(shè)置一個回滾點(diǎn)。可以供后續(xù)失敗操作返回到該位置,而不是返回所有操作,這個點(diǎn)稱之為回滾點(diǎn)。
?
事務(wù)與隔離
?
?
?
?
?
set global transaction isolation level read uncommitted;#設(shè)置事務(wù)隔離級別為讀未提交
讀未提交時,當(dāng)A對數(shù)據(jù)進(jìn)行操作但未提交時,B讀取的信息是未提交信息,可能不一致。
讀已提交時,當(dāng)A對數(shù)據(jù)進(jìn)行操作但未提交時,B讀取的信息是原始信息,不出現(xiàn)臟讀。
讀已提交時,當(dāng)A對數(shù)據(jù)進(jìn)行操作已提交時,B讀取的信息在A提交前后兩次讀取不一致,出現(xiàn)不可重復(fù)讀。
使用serializable隔離級別,一個事務(wù)沒有執(zhí)行完,其他事務(wù)的SQL執(zhí)行不了,可以擋住幻讀
?
?
?
?DCL語句
?
mysqld是MySQL的主程序,服務(wù)器端。mysql是MySQL的命令行工具,客戶端。
?
?
?
創(chuàng)建用戶user1密碼123只能在本機(jī)使用:
create user 'user1'@'localhost' identified by '123';
創(chuàng)建用戶user1密碼123可以在任何計算機(jī)使用:
create user 'user2'@'%' identified by '123';
?
grant create,alter,insert,update,select on test.* to 'user1'@'localhost';#給user1分配到test數(shù)據(jù)庫的部分權(quán)限
grant all on *.* to 'user2'@'%';#給user2分配到所有數(shù)據(jù)庫的所有表權(quán)限
revoke all on test.* from 'user1'@'localhost';#撤銷user1用戶對test數(shù)據(jù)庫所有表的操作權(quán)限
show grants for 'user1'@'localhost';#查詢用戶權(quán)限,usage是指登錄權(quán)限
drop user 'user1'@'localhost';#刪除用戶user1
mysqladmin -uroot -p password 1#修改管理員的用戶密碼為1(登出狀態(tài)使用)
set password for 'user2'@'%'=password('1');#修改普通用戶user1的密碼為1
?
轉(zhuǎn)載于:https://www.cnblogs.com/bai2018/p/11469425.html
總結(jié)
以上是生活随笔為你收集整理的MYSQL多表查询与事务的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spring5源码解读
- 下一篇: inner join 和 exists