SQL優(yōu)化
from 子句
from 表1,表2……
執(zhí)行順序:從右往左執(zhí)行(從后往前)
建議:數(shù)據(jù)量較少的表盡量放在后面
where 子句
where 條件1 and 條件2 and 條件3
執(zhí)行順序:從下往上,從右往左
建議:能將過濾量大的條件盡量放后面
group by子句
group by 字段1 字段2
執(zhí)行順序:從左往右
建議:在分組前萝快,一定要最大程度的將不需要的數(shù)據(jù)過濾
having子句
having 條件1,and條件2……
執(zhí)行順序:從后往前
建議:先分組后過濾是一個非常消耗資源的過程蚜厉,在having二次過濾之前,會對分組后的數(shù)據(jù)進(jìn)行內(nèi)部排序操作畜眨,此操作非常耗時昼牛,建議盡量避免使用
select 子句
select 字段名1,字段名2
建議:少用康聂,多用字段名贰健,oracle在解析sql的過程中,通過查詢數(shù)據(jù)字典表早抠,將按照表中字段順序依次轉(zhuǎn)換成對應(yīng)字段
order by 子句
order by 字段名1霎烙,字段名2 ……
執(zhí)行順序:從左到右
建議:因為排序笨就是消耗資源的過程,所以建議排序前一定要將數(shù)據(jù)過濾完畢
關(guān)聯(lián)查詢
多表聯(lián)合查詢
笛卡爾積條件
查詢用戶表與dept的數(shù)據(jù)
select * from emp e,dept d;
會出來多條數(shù)據(jù)
多表聯(lián)合查詢時蕊连,一定要書寫多表之間的聯(lián)合關(guān)系,即鏈接條件游昼,需要根據(jù)實際的鏈接字段或者關(guān)系來對應(yīng)甘苍,N張表聯(lián)合查詢,至少需要N-1個鏈接條件
聯(lián)合查詢可分為內(nèi)鏈接烘豌,外鏈接载庭,自鏈接
內(nèi)鏈接:返回所有滿足鏈接條件的數(shù)據(jù)
方式一:
select * from emp e ,dept d where e.deptno=d.deptno
方式二:
內(nèi)鏈接的標(biāo)準(zhǔn)寫法:
內(nèi)鏈接: 表1 [inner] join 表2 on 鏈接條件
select * from emp e jion dept d on e.deptno=d.deptno
外鏈接:因為內(nèi)鏈接只能返回滿足鏈接條件的數(shù)據(jù),但有些情況廊佩,我們需要哪些不能滿足鏈接條件的數(shù)據(jù)也要被查詢到囚聚,此時可以使用外鏈接
查詢所有員工(有部門就對應(yīng),沒有)
兩張表
(左表)emp [outer]join dept(右表)
驅(qū)動表:作為驅(qū)動表的表标锄,所有數(shù)據(jù)都得出來
匹配表:作為匹配表顽铸,只出來匹配得上的數(shù)據(jù)
左外鏈接:左表為驅(qū)動表,右表為匹配表
left [outer] join
右外鏈接:左表為匹配表料皇,右表為驅(qū)動表
right [outer] join
全外鏈接:兩表既是驅(qū)動表又是匹配表
full [outer] join
自鏈接
自己跟自己鏈接
是一個特殊的鏈接查詢谓松,一張表即為驅(qū)動表又是匹配表
--查詢出沒有領(lǐng)導(dǎo)的員工信息(沒有領(lǐng)導(dǎo)的概念就是BOSS)
select 員工.* from emp 員工 join emp 領(lǐng)導(dǎo)
--員工的領(lǐng)導(dǎo) = 領(lǐng)導(dǎo)的編號
on 員工.mgr = 領(lǐng)導(dǎo).empno;
--查詢領(lǐng)導(dǎo)信息
select 領(lǐng)導(dǎo).* from emp 員工 join emp 領(lǐng)導(dǎo)
--員工的領(lǐng)導(dǎo) = 領(lǐng)導(dǎo)的編號
on 員工.mgr = 領(lǐng)導(dǎo).empno;