45 个非常有用的 Oracle 查询语句.docx

上传人:b****3 文档编号:10555344 上传时间:2023-05-26 格式:DOCX 页数:14 大小:147.31KB
下载 相关 举报
45 个非常有用的 Oracle 查询语句.docx_第1页
第1页 / 共14页
45 个非常有用的 Oracle 查询语句.docx_第2页
第2页 / 共14页
45 个非常有用的 Oracle 查询语句.docx_第3页
第3页 / 共14页
45 个非常有用的 Oracle 查询语句.docx_第4页
第4页 / 共14页
45 个非常有用的 Oracle 查询语句.docx_第5页
第5页 / 共14页
45 个非常有用的 Oracle 查询语句.docx_第6页
第6页 / 共14页
45 个非常有用的 Oracle 查询语句.docx_第7页
第7页 / 共14页
45 个非常有用的 Oracle 查询语句.docx_第8页
第8页 / 共14页
45 个非常有用的 Oracle 查询语句.docx_第9页
第9页 / 共14页
45 个非常有用的 Oracle 查询语句.docx_第10页
第10页 / 共14页
45 个非常有用的 Oracle 查询语句.docx_第11页
第11页 / 共14页
45 个非常有用的 Oracle 查询语句.docx_第12页
第12页 / 共14页
45 个非常有用的 Oracle 查询语句.docx_第13页
第13页 / 共14页
45 个非常有用的 Oracle 查询语句.docx_第14页
第14页 / 共14页
亲,该文档总共14页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

45 个非常有用的 Oracle 查询语句.docx

《45 个非常有用的 Oracle 查询语句.docx》由会员分享,可在线阅读,更多相关《45 个非常有用的 Oracle 查询语句.docx(14页珍藏版)》请在冰点文库上搜索。

45 个非常有用的 Oracle 查询语句.docx

45个非常有用的Oracle查询语句

45个非常有用的Oracle查询语句

  这里我们介绍的是40+个非常有用的Oracle查询语句,主要涵盖了日期操作,获取服务器信息,获取执行状态,计算数据库大小等等方面的查询。

这些是所有Oracle开发者都必备的技能,所以快快收藏吧!

日期/时间相关查询

  1.获取当前月份的第一天

  运行这个命令能快速返回当前月份的第一天。

你可以用任何的日期值替换“SYSDATE”来指定查询的日期。

SELECTTRUNC(SYSDATE,'MONTH')"Firstdayofcurrentmonth"

FROMDUAL;

  2.获取当前月份的最后一天

  这个查询语句类似于上面那个语句,而且充分照顾到了闰年,所以当二月份有29号,那么就会返回29/2。

你可以用任何的日期值替换“SYSDATE”来指定查询的日期。

SELECTTRUNC(LAST_DAY(SYSDATE))"Lastdayofcurrentmonth"

FROMDUAL;

  3.获取当前年份的第一天

  每年的第一天都是1月1日,这个查询语句可以使用在存储过程中,需要对当前年份第一天做一些计算的时候。

你可以用任何的日期值替换“SYSDATE”来指定查询的日期。

SELECTTRUNC(SYSDATE,'YEAR')"YearFirstDay"FROMDUAL;

  4.获取当前年份的最后一天

  类似于上面的查询语句。

你可以用任何的日期值替换“SYSDATE”来指定查询的日期。

SELECTADD_MONTHS(TRUNC(SYSDATE,'YEAR'),12)-1"YearLastDay"FROMDUAL

  5.获取当前月份的天数

  这个语句非常有用,可以计算出当前月份的天数。

你可以用任何的日期值替换“SYSDATE”来指定查询的日期。

SELECTCAST(TO_CHAR(LAST_DAY(SYSDATE),'dd')ASINT)number_of_days

FROMDUAL;

  6.获取当前月份剩下的天数

  下面的语句用来计算当前月份剩下的天数。

你可以用任何的日期值替换“SYSDATE”来指定查询的日期。

SELECTSYSDATE,

LAST_DAY(SYSDATE)"Last",

LAST_DAY(SYSDATE)-SYSDATE"Daysleft"

