花點時間整理下sql基礎,溫故而知新,也方便復習查看。文章的demo來自oracle自帶的dept,emp,salgrade三張表。解鎖scott用戶,使用scott用戶登錄就可以看到自帶的表。
#使用oracle用戶登錄linux
[oracle@localhost ~]$ sqlplus / as sysdba;
......
SQL> alter user scott account unlock;
DQL語句——select
DML語句——insert,upate,delete等(關鍵字後帶表名)
DDL語句——create,alter,drop等(關鍵字後帶table關鍵字再跟表名)
事務控制語句——commit,rollback
select * from emp;
--查詢出來的sal乘以5
select ename , sal*5 from emp;
--表中取出2*3的結果
select 2*3 from emp;在emp;
--當我們需要顯示一個結果的時候就用系統提供的dual虛表
select 2*3 form dual;
--sysdate在Oracle中表示當前系統時間
select sysdate from dual;
--顯示出來的是salary字段名而不是sal
select ename, sal*12 salary from emp;
--含有任何null值的數學表達式最後的結果都為null
select ename, sal*5+comm from emp;
--含有任何null值的字符串表達式中,null被當作空字符串處理
select empno, ename || 'abc' || mgr from emp;
--字符串連接符:||。select語句中用單引號表示字符串
--用distinct消除結果集中deptno相同的記錄
select distinct deptno from emp;
--消除結果集中job和deptno都相同的記錄
select distinct job, deptno from emp;
select * from emp where empno = 7369;
(1)>,<,>=, <= ,<>
--取出所有部門號不是10的雇員的名字和薪水
select ename, sal from emp where deptno <> 10;
(2)between..and..
--包含最大值和最小值
select ename, sal from emp where sal between 800 and 1500;
(3)字符串比較
比較字符串ASCII碼值的比較,先比較第一字母,依次比較每個字母
select ename, sal from emp where ename > ‘DBA’;
--為空
select ename from emp where comm is null;
--不為空
select ename from emp where comm is not null;
--在選定范圍
select ename, sal from emp where sal in (800, 1250, 1500, 2000);
--不在選定范圍
select ename, sal from emp where sal not in (800, 1500, 2000);
--Oracle默認的日期格式為:DD-MON-RR
select ename, hiredate from emp where hiredate > ’20-2月-1981’;
--to_char(),把日期類型字段轉為指定格式的字符串
--輸出2008-04-04
select to_char(sysdate, ‘YYYY-MM-DD-HH24:MI:SS’) from dual;
--to_date(),將日期字符串轉為指定格式的日期
select * from emp where hiredate > to_date(‘1981-03-02’, ‘YYYY-MM-DD’);
--and
select deptno, ename, sal from emp where deptno = 10 and sal > 1000;
--or
select deptno, ename, sal from emp where deptno = 10 or sal > 1000;
--not
select ename, sal from emp where sal not in (800, 1500, 2000);
(1)通配符%,代表0個或者多個字符
select ename from emp where ename like ‘%ALL%’;
(2)單個字符-,代表一個字符
select ename from emp where ename like ‘_A%’;
(3)轉義字符\,統默認的轉義字符是 ‘\’
--中間的%不表示通配符,而是表示姓名包含%
select ename from emp where ename like ‘%\%%’;
select ename, sal from emp order by ename asc;
select ename, deptno from emp order by ename desc;
select lower(ename),sal from emp where lower(ename) like '%a%';
select upper(ename),sal from emp where upper(ename) like '%a%';
--從第2個字符開始截取ename
select substr(ename, 2) from emp;
--substr('hello',1,3),輸出hel,第三個參數可以省略
select substr('hello', 1,3) from dual;
select chr(65) from dual;
select ascii(‘A’) from dual;
對參數值進行四捨五入,可以指定四捨五入到小數點後幾位,可以用負數指定小數點前面幾位
--輸出24
select round(23.652) from dual;
--輸出23.65
select round(23.652,2) from dual;
--輸出20,-1表示對個位數進行四捨五入
select round(23.652,-1) from dual;
--輸出0,-2表示對十位數進行四捨五入
select round(23.652,-2) from dual;
把日期類型字段轉為指定格式的字符串,可以精確到時分秒
--輸出2008-04-04
select to_char(sysdate, ‘YYYY-MM-DD’) from dual;
--2008-04-04 01:10:21
select to_char(sysdate,'YYYY-MM-DD hh:mm:ss') from dual;
將日期字符串轉為指定格式的日期
select * from emp where hiredate > to_date(‘1981-03-02’, ‘YYYY-MM-DD’);
將指定的字符串轉換成數字格式,第一個參數為要轉為數字的字符串(一定要確保所轉換字段是可轉換為數字的,否則報“invalid number”),第二個參數為指定的格式
select * from emp where sal > to_number(‘$1,200.00’, ‘$9,999.99’);
這個函數有兩個參數:
第一參數:字段名或表達式,如果這個參數值為null,就返回第二參數值,否則返回第一參數值。
select ename, sal*12+nvl(comm, 0) from emp;
select sum(sal), avg(sal), max(sal), min(sal) from emp;
--求記錄數量
select count(*) from emp;
--求comm字段中所有非空記錄的數量
select count(comm) from emp;
--和distinct一起使用,得到所有唯一值記錄的數量
select count(distinct deptno) from emp;
對組函數的查詢結果進行分組
使用group by 的規律:出現在select列表中的字段,如果沒有出現在組函數中,則必須出現在group by子句中。
select deptno, avg(sal) from emp group by deptno;
--典型錯誤,group by缺少ename
select ename, deptno, max(sal) from emp group by deptno;
--求出每個部門中最賺錢的那個人的名字
select ename, deptno, sal from emp where sal in (
select sal from (
select deptno, max(sal) sal from emp group by deptno
))
having語句的作用是對分組之後的數據進行過濾數據,where 語句的作用是分組之前過濾數據。
--注意不能使用where
select avg(sal), deptno from emp group by deptno having avg(sal) > 2000;
從emp這張表裡把平均工資和部門編號列出來,並且過濾掉大寫是A的名字 把剩下的數據按照部門編號進行分組,分組之後的平均薪水必須大於2000,按照部門編號的倒序排列。
分析:分組,過濾,排序;過濾又包含分組前過濾(where)和分組後過濾(having)。編寫順序:分組前過濾(where) > 分組(group by) > 分組後過濾(having) > 排序(order by)
select avg(sal),deptno,ename from emp where ename not like '%A%' group by deptno,ename having avg(sal) > 2000 order by deptno desc;
本文就到此,下一篇我們繼續整理多表連接查詢、子查詢、視圖相關內容。