1. 程式人生 > >45個非常有用的Oracle查詢語句

45個非常有用的Oracle查詢語句

這裡我們介紹的是 40+ 個非常有用的 Oracle 查詢語句,主要涵蓋了日期操作,獲取伺服器資訊,獲取執行狀態,計算資料庫大小等等方面的查詢,這些是所有 Oracle 開發者都必備的技能!

1. 日期/時間 相關查詢

1.1. 獲取當前月份的第一天

執行這個命令能快速返回當前月份的第一天。你可以用任何的日期值替換 “SYSDATE”來指定查詢的日期。

SELECT TRUNC (SYSDATE, 'MONTH') "First day of current month"  FROM DUAL;

1.2. 獲取當前月份的最後一天

這個查詢語句類似於上面那個語句,而且充分照顧到了閏年,所以當二月份有 29 號,那麼就會返回 29/2 。你可以用任何的日期值替換 “SYSDATE”來指定查詢的日期。

SELECT TRUNC (LAST_DAY (SYSDATE)) "Last day of current month"  FROM DUAL;

1.3. 獲取當前年份的第一天

每年的第一天都是1 月1日,這個查詢語句可以使用在儲存過程中,需要對當前年份第一天做一些計算的時候。你可以用任何的日期值替換 “SYSDATE”來指定查詢的日期。

SELECT TRUNC (SYSDATE, 'YEAR') "Year First Day" FROM DUAL;

1.4. 獲取當前年份的最後一天

類似於上面的查詢語句。你可以用任何的日期值替換 “SYSDATE”來指定查詢的日期。

SELECT ADD_MONTHS (TRUNC (SYSDATE, 'YEAR'), 12) - 1 "Year Last Day" FROM DUAL

1.5. 獲取當前月份的天數

這個語句非常有用,可以計算出當前月份的天數。你可以用任何的日期值替換 “SYSDATE”來指定查詢的日期。

SELECT CAST (TO_CHAR (LAST_DAY (SYSDATE), 'dd') AS INT) number_of_days  FROM DUAL;

1.6. 獲取當前月份剩下的天數

下面的語句用來計算當前月份剩下的天數。你可以用任何的日期值替換 “SYSDATE”來指定查詢的日期。

SELECT SYSDATE,LAST_DAY (SYSDATE) "Last",LAST_DAY (SYSDATE) - SYSDATE "Days left"

  FROM DUAL;

1.7. 獲取兩個日期之間的天數

使用這個語句來獲取兩個不同日期自檢的天數。

SELECT ROUND ( (MONTHS_BETWEEN ('01-Feb-2014', '01-Mar-2012') * 30), 0)

          num_of_days  FROM DUAL; 

OR 

SELECT TRUNC(sysdate) - TRUNC(e.hire_date) FROM employees;

如果你需要查詢一些特定日期的天數,可以使用第二個查詢語句。這個例子是計算員工入職的天數。

1.8. 顯示當前年份截止到上個月每個月份開始和結束的日期

這個是個很聰明的查詢語句,用來顯示當前年份每個月的開始和結束的日期,你可以使用這個進行一些型別的計算。你可以用任何的日期值替換 “SYSDATE”來指定查詢的日期。

SELECT ADD_MONTHS (TRUNC (SYSDATE, 'MONTH'), i) start_date,

       TRUNC (LAST_DAY (ADD_MONTHS (SYSDATE, i))) end_date

  FROM XMLTABLE (

          'for $i in 0 to xs:int(D) return $i'

          PASSING XMLELEMENT (

                     d,

                     FLOOR (

                        MONTHS_BETWEEN (

                           ADD_MONTHS (TRUNC (SYSDATE, 'YEAR') - 1, 12),

                           SYSDATE)))

          COLUMNS i INTEGER PATH '.');

1.9. 獲取直到目前為止今天過去的秒數(從 00:00 開始算)

SELECT (SYSDATE - TRUNC (SYSDATE)) * 24 * 60 * 60 num_of_sec_since_morning

  FROM DUAL;

