本人有一些数据库基础,故并不详细
一、SELECT 基础语法
SELECT { [ aliias. ] column | expression | [ alias. ] * [ ,... ] }
FROM [ schema. ] table [alias]
WHERE 查询条件;
二、用DISTINCT去除重复值
SELECT DISTINCT 列名 FROM 表名;
默认情况下,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;
--email列条件为空
SELECT * FROM buser WHERE email IS NULL;
六、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提供了复杂的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';
尽量不要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';