天天看點

Oracle基礎

Oracle 基礎操作

#使用者建立

1 sqlplus /nolog
2 sys/password as sysdba--進系統管理者
3 create user user_name identified by password--建立使用者
4 grant dba to user_name--授予權限 
5 revoke 權限 from user_name --撤銷權限
6 alter user user_name account (un)lock--解鎖或鎖定
7 alter user user_name identified by password --修改使用者密碼
8 drop user user_name --删除使用者      

#表建立

user_name/password --進使用者
create table table_name (column1 modify 限制,column2 modify 限制,...)--建立表及結構
create table table_name as select * from 另一個表 (where 條件) --把另一個表的全部資料及表結構複制/某些資料
insert into table_name (column1,column2,...) values (值1,值2,...)---給表插入資料      

#增删改

1 alter table table_name add (column modify 限制)--增加列
2 alter table table_name modify (column modify)--修改列類型
3 alter table table_name rename column (old_column to new_column)--更改列名
4 alter table table_name drop column column_name --删除列
6 update table_name set column_name=新值 (where 條件) --更新表的某行
7 delete from table_name (where 條件)--删除表裡的資料
      

#函數

1、trunc(截段函數)
round(四舍五入)
round(a,b):
a:要進行操作(四舍五入)的對象
b:保留幾位小數
select sal/30,round(sal/30) from emp 
select sal/30,round(sal/30,2) from emp 
select sal/30,round(sal/30,-2) from emp 
trunc(截段)
trunc(a,b):
a:要進行截段的對象
b:截取幾位
select sal/30,trunc(sal/30) from emp 
select sal/30,trunc(sal/30,2) from emp 
select sal/30,trunc(sal/30,-1) from emp
select trunc(sysdate,'mm') from dual

2,substr 截取函數
instr(滿足字元串傳回值函數)
substr(a,b,c)
select substr('abcde',2,3) from dual
a:截取的對象
b:從第幾位開始截
c:截取幾位長度
select substr('abcde',2) from emp;
特例:c c為0,則不截取字元串長度,c沒有内容,從起始位截取全部字元串
select substr('abcde',2,-3) from dual
b: b為0 也為從第一位開始截取
select substr('abcde',0) from emp;
b<0 
select substr('abcdeefdghjbcdvs',-7,4) from dual;
instr 判斷需求字元串在已知字元串中的位置
instr(a,b)
select instr('abcde','bd')from dual
select instr(ename,'S') FROM EMP
a:已知字元串
b:需求字元串
select instr ('abcdcba','b',1) from dual
c;從第幾位開始找
select instr('abcdcba','b',1,2) from dual
d;第幾次找到需求字元串(隻能取正整數)
select instr('abcdcba','b',1,-1) from dual
C:---2(表示從右往左找位置,并且從後往前找需求字元串)
select instr('abeccdcba','c',-4,2) from dual;
着重強調:
1,在substr中,若b為負數,從後往前數b的位置,從前往後截c的長度
select substr('aabbcc',-3,2) from dual
2,在instr中,若c為負數,從後往前數c的位置,在向前找b
select instr('aabbcc','b','-3') from dual
3,在instr中,無論什麼情況,位置數總是從前向後數。      

函數練習:

Oracle基礎
Oracle基礎
1 以首字母大寫的方式顯示所有員工的姓名
SELECT  INITCAP(ename) FROM emp

2 将員工的職位用小寫顯示
SELECT LOWER(job) FROM emp
3 将員工的名字分别用大寫和小寫顯示 
SELECT UPPER(ename),LOWER(ename) FROM emp

4 将員工名字,首字母小寫,其他字母大寫的方式顯示
SELECT LOWER(SUBSTR(ename,1,1))||UPPER(SUBSTR(ename,2)) FROM emp

5 顯示員工姓名為5個字元的員工
SELECT * FROM emp WHERE LENGTH(ename)=5
6 顯示所有員工姓名的前三個字元
SELECT substr(ename,1,3) FROM emp

7 顯示所有員工姓名的後三個字元
SELECT SUBSTR(ename ,-3) FROM emp

8 以字元長度為10的方式顯示員工職位,多餘的位數在右邊以*來填充
SELECT RPAD(job,10,'*') job FROM emp

9 找出字元串"oracle training"中第二個ra出現的位置
SELECT INSTR('oracle training','ra',1,2) FROM dual

10 去除字元串‘ aadde gf ’兩邊的空格
SELECT TRIM(' aadde gf') FROM dual

11 以指定格式顯示員工的工資(格式:SMITH 的工資是 800)
SELECT ename||'的工資是:'||sal FROM  emp
12 顯示所有員工的姓名,用a替換所有"A"
SELECT REPLACE(ename,'A','a') FROM emp
13 顯示員工姓名中包含‘H’的員工
SELECT ename FROM emp WHERE ename LIKE '%H%'

14 顯示員工姓名中第二個字元是‘L’的員工
SELECT ENAME FROM EMP WHERE SUBSTR(ENAME,2,1)='L'

15 顯示員工姓名中最後一個字元是‘T’的員工
SELECT ENAME FROM EMP WHERE SUBSTR(ENAME,-1,1)='T'


16 查詢一個月前入職的員工
SELECT * FROM EMP WHERE hiredate = add_months(hiredate,-1)

17 顯示在一個月為30天的情況所有員工的日薪,忽略餘數
SELECT FLOOR(SAL/30) FROM EMP 

18 顯示員工在此公司工作了幾個月(要求結果是整數)
SELECT FLOOR(MONTHS_BETWEEN(SYSDATE,HIREDATE)/12) FROM EMP

19 顯示所有12月份入職的員工
SELECT ENAME FROM EMP WHERE TO_CHAR(HIREDATE,'MM')=12

20 顯示員工的年薪(12個月的工資+補貼)
SELECT (SAL+NVL(COMM,0))*12 FROM EMP

21 顯示所有員工的姓名、加入公司的年份和月份,并且按照年份排序
SELECT ENAME,TO_CHAR(HIREDATE,'YYYY') Y ,TO_CHAR(HIREDATE,'MM') M FROM EMP ORDER BY Y,M

22 顯示每月倒數第3天入職的所有員工
SELECT ENAME FROM EMP WHERE HIREDATE = LAST_DAY(HIREDATE)-2

23 顯示入職滿10年的員工的姓名和受雇日期。 
SELECT ENAME,HIREDATE FROM EMP WHERE MONTHS_BETWEEN(SYSDATE,HIREDATE)/12 >=10       

練習和答案

#簡單查詢(列名表名不過多贅述,以學習賬戶scott為例)

select  (column1,column2...)查詢的列名   from  查詢的表名  where 條件; --一般條件查詢      

#order by 、group by

select * from emp order by sal desc (降序) asc(升序) --以工資降序或者升序排列

select deptno,max(sal)  from emp group by deptno  --以部門分組查詢部門最高工資      

注意:用group by 分組的時候,查詢的必須是分組的列,或者用組函數(max、min、count、avg 、sum)組合使用

#子查詢

将一般查詢作為一張表,用另一個查詢查這張表,再用上一張表繼續查詢(多表查詢)

例:求出工資排名6-10的員工

1 SELECT *
2   FROM (SELECT E.*, ROWNUM R
3           FROM (SELECT * FROM EMP ORDER BY SAL DESC) E
4          WHERE ROWNUM <= 10)
5  WHERE R >= 6