1.10. 獲取今天剩下的秒數(直到 23:59:59 結束)

SELECT (TRUNC (SYSDATE+1) - SYSDATE) * 24 * 60 * 60 num_of_sec_left

  FROM DUAL;

2. 資料字典查詢

2.1. 檢查在當前資料庫模式下是否存在指定的表

這是一個簡單的查詢語句,用來檢查當前資料庫是否有你想要建立的表,允許你重新執行建立表指令碼,這個也可以檢查當前使用者是否已經建立了指定的表(根據這個查詢語句在什麼環境下執行來查詢)。

SELECT table_name

  FROM user_tables

 WHERE table_name = 'TABLE_NAME';

2.2. 檢查在當前表中是否存在指定的列

這是個簡單的查詢語句來檢查表裡是否有指定的列,在你嘗試使用 ALTER TABLE 來新增新的列新到表中的時候非常有用,它會提示你是否已經存在這個列。

SELECT column_name AS FOUND

  FROM user_tab_cols

 WHERE table_name = 'TABLE_NAME' AND column_name = 'COLUMN_NAME';

2.3. 顯示錶結構

這個查詢語句會顯示任何表的 DDL 狀態資訊。請注意我們已經將‘TABLE’作為第一個資訊提交了。這個查詢語句也可以用來獲取任何資料庫物件的 DDL 狀態資訊。舉例說明,只需要把第一個引數替換成‘VIEW’,第二個修改成檢視的名字,就可以查詢檢視的 DDL 資訊了。

SELECT DBMS_METADATA.get_ddl ('TABLE','TABLE_NAME','USER_NAME')FROMDUAL;

2.4. 獲取當前模式

這是另一個可以獲得當前模式的名字的查詢語句。

SELECT SYS_CONTEXT ('userenv', 'current_schema') FROM DUAL;

2.5. 修改當前模式

這是另一個可以修改當前模式的查詢語句,當你希望你的指令碼可以在指定的使用者下執行的時候非常有用,而且這是非常安全的一個方式。

ALTER SESSION SET CURRENT_SCHEMA = new_schema;

3. 資料庫管理查詢

3.1. 資料庫版本資訊

返回 Oracle 資料庫版本

SELECT * FROM v$version;

3.2. 資料庫預設資訊

返回一些系統預設的資訊

SELECT username,

       profile,

       default_tablespace,

       temporary_tablespace

  FROM dba_users;

3.3. 資料庫字元設定資訊

顯示資料庫的字元設定資訊

SELECT * FROM nls_database_parameters;

3.4. 獲取 Oracle 版本

SELECT VALUE

  FROM v$system_parameter

 WHERE name = 'compatible';

3.5. 儲存區分大小寫的資料,但是索引不區分大小寫

某些時候你可能想在資料庫中查詢一些獨立的資料,可能會用 UPPER(..) = UPPER(..) 來進行不區分大小寫的查詢,所以就想讓索引不區分大小寫,不佔用那麼多的空間,這個語句恰好能解決你的需求 。

CREATE TABLE tab (col1 VARCHAR2 (10)); 

CREATE INDEX idx1

   ON tab (UPPER (col1)); 

ANALYZE TABLE a COMPUTE STATISTICS;

3.6. 調整沒有新增資料檔案的表空間

另一個 DDL 查詢來調整表空間大小

ALTER DATABASE DATAFILE '/work/oradata/STARTST/STAR02D.dbf' resize 2000M;

3.7. 檢查表空間的自動擴充套件開關

在給定的表空間中查詢是否打開了自動擴充套件開關

SELECT SUBSTR (file_name, 1, 50), AUTOEXTENSIBLE FROM dba_data_files;

(OR) 

SELECT tablespace_name, AUTOEXTENSIBLE FROM dba_data_files;

3.8. 在表空間新增資料檔案

在表空間中新增資料檔案

