1.清屏
windows:host cls;
linux:host clear;
2.對日期的處理
1)系統默認的類型:
select sysdate from dual;-->注:sysdate 是系統的當前時間 系統默認格式爲:日-月-年
2)to_char()的用法
語法:TO_CHAR(date,'format_model')
格式:
日期格式的元素
格式 |
說明 |
舉例 |
YYYY |
Full year in numbers |
2011 |
YEAR |
Year spelled out(年的英文全稱) |
twenty eleven |
MM |
Two-digit value of month 月份(兩位數字) |
04 |
MONTH |
Full name of the month(月的全稱) |
4月 |
DY |
Three-letter abbreviation of the day of the week(星期幾) |
星期一 |
DAY |
Full name of the day of the week |
星期一 |
DD |
Numeric day of the month |
02 |
select to_char(sysdate,'yyyy-mm-dd') from dual;
3)修改系統的默認日期類型:
查看系統默認的參數:select * from v$nls_parameters;
修改當前會話中的日期類型的默認格式(只在當前會話有效)
alter session set nls_date_format='yyyy-mm-dd'; // 只對當前session有效
4)使用日期類型函數
SQL> select * from emp where hiredate>to_date('1981-12-31', 'yyyy-MM-dd');
或
SQL> select * from emp where to_char(hiredate, 'yyyy-MM-dd') > '1981-12-31';
語法:TO_CHAR(date, 'format_model')
語法:TO_DATE(str, 'format_model')
3.排序
語法:order by 列名 asc/desc 注:這裏的列名只能是數字,字符串,日期類型
asc 默認就是升序
desc 降序
例:按照員工的姓名排序
例:按照員工的薪水從低到高排序
當order by所在的列中有null,會:
升序時,null的在下面。
降序時,null的在上面。
我們希望,不管升序還是降序,null值的始終在下面
方式一:select empno,ename,sal,comm from emp order by comm nulls last;-->使用nulls last 可以使得null放在最後面
方式二: select empno, ename, job, hiredate, sal, nvl(comm, 0) from emp order by 6 desc
4.組函數
select
max(sal) 最高工資,
min(sal) 最低工資,
avg(sal) 平均工資,
sum(sal) 所有員工的工資和,
count(sal) 領工資的員工數量
from emp;
例:查詢emp表中的平均工資
select sum(comm)/count(*) from emp; 這裏的count(*) 會查詢出包括comm爲null的記錄數
select avg(comm) from emp;這裏的avg會自動慮null 因此comm爲null的行不算 這裏記錄數就爲3
因此上述的使用avg應改爲:select avg(nvl(comm,0)) from emp; 注:函數可以嵌套使用
注意:
按一個列分組
按多個列分組
參與分組的多個列有一個不相同就是不同的組。
having與where的區別:
Having,是分完組後再進行過濾,只顯示符合條件的結果。
在Group by與Having中都不可以使用別名。
與Where的區別
Having是是分完組後再進行過濾。
Where是先過濾,再進行分組操作。
如果可以,儘量寫Where條件,不寫Having。
5.子查詢
當一步不能求解時,可以使用子查詢
分爲:單行子查詢/多行子查詢
例:查詢工資比Scott高的員工信息
select ename from emp where sal>(select sal from emp where ename='SCOTT');
注意問題:
1. 子查詢相對主查詢往右縮進
2. 將子查詢放入括號中
3. 換行
4. 可以在主查詢的select, from, where, having 都可以放子查詢
5. 不可以在主查詢的group by 放子查詢
6. 主查詢和子查詢可以不是用一張表,只要子查詢返回的結果主查詢可以使用,即可
7. 在from後面放子查詢(*****)
select 後面放子查詢: 該子查詢必須是單行子查詢
from 後面放子查詢: 查詢員工的編號和姓名
主查詢和子查詢可以不是用一張表,只要子查詢返回的結果主查詢可以使用,即可
例:查詢部門名稱爲ACCOUNTING的員工信息
多行子查詢
in: 在集合中
例:查詢部門名稱爲ACCOUNTING和SALES的員工信息
select * from emp where deptno in( select deptno from dept where dname ='ACCOUNTING' or dname='SALES')
any:和子查詢中任意(隨便)一個值比較
查詢工資比10號部門任意一個員工工資低的員工信息
select * from emp where sal<any(select sal from emp where deptno=10);或者
select * from emp where sal<(select min(sal) from emp where deptno=10);
all: 和子查詢中所有值比較
查詢工資比10號部門所有員工工資低的員工信息
select * from emp where sal<all(select sal from emp where deptno=10);
**
any: 小於集合中的最大值
all: 小於集合中的最小值
any: 大於集合中的最小值
all: 大於集合中的最大值