1、45个很有用的SQL语句45 个非常有用的 Oracle 查询语句这里我们介绍的是 40+ 个非常有用的 Oracle 查询语句,主要涵盖了日期操作,获取服务器信息,获取执行状态,计算数据库大小等等方面的查询。这些是所有 Oracle 开发者都必备的技能,所以快快收藏吧!日期/时间 相关查询1. 获取当前月份的第一天运行这个命令能快速返回当前月份的第一天。你可以用任何的日期值替换 “SYSDATE”来指定查询的日期。?12SELECTTRUNC(SYSDATE,MONTH)FirstdayofcurrentmonthFROMDUAL;2. 获取当前月份的最后一天这个查询语句类似于上面那个语句,
2、而且充分照顾到了闰年,所以当二月份有 29 号,那么就会返回 29/2 。你可以用任何的日期值替换 “SYSDATE”来指定查询的日期。?12SELECTTRUNC(LAST_DAY(SYSDATE)LastdayofcurrentmonthFROMDUAL;3. 获取当前年份的第一天每年的第一天都是1 月1日,这个查询语句可以使用在存储过程中,需要对当前年份第一天做一些计算的时候。你可以用任何的日期值替换 “SYSDATE”来指定查询的日期。?1SELECTTRUNC(SYSDATE,YEAR)YearFirstDayFROMDUAL;4. 获取当前年份的最后一天类似于上面的查询语句。你可以
3、用任何的日期值替换 “SYSDATE”来指定查询的日期。?1SELECTADD_MONTHS(TRUNC(SYSDATE,YEAR),12)-1YearLastDayFROMDUAL5. 获取当前月份的天数这个语句非常有用,可以计算出当前月份的天数。你可以用任何的日期值替换 “SYSDATE”来指定查询的日期。?12SELECTCAST(TO_CHAR(LAST_DAY(SYSDATE),dd)ASINT)number_of_daysFROMDUAL;6. 获取当前月份剩下的天数下面的语句用来计算当前月份剩下的天数。你可以用任何的日期值替换 “SYSDATE”来指定查询的日期。?1234SEL
4、ECTSYSDATE,LAST_DAY(SYSDATE)Last,LAST_DAY(SYSDATE)-SYSDATEDaysleftFROMDUAL;7. 获取两个日期之间的天数使用这个语句来获取两个不同日期自检的天数。?1234567SELECTROUND(MONTHS_BETWEEN(01-Feb-2014,01-Mar-2012)*30),0)num_of_daysFROMDUAL;ORSELECTTRUNC(sysdate)-TRUNC(e.hire_date)FROMemployees;如果你需要查询一些特定日期的天数,可以使用第二个查询语句。这个例子是计算员工入职的天数。8. 显示
5、当前年份截止到上个月每个月份开始和结束的日期这个是个很聪明的查询语句,用来显示当前年份每个月的开始和结束的日期,你可以使用这个进行一些类型的计算。你可以用任何的日期值替换 “SYSDATE”来指定查询的日期。?1234567891011SELECTADD_MONTHS(TRUNC(SYSDATE,MONTH),i)start_date,TRUNC(LAST_DAY(ADD_MONTHS(SYSDATE,i)end_dateFROMXMLTABLE(for$iin0toxs:int(D)return$iPASSINGXMLELEMENT(d,FLOOR(MONTHS_BETWEEN(ADD_MO
6、NTHS(TRUNC(SYSDATE,YEAR)-1,12),SYSDATE)COLUMNSiINTEGERPATH.);9. 获取直到目前为止今天过去的秒数(从 00:00 开始算)?12SELECT(SYSDATE-TRUNC(SYSDATE)*24*60*60num_of_sec_since_morningFROMDUAL;10. 获取今天剩下的秒数(直到 23:59:59 结束)?12SELECT(TRUNC(SYSDATE+1)-SYSDATE)*24*60*60num_of_sec_leftFROMDUAL;数据字典查询11. 检查在当前数据库模式下是否存在指定的表这是一个简单的查
7、询语句,用来检查当前数据库是否有你想要创建的表,允许你重新运行创建表脚本,这个也可以检查当前用户是否已经创建了指定的表(根据这个查询语句在什么环境下运行来查询)。?123SELECTtable_nameFROMuser_tablesWHEREtable_name=TABLE_NAME;12. 检查在当前表中是否存在指定的列这是个简单的查询语句来检查表里是否有指定的列,在你尝试使用 ALTER TABLE 来添加新的列新到表中的时候非常有用,它会提示你是否已经存在这个列。?123SELECTcolumn_nameASFOUNDFROMuser_tab_colsWHEREtable_name=TA
8、BLE_NAMEANDcolumn_name=COLUMN_NAME;13. 显示表结构这 个查询语句会显示任何表的 DDL 状态信息。请注意我们已经将TABLE作为第一个信息提交了。这个查询语句也可以用来获取任何数据库对象的 DDL 状态信息。举例说明,只需要把第一个参数替换成VIEW,第二个修改成视图的名字,就可以查询视图的 DDL 信息了。?1SELECTDBMS_METADATA.get_ddl(TABLE,TABLE_NAME,USER_NAME)FROMDUAL;14. 获取当前模式这是另一个可以获得当前模式的名字的查询语句。?1SELECTSYS_CONTEXT(userenv,
9、current_schema)FROMDUAL;15. 修改当前模式这是另一个可以修改当前模式的查询语句,当你希望你的脚本可以在指定的用户下运行的时候非常有用,而且这是非常安全的一个方式。?1ALTERSESSIONSETCURRENT_SCHEMA=new_schema;数据库管理查询16. 数据库版本信息返回 Oracle 数据库版本?1SELECT*FROMv$version;17. 数据库默认信息返回一些系统默认的信息?12345SELECTusername,profile,default_tablespace,temporary_tablespaceFROMdba_users;18.
10、 数据库字符设置信息显示数据库的字符设置信息?1SELECT*FROMnls_database_parameters;19. 获取 Oracle 版本?123SELECTVALUEFROMv$system_parameterWHEREname=compatible;20. 存储区分大小写的数据,但是索引不区分大小写某些时候你可能想在数据库中查询一些独立的数据,可能会用 UPPER(.) = UPPER(.) 来进行不区分大小写的查询,所以就想让索引不区分大小写,不占用那么多的空间,这个语句恰好能解决你的需求 。?123456CREATETABLEtab(col1VARCHAR2(10);CRE
11、ATEINDEXidx1ONtab(UPPER(col1);ANALYZETABLEaCOMPUTESTATISTICS;21. 调整没有添加数据文件的表空间另一个 DDL 查询来调整表空间大小?1ALTERDATABASEDATAFILE/work/oradata/STARTST/STAR02D.dbfresize2000M;22. 检查表空间的自动扩展开关在给定的表空间中查询是否打开了自动扩展开关?12345SELECTSUBSTR(file_name,1,50),AUTOEXTENSIBLEFROMdba_data_files;(OR)SELECTtablespace_name,AUTO
12、EXTENSIBLEFROMdba_data_files;23. 在表空间添加数据文件在表空间中添加数据文件?12ALTERTABLESPACEdata01ADDDATAFILE/work/oradata/STARTST/data01.dbfSIZE1000MAUTOEXTENDOFF;24. 增加数据文件的大小给指定的表空间增加大小?1ALTERDATABASEDATAFILE/u01/app/Test_data_01.dbfRESIZE2G;25. 查询数据库的实际大小给出以 GB 为单位的数据库的实际大小?1SELECTSUM(bytes)/1024/1024/1024ASGBFROMd
13、ba_data_files;26. 查询数据库中数据占用的大小或者是数据库使用细节给出在数据库中数据占据的空间大小?1SELECTSUM(bytes)/1024/1024/1024ASGBFROMdba_segments;27. 查询模式或者用户的大小以 MB 为单位给出用户的空间大小?123SELECTSUM(bytes/1024/1024)sizeFROMdba_segmentsWHEREowner=&owner;28. 查询数据库中每个用户最后使用的 SQL 查询此查询语句会显示当前数据库中每个用户最后使用的 SQL 语句。?1234567891011SELECTS.USERNAME|(
14、|s.sid|)-|s.osuserUNAME,s.program|-|s.terminal|(|s.machine|)PROG,s.sid|/|s.serial#sid,s.statusStatus,p.spid,sql_textsqltextFROMv$sqltext_with_newlinest,V$SESSIONs,v$processpWHEREt.address=s.sql_addressANDp.addr=s.paddr(+)ANDt.hash_value=s.sql_hash_valueORDERBYs.sid,t.piece;性能相关查询29. 查询用户 CPU 的使用率这个语
15、句是用来显示每个用户的 CPU 使用率,有助于用户理解数据库负载情况?12345678SELECTss.username,se.SID,VALUE/100cpu_usage_secondsFROMv$sessionss,v$sesstatse,v$statnamesnWHEREse.STATISTIC#=sn.STATISTIC#ANDNAMELIKE%CPUusedbythissession%ANDse.SID=ss.SIDANDss.status=ACTIVEANDss.usernameISNOTNULLORDERBYVALUEDESC;30. 查询数据库长查询进展情况显示运行中的长查询的
16、进展情况?12345678910111213SELECTa.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$sessionbWHEREa.sid=b.sidANDb.usernameNOTIN(SYS,SYSTEM)ANDtotalwork0ORDERBYelapse
17、d_seconds;31. 获取当前会话 ID,进程 ID,客户端 ID 等这个专门提供给想使用进程 ID 和 会话 ID 做些 voodoo magic 的用户。?123456SELECTb.sid,b.serial#,a.spidprocessid,b.processclientpidFROMv$processa,v$sessionbWHEREa.addr=b.paddrANDb.audsid=USERENV(sessionid); V$SESSION.SID AND V$SESSION.SERIAL# 是数据库进程 ID V$PROCESS.SPID 是数据库服务器后台进程 ID V$S
18、ESSION.PROCESS 是客户端 PROCESS ID, ON windows it IS : separated THE FIRST # IS THE PROCESS ID ON THE client AND 2nd one IS THE THREAD id.32. 查询特定的模式或者表中执行的最后一个 SQL 语句?12345SELECTCREATED,TIMESTAMP,last_ddl_timeFROMall_objectsWHEREOWNER=MYSCHEMAANDOBJECT_TYPE=TABLEANDOBJECT_NAME=EMPLOYEE_TABLE;33. 查询每个执行
19、读取的前十个 SQL?1234567891011121314SELECT*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.addressFROMv$sqlareaaORDERBY3DESC)WHEREROWNUM10;34. 在视图中查询并显示实际的 Oracle 连接?123456SELEC
20、Tosuser,username,machine,programFROMv$sessionORDERBYosuser;35. 查询并显示通过打开连接程序打开连接的组?1234SELECTprogramapplication,COUNT(program)Numero_SesionesFROMv$sessionGROUPBYprogramORDERBYNumero_SesionesDESC;36. 查询并显示连接 Oracle 的用户和用户的会话数量?1234SELECTusernameUsuario_Oracle,COUNT(username)Numero_SesionesFROMv$sessi
21、onGROUPBYusernameORDERBYNumero_SesionesDESC;37. 获取拥有者的对象数量?1234SELECTowner,COUNT(owner)number_of_objectsFROMdba_objectsGROUPBYownerORDERBYnumber_of_objectsDESC;实用/数学 相关的查询38. 把数值转换成文字更多信息可以查看:Converting number into words in Oracle?1SELECTTO_CHAR(TO_DATE(1526,j),jsp)FROMDUAL;输出:?1onethousandfivehundr
22、edtwenty-six39. 在包的源代码中查询字符串这个查询语句会在所有包的源代码上搜索FOO_SOMETHING ,可以帮助用户在源代码中查找特定的存储过程或者是函数调用。?12345-searchastringfoo_somethinginpackagesourcecodeSELECT*FROMdba_sourceWHEREUPPER(text)LIKE%FOO_SOMETHING%ANDowner=USER_NAME;40. 把用逗号分隔的数据插入的表中当 你想把用逗号分隔开的字符串插入表中的时候,你可以使用其他的查询语句,比如 IN 或者是 NOT IN 。这里我们把AA,BB,C
23、C,DD,EE,FF转换成包含 AA,BB,CC 等作为一行的表,这样你就很容易把这些字符串插入到其他表中,并快速的做一些相关的操作。?1234567WITHcsvAS(SELECTAA,BB,CC,DD,EE,FFAScsvdataFROMDUAL)SELECTREGEXP_SUBSTR(csv.csvdata,+,1,LEVEL)pivot_charFROMDUAL,csvCONNECTBYREGEXP_SUBSTR(csv.csvdata,+,1,LEVEL)ISNOTNULL;41. 查询表中的最后一个记录这个查询语句很直接,表中没有主键,或者是用户不确定记录最大主键是否是最新的那个记
24、录时,就可以使用这个语句来查询表中最后一个记录。?1234567891011SELECT*FROMemployeesWHEREROWIDIN(SELECTMAX(ROWID)FROMemployees);(OR)SELECT*FROMemployeesMINUSSELECT*FROMemployeesWHEREROWNUM(SELECTCOUNT(*)FROMemployees);42. 在 Oracle 中做行数据乘法这个查询语句使用一些复杂的数学函数来做每个行的数值乘法。更多内容请查阅:Row Data Multiplication In Oracle?12345678910111213WITHtblAS(SELECT-2numFROMDUALUNIONSELECT-3numFROMDUALUNIONSELECT-4numFROMDUAL),sign_valAS(SELECT
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1