天天看点

Oracle查询SELECT

本人有一些数据库基础,故并不详细

一、SELECT 基础语法

SELECT { [ aliias. ] column | expression | [ alias. ]  * [ ,... ] }
FROM [ schema. ] table [alias]
WHERE  查询条件;
           

二、用DISTINCT去除重复值

默认情况下,SELECT 语句或返回符合条件的所有行值,实际是哪个这是因为在SELECT语句后面有一个默认的关键字ALL,用来表示返回所以的数据行,包含具有重复的行。

DISTINCT 或ALL以及UNIQUE必须紧随在SELECT 语句后面。

使用DISTINCT的限制:

1、在使用了DISTINCT的选择列表中取回的总数据的大小受限于数据块大小的限制,是一个数据块大小减去一些开销之后的代销,也就是说要注意DISTINCT后面的选择列表的大小,不过在实际的 工作中一般很少会超越这个限制。

2、如果选择列表中包含了大对象类型,比如LOB列,那么不能使用DISTINCT关键字。

三、表达式查询

算数运算符

运算符 说明
+ 加法操作
- 减法操作
* 乘法操作
/ 除法操作

SQL比较运算符

运算符 运算符描述
< 小于
<= 小于等于
> 大于
>= 大于等于
= 等于
<> 或 != 不等于

定义表达式注意原则:

1、字符串和日期类型的值要放在单引号中。

2、日期的默认格式是DD-MON_RR,可以同更改NLS_DATE_FORMAT来更改日期的现实格式。

3、虽然SQL语言本身不区分大小写。但是位于单引号中的比较值是区分大小写的。

四、BETWEEN、IN、LIKE范围查询

1、使用BETWEEN进行范围查询

expr1 [ NOT ] BETWEEN expr2 AND expr3
           

五、处理NULL值

如果一个列的列属性设置为允许NULL值,那么在使用WHERE条件查询列值为NULL值得列时,需要使用IS NULL 或 IS NOT NULL来测试控制。NULL时为止、未指定的或难以获得的值,如果使用等于或者不等于进行比较,结果总是返回FALSE或未知,疑问NULL列不能等于或不等于任何值。如果使用 “=” 或者 “!=”,将会返回UNKNOWN,UNKNOWN大多数情况下也是FALSE,因此无法取出任何记录。

--email列条件不为空
SELECT * FROM buser WHERE email IS NOT NULL;
           
Oracle查询SELECT
--email列条件为空
SELECT * FROM buser WHERE email  IS NULL;
           
Oracle查询SELECT

六、AND、OR、NOT逻辑运算符

AND和OR可以让用户连接多个比较表达式,实现对于复杂条件的运算。

1、AND运算符,有称与运算符,如果AND左右俩侧的表达式结果都为TRUE ,那么结果就位TRUE。

2、OR运算符,又称或运算符,如果OR左右俩侧的表达式只要有一个结果为TRUE,那么俩个结果就位TRUE。

3、NOT运算符,又称取反运算符,NOT通常是单目运算符,即NOT右侧才能包含表达式,是对结果取反,如果表达式结果为TRUE,那么NOT的结果就为FALSE;否则如果表达式的结果为FALSE,那么NOT的结果就为TRUE。

七、使用ORDER BY 排序

在WHERE子句的后面可以紧跟ORDER BY 子句来实现对查询结果的排序,ASC指定升序排序,这是默认的顺序;DESC用于指定降序的排序顺序。ORDER BY子句必须为SELECT最后一个子句。

八、ROWNUM伪列

伪列是指物理上并不存在的列,只是在查询是,ORACLE 才构造伪列的数值,位列是由Oracle自动构造的,一般情况下无法对其进行修改。ROWNUM是根据查询结果集来动态产生的,它产生在ORDER BY 排序结果集之前,因此如果在结果集中应用了排序,就有可能导致伪劣排序的混乱。在应用了WHERE条件是,如果条件不匹配,会被丢弃并且会被重置,这也就是说,如果ROWNUM 的值不满足,那么下一行的值将会重用ROENUM。

九、ROWID伪列

ROWID伪列用来返回行的地址,它包含了用来定位一个行所需要的信息。ROWID通常用来定位记录,比如索引就使用ROWID来定位目标行位置,并且ROWID默认情况下是按字符递增进行排列的。

ROWID的18个字符按照功能进行组织,七组成结构参见表

数据对象编号 文件编号 块编号 行编号
OOOOOO FFF BBBBBB RRR

1、数据对象编号,表示行所在的数据库段的编号。

2、数据文件编号,与表空间相关的数据文件编号指定所在行所在的数据文件。