FROMDUAL;

  7.获取两个日期之间的天数

  使用这个语句来获取两个不同日期自检的天数。

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

num_of_days

FROMDUAL;

OR

SELECTTRUNC(sysdate)-TRUNC(e.hire_date)FROMemployees;

  如果你需要查询一些特定日期的天数,可以使用第二个查询语句。

这个例子是计算员工入职的天数。

  8.显示当前年份截止到上个月每个月份开始和结束的日期

  这个是个很聪明的查询语句,用来显示当前年份每个月的开始和结束的日期,你可以使用这个进行一些类型的计算。

你可以用任何的日期值替换“SYSDATE”来指定查询的日期。

SELECTADD_MONTHS(TRUNC(SYSDATE,'MONTH'),i)start_date,

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

FROMXMLTABLE(

'for$iin0toxs:

int(D)return$i'

PASSINGXMLELEMENT(

d,

FLOOR(

MONTHS_BETWEEN(

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

SYSDATE)))

COLUMNSiINTEGERPATH'.');

  9.获取直到目前为止今天过去的秒数(从00:

00开始算)

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

FROMDUAL;

  10.获取今天剩下的秒数(直到23:

59:

59结束)

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

FROMDUAL;

  数据字典查询

  11.检查在当前数据库模式下是否存在指定的表

  这是一个简单的查询语句,用来检查当前数据库是否有你想要创建的表,允许你重新运行创建表脚本,这个也可以检查当前用户是否已经创建了指定的表(根据这个查询语句在什么环境下运行来查询)。

SELECTtable_name

FROMuser_tables

WHEREtable_name='TABLE_NAME';

  12.检查在当前表中是否存在指定的列

  这是个简单的查询语句来检查表里是否有指定的列,在你尝试使用ALTERTABLE来添加新的列新到表中的时候非常有用,它会提示你是否已经存在这个列。

SELECTcolumn_nameASFOUND

FROMuser_tab_cols

WHEREtable_name='TABLE_NAME'ANDcolumn_name='COLUMN_NAME';

  13.显示表结构

  这个查询语句会显示任何表的DDL状态信息。

请注意我们已经将‘TABLE’作为第一个信息提交了。

这个查询语句也可以用来获取任何数据库对象的DDL状态信息。

举例说明,只需要把第一个参数替换成‘VIEW’,第二个修改成视图的名字,就可以查询视图的DDL信息了。

SELECTDBMS_METADATA.get_ddl('TABLE','TABLE_NAME','USER_NAME')FROMDUAL;

  14.获取当前模式

  这是另一个可以获得当前模式的名字的查询语句。

SELECTSYS_CONTEXT('userenv','current_schema')FROMDUAL;

  15.修改当前模式

  这是另一个可以修改当前模式的查询语句,当你希望你的脚本可以在指定的用户下运行的时候非常有用,而且这是非常安全的一个方式。

ALTERSESSIONSETCURRENT_SCHEMA=new_schema;

  数据库管理查询

  16.数据库版本信息

  返回Oracle数据库版本

SELECT*FROMv$version;

  17.数据库默认信息

  返回一些系统默认的信息

SELECTusername,

profile,

default_tablespace,

temporary_tablespace

FROMdba_users;

  18.数据库字符设置信息

  显示数据库的字符设置信息

SELECT*FROMnls_database_parameters;

  19.获取Oracle版本

SELECTVALUE

FROMv$system_parameter

WHEREname='compatible';

  20.存储区分大小写的数据,但是索引不区分大小写

  某些时候你可能想在数据库中查询一些独立的数据,可能会用UPPER(..)=UPPER(..)来进行不区分大小写的查询,所以就想让索引不区分大小写,不占用那么多的空间,这个语句恰好能解决你的需求。

CREATETABLEtab(col1VARCHAR2(10));

CREATEINDEXidx1

ONtab(UPPER(col1));

ANALYZETABLEaCOMPUTESTATISTICS;

  21.调整没有添加数据文件的表空间

  另一个DDL查询来调整表空间大小

ALTERDATABASEDATAFILE'/work/oradata/STARTST/STAR02D.dbf'resize2000M;

  22.检查表空间的自动扩展开关

  在给定的表空间中查询是否打开了自动扩展开关