ALTER TABLESPACE data01 ADD DATAFILE '/work/oradata/STARTST/data01.dbf'

    SIZE 1000M AUTOEXTEND OFF;

3.9. 增加資料檔案的大小

給指定的表空間增加大小

ALTER DATABASE DATAFILE '/u01/app/Test_data_01.dbf' RESIZE 2G;

3.10. 查詢資料庫的實際大小

給出以 GB 為單位的資料庫的實際大小

SELECT SUM (bytes) / 1024 / 1024 / 1024 AS GB FROM dba_data_files;

3.11. 查詢資料庫中資料佔用的大小或者是資料庫使用細節

給出在資料庫中資料佔據的空間大小

SELECT SUM (bytes) / 1024 / 1024 / 1024 AS GB FROM dba_segments;

3.12. 查詢模式或者使用者的大小

以 MB 為單位給出使用者的空間大小

SELECT SUM (bytes / 1024 / 1024) "size"

  FROM dba_segments

 WHERE owner = '&owner';

3.13. 查詢資料庫中每個使用者最後使用的 SQL 查詢

此查詢語句會顯示當前資料庫中每個使用者最後使用的 SQL 語句。

SELECT S.USERNAME || '(' || s.sid || ')-' || s.osuser UNAME,

         s.program || '-' || s.terminal || '(' || s.machine || ')' PROG,

         s.sid || '/' || s.serial# sid,

         s.status "Status",

         p.spid,

         sql_text sqltext

    FROM v$sqltext_with_newlines t, V$SESSION s, v$process p

   WHERE     t.address = s.sql_address

         AND p.addr = s.paddr(+)

         AND t.hash_value = s.sql_hash_value

ORDER BY s.sid, t.piece;

4. 效能相關查詢

4.1. 查詢使用者 CPU 的使用率 

這個語句是用來顯示每個使用者的 CPU 使用率,有助於使用者理解資料庫負載情況

SELECT ss.username, se.SID, VALUE / 100 cpu_usage_seconds

    FROM v$session ss, v$sesstat se, v$statname sn

   WHERE     se.STATISTIC# = sn.STATISTIC#

         AND NAME LIKE '%CPU used by this session%'

         AND se.SID = ss.SID

         AND ss.status = 'ACTIVE'

         AND ss.username IS NOT NULL

ORDER BY VALUE DESC;

4.2. 查詢資料庫長查詢進展情況

顯示執行中的長查詢的進展情況

SELECT a.sid,

         a.serial#,

         b.username,

         opname OPERATION,

         target OBJECT,

         TRUNC (elapsed_seconds, 5) "ET (s)",

         TO_CHAR (start_time, 'HH24:MI:SS') start_time,

         ROUND ( (sofar / totalwork) * 100, 2) "COMPLETE (%)"

    FROM v$session_longops a, v$session b

   WHERE     a.sid = b.sid

         AND b.username NOT IN ('SYS', 'SYSTEM')

         AND totalwork > 0

ORDER BY elapsed_seconds;

4.3. 獲取當前會話 ID,程序 ID,客戶端 ID 等

這個專門提供給想使用程序 ID 和 會話 ID 做些 voodoo magic 的使用者。

SELECT b.sid,

       b.serial#,

       a.spid processid,

       b.process clientpid

  FROM v$process a, v$session b

 WHERE a.addr = b.paddr AND b.audsid = USERENV ('sessionid');

V$SESSION.SID AND V$SESSION.SERIAL# 是資料庫程序 ID

V$PROCESS.SPID 是資料庫伺服器後臺程序 ID

V$SESSION.PROCESS 是客戶端 PROCESS ID, ON windows it IS : separated THE FIRST # IS THE PROCESS ID ON THE client AND 2nd one IS THE THREAD id.

4.4. 查詢特定的模式或者表中執行的最後一個 SQL 語句

SELECT CREATED, TIMESTAMP, last_ddl_time

  FROM all_objects

 WHERE     OWNER = 'MYSCHEMA'

       AND OBJECT_TYPE = 'TABLE'

       AND OBJECT_NAME = 'EMPLOYEE_TABLE';

