SQL語句完整結構: select from where group by having order by 今天分享的知識點:(1)分組查詢 select 中非組函數的列需要在group by 進行參與分組運算 where 後面不能使用組函數,having可以;如果使用非組函數過濾,優先使用wher ...
SQL語句完整結構:
select from where group by having order by
今天分享的知識點:
(1)分組查詢
select 中非組函數的列需要在group by 進行參與分組運算
where 後面不能使用組函數,having可以;如果使用非組函數過濾,優先使用where
增強分組查詢group by rollup(a,b),先對a和b分組,再對a分組,再對null分組;
(2)自連接和外連接查詢(全集,子集。全集表在哪邊就是啥連接)
自連接
select e1.empno,e1.ename,e1.mgr,e2.ename from emp e1,emp e2 where e1.mgr=e2.empno(+);
sql99標準:
A a left join B b on a.col1=b.col2 左連接
A a right join B b on a.col1=b.col2 右連接
orcle:
A a , B b where a.col1(+)=b.col2 右連接
A a , B b where a.col1 =b.col2(+) 左連接
select d.deptno 部門編號,d.dname 部門名稱,count(e.empno) 部門總人數 from emp e, dept d where e.deptno(+)=d.deptno
group by d.deptno,d.dname order by d.deptno;
(3) 等值連接
等值連接 where =
不等值連接 where between and,等
(4)子查詢(select 語句的嵌套)
子查詢放在哪裡?select ,from ,where,having
子查詢用什麼關鍵字連接?單行子查詢使用(=,<>,>,>=,<,<=,between and),多行子查詢使用單行運算符和(in(),any(),all())
子查詢和主查詢執行順序?一般首先執行子查詢,相關子查詢首先執行主查詢;
子查詢一般參與排序麽?一般不參與排序,但是在分頁查詢中需要對子查詢排序;
相關子查詢需要註意什麼?主查詢的結果可以以參數傳遞給子查詢使用
對多行子查詢not in()不能使用null的理解
(5)層次查詢(針對的是一張表,該表中存在tree的結構)
connect by prior empno=mgr start with mgr is null
(6)分頁查詢
一張表不經過任何操作預設帶有rownum行號,經過排序操作之後,該行號也隨著排序了,但不是從1-2-3排序的
為了重新按照1-2-3排序,需要將參與排列的表放入from中構成一張新的表;新表的順序是按照1-2-3排序的
rownum 不能直接rownum>1,但是可以使用rownum<6
為了使用rownum>1,我們把rownum當成列來使用而不是行號;
select * from (select rownum rm,e1.* from (select rownum,e.* from emp e order by sal desc)
e1 where rownum<8 ) e2 where rm>2;
(7)集合操作
union 去重,union all不去重
集合參與運算(並集,交集,差集)需要每一個集合的列個數和類型要一樣;
order by放在最後;
set timing on
(8)臨時表
create global temporary xx on commit delete rows;
註意:
自然連接(顯示的只能是* ,不能使用on 有一個連接條件)
select * from emp natural join dept;
交叉連接(產生了笛卡爾積)
select e.ename,d.dname from emp e cross join dept d;
內連接(在笛卡爾積上選擇了滿足on條件的記錄行)
顯式內連接:select * from emp e inner join dept d on e.deptno=d.deptno;
隱式內連接:select * from emp e , dept d where e.deptno=d.deptno;