SELECTSUBSTR(file_name,1,50),AUTOEXTENSIBLEFROMdba_data_files;

(OR)

SELECTtablespace_name,AUTOEXTENSIBLEFROMdba_data_files;

  23.在表空间添加数据文件

  在表空间中添加数据文件

ALTERTABLESPACEdata01ADDDATAFILE'/work/oradata/STARTST/data01.dbf'

SIZE1000MAUTOEXTENDOFF;

  24.增加数据文件的大小

  给指定的表空间增加大小

ALTERDATABASEDATAFILE'/u01/app/Test_data_01.dbf'RESIZE2G;

  25.查询数据库的实际大小

  给出以GB为单位的数据库的实际大小

SELECTSUM(bytes)/1024/1024/1024ASGBFROMdba_data_files;

  26.查询数据库中数据占用的大小或者是数据库使用细节

  给出在数据库中数据占据的空间大小

SELECTSUM(bytes)/1024/1024/1024ASGBFROMdba_segments;

  27.查询模式或者用户的大小

  以MB为单位给出用户的空间大小

SELECTSUM(bytes/1024/1024)"size"

FROMdba_segments

WHEREowner='&owner';

  28.查询数据库中每个用户最后使用的SQL查询

  此查询语句会显示当前数据库中每个用户最后使用的SQL语句。

SELECTS.USERNAME||'('||s.sid||')-'||s.osuserUNAME,

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

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

s.status"Status",

p.spid,

sql_textsqltext

FROMv$sqltext_with_newlinest,V$SESSIONs,v$processp

WHEREt.address=s.sql_address

ANDp.addr=s.paddr(+)

ANDt.hash_value=s.sql_hash_value

ORDERBYs.sid,t.piece;

  性能相关查询

  29.查询用户CPU的使用率

  这个语句是用来显示每个用户的CPU使用率,有助于用户理解数据库负载情况

SELECTss.username,se.SID,VALUE/100cpu_usage_seconds

FROMv$sessionss,v$sesstatse,v$statnamesn

WHEREse.STATISTIC#=sn.STATISTIC#

ANDNAMELIKE'%CPUusedbythissession%'

ANDse.SID=ss.SID

ANDss.status='ACTIVE'

ANDss.usernameISNOTNULL

ORDERBYVALUEDESC;

  30.查询数据库长查询进展情况

  显示运行中的长查询的进展情况

SELECTa.sid,

a.serial#,

b.username,

opnameOPERATION,

targetOBJECT,

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