4.5. 查詢每個執行讀取的前十個 SQL

SELECT *

  FROM (  SELECT ROWNUM,

                 SUBSTR (a.sql_text, 1, 200) sql_text,

                 TRUNC (

                    a.disk_reads / DECODE (a.executions, 0, 1, a.executions))

                    reads_per_execution,

                 a.buffer_gets,

                 a.disk_reads,

                 a.executions,

                 a.sorts,

                 a.address

            FROM v$sqlarea a

        ORDER BY 3 DESC)

 WHERE ROWNUM < 10;

4.6. 在檢視中查詢並顯示實際的 Oracle 連線

SELECT osuser,

         username,

         machine,

         program

    FROM v$session

ORDER BY osuser;

4.7. 查詢並顯示通過開啟連線程式開啟連線的組

SELECT program application, COUNT (program) Numero_Sesiones

    FROM v$session

GROUP BY program

ORDER BY Numero_Sesiones DESC;

4.8. 查詢並顯示連線 Oracle 的使用者和使用者的會話數量

SELECT username Usuario_Oracle, COUNT (username) Numero_Sesiones

    FROM v$session

GROUP BY username

ORDER BY Numero_Sesiones DESC;

獲取擁有者的物件數量

SELECT owner, COUNT (owner) number_of_objects

    FROM dba_objects

GROUP BY owner

ORDER BY number_of_objects DESC;

5. 實用/數學 相關的查詢

5.1. 把數值轉換成文字

SELECT TO_CHAR (TO_DATE (1526, 'j'), 'jsp') FROM DUAL;

輸出:

one thousand five hundred twenty-six

5.2. 在包的原始碼中查詢字串

這個查詢語句會在所有包的原始碼上搜索‘FOO_SOMETHING’ ,可以幫助使用者在原始碼中查詢特定的儲存過程或者是函式呼叫。

--search a string foo_something in package source code

SELECT *

  FROM dba_source

 WHERE UPPER (text) LIKE '%FOO_SOMETHING%' 

AND owner = 'USER_NAME';

5.3. 把用逗號分隔的資料插入的表中

當 你想把用逗號分隔開的字串插入表中的時候,你可以使用其他的查詢語句,比如 IN 或者是 NOT IN 。這裡我們把‘AA,BB,CC,DD,EE,FF’轉換成包含 AA,BB,CC 等作為一行的表,這樣你就很容易把這些字串插入到其他表中,並快速的做一些相關的操作。

WITH csv

     AS (SELECT 'AA,BB,CC,DD,EE,FF'

                   AS csvdata

           FROM DUAL)

    SELECT REGEXP_SUBSTR (csv.csvdata, '[^,]+', 1, LEVEL) pivot_char

      FROM DUAL, csv

CONNECT BY REGEXP_SUBSTR (csv.csvdata,'[^,]+', 1, LEVEL) IS NOT NULL;

5.4. 查詢表中的最後一個記錄

這個查詢語句很直接,表中沒有主鍵,或者是使用者不確定記錄最大主鍵是否是最新的那個記錄時,就可以使用這個語句來查詢表中最後一個記錄。

SELECT *

  FROM employees

 WHERE ROWID IN (SELECT MAX (ROWID) FROM employees); 

(OR) 

SELECT * FROM employees

MINUS

SELECT *

  FROM employees

 WHERE ROWNUM < (SELECT COUNT (*) FROM employees);

5.5. 在 Oracle 中做行資料乘法

這個查詢語句使用一些複雜的數學函式來做每個行的數值乘法。 

WITH tbl

     AS (SELECT -2 num FROM DUAL

         UNION

         SELECT -3 num FROM DUAL

         UNION

         SELECT -4 num FROM DUAL),

     sign_val

     AS (SELECT CASE MOD (COUNT (*), 2) WHEN 0 THEN 1 ELSE -1 END val

           FROM tbl

          WHERE num < 0)

  SELECT EXP (SUM (LN (ABS (num)))) * val

    FROM tbl, sign_val

