#登錄到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的條件是兩個表中有相同的字段