Oracle實戰練習

#登錄到sqlplus; 
#用戶名:scott 密碼:tiger

#或者在命令提示符下
sqlplus sys/dys as sysdba ;    #管理員登錄到sqlplus

alter user scott account unlock;   #解開用戶

#清空sqlplus屏幕中的記錄
clear scr;
#查看錶結構
desc emp;  

#select 語句
select ename, sal*12 from emp;
desc emp;
#表字段的別名
select ename, sal*12 as annual_sal from emp;

#在表中運用運算
select 2*3 from emp; #查出來的是14條記錄, 因爲emp表中有14條記錄

#查看虛表dual
desc dual;

#在dual表中運算
select 2*3 from dual;

#查看系統時間
select sysdate from dual;   #顯示一條記錄

#使用""來保持原來的格式
select ename, sal*12 as"annual sal" from emp;

#查看錶中的字段值爲空的記錄
select ename, comm from emp; #因爲任何含有空值的表達式最後顯示結果仍是空值

#字符串連接,使用||
select ename||sal from emp;
 
#distinct 查詢,去除重複行
 select distinct deptno from emp;
 select distinct deptno,job from emp;   #兩個在一起的組合重複的去掉,distinct 可以修飾一個或多個字段

#where過濾條件
#查詢部門編號是10的員工信息
 select * from emp where deptno=10;
#查詢名稱是CLARKR部門員工信息
 select * from emp where ename ='CLARK';
 select ename, sal from emp where sal>1500;
#比較每個字符的ascii碼誰大誰小
 select ename, sal from emp where ename>'CBA';
#查詢工資在800和1500之間
 select ename, sal from emp where sal between 800 and 1500;
#或者
 select ename, sal from emp where sal>=800 and sal<=1500;
 
#空值處理
select ename, sal,comm from emp where comm is null;
select ename, sal,comm from emp where comm=null; #這樣寫是錯誤的
select ename, sal ,comm from emp where comm is not null;
#in查詢
 select ename,sal, comm from emp where sal in (800,1500,2000);
 select ename, sal, comm from emp where ename in('SMITH','KING','ABC'); #表示查詢符合在集合範圍內的一個或者多個
 select ename, sal from emp where sal not in(800,1000);
#日期處理
 select ename, sal, hiredate from emp where hiredate>'20-2月-81';
 #或者
 select ename, sal, hiredate from emp where hiredate >'20-2月-1981';
 
 #and 處理, or處理
 select ename, sal from emp where deptno=10 and sal>1000;
 select ename, sal from emp where deptno=10 or sal>1000;
 
 #模糊查詢
 select ename from emp where ename like'%ALL%';  #%百分號表示1個或者多個
 #查出名稱第二個是A的
 select ename from emp where ename like'_A%';
 #如果是%,用轉義字符
  select ename from emp where ename like'%/%%';
 #用escape識別轉義字符
  select ename from emp where ename like'%$%%' escape '$';
 #按部門編號降序排列
  select * from dept order by deptno desc;
 #按empno升序排列
 select empno, ename from emp order by empno asc;  #默認是升序排列
 #過濾後再排序
 select empno, ename from emp where deptno<>10 order by empno asc;
 select ename, sal, deptno from emp order by deptno asc;
 #排序兩個條件
 select ename, sal, deptno from emp order by deptno asc, sal ;
 
 #綜合排序條件
  select ename, sal*12 annual_sal from emp where ename not like'_A%' and sal
  800 order by deptno;
 
  #SQL函數
  select lower(ename) from emp; #轉換成小寫
  #第二個字母是a的
   select ename from emp where lower(ename) like'_a%';
  #或者
   select ename from emp where ename like'_a%' or ename like'_A%';
 #截取字符串
  select substr(ename,2,3) from emp; #從第二個字符串開始,截取3個字符串
  select ascii('A') from dual;   #查出ascii碼
  select round(23.652) from dual;  #四捨五入
 #四捨五入,保留小數點兩位
  select round(23.652,2) from dual;
  select round(23.652,1) from dual;
  select round(23.652,-1) from dual;
 #把數字或者日期轉換爲某種形式
 select to_char(sal,'$99,999.9999') from emp;  #9代表一位數字
 #人民幣
 select to_char(sal, 'L99,999.9999') from emp;
 
 #對日期進行轉換
 select hiredate from emp;
 select to_char(hiredate, 'YYYY-MM-DD HH:MI:SS') from emp;
 select to_char(sysdate, 'YYYY-MM-DD') from dual;
 
 select ename, hiredate from emp where hiredate> to_date('1981-2-20 12:34:36
','YYYY-MM-DD HH24:Mi:SS');

 select sal from emp where sal>to_number('$1,250.00','$9,999.99');
#計算年薪,如果comm是爲null的話,則讓其顯示0
 select ename, sal*12 + nvl(comm, 0) from emp; 
 
 #max函數
 select max(sal) from emp;
 #min函數
 select min(sal) from emp;
 #avg函數
 select avg(sal) from emp;
 #avg函數,將其轉換成to_char形式
 select to_char(avg(sal),'99,999.9999') from emp;
 #保留兩位小數
 select round(avg(sal),2) from emp;
 select sum(sal) from emp;
 select count(*) from emp;
 select count(*) from emp where deptno=10;
 select count(ename) from emp;   #14條記錄
 select count(distinct(deptno)) from emp; #3條記錄
 
 #group by 語句
 select avg(sal) from emp group by deptno;
 select max(sal) from emp group by deptno, job;
 select ename from emp where sal=(select max(sal) from emp);
 select deptno, max(sal) from emp group by deptno;
 
 #having子句,使用having對分組進行限制
 select avg(sal), deptno from emp group by deptno;
 select avg(sal), deptno from emp group by deptno having avg(sal) >2000;
 select avg(sal) from emp where sal>1200 group by deptno having avg(sal) >15
00 order by avg(sal) desc;

#子查詢
 select ename, sal from emp where sal=(select max(sal) from emp);
 select ename, sal from emp where sal> (select avg(sal) from emp);
 #下面這麼寫法是錯誤的
 select ename, sal ,deptno from emp where sal=(select max(sal) from emp group by
deptno);    #第 1 行出現錯誤:
#RA-01427: 單行子查詢返回多個行

 select ename, sal from emp join(select max(sal) max_sal, deptno from emp gr
oup by deptno) t on (emp.sal=t.max_sal and emp.deptno = t.deptno);

#理解子查詢的關鍵是把其當成一張表
#求出每個員工的上司是誰
select e1.ename, e2.ename from emp e1, emp e2 where e1.mgr=e2.empno;
select ename, dname, grade from emp e, dept d, salgrade s where e.deptno =
d.deptno and e.sal between s.losal and s.hisal and job<>'CLEAK';

#沒有表連接,默認是笛卡兒積
select ename, dname from emp, dept;
#或者
select ename, dname from emp cross join dept;
#有連接條件
select ename, dname from emp,dept where emp.deptno = dept.deptno;
#或者
select ename, dname from emp join dept on(emp.deptno = dept.deptno);
select ename, dname from emp join dept using(deptno);  #使用using的條件是兩個表中有相同的字段

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章