GROUP BY val;

5.6. 在 Oracle 生成隨機資料

每個開發者都想能輕鬆生成一堆隨機資料來測試資料庫多好,下面這條查詢語句就可以滿足你,它可以在 Oracle 中生成隨機的資料插入到表中。 

SELECT LEVEL empl_id,

           MOD (ROWNUM, 50000) dept_id,

           TRUNC (DBMS_RANDOM.VALUE (1000, 500000), 2) salary,

           DECODE (ROUND (DBMS_RANDOM.VALUE (1, 2)),  1, 'M',  2, 'F') gender,

           TO_DATE (

                 ROUND (DBMS_RANDOM.VALUE (1, 28))

              || '-'

              || ROUND (DBMS_RANDOM.VALUE (1, 12))

              || '-'

              || ROUND (DBMS_RANDOM.VALUE (1900, 2010)),

              'DD-MM-YYYY')

              dob,

           DBMS_RANDOM.STRING ('x', DBMS_RANDOM.VALUE (20, 50)) address

      FROM DUAL

CONNECT BY LEVEL < 10000;

5.7. 在 Oracle 中生成隨機數值

這是 Oracle 普通的舊的隨機數值生成器。這個可以生成 0-100 之間的隨機數值,如果你想自己設定數值範圍,那麼改變乘數就可以了。

--generate random number between 0 and 100

SELECT ROUND (DBMS_RANDOM.VALUE () * 100) + 1 AS random_num FROM DUAL;

5.8. 檢查表中是否含有任何的資料

這個可以有很多中寫法,你可以使用 count(*) 來查看錶裡的行的數量,但是這個查詢語句比較高效和快速,而且我們只是想知道表裡是否有任何的資料。

SELECT 1

  FROM TABLE_NAME

 WHERE ROWNUM = 1;

相關推薦

45常用的Oracle查詢語句

這裡我們介紹的是 40+ 個非常有用的 Oracle 查詢語句,主要涵蓋了日期操作,獲取伺服器資訊,獲取執行狀態,計算資料庫大小等等方面的查詢。這些是所有 Oracle 開發者都必備的技能,所以快快收藏吧! 日期/時間 相關查詢 獲取當前月份的第一

45非常有用Oracle查詢語句

這裡我們介紹的是 40+ 個非常有用的 Oracle 查詢語句,主要涵蓋了日期操作,獲取伺服器資訊,獲取執行狀態,計算資料庫大小等等方面的查詢,這些是所有 Oracle 開發者都必備的技能! 1. 日期/時間 相關查詢 1.1. 獲取當前月份的第一天 執行這個命令能快速返

12非常有用的javascript技巧,必看!

login 他會 有時 throw 代碼 取數 屬性 nbsp 存在 提示:該文章是整理別人別人的文章,作者比較多,很難分辨原創作者是誰。 1)使用!!將變量轉換成布爾類型   有時,我們需要檢查一些變量是否存在,或者它是否具有有效值,從而將他們的值視為true。對於這樣的

Oracle - 查詢語句 - 分組函數