TO_CHAR(start_time,'HH24:

MI:

SS')start_time,

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

FROMv$session_longopsa,v$sessionb

WHEREa.sid=b.sid

ANDb.usernameNOTIN('SYS','SYSTEM')

ANDtotalwork>0

ORDERBYelapsed_seconds;

  31.获取当前会话ID,进程ID,客户端ID等

  这个专门提供给想使用进程ID和会话ID做些voodoomagic的用户。

SELECTb.sid,

b.serial#,

a.spidprocessid,

b.processclientpid

FROMv$processa,v$sessionb

WHEREa.addr=b.paddrANDb.audsid=USERENV('sessionid');

∙V$SESSION.SIDANDV$SESSION.SERIAL#是数据库进程ID

∙V$PROCESS.SPID是数据库服务器后台进程ID

∙V$SESSION.PROCESS是客户端PROCESSID,ONwindowsitIS:

separatedTHEFIRST#ISTHEPROCESSIDONTHEclientAND2ndoneISTHETHREADid.

  32.查询特定的模式或者表中执行的最后一个SQL语句

SELECTCREATED,TIMESTAMP,last_ddl_time

FROMall_objects

WHEREOWNER='MYSCHEMA'

ANDOBJECT_TYPE='TABLE'

ANDOBJECT_NAME='EMPLOYEE_TABLE';

  33.查询每个执行读取的前十个SQL

SELECT*

FROM(SELECTROWNUM,

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

FROMv$sqlareaa

ORDERBY3DESC)

WHEREROWNUM<10;

  34.在视图中查询并显示实际的Oracle连接

SELECTosuser,

username,

machine,

program

FROMv$session

ORDERBYosuser;

  35.查询并显示通过打开连接程序打开连接的组

SELECTprogramapplication,COUNT(program)Numero_Sesiones

FROMv$session

GROUPBYprogram

ORDERBYNumero_SesionesDESC;

  36.查询并显示连接Oracle的用户和用户的会话数量

SELECTusernameUsuario_Oracle,COUNT(username)Numero_Sesiones

FROMv$session

GROUPBYusername

ORDERBYNumero_SesionesDESC;

  37.获取拥有者的对象数量

SELECTowner,COUNT(owner)number_of_objects

FROMdba_objects

GROUPBYowner

ORDERBYnumber_of_objectsDESC;

  实用/数学相关的查询

  38.把数值转换成文字更多信息可以查看:

ConvertingnumberintowordsinOracle

SELECTTO_CHAR(TO_DATE(1526,'j'),'jsp')FROMDUAL;

  输出:

onethousandfivehundredtwenty-six

  39.在包的源代码中查询字符串这个查询语句会在所有包的源代码上搜索‘FOO_SOMETHING’,可以帮助用户在源代码中查找特定的存储过程或者是函数调用。

--searchastringfoo_somethinginpackagesourcecode

SELECT*

FROMdba_source

WHEREUPPER(text)LIKE'%FOO_SOMETHING%'

ANDowner='USER_NAME';

  40.把用逗号分隔的数据插入的表中

  当你想把用逗号分隔开的字符串插入表中的时候,你可以使用其他的查询语句,比如IN或者是NOTIN。

这里我们把‘AA,BB,CC,DD,EE,FF’转换成包含AA,BB,CC等作为一行的表,这样你就很容易把这些字符串插入到其他表中,并快速的做一些相关的操作。

WITHcsv

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

AScsvdata

FROMDUAL)

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

FROMDUAL,csv

CONNECTBYREGEXP_SUBSTR(csv.csvdata,'[^,]+',1,LEVEL)ISNOTNULL;

  41.查询表中的最后一个记录

  这个查询语句很直接,表中没有主键,或者是用户不确定记录最大主键是否是最新的那个记录时,就可以使用这个语句来查询表中最后一个记录。

SELECT*

FROMemployees

WHEREROWIDIN(SELECTMAX(ROWID)FROMemployees);

(OR)

SELECT*FROMemployees

MINUS

SELECT*

FROMemployees

WHEREROWNUM<(SELECTCOUNT(*)FROMemployees);

  42.在Oracle中做行数据乘法

  这个查询语句使用一些复杂的数学函数来做每个行的数值乘法。

更多内容请查阅:

RowDataMultiplicationInOracle

WITHtbl

AS(SELECT-2numFROMDUAL

UNION

SELECT-3numFROMDUAL

UNION

SELECT-4numFROMDUAL),

sign_val

AS(SELECTCASEMOD(COUNT(*),2)WHEN0THEN1ELSE-1ENDval

FROMtbl

WHEREnum<0)

SELECTEXP(SUM(LN(ABS(num))))*val

FROMtbl,sign_val

GROUPBYval;

  43.在Oracle生成随机数据

  每个开发者都想能轻松生成一堆随机数据来测试数据库多好,下面这条查询语句就可以满足你,它可以在Oracle中生成随机的数据插入到表中。

详细信息可以查看RandomDatainOracle

SELECTLEVELempl_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

FROMDUAL

CONNECTBYLEVEL<10000;

  44.在Oracle中生成随机数值

  这是Oracle普通的旧的随机数值生成器。

这个可以生成0-100之间的随机数值,如果你想自己设置数值范围,那么改变乘数就可以了。

--generaterandomnumberbetween0and100

SELECTROUND(DBMS_RANDOM.VALUE()*100)+1ASrandom_numFROMDUAL;

  45.检查表中是否含有任何的数据

  这个可以有很多中写法,你可以使用count(*)来查看表里的行的数量,但是这个查询语句比较高效和快速,而且我们只是想知道表里是否有任何的数据。

SELECT1

FROMTABLE_NAME

WHEREROWNUM=1;

  

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 教育学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2