一、Oracle 中的分頁 1) select * from emp; 2)select * ,rownum from emp; //這樣寫不行 3)select ename,job,sal,rownum from emp; //可以 ENAME JOB SAL ROWNUM SMITH CLERK ...
一、Oracle 中的分頁
1) select * from emp;
2)select * ,rownum from emp; //這樣寫不行
3)select ename,job,sal,rownum from emp; //可以
ENAME JOB SAL ROWNUM
---------- --------- --------- ----------
SMITH CLERK 800.00 1
ALLEN SALESMAN 1600.00 2
WARD SALESMAN 1250.00 3
JONES MANAGER 2975.00 4
4)select a1.*,rownum from (select * from emp) a1 ;
5)select a1.*,rownum from (select * from emp) a1 and rownum <=10 ; //只查前10條 用過一次,就不能再用第二次
6)select * from (select a1.*,rownum 行號 from (select * from emp) a1 where rownum <=10) where 行號>=5; 查的是5到10條
查詢的變化,如果有改動,只要改變裡面的查詢即可,不管是排序,還是指定列查詢
二、Oracle 中的函數
1.字元串函數
--lower (char) // select lower('AAA') from dual; ->aaa
--upper(char)
--length() //select length('AAA') from dual -> 3
--substr(char,m,n) 取子串
--replace(char1,search_string,replace_string) //顯示所有emp姓名,用 a 替換所有的 A -> select replace(ename,'A','a') from emp;
--instr(char1,char2,[,n[,m]] 取子串在字元串中的位置
2.數學函數
--round(n,[m]) 四捨五入,省掉m則四捨五入到整數,如果m為正,則四捨五入到小數點的m位後,如果m是負數,則舍入到小數點的m位前
--trunc (n,[m]) 用於截取數字,省m則截掉小數部分,如果m為正,則四捨五入到小數點的m位後,如果m是負數,則舍入到小數點的m位前
--mod(m,n) 求模
--floor(n) 反回小於或是等於 n的最大整數
--ceil(n) 反回大於或是等於n 的最小整數
3.日期函數
--sysdate 返回系統時間 select sysdate from dual; mysql 用 now() , sqlserver 用 getDate()
--add_month(d,n) //查找已經入職 8 個月多的員工 select * from scott.emp where sysdate>add_months(hiredate,8);
--last_month(d) 返回指定日期所在月份的最後一天 //這個d 就是指定的日期
4.轉換函數
用於將數據從一種類型轉換成別一種在某些情況下,oracle server 允許值的數據類型和實際的不一樣,這時oracle 會隱含的轉變數據類型。比如 可以將 '11' 傳給 number類型。
反之也可以,將11 傳給 varchar2日期是否可以顯示時分秒?貨幣可否加 貨幣符號
SQL> select ename,to_char(hiredate,'yyyy-mm-dd hh24:mi:ss') from scott.emp; // 本例沒寫錯,上面的確實是 hh24,並且 那個地方確實是 mi
yyyy 表示 年份
mm 表示 月份
dd 表示 天
hh24 表示 小時
mi 表示 分鐘
ss 表示 秒
如果要寫成 yyyy-MM-dd hh:mm:ss 這樣就不對了,因為 Oracle 的爛格式很特
5.系統函數
SYS_context('...','...') //返回一個指定namespace下的parameter值。該函數可以在SQL和PL/SQL語言中使用。以下的例 子都要寫成 select sys_context('userenv','xxxx') from dual 這樣的方式:
1 terminal 當前會話客戶所對應的終端的標識符 select sys_context('userenv','terminal') from dual; -> AAA-74B992CC317
2 language 語言 ->SIMPLIFIED CHINESE_CHINA.ZHS16GBK
3 db_name 當前資料庫名稱 ->orcl
4 nls_date_format 當前會話所對應的日期格式 ->DD-MON-RR
5 session_user 當前會話所對應的資料庫用戶名 ->SA
6 current_schema 當前會話客戶所對應的預設方案名 SA
7 host 返回資料庫所在的主機名稱 ->WORKGROUP\AAA-74B992CC317
三、關於 dual 的說明
如下查詢 select 10+5 ; 可以發現出錯: 未找到要求的from 關鍵字,但這樣的寫法在mysql或sqlserver都是可以的,在oracle 中 要改寫成 select 10+5 from dual
T-SQL是SQL Server的語言引擎,而Oracle的語言引擎卻是 PLSQL。
這兩種查詢語言都對ANSI SQL-92標準進行了擴展以提供額外的支持力度。
用PLSQL執行數據查詢的時候,FROM子句是必須的,這同SQL Server的要求是不一樣的。
SELECT語句必須選擇針對的數據表。在Oracle資料庫內有一種特殊的表Dual。
Dual表是Oracle中的一個實際存在的表,任何用戶均可讀取,常用在沒有目標表的select中Dual表由Oracle連同數據字典一同創建,所有的用戶都可以用名稱DUAL訪問該表。這個表裡只有一列dummy,該列定義為VARCHAR2(1)類型,有一行值X。從DUAL表選擇數據常被用來通過SELECT語句計算常數表達式,由於DUAL只有一行數據,所以常數只返回一次。
==幾個常見的查詢
//查看當前連接的用戶 select user from dual;
//查看當前日期 select user from dual;
==幾個常見的查詢操作
//用查詢結果創建新表 create table T(id,name,sal, deptno) as select empno,ename,sal,deptno from emp;
//使用特定的格式插入日期 (使用 to_date 函數) insert into emp values (2000,'張三','XXX',9000,to_date('1999-12-15','yyyy-MM-dd'),3000,500,20);
//使用子查詢插入數據 //例子 : 把emp表中某些符合條件的數據,導入到 T2表中 create table T2(id number(5), stuName varchar2(20),deptNo number(5) ) ; insert into T2 (id,stuName,deptNO) select empno,ename,deptNO from emp where sal <2000
//使用子查詢更新數據 //例子 希望工 scott 的 崗位,工資,獎金 和smith 一樣 update emp set (job,sal,comm) =(select job,sal,comm from emp where ename='SCOTT') where ename='SMITH';
四、關於 sys 和 system用戶
用戶和方案的關係 一個用戶被創建以後,會創建一個對應的方案,和用戶名一樣,方案里裝的數據對象(表,視圖,序列....)
資料庫管理員
每個oracle都有一個或多個dba ,他的主要工作是什麼
1 安裝和升級oracle資料庫
2 建庫,建表空間,建表,視圖,索引
3 定製並實施備份計算和恢復計劃
4 資料庫的許可權管理,調優故障處理
5 高級dba 能參與項目開發,會寫sql語句,存儲過程,觸發器,函數,約束等
管理員管理資料庫用的用戶是 sys 和 system
最主要的區別 :存儲的數據的重要性不同
sys: 所有的數據字典和基表和視圖都放在sys用戶中,這些東西對oracle的運行是至關重要的,由資料庫自已維護,任何用戶都不能修改,sys 用戶擁有 dba,sysdab,sysoper 角色或許可權 ,是高許可權用戶
sysdba >sysoper >dba
system 用於存放次一級的數據, 比如orcle 的一些特性或工具的管理信息,它有dba,sysdba 角色或許可權
sys用戶必須以 as sysdba 或 sysoper 的方式登錄 不能normal 方式登錄
system 可以以sysdba 的身份登錄的,如果以這樣的方式登錄,其實登錄的就是sys
五、資料庫(表)的邏輯備分與恢復
邏輯備份: 用工具 export 將數據對象的結構和數據以文件的方式導出的過程
邏輯恢復: 用工具 import 從備份的文件把數據對象恢復的過程
物理備份和恢復: 在數庫open 的狀態下或關閉的狀態下均可進行,但邏輯備份和恢復必須在open的狀態的才能進行
== 導出
分三種 導出表 ,導出方案, 導出資料庫 //用戶和方案的關係:一個用戶創建以後,對應著一個方案,方案名和用戶名一樣,方案里裝的是數據對象
導出用 exp 命令 ,它有很多常用的選項
-- userid 用於指定執行導出操作的用戶名,口令,連接字元串 //scott/scott@orcl
-- tables 用於指定要導出的表
-- owner 執行導出操作的方案
-- full=y 指定導出的是整個資料庫
-- inctype 指導出操作的增量類型
-- rows 指定導出操作是否要導出表中的數據 // rows=n 表示不導出數據,只導出表結構
-- file 指定文件名
--導出表
1) 導出自己的表 比如 scott 導出自已的 emp 和 dept 表
exp userid=scott/scott@orcl tables=(emp,dept) file="c:\scott.dmp" //註意 export 是oracle帶的工具,在 C:\oracle\product\10.2.0\db_2\bin 目錄下 叫 exp.exe
2) 導出其他方案中的表
要導出其他方案中的表,要有dba 的許可權或 exp_full_database 許可權
3) 導出表結構
在上面的操作後面加上 rows=n 即可
4) 使用直接導出的方式
在上面的語句後面加上 direct=y 即可
速度快,數據量大的時候適用,但要求 資料庫的字元集和客戶端的字元集一致,否則會報錯
== 導入
導入有導入表,導入方案,導入資料庫
導入用的命令是 imp
常用的選項
-- userid 指定導入用的用戶名和密碼連接串
-- tables 執行導入的表
-- fromuser 指定源用戶
-- touser :指定目標用戶
-- file 指定要導入的文件名
-- inctype 指導入操作的增量類型
-- rows 指定導入操作是否要導入表中的數據 //rows=n 表示不導入數據,只導入表結構
-- ignore 如果表存在,則只導入數據
導入表
1) 導入自己的表
imp userid=scott/scott@orcl tables=(emp,dept) file=c:\scott.dmp
2) 把某個或某些表導給其他用戶
imp userid=system/system@orcl tables=(dept,emp) file=c:\scott.dmp touser=zs //這裡不要加 scott. 還有,要註意約束造成的問題
3 導入表結構
imp userid=scott/scott@orcl tables=(emp,dept) file=c:\scott.dmp rows =n
4) 導入數據
imp userid=scott/scott@orcl tables=(emp,dept) file=c:\scott.dmp ignore=y
導入方案
1) 導入自己的方案
imp userid=scott/scott file=d:\xxx.dmp;
2) 導入其他方案
imp userid system/aaaaaaaa file=d:\xxx.dmp fromuser=system touser=scott;
3) 導入資料庫
imp userid system/aaaaaaaa full=y file=c:\database.dmp;