記得本身要敲o~~~sql
select * from bonus; select * from salgrade; select 1+1 from dual; --笛卡爾積:兩張表的乘積 select * from emp,dept; select * from emp e1,dept d1 where e1.deptno =d1.deptno; /* 內聯接: 隱式內聯接: 不等值內聯接:where e1.deptno <> d1.deptno 自聯接:本身鏈接本身 等值內聯接: where e1.deptno = d1.deptno; 顯示內聯接: select * from 表1 inner join 表2 連接條件 inner關鍵字能夠省略 */ select * from emp e1,dept d1 where e1.deptno <> d1.deptno; --查詢員工編號,員工姓名,經理編號,經理的姓名 select e1.empno,e1.ename,e1.mgr,m1.ename from emp e1,emp m1 where e1.mgr = m1.empno; --查詢員工編號,員工姓名,員工的部門名稱,經理的編號,經理的姓名 select e1.empno,e1.ename,e1.mgr,m1.ename,d1.dname from emp e1,emp m1,dept d1 where e1.mgr = m1.empno and e1.deptno = d1.deptno; --查詢員工編號,員工姓名,員工的部門名稱,經理的編號,經理的姓名,經理的部門名稱 select e1.empno,e1.ename,d1.dname,e1.mgr,m1.ename,d2.dname from emp e1,emp m1,dept d1,dept d2 where e1.mgr = m1.empno and e1.deptno = m1.deptno and d2.deptno = m1.deptno; select * from dept; select * from emp; select * from salgrade; --查詢員工編號,員工姓名,員工的部門名稱,員工的工資等級,經理的編號,經理的姓名,經理的部門名稱 select e1.empno,e1.ename,d1.dname,s1.grade,e1.mgr,m1.ename,d2.dname from emp e1, emp m1,dept d1,dept d2,salgrade s1 where e1.mgr= m1.empno and e1.deptno = d1.deptno and m1.deptno = d2.deptno and e1.sal between s1.losal and s1.hisal ; --查詢員工編號,員工姓名,員工的部門名稱,員工的工資等級,經理的編號,經理的姓名,經理的部門名稱,經理的工資等級 select e1.empno,e1.ename,d1.dname,s1.grade,e1.mgr,m1.ename,d2.dname,s2.grade from emp e1, emp m1,dept d1,dept d2,salgrade s1,salgrade s2 where e1.mgr= m1.empno and e1.deptno = d1.deptno and m1.deptno = d2.deptno and e1.sal between s1.losal and s1.hisal and m1.sal between s2.losal and s2.hisal ; --查詢員工編號,員工姓名,員工的部門名稱,員工的工資等級,經理的編號,經理的姓名,經理的部門名稱,經理的工資等級 --將工資登記1,2,3,4顯示成中文的一級二級,三級四級 select e1.empno, e1.ename, d1.dname, case s1.grade when 1 then '一級' when 2 then '二級' when 3 then '三級' when 4 then '四級' else '五級' end "等級", e1.mgr, m1.ename, d2.dname, decode(s2.grade,1,'一級',2,'二級',3,'三級',4,'四級','五級') "等級" from emp e1, emp m1,dept d1,dept d2,salgrade s1,salgrade s2 where e1.mgr= m1.empno and e1.deptno = d1.deptno and m1.deptno = d2.deptno and e1.sal between s1.losal and s1.hisal and m1.sal between s2.losal and s2.hisal ; --查詢員工姓名和員工部門所處的位置 select e1.ename,e1.deptno from emp e1 ,dept d1 where e1.deptno = d1.deptno; select * from emp e1 inner join dept d1 on e1.deptno = d1.deptno; /* 外聯接:(標準,通用寫法) 左外聯接:left outer join 左表中全部的記錄,若是右表沒有對應記錄,就顯示空 右外鏈接:right outer join 右表中全部的記錄,若是左表沒有對應記錄,就顯示空 outer 關鍵字能夠省略 Oracle中的外鏈接:(+)其實是沒有對應的記錄就加上空值 select * from emp e1,dept d1 where e1.deptno = d1.deptno(+); */ select * from emp e1 left outer join dept d1 on e1.deptno = d1.deptno; insert into emp(empno,ename) values(9527,'HUAAN'); select * from emp e1,dept d1 where e1.deptno = d1.deptno(+); select * from emp e1 right outer join dept d1 on e1.deptno = d1.deptno; select * from emp e1,dept d1 where e1.deptno(+) = d1.deptno; /* 子查詢:查詢語句中嵌套查詢語句;用來解決複雜的查詢語句 查詢最高工資的員工的信息 單行子查詢:> >= = < <= <> != 多行子查詢: in not in >any >all exists not exists 查詢領導信息 */ --查詢最高工資的員工信息 --1.查詢最高工資 select max(sal) from emp ; --2.工資等於最高工資 select * from emp where sal=(select max(sal) from emp); --查詢出比僱員7654的工資高,同時和7788從事相同工做的員工信息 --1.僱員7654的工資 1250 select sal from emp where empno=7654; --2.7788從事的工做 ANALYST select job from emp where empno= 7788; select* from emp where (select sal from emp where empno=7654)<sal and job=(select job from emp where empno= 7788); select * from emp where sal > (select sal from emp where empno = 7654) and job = (select job from emp where empno = 7788); --查詢每一個部門最低工資的員工信息和他所在的部門信息 --1.查詢每一個部門的最低工資,分組統計 select deptno, min(sal) minsal from emp group by deptno; --2.員工工資等於他所處部門的最低工資 select * from emp e1, (select deptno, min(sal) minsal from emp group by deptno) t1 where e1.deptno = t1.deptno and e1.sal = t1.minsal; --3.查詢部門相關信息 select * from emp e1, (select deptno,min(sal) minsal from emp group by deptno) t1, dept d1 where e1.deptno = t1.deptno and e1.sal = t1.minsal and e1.deptno = d1.deptno; /* 內聯接,單行自查詢,多行子查詢 in not in any all exists 一般狀況下,數據庫中不要出現null,最好的作法是加上not null null值並不表明不佔用空間,char(100)null 100個字符 */ --查詢領導信息 --1.查詢全部經理的編號 select mgr from emp; select distinct mgr from emp; --2.結果 select * from emp where empno in (select mgr from emp); --查詢不是領導的信息 select * from emp where empno not in (select mgr from emp); select * from emp where empno <>all(select mgr from emp); --正確寫法 select * from emp where empno not in(select mgr from emp where mgr is not null); --查詢出比10號部門任意一個員工薪資高的員工信息 10 20 30 select * from emp where sal > any(select sal from emp where deptno=10); --查詢出比20號部門全部員工薪資高的員工信息 10 20 30 --1.20號最高工資 3000 select max(sal) from emp where deptno =20; --2.員工信息 select * from emp; --合併 select * from emp where sal > (select max(sal) from emp where deptno =20); -----使用多行子查詢完成上面這題 --20號部門全部員工的薪資 select sal from emp where deptno = 20; --大於集合全部的 select * from emp where sal > all(select sal from emp where deptno=20); /* exists(查詢語句):存在的意思,判斷一張表裏的記錄是否存在於另一張表中 看成布爾值來處理 當查詢語句有結果的時候,就返回true;不然false; 數據量比較大的時候是很是高效的 */ select * from emp where exists(select * from emp where deptno = 1234567); select * from emp where 3=4; select * from emp where exists(select * from emp where deptno = 20); --查詢有員工的部門的信息 select * from dept d1 where exists(select * from emp e1 where e1.deptno = d1.deptno ); --找到員工表中工資最高的前三名(降序排序) select * from emp order by sal desc; /* rownum : 僞列 ,系統自動生成一列,用來表示行號 rownum是Oracle特有的用來表示行號,默認值/起始值是1,在每查詢出結果以後,在添加1 rownum最好不能作大於號判斷,能夠作小於號判斷 sql執行順序 from .. where..group by..having..select ..rownum..order by */ select rownum ,e1.* from emp e1; --查詢rownum大於2的全部記錄 select rownum , e1.* from emp e1 where rownum>2;--沒有任何記錄 --查詢rownum大於等於1的全部記錄 select rownum , e1.* from emp e1 where rownum>=1; --查詢rownum < 6 的全部記錄 select rownum,e1.* from emp e1 where rownum < 6; --rownum 排序 select rownum ,e1.* from emp e1 order by sal; --找到員工表中工資最高的前三名 select rownum ,e1.* from emp e1 order by sal desc ; --將上面的結果看成一張表處理,再查詢 select rownum ,t1.* from (select rownum ,e1.* from emp e1 order by sal desc) t1; --只顯示前三條記錄 select rownum , t1.* from(select rownum ,e1.* from emp e1 order by sal desc) t1 where rownum<4; --找到員工表中薪水大於本部門平均薪水的員工 --1.分組統計部門平均薪水 select deptno, avg(sal) avgsal from emp group by deptno; --2.員工工資 > 本部門平均工資 select * from emp e1, (select deptno,avg(sal) avgsal from emp group by deptno) t1 where e1.sal>t1.avgsal and e1.deptno = t1.deptno; /* 關聯子查詢 , 非關聯子查詢 */ select * from emp e where sal > (select avg(sal) from emp e2 group by deptno having e.deptno=e2.deptno) /* 統計每一年入職的員工個數 */ select hiredate from emp; --只顯示年 select to_char(hiredate,'yyyy') from emp; --分組統計 select to_char(hiredate,'yyyy')yy,count(1) cc from emp group by to_char(hiredate,'yyyy'); select case yy when '1987' then cc end from (select to_char(hiredate,'yyyy') yy,count(1) cc from emp group by to_char(hiredate,'yyyy')) tt; select yy from (select to_char(hiredate,'yyyy') yy,count(1) cc from emp group by to_char(hiredate,'yyyy')) tt; select case yy when '1987' then cc end "1987" from (select to_char(hiredate,'yyyy') yy,count(1) cc from emp group by to_char(hiredate,'yyyy')) tt; select case yy when '1987' then cc end "1987" from (select to_char(hiredate,'yyyy') yy,count(1) cc from emp group by to_char(hiredate,'yyyy')) tt; --去除行記錄中的空值 select sum(case yy when '1987' then cc end) "1987" from (select to_char(hiredate,'yyyy') yy,count(1) cc from emp group by to_char(hiredate,'yyyy')) tt; --統計員工的總數 select sum(cc) "TOTAL" from (select to_char(hiredate,'yyyy') yy,count(1) cc from emp group by to_char(hiredate,'yyyy')) --將1987 和TOTAL 合併在一塊兒 select sum(cc) "TOTAL", sum(case yy when '1987' then cc end)"1987" from (select to_char(hiredate,'yyyy') yy,count(1) cc from emp group by to_char(hiredate,'yyyy')) tt; --顯示全部年份的結果 select sum(cc) "TOTAL", sum(case yy when '1980' then cc end) "1980", sum(case yy when '1981' then cc end) "1981", sum(case yy when '1982' then cc end) "1982", sum(case yy when '1987' then cc end) "1987" from (select to_char(hiredate,'yyyy') yy,count(1) cc from emp group by to_char(hiredate,'yyyy')) tt; /* rowid :僞列 每行記錄所存放的真實物理地址 rownum :行號 每查詢出記錄以後,就會添加一個行號 */ select rowid ,e.* from emp e; /* rownum:分頁查詢 在Oracle中只能使用子查詢來作分頁查詢 */ select rownum, emp.* from emp; select * from (select rownum hanghao ,emp.* from emp)tt where tt.hanghao between 6 and 10; /* 集合運算: 並集:將兩個查詢結果進行合併 交集 差集 全部的查詢結果可能不是來自同一張表 emp 2000年 2017年 手機 詳細信息 emp2017 */ --工資大於1500,或者20號部門下的員工 select * from emp where sal > 1500 or deptno = 20; --並集運算: union union all /* union:去除重複的,而且排序 union all:不會去除重複的 */ select * from emp where sal>1500 union select * from emp where deptno = 20; select * from emp where sal > 1500 union all select * from emp where deptno = 20; /* 交集運算: intersect */ --工資大於1500,而且20號部門下的員工 select * from emp where sal>1500 intersect select * from emp where deptno = 20; /* 差集運算: 兩個結果相減 */ --1981年入職員工(不包括總裁和經理) --1981年入職員工 select * from emp where to_char(hiredate,'yyyy')= 1981; --總裁和經理 select * from emp where job = 'PRESIDENT' or job = 'MANAGER'; select * from emp where to_char(hiredate,'yyyy')= 1981 minus select * from emp where job = 'PRESIDENT' or job = 'MANAGER'; /* 集合運算中的注意事項 1.列的類型要一致 2.按照順序寫 3.列的數量要一致,若是不足,用空值填充 */ select ename,sal from emp where sal > 1500 union select ename,sal from emp where deptno = 20;