oracle SQL查詢語句
SELECT LPAD(' ',(LEVEL-1)*3)||ename
FROM emp
START WITH ename='SMITH'
CONNECT BY PRIOR empno=mgr ;
SELECT ename
FROM emp
START WITH ename='SCOTT'
CONNECT BY PRIOR mgr=empno
ORDER BY LEVEL DESC ;
SELECT LPAD(' ',(LEVEL-1)*3)||ename
FROM emp
START WITH mgr IS NULL
CONNECT BY PRIOR empno=mgr ;
你問的是ORACLE中層次樹狀查詢,START WITH 。。 CONNECT BY 用法。
START WITH 指明樹的起點。至于是找上級還是下級(也就是你問的),關鍵就在于PRIOR的用
法。PRIOR的意思是前一個。
比如:START WITH ename='SMITH'
CONNECT BY PRIOR empno=mgr ;
的意思:ename='SMITH'表示樹的起點,即第一行
CONNECT BY PRIOR empno=mgr 表示上一行員工的編號是當前行的管理者,即找SMITH的下屬。
START WITH ename='SCOTT'樹的起點,即第一行
CONNECT BY PRIOR mgr=empno 表示上一行員工的管理員編號是當前員工的編號,即找SCOTT的上級及間接上級。
ORACLE中常用的SQL語法是什么
數據控制語句 (DML) 部分 1。
INSERT (往數據表里插入記錄的語句) INSERT INTO 表名(字段名1, 字段名2, ……) VALUES ( 值1, 值2, ……); INSERT INTO 表名(字段名1, 字段名2, ……) SELECT 字段名1, 字段名2, …… FROM 另外的表名;字符串類型的字段值必須用單引號括起來, 例如: 'GOOD DAY' 如果字段值里包含單引號' 需要進行字符串轉換, 我們把它替換成兩個單引號''。 字符串類型的字段值超過定義的長度會出錯, 最好在插入前進行長度校驗。
日期字段的字段值可以用當前數據庫的系統時間SYSDATE, 精確到秒 或者用字符串轉換成日期型函數TO_DATE('2001-08-01','YYYY-MM-DD') TO_DATE()還有很多種日期格式, 可以參看ORACLE DOC。 年-月-日 小時:分鐘:秒 的格式YYYY-MM-DD HH24:MI:SS INSERT時最大可操作的字符串長度小于等于4000個單字節, 如果要插入更長的字符串, 請考慮字段用CLOB類型, 方法借用ORACLE里自帶的DBMS_LOB程序包。
INSERT時如果要用到從1開始自動增長的序列號, 應該先建立一個序列號 CREATE SEQUENCE 序列號的名稱 (最好是表名+序列號標記) INCREMENT BY 1 START WITH 1 MAXVALUE 99999 CYCLE NOCACHE;其中最大的值按字段的長度來定, 如果定義的自動增長的序列號 NUMBER (6) , 最大值為999999 INSERT 語句插入這個字段值為: 序列號的名稱。 NEXTVAL 2。
DELETE (刪除數據表里記錄的語句) DELETE FROM表名 WHERE 條件;注意:刪除記錄并不能釋放ORACLE里被占用的數據塊表空間。 它只把那些被刪除的數據塊標成unused。
如果確實要刪除一個大表里的全部記錄, 可以用 TRUNCATE 命令, 它可以釋放占用的數據塊表空間 TRUNCATE TABLE 表名; 此操作不可回退。 3。
UPDATE (修改數據表里記錄的語句) UPDATE表名 SET 字段名1=值1, 字段名2=值2, …… WHERE 條件;如果修改的值N沒有賦值或定義時, 將把原來的記錄內容清為NULL, 最好在修改前進行非空校驗; 值N超過定義的長度會出錯, 最好在插入前進行長度校驗。 。
注意事項: A。 以上SQL語句對表都加上了行級鎖, 確認完成后, 必須加上事物處理結束的命令 COMMIT 才能正式生效, 否則改變不一定寫入數據庫里。
如果想撤回這些操作, 可以用命令 ROLLBACK 復原。 B。
在運行INSERT, DELETE 和 UPDATE 語句前最好估算一下可能操作的記錄范圍, 應該把它限定在較小 (一萬條記錄) 范圍內,。 否則ORACLE處理這個事物用到很大的回退段。
Oracle維護常用SQL語句是什么
1、查看表空間的名稱及大小 select t。
tablespace_name, round(sum(bytes/(1024*1024)),0) ts_size from dba_tablespaces t, dba_data_files d where t。 tablespace_name = d。
tablespace_name group by t。tablespace_name; 2、查看表空間物理文件的名稱及大小 select tablespace_name, file_id, file_name, round(bytes/(1024*1024),0) total_space from dba_data_files order by tablespace_name; 3、查看回滾段名稱及大小 select segment_name, tablespace_name, r。
status, (initial_extent/1024) InitialExtent,(next_extent/1024) NextExtent, max_extents, v。curext CurExtent From dba_rollback_segs r, v$rollstat v Where r。
segment_id = v。usn(+) order by segment_name ; 4、查看控制文件 select name from v$controlfile; 5、查看日志文件 select member from v$logfile; 6、查看表空間的使用情況 select sum(bytes)/(1024*1024) as free_space,tablespace_name from dba_free_space group by tablespace_name; SELECT A。
TABLESPACE_NAME,A。BYTES TOTAL,B。
BYTES USED, C。BYTES FREE, (B。
BYTES*100)/A。BYTES "% USED",(C。
BYTES*100)/A。BYTES "% FREE" FROM SYS。
SM$TS_AVAIL A,SYS。SM$TS_USED B,SYS。
SM$TS_FREE C WHERE A。TABLESPACE_NAME=B。
TABLESPACE_NAME AND A。TABLESPACE_NAME=C。
TABLESPACE_NAME; 7、查看數據庫庫對象 select owner, object_type, status, count(*) count# from all_objects group by owner, object_type, status; 8、查看數據庫的版本 Select version FROM Product_component_version Where SUBSTR(PRODUCT,1,6)='Oracle'; 9、查看數據庫的創建日期和歸檔方式 Select Created, Log_Mode, Log_Mode From V$Database; 10、如何遠程判斷Oracle數據庫的安裝平臺 select * from v$version; 1 1、查看數據表的參數信息 SELECT partition_name, high_value, high_value_length, tablespace_name, pct_free, pct_used, ini_trans, max_trans, initial_extent, next_extent, min_extent, max_extent, pct_increase, FREELISTS, freelist_groups, LOGGING, BUFFER_POOL, num_rows, blocks, empty_blocks, avg_space, chain_cnt, avg_row_len, sample_size, last_analyzed FROM dba_tab_partitions --WHERE table_name = :tname AND table_owner = :towner ORDER BY partition_position 1 2、查看還沒提交的事務 select * from v$locked_object; select * from v$transaction; 1 4、回滾段查看 select rownum, sys。 dba_rollback_segs。
segment_name Name, v$rollstat。extents Extents, v$rollstat。
rssize Size_in_Bytes, v$rollstat。xacts XActs, v$rollstat。
gets Gets, v$rollstat。waits Waits, v$rollstat。
writes Writes, sys。dba_rollback_segs。
status status from v$rollstat, sys。dba_rollback_segs, v$rollname where v$rollname。
name(+) = sys。dba_rollback_segs。
segment_name and v$rollstat。usn (+) = v$rollname。
usn order by rownum 1 5、捕捉運行很久的SQL column username format a12 column opname format a16 column progress format a8 select username,sid,opname, round(sofar*100 / totalwork,0) || '%' as progress, time_remaining,sql_text from v$session_longops , v$sql where time_remaining 0 and sql_address = address and sql_hash_value = hash_value / 16。 查看數據表的參數信息 SELECT partition_name, high_value, high_value_length, tablespace_name, pct_free, pct_used, ini_trans, max_trans, initial_extent, next_extent, min_extent, max_extent, pct_increase, FREELISTS, freelist_groups, LOGGING, BUFFER_POOL, num_rows, blocks, empty_blocks, avg_space, chain_cnt, avg_row_len, sample_size, last_analyzed FROM dba_tab_partitions --WHERE table_name = :tname AND table_owner = :towner ORDER BY partition_position 17。
查找object為哪些進程所用 select p。spid, s。
sid, s。serial# serial_num, s。
username user_name, a。type object_type, s。
osuser os_user_name, a。 owner, a。
object object_name, decode(sign(48 - command), 1, to_char(command), 'Action Code #' || to_char(command) ) action, p。 program oracle_process, s。
terminal terminal, s。program program, s。
status session_status from v$session s, v$access a, v$process p where s。 paddr = p。
addr and s。type = 'USER' and a。
sid = s。sid and a。
object='SUBSCRIBER_ATTR' order by s。username, s。
osuser 18。 耗資源的進程(top session) select s。
schemaname schema_name, decode(sign(48 - command), 1, to_char(command), 'Action Code #' || to_char(command) ) action, status session_status, s。 osuser os_user_name, s。
sid, p。spid , s。
serial# serial_num, nvl(s。username, '[Oracle process]') user_name, s。
terminal terminal, s。 program program, st。
value criteria_value from v$sesstat st, v$session s , v$process p where st。sid = 。
sql server的sql語句和oracle的sql語句有什么不同嗎
Oracle與Sql server都遵循SQL-92標準:
區別如下:
*中表名,字段名,存儲過程名,變量名不能超過30個字符串長度。
*中不支持Top 語法。使用whererownum
*中光標的使用與SqlServer中有挺大差別,主要是在循環控制方面不一致。
在Oracle中如果某列是Date類型,那么它默認的格式是yyyy-MM-dd,如果使用where colDate = '2005-06-08 17:14:57'就會出錯,'2005-06-08'可以。如果此時需要精確比較時間(小時,分,秒),可以采用下列方法:TO_DATE('2005-6-8 17:14:57','yyyy-mm-dd hh24:mi:ss')。由于Oracle和SQLServer在DateTime上對SQL標準的拓展實現方式不同,因此不能用同一個SQL實現。
*中的TimeStamp(時間戳)與SqlServer中的差別很大。SqlServer中的TimeStamp是二進制格式存儲在數據庫中,可以將DataSet中的這個字段類型設定為base64Binary類型。Oracle中的TimeStamp是時間格式存儲的。因此,無法用同一個DataSet既裝載SqlServer的TimeStamp,有裝載Oracle的TimeStamp.由于在應用程序中很少用到這個值,因此可以不檢索這個字段。
*中的TimeStamp不能像SqlServer在傳入數據的時候自動填充,可以設定默認值systimestamp來實現類似功能。
*中沒有Boolean的字段類型,可以用intger或者char代替SqlServer中的bit類型。
*中會將””空字符串當多NULL處理,也就是說,當應用程序往數據庫中插入一個空字符串時,實際數據庫會嘗試插入一個NULL。如果這個字段是NOTNULL類型,那么就會出錯,這種情況下可以用別的默認值代替空字符串。當從SqlServer導入數據到Oracle的時候,在NOTNULL列上的空字符串會導致導出操作失敗。此時可以在導出向導中手工修改SQL腳本,將空字符串設定成一個特殊值。
*中不支持,SELECT . . INTO創建新表,要用CREATE TABLE 表名AS SELECT 語句 ,創建新表。
9.在Oracle中連接字符串用 ‘||’ 或CONCAT(COL1,COL2)函數,不能使用‘+’。
統配符 [],[^] ,Oracle好像也不支持。
ORACLE中的SQL語句
你是不會寫ORACLE下的SQL語句,還是沒有思路?
前者的話,我也邦不了你,因為我也不會,哈哈。我一般都是在SQL Server下工作。
后者的話,你可以這樣試試。
寫一個方法,里面聲明4個變量,用來接收4個文本框的text.
再一個SQL語句:SELECT * FROM 表名 WHERE 1=1(SQL Server下是這樣的)然后用If判斷變量是否為空,如果不為空,那么就在if括號里面給SQL語句加上條件 AND 字段名=變量
依次類推。希望能幫助到你。
有一個Oracle中的SQL查詢語句的問題
雙表查詢:簡單說了仔細的說如下(也是簡單,還是你學學吧)select A。
CD,B。ID from A,B用select 先選擇a表的cd字段 b表的ID做為,兩個表的查詢依據,查出兩個表中所有CD,ID 兩個字段的內容那個from后面的a,b指的要查的表。
后面一句where a。cd=b。
cd(+)ad。
。是條件,也就是說符合a表。
cd標準的b表中的id字值和cd字同時為11的列表值。在意如此。
總的來說,是查一個固定ID排序值,其中B。ID(+)=11不是結果,B。
CD(+) AND B。 ID(+) = 11加起來滿足a。
cd才是結果。而這里的b。
id(+)=11是指定查詢,(這里是獨立理解,因為你這句中還有一個條件為B。CD(+) 其它他和B。
ID(+) 意思一樣如果這樣寫A。CD = B。
ID(+)ANDB。CD(+) = 11是一樣的,之后一個等號后面的是限制范圍。
(語文沒學好,不會表達,不好意思,如果看到我這句之后感覺更迷湖了,就拿刀砍我吧)。
在Oracle中SQL語句的解析步驟是怎樣的呢
在Oracle中SQL語句的解析步驟如下: 1、 語法檢測。
判斷一條SQL語句的語法是否符合SQL的規范,比如執行:SQL> selet * from emp;我們就可以看出由于Select關鍵字少了一個“c”,這條語句就無法通過語法檢驗的步驟了。 2、 語義檢查。
語法正確的SQL語句在解析的第二個步驟就是判斷該SQL語句所訪問的表及列是否準確?用戶是否有權限訪問或更改相應的表或列?比如如下語句: SQL> select * from emp; select * from emp * ERROR at line 1: ORA-00942: table or view does not exist 由于查詢用戶沒有可供訪問的emp對象,因此該SQL語句無法通過語義檢查。 3、 檢查共享池中是否有相同的語句存在。
假如執行的SQL語句已經在共享池中存在同樣的副本,那么該SQL語句將會被軟解析,也就是可以重用已解析過的語句的執行計劃和優化方案,可以忽略語句解析過程中最耗費資源的步驟,這也是我們為什么一直強調避免硬解析的原因。 這個步驟又可以分為兩個步驟: (1)驗證SQL語句是否完全一致。
在這個步驟中,Oracle將會對傳遞進來的SQL語句使用HASH函數運算得出HASH值,再與共享池中現有語句的HASH值進行比較看是否一一對應。現有數據庫中SQL語句的HASH值我們可以通過訪問v$sql、v$sqlarea、v$sqltext等數據字典中的HASH_VALUE列查詢得出。
如果SQL語句的HASH值一致,那么ORACLE事實上還需要對SQL語句的語義進行再次檢測,以決定是否一致。那么為什么Oracle需要再次對語句文本進行檢測呢?不是SQL語句的HASH值已經對應上了?事實上就算是SQL語句的HASH值已經對應上了,并不能說明這兩條SQL語句就已經可以共享了。
我們首先參考如下一個例子:假如用戶A有自己的一張表EMP,他要執行查詢語句:select * from emp;用戶B也有一張EMP表,同樣要查詢select * from emp;這樣他們兩條語句在文本上是一模一樣的,他們的HASH值也會一樣,但是由于涉及到查詢的相關表不一樣,他們事實上是無法共享的。 假如這時候用戶C又要查詢同樣一條語句,他查詢的表為scott下的公有同義詞,還有就是SCOTT也查詢同樣一張自己的表emp,情況會是如何呢? SQL> connect a/a Connected。
SQL> create table emp ( x int ); Table created。 SQL> select * from emp; no rows selected SQL> connect b/b Connected。
SQL> create table emp ( x int ); Table created。 SQL> select * from emp; no rows selected SQL> conn scott/tiger Connected。
SQL> select * from emp; SQL> conn c/c Connected。 SQL> select * from emp; SQL> conn/as sysdba Connected。
SQL> select address,hash_value, executions, sql_text 2 from v$sql 3 where upper(sql_text) like 'SELECT * FROM EMP%' 4 / ADDRESS HASH_VALUE EXECUTIONS SQL_TEXT -------- ---------- ---------- ------------------------ 78B89E9C 3011704998 1 select * from emp 78B89E9C 3011704998 1 select * from emp 78B89E9C 3011704998 2 select * from emp 我們可以看到這四個查詢的語句文本和HASH值都是一樣的,但是由于查詢的對象不同,只有后面兩個語句是可以共享的,不同情況的語句還是需要硬解析的。 因此在檢查共享池共同SQL語句的時候,是需要根據具體情況而定的。
我們可以進一步查詢v$sql_shared_cursor以得知SQL為何不能共享的原因: SQL> select kglhdpar, address, 2 auth_check_mismatch, translation_mismatch 3 from v$sql_shared_cursor 4 where kglhdpar in 5 ( select address 6 from v$sql 7 where upper(sql_text) like 'SELECT * FROM EMP%' ) 8 / KGLHDPAR ADDRESS A T -------- -------- - - 78B89E9C 786C9D78 N N 78B89E9C 786AC810 Y Y 78B89E9C 786A11A4 Y Y TRANSLATION_MISMATCH表示SQL游標涉及到的數據對象是不同的;AUTH_CHECK_MISMATCH表示對同樣一條SQL語句轉換是不匹配的。 ( 2、)驗證SQL語句執行環境是否相同。
比如同樣一條SQL語句,一個查詢會話加了/*+ first_rows */的HINT,另外一個用戶加/*+ all_rows */的HINT,他們就會產生不同的執行計劃,盡管他們是查詢同樣的數據。 我們下面就一個實例來說明SQL執行環境對解析的影響,我們通過將會話的workarea_size_policy變更來查看對同樣一條SQL語句執行的影響: SQL> alter system flush shared_pool; System altered。
SQL> show parameter workarea_size_policy NAME TYPE VALUE ------------------------------------ ----------- -------------- workarea_size_policy string AUTO SQL> select count(*) from t; COUNT(*) ---------- 5736 SQL> alter session set workarea_size_policy=manual; Session altered。 SQL> select count(*) from t; COUNT(*) ---------- 5736 SQL> select sql_text, child_number, hash_value, address 2 from v$sql 3 where upper(sql_text) = 'SELECT COUNT(*) FROM T' 4 / SQL_TEXT CHILD_NUMBER HASH_VALUE ADDRESS ------------------------------ ------------ ---------- -------- select count(*) from t 0 2199322426 78717328 select count(*) from t 1 2199322426 78717328 可以看到。
Oracle的Sql語句必做哪些事
使用scott/tiger用戶下的emp表和dept表完成下列練習,表的結構說明如下 emp員工表(empno員工號/ename員工姓名/job工作/mgr上級編號/hiredate受雇日期/sal薪金/comm傭金/deptno部門編號) dept部門表(deptno部門編號/dname部門名稱/loc地點) 工資 = 薪金 + 傭金 1.列出至少有一個員工的所有部門 2.列出薪金比“SMITH”多的所有員工。
3.列出所有員工的姓名及其直接上級的姓名。 4.列出受雇日期晚于其直接上級的所有員工。
5.列出部門名稱和這些部門的員工信息,同時列出那些沒有員工的部門。 6.列出所有“CLERK”(辦事員)的姓名及其部門名稱。
7.列出最低薪金大于1500的各種工作。 8.列出在部門“SALES”(銷售部)工作的員工的姓名,假定不知道銷售部的部門編號。
9.列出薪金高于公司平均薪金的所有員工。 10.列出與“SCOTT”從事相同工作的所有員工。
11.列出薪金等于部門30中員工的薪金的所有員工的姓名和薪金。 12.列出薪金高于在部門30工作的所有員工的薪金的員工姓名和薪金。
13.列出在每個部門工作的員工數量、平均工資和平均服務期限。 14.列出所有員工的姓名、部門名稱和工資。
16.列出所有部門的詳細信息和部門人數。 17.列出各種工作的最低工資。
18.列出MANAGER(經理)的最低薪金。 19.列出所有員工的年工資,按年薪從低到高排序。
sql server的sql語句和oracle的sql語句有什么不同嗎
基本上都是相似的,但值得注意的幾個地方(是我們經常碰到的):
1.數據類型是varchar2而不是varchar,
2.有數據類型number,沒有數據類型numeric,
3.還有就是字符的連接,用的是“||”而不是"+",
4.取得系統時間是sysdate ,而不是函數getdate()
還有一些在具體的使用中需要注意的,
可以查看sql server與oracle的對比列表。
呵呵,希望能有幫助,^_^
轉載請注明出處華閱文章網 » sqloracle語句