select語法: select [distinct|all] 列名 from 表名 [where] [group by] [having] [order by] ps:[] 表示可以省略 舉幾個慄子: select * from emp; ps:* 表示所有欄位即把要查詢的表的所有欄位都顯示出來, ...
select語法:
select [distinct|all] 列名 from 表名 [where] [group by] [having] [order by] ps:[] 表示可以省略
舉幾個慄子:
select * from emp; ps:* 表示所有欄位即把要查詢的表的所有欄位都顯示出來,並不建議使用因為網路消耗大,效率也不高
select empno from emp; ps:篩選指定欄位,可以篩選多個,欄位之間用逗號隔開
select empno,ename,job from emp; ps:篩選指定欄位,可以篩選多個,欄位之間用逗號隔開
select job from emp;
select distinct(job) from emp; ps:all是預設的即有重覆也會顯示,distinct消除重覆
select * from emp where comm is not null; ps:null表示空值
select job,count(*),sum(sal) from emp group by job; ps:count() sum()為聚合函數後面會講
select sum(sal), count(*), (sum(sal)/count(*)) from emp group by job having (sum(sal)/count(*))>2000; ps:having 要與group by 連用 having 要放在group by後面,group by 可以單獨使用
select * from emp order by empno desc; ps:desc是按降序排序,asc是按升序排序,預設是asc
select empno as 雇員編號 from emp order by 雇員編號; ps:雇員編號是別名,別名中英文不限,當然你要用阿拉伯語,德語什麼的只要可以打出來識別也沒問題,as可以省略也可以寫,都是一樣的道理,order by後應該使用別名,只有order by 可以這樣,having後面都不可以
select * from emp order by empno desc ,job; ps:可以根據兩個欄位進行排序,先按照empno進行降序排序,如果相等對job進行升序排序
select job,sum(sal) from emp group by job ; ps:group by 後的欄位必須在查詢欄位出現,查詢欄位還可以出現聚合函數
select job,sum(sal)*2 from emp group by job ; ps:不表示資料庫的數據被改變只表示顯示的結果
select ename ,sal from emp where sal not between 4000 and 5000; ps:between 4000 and 5000 相當於 >=4000 and <=5000
select job , ename from emp where sal in(800,1600,1500); ps:在集合中選取符合條件的
select ename from emp where ename like '__A%'; ps:模糊查詢,_代表匹配一個字元,%代表匹配至少0 個字元
select ename from emp where ename like '%A%' or ename like '%E%';
使用where來進行篩選時,常用的操作符:< 小於 >大於 = 等於 !=不等於 <>不等於 <=小於等於 >=大於等於
having是對group分的組進行篩選,不同於where group要分的組是where篩選過後的
子查詢:
select empno, ename from emp where empno in (select empno from emp where comm is not null);
any 和<any <=any表示小於或小於等於列表中最大值,與 in配合使用 和> any >=any表示大於或大於等於列表中的最小值 =any 相當於in
all 和<all <=all表示小於或小於等於列表中的最小值,與in配合使用 和>all >=all表示大於或大於等於列表中的最大值 <>all相當於 not in
舉幾個慄子:
select sal from emp where comm is not null;(1)
select * from emp where sal =any(select sal from emp where comm is not null);(2)
select * from emp where sal in(select sal from emp where comm is not null);(3)
select * from emp where sal <any(select sal from emp where comm is not null);
select * from emp where sal <=any(select sal from emp where comm is not null);
select * from emp where sal >any(select sal from emp where comm is not null);
select * from emp where sal >=any(select sal from emp where comm is not null);
select * from emp where sal <>all(select sal from emp where comm is not null);
select * from emp where sal >all(select sal from emp where comm is not null);
select * from emp where sal >=all(select sal from emp where comm is not null);
select * from emp where sal <all(select sal from emp where comm is not null);
select * from emp where sal <=all(select sal from emp where comm is not null);
註意看這幾句的關係
連接查詢:
select * from emp, dept; 產生笛卡兒積
內連接:等值連接、不等值連接
等值連接:連接中使用“=”(等號) 連接兩個條件列表
select * from emp e, dept d where e.deptno=d.deptno; select * from emp e inner join dept d on e.deptno=d.deptno; //功能相等 ps:inner可以省略,系統自動識別為內連接
不等值連接:連接時使用<、 > 、>=、 <=、 between ……and ……、in等連接兩個條件列表
自連接:把自身表的一個引用作為另一個表來處理
select e.empno 雇員編號, e.ename 雇員姓名,m.empno 領導編號 from emp e, emp m where e.mgr=m.empno;
外連接:左外連接、右外連接、全外連接
左外連接:返回結果不僅僅符合連接條件的行記錄,左表全部記錄都會包含,右表不滿足的用NULL填充
右外連接:返回結果不僅僅符合連接條件的行記錄,右表全部記錄都會包含,左表不滿足的用NULL填充
全外連接:無論是否成功匹配,左右表記錄都返回,不滿足用NULL填充
oracle使用外連接有一種特殊的方法,用(+)表示外連接,放在非主表的一方
舉幾個慄子:
dept是左表,採用左外連接
select d.deptno, d.dname,a.empno, a.ename,a.job,a.sal from dept d ,(select empno, ename, job ,sal ,deptno from emp where comm is null) a where d.deptno=a.deptno(+);
select d.deptno, d.dname,a.empno, a.ename,a.job,a.sal from dept d left join (select empno, ename, job ,sal ,deptno from emp where comm is null) a on d.deptno=a.deptno;
以上兩個查詢語句相等
採用右外連接:
select d.deptno, d.dname,a.empno, a.ename,a.job,a.sal from dept d right join (select empno, ename, job ,sal ,deptno from emp where comm is null) a on d.deptno=a.deptno;
select d.deptno, d.dname,a.empno, a.ename,a.job,a.sal from dept d , (select empno, ename, job ,sal ,deptno from emp where comm is null) a where d.deptno(+)=a.deptno;
以上兩個查詢語句相等
採用全外連接:
select d.deptno, d.dname,a.empno, a.ename,a.job,a.sal from dept d full join (select empno, ename, job ,sal ,deptno from emp where comm is null) a on d.deptno=a.deptno;
獻給和我一樣的小白,有關查詢還有很多知識點,這裡只寫了常用的,如有錯誤請指出,謝謝!