出現 erb 現在 不同 max 過濾 group cnblogs 語句 /* 分組函數 不能再select子句中出現普通的列,除非這個列在group by中給出 所有的空值都會被分為一組 分組過濾

oracle查詢語句執行順序

lin oracle查詢 etc utl columns contain 處理 text lec 完整的查詢語句類似是這樣的: select ..., ROWNUM from table where <where clause> group by &

5 非常有用的 Laravel Blade 指令,你用過哪些?

內容 def upload user 兩個 doc 系統 使用 hub 接下來我將帶大家認識下五個 Laravel Blade 指令,這些指令將讓你在解決特定問題時如虎添翼。如果你是剛接觸 Laravel 的用戶,這些小技巧能帶你認識到 Laravel Blade 模板引

表關聯的查詢語句

name where sele rom left join nbsp ID 語句 關聯 select a.*,(select table1 .name from table1 where table1.id=a.table1ID) from table as a selec

收集的20非常有用的Java程式片段

收集的20個非常有用的Java程式片段 下面是20個非常有用的Java程式片段,希望能對你有用。  1. 字串有整型的相互轉換 String a = String.valueOf(2); //integer to numeric string int i = Integer

Oracle - 查詢語句 - 多表關聯查詢

/*         SQL語句的歷史版本         SQL89         比較多       &nb

Makefile有三非常有用的變數。分別是[email protected],$^,$

原文地址:https://blog.csdn.net/u013774102/article/details/79043559 假設我們有下面這樣的一個程式,原始碼如下:  /* main.c */ #include "mytool1.h" #include "mytool2.h" i

阿里P7大牛整理2的0非常有用的Java程式片段,你知道幾

1、字串有整型的相互轉換 String a = String.valueOf(2);  //integer to numeric string   int i = Integer.parseInt(a); //numeric string to an int 2、向檔案

20非常有用的JAVA程式片段

private void createThumbnail(String filename, int thumbWidth, int thumbHeight, int quality, String outFilename)         throws InterruptedException, FileN

Java乾貨分享:10非常有用的Java程式碼片段,記得收藏哦!

最近有粉絲私信我說,能不能分享一些技術型的乾貨,方便開發,於是我抽時間總結了一些經常會用帶的程式碼片段,分享給大家! 下面是10個非常有用的Java程式片段,希望能對你有用。 字串有整型的相互轉換 向檔案末尾新增內容 轉字串到日期 4.使用JDBC連結O

java程式設計師菜鳥進階(二)oracle基礎詳解(二)oracle查詢語句和資料排序

本文所以練習都是基於oracle自帶提供的一個數據庫進行的。資料庫中包含員工表emp。部門資訊表dept。員工工資工總表下面是三個表的表結構:一:基本查詢語句1.最簡單的查詢所有列語句Select * from emp;2.查詢指定列表的查詢語句Select empno ,e

12 非常有用的 JavaScript 技巧

在這篇文章中將給大家分享12個有關於JavaScript的小技巧。這些小技巧可能在你的實際工作中或許能幫助你解決一些問題。 使用!!操作符轉換布林值 有時候我們需要對一個變數查檢其是否存在或者檢查值是否有一個有效值,如果存在就返回true值。為了做這樣的驗證,我們可

ASP 程式設計中20非常有用的例子

1.如何用Asp判斷你的網站的虛擬物理路徑 答:使用Mappath方法 < p align="center" >< font size="4" face="Arial" >< b > The Physical path to this vi

關於latex簡歷幾非常有用的命令

    大家知道latex是最好的排版系統,用來寫論文,排版非常漂亮,用來做簡歷可以提升逼格,下面介紹幾個有用的命令 幾個有用的命令 section、cventry、cvitem、cvli

46 非常有用的 PHP 程式碼片段

http://www.oschina.net/question/2012764_246023?from=20150809 1. 傳送 SMS 在開發 Web 或者移動應用的時候,經常會遇到需要傳送 SMS 給使用者,或者因為登入原因,或者是為了傳送資訊。下面的 PHP 程式碼就實現了傳送 SMS 的功能。

Oracle查詢語句中算術運算子的使用

1、運算子的分類和優先順序(1)、算術運算子(+、-、*、/):可以運用到數字和日期的列上<1>、具體需求:例:檢視scott.emp表中的員工年收入(select sal * 12 from emp;)(2)、優先順序:和數學裡面的規則一樣例:檢視scott.e

oracle查詢語句練習題與答案(scott使用者)

1 找出佣金高於薪金60%的僱員。 SELECT * FROM emp WHERE comm > (sal * 0.6); 2 找出部門10中所有經理和部門20中所有辦事員的詳細資料。 SELECT * FROM emp WHERE (deptno