內(nèi)連接
隱式內(nèi)連接
看不到Join關(guān)鍵字纠永,條件使用where指定
語法:select 列名印颤,列名...from 表名1苔可,表名2where 表名1.列名=表名2.列名
select *from fruit ,price where fruit.price_id=price.id;
說明:在產(chǎn)生兩張表的笛卡爾積的數(shù)據(jù)后寇漫,通過條件刪選出正確的結(jié)果亲桦。
顯示內(nèi)連接
使用 inner join...on語句,可以省略inner
語法:select *from 表名1 inner join 表名2 on 條件中符;
或者 select * from 表名1 join 表名2 on 條件
具體操作
select *from fruit inner join price on fruit.price_id=price.id
小結(jié)
1.隱式連接看不到j(luò)oin姜胖,顯示連接看到j(luò)oin
2.內(nèi)連接查詢步驟:
1.確定查詢幾張表
2.確定表連接哪些條件
3.根據(jù)需要在操作
左外連接
左外連接可以理解為:用左邊表去右邊表中查詢對應記錄,不管是否找到淀散,都將顯示左邊表中全部記錄
左外連接: 使用 left outer join...on,outer 可以省略
select *from 表1 left outer join 表2 on 條件右莱;
用 left 關(guān)鍵字之前的表,是定義為左側(cè)档插。left 關(guān)鍵字之后的表慢蜓,定義右側(cè)。
查詢的內(nèi)容:以左側(cè)的表為主郭膛,如果左側(cè)有數(shù)據(jù)晨抡,右側(cè)沒有對應的數(shù)據(jù),仍然會把左側(cè)數(shù)據(jù)進行顯示则剃。
select *from fruit left outer join price on fruit.price_id=price.id?
右外連接
用右邊表去左邊表查詢記錄耘柱,不管是否找到,右邊表的記錄都將顯示棍现。
右外連接:使用 right outer join...on,outer 可以省略
語法:select *from 表1 right outer join 表2 on 條件调煎;
select *from fruit outer join price on fruit.price_id=price.id
子查詢
什么是子查詢
一條查詢語句結(jié)果作為另一條查詢語法一部分
select 查詢字段 from 表 where 條件;
舉例: select * from employee where salary =(select max(salary)from employee);
子查詢的三種情況
單行單列? ?多行單列? ? ?多行多列
單行單列?
1.查詢最高工資是多少
select max(salary)from emp;
根據(jù)最高工資到員工表查詢到對應的員工信息
select?*from emp where salary =(select max(salary)from emp);
到員工表查詢小于平均的員工信息
?select *from emp where salary <(select? avg(salary)from emp);
子查詢結(jié)果是單行單列時父查詢?nèi)绾翁幚恚?/p>
select 查詢字段 from 表where 字段=(子查詢);
通常作為父查詢條件
子查詢是多行單列的時候
子查詢的結(jié)果是多行單列己肮,結(jié)果集類似一個數(shù)組士袄,在where后面作為條件悲关,父查詢使用in運算符
select 查詢字段 from 表 where 字段 in(子查詢);
查詢工資大于5000的員工娄柳,來自于哪些部門的名字
先查詢大于5000的員工所在的部門id
select dept_id from emp where salary >5000;
在查詢在這些部門id中部門的名字
select dept.name from dept where dept.id in(select dept_id from emp where salary >5000);
子查詢的結(jié)果是多行單列時父查詢?nèi)绾翁幚恚?/p>
放在父查詢的條件位置寓辱,使用in
子查詢的結(jié)果是多行多列
子查詢的結(jié)果是多行多列,在from后面作為表
select 查詢字段from (子查詢)表別名 where條件赤拒;
注意:子查詢作為表需要取別名秫筏,否則這張表沒用名稱無法訪問表中的字段
查詢出2011年以后入職的員工信息,包括部門名稱
在員工表中查詢2011-1-1以后入職的員工
select *from empty where join date >"2011-1-1"
查詢所有的部門信息需了,與上面的虛擬表中的信息組合跳昼,找出所有部門id等于dept_id
select *from dept d,(select *from emp where join_date >"2011-1-1")? ?e? where e.dept_id=d.id;
小結(jié)
三種子查詢情況:單行單列,多行單列肋乍,多行多列
單行單列:作為父查詢的條件
多行單列:作為父查詢的條件鹅颊,通常使用in
多行多列:作為父查詢的一張表(虛擬表)
事務(wù)的概念
mysql中可以有兩種方式進行事務(wù)操作
1.手動提交事務(wù):先開啟,再提交
2.自動提交事務(wù)(默認的):即執(zhí)行一條SQL語句提交一次事務(wù)墓造。
事務(wù)有關(guān)的SQL語句:
SQL語句? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?描述
start transaction;? ? ? ? ? ? ? ? ?開啟手動控制事務(wù)
commit;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?提交事務(wù)
rollback;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?回滾事務(wù)
手動提交事務(wù)的步驟
第一種情況:開啟事務(wù)——>執(zhí)行SQL語句——>成功——>提交事務(wù)
第二種情況:開啟事務(wù)——>執(zhí)行SQL語句——>失敗——>回滾事務(wù)
?在mysql中模她,mysql默認是自動提交事務(wù)纱控,就是執(zhí)行一個sql語句就會提交一次事務(wù)掸犬。
-- 查看mysql是否是自動提交事務(wù)
show variables like'%commit%'
-- autocommit 值是on表示開啟了自動提交事務(wù)聋伦,如果值是off表示關(guān)閉自動提交事務(wù)
-- a - 100
update account set money = money - 100where name='a';
-- b + 100
update account set money = money + 100where name='b';
-- 關(guān)閉自動提交事務(wù)
-- autocommit 值是on表示開啟了自動提交事務(wù),如果值是off表示關(guān)閉自動提交事務(wù)
-- 可以給其設(shè)置值 1 表示on 0 表示off
set autocommit = 0
-- 手動控制事務(wù)
start transaction;
-- 執(zhí)行轉(zhuǎn)賬的sql語句都位于都一個事務(wù)中蛉拙,要么都成功尸闸,要么都失敗--
-- a - 100
update account set money = money - 100where name='a';
-- b + 100
update account set money = money + 100where name='b';
-- 一切正常,提交事務(wù)永久性改變
commit;
-- 小結(jié):
--??? 1.在start transaction開啟事務(wù)之前會將之前沒有提交事務(wù)的數(shù)據(jù)先提交然后在控制事務(wù)
--? 2.在mysql中關(guān)閉自動提交事務(wù)只是臨時的孕锄,如果重新啟動mysql服務(wù)或者重新連接mysql服務(wù)器那么又會
-- 開啟自動提交事務(wù)
事務(wù)的特性
原子性:一組sql語句不能被拆分吮廉,要么都成功,要么都失敗
一致性:操作事務(wù)前后數(shù)據(jù)是一致的畸肆。
原來:
A:100
B:100
轉(zhuǎn)賬之后:
A:90
B:110
持久性:事務(wù)被提交之后宦芦,數(shù)據(jù)就會永久性保存。
隔離性:多個事務(wù)之間沒有關(guān)系轴脐。
事務(wù)1:a給b轉(zhuǎn)賬
事務(wù)2:c給d轉(zhuǎn)賬
事務(wù)并發(fā)訪問引發(fā)的問題
前提:不考慮隔離性调卑。
有三個問題:
1)臟讀:最嚴重的,一定避免
2)不可重復讀
3)幻讀或者虛讀
小結(jié):
臟讀:未提交事務(wù) 數(shù)據(jù)內(nèi)容
不可重復讀:已經(jīng)提交事務(wù) 數(shù)據(jù)內(nèi)容 update
幻讀:已經(jīng)提交事務(wù) 行記錄數(shù) insert delete