一、sqlplus鏈接遠程Oracle命令sql
sqlplus(須要設置環境變量) scott(用戶名)/5456(密碼)@192.168.230.128:1521(IP)/orcl(數據庫名) -- 若是是本地的Oracle,@後面的不用寫數據庫
二、查看當前用戶函數
show user -- sqlplus命令優化
三、查看當前用戶下的表spa
select * from tab;3d
四、執行上一條SQL語句code
/ -- sqlplus命令orm
1)查看員工表結構——descblog
desc emp;排序
2)查詢員工表中的數據
select * from emp;
eg.查詢員工表中的員工號,姓名,月薪,年薪(月薪*12)
SELECT EMPNO,ENAME,SAL,SAL*12 FROM EMP;
3)取別名的3種方式
/** * 取別名的3種方式: * 1.加不加as是同樣的 * 2.若是起的別名中沒有特殊字段,能夠不用加"" */ SELECT EMPNO "員工id", ENAME AS "員工姓名", SAL 月薪, SAL * 12 "年 薪", -- 有空格,要加"" NVL( COMM, 0 ) "獎select金", -- 有特殊字段,要加"" SAL * 12+NVL ( COMM, 0 ) 年收入 FROM EMP;
4)去重——distinct
SELECT DISTINCT JOB, EMPNO FROM EMP; -- 去重,distinct修飾的後面的全部字段(JOB和EMPNO二者搭配不重複),只要字段們不重複就展現
5)字符串鏈接
鏈接符 「||」
/** * 字符串鏈接 * MySQL版:select concat('hello',' world'); -- 要用 單引號(單引號表示日期和字符串,雙引號表示列的別名) * Oracle版:select concat('hello',' world') from dual; -- 若是前面的操做,和任何表都沒有關係就用dual表(僞表) * select 'hello' || ' world' from dual; */
6)排序
order by後面能夠+列、表達式、別名、序號
SELECT EMPNO, ENAME, SAL, SAL * 12 "年薪" FROM EMP ORDER BY "年薪", -- 咱們還可使用列號來代替字段,好比此處就能夠寫4(第4列) SAL;-- 多個列排序,order by先按照第一個排序,在按照後面的列排序
desc只做用於離他最近的字段
SELECT EMPNO, ENAME, SAL, SAL * 12 "年薪" FROM EMP ORDER BY EMPNO, "年薪" desc; -- desc只做用於離他最近的字段
1)包含null的表達式結果都爲null
SELECT EMPNO, ENAME, SAL, SAL * 12, COMM, SAL * 12+COMM FROM EMP;
此時咱們須要一個方法NVL
nvl(a,b) -- 判斷a是否爲null,若是爲null則取b的值
修改後的:
SELECT EMPNO, ENAME, SAL, SAL * 12, NVL(COMM, 0), SAL * 12+NVL(COMM, 0) FROM EMP;
2)null永遠不爲null
空值是無效的,未指定的,未知的或不可預知的值;空值不是0或者空格
SELECT * FROM EMP WHERE COMM IN ( 300, 500, NULL );
3)若是集合中含有null,不能使用not in,可使用in
SELECT * FROM EMP WHERE COMM NOT IN ( NULL );
4)null值的排序問題
SELECT * FROM emp ORDER BY COMM DESC; -- 緣由:在Oracle中,空值最大
爲了讓null值放到最後,採用nulls last進行操做:
SELECT * FROM emp ORDER BY COMM DESC NULLS LAST;
5)分組/多行/組函數會自動濾空
1.*和列名,儘可能使用列名 -- 列名:減小了分析過程
2.where解析順序是從右-->左,儘可能把假的放前面
使用where語句對查詢結果進行過濾
1)非空和空的限制
eg.查詢每月能獲得獎金的僱員
SELECT * FROM EMP WHERE comm IS NOT NULL;
2)範圍限制
eg1.查詢基本工資大於1500可是小於3000的所有僱員
SELECT * FROM EMP WHERE SAL>1500 AND SAL<3000;
或
SELECT * FROM EMP WHERE SAL BETWEEN 1500 AND 3000; -- 這種方式包括1500和3000
eg2.查詢1981-1-1到1981-12-31入職的僱員(between and還能夠用於日期的區間)
SELECT * FROM EMP WHERE HIREDATE BETWEEN to_date( '1981-1-1', 'yyyy-mm-dd' ) AND to_date( '1981-12-31', 'yyyy-mm-dd' ); -- 字符串==>日期
eg3.查詢僱員編號爲7369,7499,7521的僱員標號的具體信息
SELECT * FROM EMP WHERE EMPNO IN (7369,7499,7521);
3)模糊查詢
SQL中採用LIKE關鍵字表示模糊查詢,它有如下通配符:
eg.查詢僱員名中第二個字符包含M的僱員
SELECT * FROM EMP WHERE ENAME LIKE '_M%';
轉小寫——lower
SELECT LOWER( 'HELLO,WORLD' ) 轉小寫 FROM dual;
轉大寫——upper
SELECT UPPER( 'hello,world' ) 轉大寫 FROM dual;
首字母大寫——initcap
SELECT initcap( 'hello,world' ) 首字母大寫 FROM dual; >> Hello,World
取子串——substr
SELECT substr( 'Hello World', 4 ) 子串 FROM dual;--substr(a,b) 從a中,第b位開始取 SELECT substr( 'Hello World', 4, 3 ) 子串 FROM dual;--substr(a,b,c) 從a中,第b位開始取,取c位
取字符數與字節數——length,lengthb
SELECT length( 'Hello 中國' ) 字符, -- 8 lengthb ( 'Hello 中國' ) 字節 -- 10 FROM dual;
在a中,查找b的位置——instr
SELECT instr( 'Hello World', 'lo' ) 位置 FROM dual; >>3
左填充與右填充——lpad,rpad
SELECT lpad( 'abcd', 10, '*' ) 左, rpad( 'abcd', 10, '*' ) 右 FROM dual; >>左:******abcd,右:abcd******
去掉先後指定的字符
SELECT trim( 'H' FROM 'Hello WorldH' ) FROM dual; >>ello World
替換——replace
SELECT REPLACE ( 'Hello World', 'l', '*' ) FROM dual; >>He**o Wor*d
四捨五入——round(數字+日期)
SELECT round( 45.926, 2 ) 一, round( 45.926, 1 ) 二, round( 45.926, 0 ) 三, round( 45.926,- 1 ) 四, round( 45.926,- 2 ) 五 -- round(55.926,-2) ==> 100 FROM dual; 一 二 三 四 五 ---------- ---------- ---------- ---------- ---------- 45.93 45.9 46 50 0 SELECT round( SYSDATE, 'month' ), -- 時間按月來4舍5入 round( SYSDATE, 'year' ) -- 按年來4舍5入 FROM dual; >>2018-05-01 00:00:00 2018-01-01 00:00:00
截斷——trunc
SELECT trunc( 45.926, 2 ) 一, trunc( 45.926, 1 ) 二, trunc( 45.926, 0 ) 三, trunc( 45.926,- 1 ) 四, trunc( 45.926,- 2 ) 五 FROM dual 一 二 三 四 五 ---------- ---------- ---------- ---------- ---------- 45.92 45.9 45 40 0
顯示當前時間
SELECT SYSDATE FROM dual; >>2018-05-01 15:10:03
格式化時間(日期-->字符串)
SELECT to_char( SYSDATE, 'yyyy-mm-dd hh24:mi:ss' ) FROM dual; >>2018-05-01 15:10:43
eg.打印昨天,今天,明天
SELECT ( SYSDATE - 1 ) 昨天, SYSDATE 今天, ( SYSDATE + 1 ) 明天 FROM dual; 昨天 今天 明天 -------------- -------------- -------------- 28-9月 -16 29-9月 -16 30-9月 -16
eg.計算員工的工齡:天,星期,月,年
SELECT ename, hiredate, ( SYSDATE - hiredate ) 天, ( SYSDATE - hiredate ) / 7 星期, ( SYSDATE - hiredate ) / 30 月, ( SYSDATE - hiredate ) / 365 年 FROM emp;
返回兩個日期之間的月份數
-- 查詢ename的入職時間,與當前時間相差幾個月 SQL> select months_between(sysdate,hiredate) from emp where ename='FORD'; MONTHS_BETWEEN(SYSDATE,HIREDATE) -------------------------------- 439.12001 -- 查詢系統時間與指定字符串(必須按照這個格式寫,固然能夠修改Oracle的日期格式)相差幾個月 SQL> select months_between(sysdate,'06-6月-18') from emp where ename='FORD'; MONTHS_BETWEEN(SYSDATE,'06-6月-18') ----------------------------------- 1
計算當前系統時間加上53個月後的日期
SELECT add_months( SYSDATE, 53 ) FROM dual; >>2022-10-01 15:41:31
本月的最後一天
SELECT last_day( SYSDATE ) FROM dual; >>2018-05-31 15:42:53
獲取下個星期三的日期
SELECT next_day( SYSDATE, 'wed' ) -- 下個星期三的日期 FROM dual; select next_day(sysdate,'星期五') from dual; -- 牛B:居然能夠用中文 NEXT_DAY(SYSDA -------------- 13-7月 -18
a.日期到字符串的轉換
TO_CHAR(date,'format_model')
SELECT EMPNO, ENAME, TO_CHAR( HIREDATE, 'YYYY"年"MM"月"DD' ) -- 日期轉字符串 FROM emp;
b.數字到字符串的轉換
TO_CHAR(number,'format_model')
SELECT EMPNO, ENAME, TO_CHAR(SAL,'$99,999') -- 格式化成的字符串格式 FROM emp
SELECT TO_NUMBER('10') FROM dual
SELECT TO_DATE('1985-04-22', 'YYYY-MM-DD')-- 之後面的格式進行轉換 FROM dual
NVL(a,b):判斷a是否爲空,爲空返回b,不爲空返回a
NVL2(a,b,c):當a=null時,返回c,不然返回b
NULLIF(a,b):a和b的值相等時,返回null;不然返回a
COALESCE(a,b,c,...):從左往右找到第一個不爲空的值
條件表達式就是SQL中的判斷,他有如下兩種實現方式:
eg.實現給員工漲工資,總裁1000 經理800 其餘400
CASE表達式版
SELECT ename, job, sal 漲前, CASE job WHEN 'PRESIDENT' THEN sal + 1000 WHEN 'MANAGER' THEN sal + 800 ELSE sal + 400 END 漲後 FROM emp;
上面的至關於等號,這個至關於範圍
DECODE函數版
SELECT ename, job, sal 漲前, decode( job, 'PRESIDENT', sal + 1000, 'MANAGER', sal + 800, sal + 400 ) 漲後 FROM emp;
1)統計記錄數——count()
2)最小值查詢——min()
3)最大值查詢——max()
4)查詢平均值——avg()
5)求和函數——sum()
6)分組查詢——group by
having後面的條件能夠加多行函數
SELECT DEPTNO, MIN( SAL ) FROM EMP GROUP BY DEPTNO HAVING MIN( SAL ) > 900;
左鏈接