1.
这里涉及到两个系统视图的应用dba_tab_cols和user_tab_cols;
2.
dba_tab_cols包含所有用户下表字段信息;user_tab_cols包含当前用户下表信息;使用tba_tab_clos查询表字段类型需要指定owner(用户)
3.
上述两个表中,table_name,column_name,data_type就可以满足需要查询表字段类型了,具体类型对应其他字段还有另外定义,比如varchar2,date,number还对应在data_length字段有值,说明类型其长度
4.
user_tab_columns和user_tab_cols都可以满足问题要求,但是两张视图还是有区别的,主要是包含字段的区别等,具体区别可以度娘哈,这里就不赘述。
② Oracle表中有各种类型数据,如何用sql语句查询类型为Number的所有字段
select * from user_tab_columns ut where ut.table_name='表名'哪银 AND ut.DATA_TYPE = '核碰NUMBER'改缓谈;
以emp表为例:
select * from user_tab_columns ut where ut.table_name='EMP' AND ut.DATA_TYPE = 'NUMBER'
③ oracle数据库中sql基础
一 关系数据库的一些概念 主键的值一般不可以改变 外键 指向另一个表或本表的主键或唯一键的字段 外键的值一定要和某一主键相同 或者为空 数据库对像 表 视图 序列 索引 同义词 程序(进程 函数 sql和pl/sql数据) sql mand 类乎没别data retrieval数据检索:selectdata manipulationlanguage (DML)数据操作语言:insert update deletedata definition language (DDL)数据定义语言 create alter drop rename truncatetransaction control事务控制:mit rollback savepointdata control language(DCL)数据控制语言 grant revokeDCL 和DDL命令的执行会导致一次隐式提交 之前未提交的操作(包括DML 命令)都会提交写入日志文件 并在适当地时候写入数据文件 二 SQL的语法 ) 连接号 ||岁卜纳 ) 把两个字符连接起来eg:select game_card_type_id||name from game_card_type; ) select distinct dept_id title from emp 对多个字段的唯一 ) order by desc(降序)order by asc(升序) ) where column is (not) null ) like _a% _表示一个字符 %表示多少字符like %x\_y% escape :显示包括x_y的字符 ) where lumn(+)=lumnplace the operator on the side of the join where there is no value to join to ) 联接类型:equijoin:等式查询non_equijoin:不等式查询self:自己和自己建弊老立关联out join:where lumn=lumn(+)可以用的操作符是 = and 不可以用 or in )COUNT 函数所用的列包含空值时 空值行被忽略 )where 后的in any all 的区别in 等于子查询的任何一个数any 与子查询的每一个值相比只要比其中一个大(小)就可以了all:与子查询的所有值相比要比所有的的都大(小)!=ALL作用跟NOT IN 一样 三 SQL*PLUS的环境(可以在glogin sql中定义初始参数) ) START 命令用以执行一个已储存的文件 等同于@ ) SAVE命令用以创建一个文件 ) EDIT命令用以调用编辑器编辑已存文件的内容 ) CHANGE 是SQL*Plus的编辑命令 用于在当前一行把旧文段转换为新文段 ) DEL 命令用以删除文本中一行或多行文字 ) SPOOL命令用以把查询结果储存在一个已有文件中 注意与SAVE区别 ) GET命令用以一个文件的内容写进一个SQL块中 ) SPOOL OUT命令用以把文件的结果发送到系统打印机 ) set pause off/on:设置页面的滚动 按enter看下一页 ) PAGESIZE 指定每页显示的行的数值 ) LONG 设置LONG类型数据显示的最大宽度 ) FEEDBACK 设置查询返回记录的最大值 ) DESCRIBE :用于显示表和视图的结构 同义词 或指定函数和过程的详述 ) Timing 可以看到语句执行的时间 ) Autotrace 可以看到sql的执行计划 sysdba执行/home/oracle/proct/ /sqlplus/admin/plustrce sql脚本 而且必须把plustrace角色赋给执行用户 执行用户必须运行/home/oracle/proct/ /rdbms/admin/utlxplan sql ) 在各种数据类型中 只有NUMBER数据类型的默认显示是靠右对齐的 而CHAR DATE和VARCHAR 是靠左对齐的 ) QUIT 是SQL*PLUS命令 用以结束一个SQL*PLUS的对话 ) ttitle:ttitle selina 设select 的结果的抬头为selinatti 显示ttitle的状态tti off/onbtitle end 设结果的尾部 ) Column a) column name heading 名字 format a b) column id justify left format c) column start_date format a null not hired //当字段为空的时候则显示成not hiredd) column :显示所有的column设置e) column columnname:显示某一个字段的设置f) clear column :清除所有column设置g) column columnname clear:清除某一字段的设置h) 以上的column可用col代替 clear可以用cle代替 )定义变量用& 由用户输入变量值 此变量可以存在于where后 做为整个查询语句的变量 也可以在order by 后 做为字段的变量 也可以放在select 后 做为字段或表达式的变量 用&& 如果多个地方引用此变量 只用输入一次SQL> SELECTempno ename job &&column_nameFROMempORDER BY &column_name;accept 由用户输入变量值accept 变量名 datatype prompt 告诉用户需要输入的信息 hide引用的时候 &变名define(undefined) 一开始就定义变量值 四 函数 字符函数lower:把字符转成小写upper:把字符转成大写initcap:把单词的第一个字母变成大写concat:连接字符concat( good morning )=goodmoringSUBSTR (columnexpression m[ n]) 用于对字符串进行截取操作 从第m个位置开始 把其后的连续n个字符的部分截取下来 如果m位负值 则从末尾开始计算 eg:substr( string ) =strsubstr( string )=ingINSTR( String r )= LPAD(sal * ) =*******sallength: 用于返回表达式中的字符数 注意返回的是NUMBER NVL(expression expression )NVL 函数用以把一个空值转换为一个实值 如 NVL( /quantity ) 要是quantity为空值 该函数返回一个 如果两个字段类型不同必须进行转换 Min():返回最小值 如果是字符 A<a 数学函数round:四舍五入round( )= round( )= trunc: 截断trunc( )= trunc( )= mod:mod(m n):m n*flood(m/n) file://flood是取整数 日期函数:a) months_beeen(date date ) 算date 和date 之间的月的数量 可以是小数可以是负数months_beeen( sep jan )= b) add_months(date n) 为date加上N个月 N只可以是整数c) next_date(date char ) 查找date的下一个星期Nnext_date( sep FRIDAY )= SEP d) last_day(date):查找date月的最后一天 e) rount(date) 把日期四舍五入f) rount( MAY MONTH )= JUN g) rount( MAY YEAR )= JAN h) trunc(date) 把日期截断i) trunc ( MAY MONTH )= MAY j) trunc ( MAY YEAR )= JAN k) 日期中RR与YY的区别 RR格式对日期作类似于舍入的操作 YY格式对日期作类似于截取的操作RR YY oct oct oct oct 用法 select to_char(sysdate YY ) from al;select to_char(to_date( RR MM DD ) YYYY MM DD ) from al;select to_char(to_date( YY MM DD ) YYYY MM DD ) from al; 转换函数TO_CHAR TO_CHAR(date fmt ) fm前缀用来去除首尾的空字符或 TO_CHAR(total fm$ )如果想转成$ 那就要写成fm$ 可以把日期转换成字符TO_CHAR(log_time MM/YY )TO_CHAR(lot_time fmdd of; mm yyyy )具体格式如下HH :MI:SS AM : : pmDD of MONTH of MAYDdspth fourteenthDdsp fourteenddth thYYYY MM MONTH MAY group 函数avg count max min stddev sum variance 五 数据字典 用户表 由用户创建 包含用户的内容数据字典 由系统建立 包含数据库的信息前缀:USER_ 由用户创建 显示用户拥有的所有对象 ALL_ 由受权的用户访问 用户可以访问的对象名 DBA_ 由受了DBA权限的人访问 显示数据库的所有对象 V$ 由受了DBA权限的人访问 显示数据字典数据库服务器性能信息 通常是DBA用于显示系统的统计表和动态性能表 数据字典DICTIONARY数据字典提供用户可以访问的数据字典表和视图的描述 USER_OBJECTS显示用户拥有的对象 USER_VIEWS显示用户拥有的视图 USER_TABLES显示用户拥有的表 ALL_TABLES显示用户可以访问的表 ALL_VIEWS显示用户可以访问的视图 USER_CATALOG显示用户拥有的所有表 视图 同义词和序列 USER_CONS_COLUMNS显示带约束的列 DBA_CONS_COLUMNS显示数据库里的所有表 视图和同义词 USER_TAB_PRIVS_MADE 本用户赋给别的用户赋予权限的表USER_TAB_PRIVS_RECD 其他用户给本用户赋予权限的表USER_COL_PRIVS_MADE 本用户赋给别的用户赋予权限的字段USER_COL_PRIVS_RECD 其他用户给本用户赋予权限的字段ROLE_SYS_PRIVS:有什么系统权限赋给roleROLE_TAB_PRIVS:有什么关于表的权限赋给roleUSER_ROLE_PRIVS:role和用户的对应表常用的表user_objects 用户对象表(存储用户的所有对象)存储以下的类型的数据Selina Sql>select distinct object_type from user_objects;INDEXLOBPACKAGEPACKAGE _catalog:用户类表 存储以下的类型的数据Selina Sql>select distinct table_type from user_catalog;SEQUENCESYNONYMTABLEVIEW lishixin/Article/program/Oracle/201311/17719
④ sql语句 分类汇总 oracle
select a.供应商,sum(a.型号1),sum(a.型号2),sum(a.型号锋明宏3) from
(select 供应槐腊商,
sum(case when 型号='1' then 1 eles 0 end) 型号1,
sum(case when 型号='2' then 1 eles 0 end) 型号银册2,
sum(case when 型号='3' then 1 eles 0 end) 型号3
group by 供应商) a
group by a.供应商
⑤ oracle中的多重分组相关的sql语句
一般处理神大行这样的问题,我都是通过分部解决的,因为分部的汇总就是一条SQL语句,但是有时这个语句太长了,可读性不好。
对于这个问题。
建立一个View(VwTbl1).按照账号把monf,mons汇总起来,同时对处理人员进行计数。
SELECT acco, SUM(monf) AS SumF, SUM(mons) AS SumS, COUNT(DISTINCT offi) AS NumP
FROM Table1 Group By acco你要的就是上面这个游哗View中仿灶SumF和SumS相等。同时NumO>1的。这下简单了吧。
SELECT acco
FROM VwTbl1
WHERE (SumF = SumS) AND (NumP > 1)
⑥ oracle中sql语句中的分组,如何将竖列变横列
create or replace type list_agg as object
(
total varchar2(4000),
static function ODCIAggregateInitialize(sctx IN OUT list_agg)
return number,
member function ODCIAggregateIterate(self IN OUT list_agg,
value IN varchar2) return number,
member function ODCIAggregateTerminate(self IN list_agg,
returnValue OUT varchar2,
flags IN number)
return number,
member function ODCIAggregateMerge(self IN OUT list_agg,
ctx2 IN list_agg) return number
);
create or replace type body list_agg is
static function ODCIAggregateInitialize(sctx IN OUT list_agg) return number is
begin
sctx := list_agg(null);
return ODCIConst.Success;
end;
member function ODCIAggregateIterate(self IN OUT list_agg,
value IN varchar2) return number is
begin
self.total := self.total || value;
return ODCIConst.Success;
end;
member function ODCIAggregateTerminate(self IN list_agg,
returnValue OUT varchar2,
flags IN number) return number is
begin
returnValue := substr(self.total, 2);
return ODCIConst.Success;
end;
member function ODCIAggregateMerge(self IN OUT list_agg,
ctx2 IN list_agg) return number is
begin
self.total := self.total || ctx2.total;
return ODCIConst.Success;
end;
end;
CREATE OR REPLACE FUNCTION ColumnToRow(input varchar2 )
RETURN varchar2
PARALLEL_ENABLE AGGREGATE USING list_agg;
select ColumnToRow(','||Tname) from tab where rownum<10;
⑦ oracle sql报表统计,怎么按订单类别,分组显示订单总数和交易成功订单数。
SELECT
ord.ORDER_TYPE as 订单类型,
COUNT(ord.ORDER_ID) as 订单总数,
orde.succCount as 交易成功订单总数
FROM
ORDER ord
LEFT JOIN
(
SELECT
ORDER_TYPE,
COUNT(ORDER_ID) AS succCount
FROM
ORDER
WHERE
STATUS_ID = 'ORDER_SUCCESS'
GROUP BY
ORDER_TYPE
)
orde
ON
orde.ORDER_TYPE = ord.ORDER_TYPE
GROUP BY
ord.ORDER_TYPE;
还有一种方法是,
SELECT
ORDER_TYPE AS 订单类型,
STATUS_ID AS 订单状态,
COUNT(ORDER_ID) AS 订单数
FROM
ORDER
GROUP BY
ORDER_TYPE,
STATUS_ID;
查出以订单类型的不同状态为分组的订单数,然后在代码中求订单总数
⑧ oracle中float 在sqlserver中对应哪个 类型
OracleSQLServer 比较
SQLServer 常见的数据库类型
字符数据类型 CHAR CHAR :都是固定长度字符资料但oracle里面最大度为2kb,SQLServer里面最大长度为8kb
变长字符数据类型 VARCHAR2 VARCHAR :racle里面最大长度为4kb,SQLServer里面最大长度为8kb
根据字符集而定的固定长度字符串 NCHAR :NCHAR 前者最大长度2kb后者最大长度4kb
根据字符集而定的可变长度字符串 NVARCHAR2 NVARCHAR :者最大长度都为4kb
日期和时间数据类型 DATE 有Datetime和Smalldatetime两种 在oracle里面格式为DMY在SQLSerser里面可以调节,默认的为MDY
数字类型 NUMBER(P,S) NUMERIC[P(,S)] :Oracle里面p代表小数点左面的位数,s代表小数点右面的位数。而SQLServer里面p代表小数点左右两面的位数之和,s代表小数点右面的位数。
数字类型 DECIMAL(P,S) DECIMAL[P(,S)] :racle里面p代表小数点左面的位数,s代表小数点右面的位数。而SQLServer里面p代表小数点左右两面的位数之和,s代表小数点右面的位数。
整数类型 INTEGER INT 同为整数类型,存储大小都为4个字节
浮点数类型 FLOAT FLOAT
实数类型 REAL REAL
ORACLE的数据类型
常用的数据库字段类型如下:
字段类型 中文说明 限制条件 其它说明
CHAR 固定长度字符串 最大长度2000 bytes
VARCHAR2 可变长度的字符串 最大长度4000 bytes 可做索引的最大长度749
NCHAR 根据字符集而定的固定长度字符串 最大长度2000 bytes
NVARCHAR2 根据字符集而定的可变长度字符串 最大长度4000 bytes
DATE 日期(日-月-年) DD-MM-YY(HH-MI-SS)
LONG 可变长度的字符数据 最大长度2G(231-1)足够存储大部头着作
RAW 固定长度二进制数据 最大长度2000 bytes 可存放比较小的多媒体图象声音等
LONG RAW 可变长度的二进制数据 最大长度2G 可存放比较大的多媒体图象声音等
BLOB 大型的二进制对象(可变长度)最大长度4G
CLOB 大型的CHAR类型数据
NCLOB 大型的NCHAR类型数据
BFILE 存放在数据库外的大型的二进制文件
ROWID 数据表中记录的唯一行号10 bytes ********.****.****格式,*为0或1,存储在索引中。
UROWID 同上 存储在索引中
NROWID 二进制数据表中记录的唯一行号 最大长度4000 bytes
NUMBER(P,S) 数字类型 P为总的位数,S为小数位
DECIMAL(P,S) 数字类型P为总的位数,S为小数位
INTEGER 整数类型 的整数
FLOAT 浮点数类型
NUMBER(38),双精度
REAL 实数类型
NUMBER(63),精度更高
注意:每个表中只能有一个LONG或LONG RAW列,……….。
几个常见的SQLSERVER和ORACLE数据类型对应关系表格
SQL Server和Oracle数据类型的对应关系
⑨ oracle sql是怎么解析的
导读:Oracle的后台运作原理是什么?我们的一条命令是如何被执行的?今天我们就从一条简单的Select语句开始,看看Oracle数据库后台的运作机制。
Select语句可以说是DBA和数据库开发者在工作中使用最多的语句之一,但这条语句是如何执行?在Oracle数据库中又是如何运作的呢?今天我们就从一条简单的Select语句开始,看看Oracle数据库后台的运作机制。这对于我们之后的系统管理与故障排除非常有帮助。
第一步:客户端把语句发给服务器端执行
当我们在客户端执行select语句时,客户端会把这条SQL语句发送给服务器端,让服务器端的进程来处理这语句。也就是说,Oracle客户端是不会做任何的操作,他的主要任务就是把客户端产生的一些SQL语句发送给服务器端。虽然在客户端也有一个数据库进程,但是,这个进程的作用跟服务器上的进程作用事不相同的。服务器上的数据库进程才会对SQL语句进行相关的处理。不过,有个问题需要说明,就是客户端的进程跟服务器的进程是一一对应的。也就是说,在客户端连接上服务器后,在客户端与服务器端都会形成一个进程,客户端上的我们叫做客户端进程;而服务器上的我们叫做服务器进程。所以,由于所有的SQL语句都是服务器进程执行的,所以,有些人把服务器进程形象地比喻成客户端进程的“影子”。
第二步:语句解析
当客户端把SQL语句传送到服务器后,服务器进程会对该语句进行解析。同理,这个解析的工作,也是在服务器端所进行的。虽然这只是一个解析的动作,但是,其会做很多“小动作”。
1. 查询高速缓存。服务器进程在接到客户端传送过来的SQL语句时,不会直接去数据库查询。而是会先在数据库的高速缓存中去查找,是否存在相同语句的执行计划。如果在数据高速缓存中,刚好有其他人使用这个查询语句的话,则服务器进程就会直接执行这个SQL语句,省去后续的工作。所以,采用高速数据缓存的话,可以提高SQL语句的查询效率。一方面是从内存中读取数据要比从硬盘中的数据文件中读取数据效率要高,另一方面,也是因为这个语句解析的原因。
不过这里要注意一点,这个数据缓存跟有些客户端软件的数据缓存是两码事。有些客户端软件为了提高查询效率,会在应用软件的客户端设置数据缓存。由于这些数据缓存的存在,可以提高客户端应用软件的查询效率。但是,若其他人在服务器进行了相关的修改,由于应用软件数据缓存的存在,导致修改的数据不能及时反映到客户端上。从这也可以看出,应用软件的数据缓存跟数据库服务器的高速数据缓存不是一码事。
2. 语句合法性检查。当在高速缓存中找不到对应的SQL语句时,则数据库服务器进程就会开始检查这条语句的合法性。这里主要是对SQL语句的语法进行检查,看看其是否合乎语法规则。如果服务器进程认为这条SQL语句不符合语法规则的时候,就会把这个错误信息,反馈给客户端。在这个语法检查的过程中,不会对SQL语句中所包含的表名、列名等等进行SQL他只是语法上的检查。
3. 语言含义检查。若SQL语句符合语法上的定义的话,则服务器进程接下去会对语句中的字段、表等内容进行检查。看看这些字段、表是否在数据库中。如果表名与列名不准确的话,则数据库会就会反馈错误信息给客户端。
所以,有时候我们写select语句的时候,若语法与表名或者列名同时写错的话,则系统是先提示说语法错误,等到语法完全正确后,再提示说列名或表名错误。若能够掌握这个顺序的话,则在应用程序排错的时候,可以节省时间。
4. 获得对象解析锁。当语法、语义都正确后,系统就会对我们需要查询的对象加锁。这主要是为了保障数据的一致性,防止我们在查询的过程中,其他用户对这个对象的结构发生改变。对于加锁的原理与方法,我在其他文章中已经有专门叙述,在这里就略过不谈了。
5. 数据访问权限的核对。当语法、语义通过检查之后,客户端还不一定能够取得数据。服务器进程还会检查,你所连接的用户是否有这个数据访问的权限。若你连接上服务器的用户不具有数据访问权限的话,则客户端就不能够取得这些数据。故,有时候我们查询数据的时候,辛辛苦苦地把SQL语句写好、编译通过,但是,最后系统返回个 “没有权限访问数据”的错误信息,让我们气半死。这在前端应用软件开发调试的过程中,可能会碰到。所以,要注意这个问题,数据库服务器进程先检查语法与语义,然后才会检查访问权限。
6. 确定最佳执行计划。当语句与语法都没有问题,权限也匹配的话,服务器进程还是不会直接对数据库文件进行查询。服务器进程会根据一定的规则,对这条语句进行优化。不过要注意,这个优化是有限的。一般在应用软件开发的过程中,需要对数据库的sql语言进行优化,这个优化的作用要大大地大于服务器进程的自我优化。所以,一般在应用软件开发的时候,数据库的优化是少不了的。
当服务器进程的优化器确定这条查询语句的最佳执行计划后,就会将这条SQL语句与执行计划保存到数据高速缓存。如此的话,等以后还有这个查询时,就会省略以上的语法、语义与权限检查的步骤,而直接执行SQL语句,提高SQL语句处理效率。
第三步:语句执行
语句解析只是对SQL语句的语法进行解析,以确保服务器能够知道这条语句到底表达的是什么意思。等到语句解析完成之后,数据库服务器进程才会真正的执行这条SQL语句。
这个语句执行也分两种情况。一是若被选择行所在的数据块已经被读取到数据缓冲区的话,则服务器进程会直接把这个数据传递给客户端,而不是从数据库文件中去查询数据。若数据不在缓冲区中,则服务器进程将从数据库文件中查询相关数据,并把这些数据放入到数据缓冲区中。
这里仍然要注意一点,就是Oracle数据库中,定义了很多种类的高速缓存。像上面所说的SQL语句缓存与现在讲的数据缓存。我们在学习数据库的时候,需要对这些缓存有一个清晰的认识,并了解各个种类缓存的作用。这对于我们后续数据库维护与数据库优化是非常有用的。
第四步:提取数据
当语句执行完成之后,查询到的数据还是在服务器进程中,还没有被传送到客户端的用户进程。所以,在服务器端的进程中,有一个专门负责数据提取的一段代码。他的作用就是把查询到的数据结果返回给用户端进程,从而完成整个查询动作。
从这整个查询处理过程中,我们在数据库开发或者应用软件开发过程中,需要注意以下几点:
一是要了解数据库缓存跟应用软件缓存是两码事情。数据库缓存只有在数据库服务器端才存在,在客户端是不存在的。只有如此,才能够保证数据库缓存中的内容跟数据库文件的内容一致。才能够根据相关的规则,防止数据脏读、错读的发生。而应用软件所涉及的数据缓存,由于跟数据库缓存不是一码事情,所以,应用软件的数据缓存虽然可以提高数据的查询效率,但是,却打破了数据一致性的要求,有时候会发生脏读、错读等情况的发生。所以,有时候,在应用软件上有专门一个功能,用来在必要的时候清除数据缓存。不过,这个数据缓存的清除,也只是清除本机上的数据缓存,或者说,只是清除这个应用程序的数据缓存,而不会清除数据库的数据缓存。
二是绝大部分SQL语句都是按照这个处理过程处理的。我们DBA或者基于Oracle数据库的开发人员了解这些语句的处理过程,对于我们进行涉及到SQL语句的开发与调试,是非常有帮助的。有时候,掌握这些处理原则,可以减少我们排错的时间。特别要注意,数据库是把数据查询权限的审查放在语法语义的后面进行检查的。所以,有时会若光用数据库的权限控制原则,可能还不能满足应用软件权限控制的需要。此时,就需要应用软件的前台设置,实现权限管理的要求。而且,有时应用数据库的权限管理,也有点显得繁琐,会增加服务器处理的工作量。因此,对于记录、字段等的查询权限控制,大部分程序涉及人员喜欢在应用程序中实现,而不是在数据库上实现。
⑩ Oracle与SQL数据库在SQL语句和字段类型的区别
SQL 是一种 ANSI 的标准计算机语言如今无论是像Oracle、Sybase、DB2、Informix、SQL Server这些大型的数据库管理系统,还是像Visual Foxpro、PowerBuilder这些PC上常用的数据库开发系统,都支持SQL语言作为查询语言 oracle sql与其他数据库sql没有区别 只是每种数据库具体怎么去实现(内部运行机制不同但是 提供的SQL(算是编程中说的接口吧)是一样的