3、数据块编号,指定包含行数据的数据块,数据块编号是相对于数据文件而不是表空间的,因此俩个行可能具有相同的数据块编号,但是4、它们位于不同的数据文件中。

5、行号,指定块中的行号。

Oracle提供了一个可以轻松得到具体的ROWID包含的信息,这个包就是DBMS_ROWID,因此要获取具体的编号信息,可以使用如下查询。

--查询ROWID信息
SELECT DBMS_ROWID.rowid_object (ROWID) object_id,   				-- 对象编号
			 DBMS_ROWID.rowid_relative_fno (ROWID) file_id,			-- 数据文件编号
			 DBMS_ROWID.rowid_block_number (ROWID) block_id,		-- 数据文件编号
			 DBMS_ROWID.rowid_row_number (ROWID) num				-- 数据文件编号
FROM buser--(查询的表名)
WHERE ROWNUM < 5;
           

或者使用dual表和ROWID查询

SELECT DBMS_ROWID.rowid_object ('AAAR/UAAFAAAAClAAB') object_id,   					-- 对象编号
			 DBMS_ROWID.rowid_relative_fno ('AAAR/UAAFAAAAClAAB') file_id,			-- 数据文件编号
			 DBMS_ROWID.rowid_block_number ('AAAR/UAAFAAAAClAAB') block_id,			-- 数据文件编号
			 DBMS_ROWID.rowid_row_number ('AAAR/UAAFAAAAClAAB') num					-- 数据文件编号
FROM dual
           

ROWID表示行的唯一标识符,它用来构建索引结构,每一个索引建都包含一个ROWID值没用来指定索引的行,使用ROWID是访问表行最快的方法,二千可以用来观察数据的物理组成方式。对于每一行记录,即便所有的字段值都相同,ROWID也不可能相同,因为ROWID总是唯一的。

十、CASE表达式

在SQL语言中,可以通过俩种方式模拟IF-THEN-ELSE逻辑,分别是CASE表达式和DECODE函数。

在SQL语言中,XASE 语句按其难易程度可以分为如下俩类:

1、简单CASE语句,在CASE语句中指定输入表达式,通过WHEN子句中的多个条件值与之进行比较 ,简单CASE语句是基于值之间的比较。

2、搜索CASE语句,CASE语句中不指定比较值,通过WHEN子句中使用表达式计算结果值,只要条件为TRUE就去其结果。

语法如下:

CASE expr														--指定要匹配的表达式,该表达式必须返回值
	WHEN comparison_expr1 THEN return_expr1						--WHEN子句分局表达式返回的值进行判断
	[WHEN comparison_expr2 THEN return_expr年
	WHEN comparison_exprn THEN return_exprn
	...
	ELSE else_expr]												--上述所有条件都不成立则执行ELSE子句
END
           

简单CASE语句要求在CASE关键字后面指定一个表达式,这个表达式可以是列名或者是返回结果的表达式,在WHEN子句中提供一系列的值,与expr中的结果值进行比较,WHEN子句的个数可以有65534个,如果包含ELSE最大可达65535个。WHEN子句中表达式的结果类型必须要与CASE中的输入表达式的类型想匹配并且所有的THEN关键字后的结果值得类型必须相同。

例:

SELECT name, birth, 
		CASE birth 
			WHEN '1991'  THEN BIRTH+1 
			WHEN '1992' THEN  BIRTH+2 
			ELSE BIRTH-1 
		END nameASD 
FROM buser
WHERE MOBILE = '13499990001';
           
Oracle查询SELECT

Oracle提供了复杂的CASE。

CASE WHEN comparison_expr THEN return_expr1															
							
	[WHEN comparison_expr2 THEN return_expr1
	WHEN comparison_exprn THEN return_exprn
	...
	ELSE else_expr]		
END										
           

例:

SELECT account,name, birth, 
		CASE 
			WHEN account = 'zhangsan' THEN birth-5 
			WHEN account = 'wangwu'  THEN  birth+2 
			ELSE birth-1 
		END nameASD 
FROM buser
WHERE MOBILE = '13499990001';
           
Oracle查询SELECT

尽量不要WHEN和THEN后面的变量一样,否则可能会有问题,什么原因还没有弄明白,欢迎大家指点。下面的例子细心的人就会发现有问题。

SELECT account,name, birth, 
		CASE 
			WHEN birth > '1900' THEN birth-5 
			WHEN birth <= '1900'  THEN  birth+2 
			ELSE birth-1 
		END nameASD 
FROM buser
WHERE MOBILE = '13499990001';
           
Oracle查询SELECT