您的位置:首页 > 数据库 > Oracle

Oracle 查询语句

2016-05-23 00:00 375 查看
SQL是结构化查询语言( Structured Query Language)的缩写,它是目前关系数据库系统中通用的标准语言。

SQL在字面上虽然称为结构化查询语言,实际上它还包括数据操纵数据定义事务控制安全控制等一系列命令。
SQL操作的基本对象是表,也就是关系。

它可以对表中的数据进行查询、增加、删除、修改等常规操作,还可以维护表中数据的一致性、完整性和安全性,能够满足从单机到分布式系统的各种应用需求。
SQL是一种非过程化的语言,用户在使用SQL操作数据时,只需要告诉系统做什么,而不需要关心怎么做,系统会根据用户的意图自动完成相应的操作。
由于SQL的这一特点,它被人们称为“第四代语言”(4GL ),以区别于面向过程的高级语言。
用SQL语言编写的SQL语句有两种执行方式,一种是联机交互方式, SQL语句在一定的平台上执行,例如数据库管理系统提供的实用程序。
这个执行平台将SQL语句提交给数据库服务器,并将从数据库服务器返回的执行结果显示给用户。
另一种方式是嵌入方式,用户在用C/C++ 、Java等高级语言编写应用程序时,可能需要操作数据库中的数据,这时SQL作为一种嵌入式语言,嵌入到高级语言程序中,通过数据库接口;如ODBC 、JDBC访问数据库中的数据。
SQL包括一系列命令,可以满足对数据的各种访问。

按照通用的分类标准, SQL命令分为以下几种类型:

·查询命令包括SELECT命令
•DML命令包括INSERT 、DELETE 、UPDATE命令
•DDL命令包括CREATE 、D·ROP 、ALTER 、RENAME 、TRUNCATE命令
·事务控制命令包括COMMIT 、ROLLBACK 、SAVEPOINT命令
•DCL命令包括GRANT 、REVOKE命令
命令和相关的参数一起构成了SQL语句。

查询语句

查询语句是使用最为频繁的数据库访问语句,对应的SQL命令是SELECT 。

虽然只有一条命令,但是由于它有灵活多样的形式,以及功能强大的子句,可以组成各种复杂的查询语句,能够完成各种复杂的查询。
SELECT语句可以根据用户的要求查询数据库中的数据,并且可以对它们进行简单的计算和统计。
最简单的SELECT语句只有一个FROM子句,格式如下:

SELECT 表达式 FROM 表名称;

其中SELECT之后引导一个或多个列名,或者表达式,用来指定需要查询的列,或者对数据所进行的计算。
在FROM子句指定一个或多个表名,用来指定本次查询所涉及的表。

查询的结果是返回一行或多行数据,每行由一个或多个列的列值组成。
完整的SELECT语句包括WHERE 、ORDER 、GROUP等子句。格式如下:

SELECT 表达式
FROM 表名
WHERE 条件
GROUP BY 列名
HAVING 条件
ORDER BY 表达式
SELECT语句最灵活的用法体现在WHERE子句中的查询条件,这个条件用来指定查询什么样的数据。

查询语句的基本用法

如果要查询某个表中一个或多个列的数据,需要在SELECT 命令之后指定列名,并在FROM子句中指定查询所涉及的表。

格式如下:

SELECT 列名称列表 FROM 表名称;

查询的结果是从指定的表中将指定列的数据显示出来。

这样的语句可以在Oracle提供的实用工具SQL*Plus 中执行,也可以在其他实用工具或应用程序中执行。

SQL语句中除字符串外,各个部分是大小写不敏感的。

如果在SQL*Plus 中执行SQL语句,还要在语句末尾加上一个分号。
分号并不是SQL语句的一部分,只是语句结束的标志。

一条句可以在一行中书写,也可以分行书写。
如果要查询表中的所有的列,可以用“*”符号代替所有的列名。

如果不了解表的结构,可以在SQL*Plus 中执行命令DESCRIBE (简写为DESC ),查看表的结构。
这个命令的参数是表名,或者其他对象名

注意,这条命令不是SQL 命令,而是SQL*Plus 中的命令。

在默认情况下,在显示数据时,各列的标题就是列的名称。

在SELECT语句中可以定义列的别名,这样在显示数据时,列的标题就是这个别名,在整个SQL语句中都可以使用这个别名。
使用别名的SELECT语句格式为:

SELECT 列1 AS 别 名1 ,列2 AS 别名2 •••
或者在列名后直接指定别名,省略AS 关键字。

在查询结果中如果有重复行,可以使用DISTINCT关键字去掉重复行的显示。

重复行是指在SELECT语句中涉及的所有列的列值完全相同的行。

SELECT语句不仅可以进行简单的查询,还可以对查询的列进行简单的计算,也可以在两个列之间进[b]行计算,或者将某个列与其他表达式,或者两个表达[b]式进行计算。[/b][/b]

使用||运算符可以将两个数据连接起来。

无论是数字型还是日期型数据,在进行这种运算时,都可以看做是字符型数据。
通过||运算符,用户可以设计自己喜欢的数据显示方式,如将两个列的值连接起来,也可以将列的值与其他文字连接起来。
连接以后所得的数据可以当做一个列来显示。

如果在SQL语句中使用了字符串,必须用一对单引号将字符串限定,并且字符串中的字符是大小写敏感的。
加减乘除四则运算在SELECT语句中比较简单,需要住意的是空值的计算。

空值与其他数据进行四则运算时,结果将得到空值,而不管它与什么样的数据运算。

为了解决空值的计算问题, SQL提供了一个函数,这个函数是NVL ,它的功能是把空值转换为其他可以参加运算的数据。
这个函数的调用格式是:
NVL (表达式,替代值)
当表达式的结果为空时,这个函数就把表达式的值用指定的值代替。

SELECT命令还可以用来计算一个普通表达式的值,这个表达式可能与表没有任何关系。

为了解决表达式与表无关的问题,Oracle提供了一个特殊的表dual。

查询语句中的条件

如果希望只查询一部分行,那么可以通过WHERE子句指定条件。WHERE子句的作用是通过指定条件,使SELECT语句仅仅查询符合条件的行。
在更多情况下,都需要根据指定的条件对数据进行查询。

WHERE子句指定的条件是一个关系表达式如果关系表达式的结果为真,则条件成立,否则条件不成立。
关系表达式用于比较两个表达式的大小,或者进行模糊匹配,或者将一个表达式的值与一个集合中的元素进行匹配。

关系运算符
=!=>=<=
LIKE
IN
BETWEEN
AND OR
NOT
IS NULL

LIKE运算符通常用来进行字符串的模糊匹配,而“=”运算符只能对字符串进行精确比较
在LIKE指定的关系表达式中可以使用两个通配得:%和_,其中%可以代替多个字符,_可以代替一个字符。
注意,%用来代替多个连续的字符,包括空字符串,而_只能用来代替一个字符,包括空字符。

IN运算符用来与一个集合中的元素进行比较。

SELECT语句将指定的表达式与集合中的元素一一比较,只要与其中-个相等,则条件成立。
如果没有任何一个元素与表达式的值相等,则条件不成立。

BETWEEN运算符用于将表达式的值与两个指定数据进行比较,如果表达式的值在这两个数据之间,则条件成立。
这两个数据和表达式必须能够比较大小,而且后一个数据必须大于前一个数据。

在复杂的查询语句中,可能需要多个条件,这些条件通过ANDOR运算符连接。

多个条件表达式连接起来以后,就构成一个逻辑表达式
逻辑表达式的结果要么为真,要么为假,它是与两个关系表达式的值和所使用的连接运算有关的。

NOT运算符的作用是对关系表达式的值取反。

它的用法是在关系表达式之前加上NOT运算符。

注:取反运算符- 是对数值型数据取反。

在默认情况下, NOT运算符只对最近的一个关系表达式取反,如果要对已经通过AND或OR连接的多个关系表达式同时取反,则要用一对圆括号将多个关系表达式限定。

在WHERE子句中构造条件时,还要注意空值的运算。空值与任何数据进行赋值运算、四[b]则运算以及关系运算时,结果都为空值。[/b]

查询语句中的单行函数

在SELECT语句中不仅可以对数据进行前面讲述的各种运算,还可以把数据作为函数的参数,进行其他的计算。
所谓单行函数,就是分别作用于查询结果中的每一行,对于每一行,分别得到一个计算结果。
这些函数都是Oracle提供的系统函数,用户可以在SELECT语句或其他SQL语句中直接使用它们。
Oracle提供的函数很多,这里仅仅把最常用的函数进行分类介绍。
在函数中处理的数据可以是某个列的列值,也可以是某个表达式

1.字符串处理函数

顾名思义,这类函数以字符串为处理对象,处理的结果是另一字符串或者一个数字。

(1)CONCAT函数

这个函数的参数是两个字符串,计算的结果是将两个字符串连接在一起,生成一个新的字符串。

例如
SELECT CONCAT('A', 'B') FROM dual;

(2)CHR与ASCII函数

CHR函数的参数是一个正整数,它将这个正整数作为ASCII码,返回对应的字母。

ASCII 函数的作用正好相反,它以一个字符为参数,返回这个字符对应的ASCII码。

例如:
SELECT CHR(32), ASCII('A') FROM dual;

(3)INSTR函数

这个函数在一个字符串中查找另一个字符串,如果找到,则返回出现的位置,否则返回0,位置的编号从l 开始。
这个函数的语法格式为:

INSTR(字符串, 子字符串, start, occurrence)

其中前两个参数是必需的,这个函数在第一个参数中查找第二个参数,得到的结果是第二个参数在第一个参数中出现的位置,如果没有找到,则返回0 。
后两个参数是可选的,参数start指定从第一个参数的什么位置开始查找,默认从l 开始,即第一个字符。
参数occurrence指定查找子字符串的第几次出现。

(4)LENGTH函数

这个函数的作用是求得一个字符串的长度。

(5)LOWER和UPPER函数

这两个函数的作用是进行字符串的大小写转换,它们的参数都是一个字符串。

其中LOWER 函数将字符串中的字母转换为对应的小写字母, UPPER 函数将字符串中的字母转换为对应的大写字母。

(6)LPAD和RPAD函数

这两个函数的作用是在字符串中填充指定的字符,使字符串达到指定的长度。

LPAD 函数从左边填充, RPAD 函数从右边填充,处理的结果是得到一个新的字符串。
这两个函数的语法格式为:

LPAD(字符串,长度,填充字符)

RPAD(字符串,长度,填充字符)

这两个函数在字符串中填充指定的字符,使其达到指定的长度,默认是填充空格

如果指定的长度比字符串本来的长度小,则将字符串截断,只保留新的长度。

注:在截断字符串时,都是截断字符串右边的部分。

(7)LTRIM、RTRIM函数和TRIM函数

这三个函数的作用是去掉字符串左边或右边连续的空格,并得到一个新的字符串。

TRIM 函数的作用是同时去掉字符串左边和右边的连续空格,它相当于对字符串先执行LTRIM 函数,再执行RTRIM 函数,或者先执行RTRIM 函数,再执行LTRIM 函数。
注:这三个函数只能去除字符串左边或右边的空格,对于字符串中间的空格是不能去除的。

(8)REPLACE函数

这个函数的作用是在一个字符串中查找另一个字符串,并将找到的字符串用第三个字符串代替。
这个函数的语法格式为:

REPLACE(字符串,子字符串,替换字符串)

如果在字符串没有找到子字符串,则不做任何处理,如果找到,则用替换字符串代替。

如果没有指定替换字符串,就将找到的子字符串从原字符串中删除。

(9)SUBSTR函数

这个函数的作用是根据指定的开始位置和长度,返回一个字符串的子字符串

它的语法格式为:
SUBSTR(字符串,开始位置,长度)

位置编号从l 开始。

开始位置可以是正整数或负整数。

如果是负整数,则从字符串的右边开始数。
长度是可选的,如果缺省,则返回从开始位置到字符串末尾的所有字符。

注:开始位置是负整数时,从字符串右边开始数,但是长度扔往右边算。

2.数学函数
数学函数的处理对象是数字型数据,处理的结果一般也是数字型数据。

(1)ABS函数

这个函数的作用是求得一个数字的绝对值

(2)CEIL和FLOOP函数

这两个函数都以一个数字为参数, CEIL 函数返回大于或等于这个数字的最小整数
FLOOR 函数返回小于或等于这个数字的最大整数

(3)MOD函数

这个函数有两个参数,结果是两个数相除所得的余数。

(4)ROUND和TRUNC函数

ROUND 函数的作用是对数据进行四舍五入计算

这个函数的语法结构为:

ROUND(数据,舍入位置)

其中舍入位置可以是正整数,也可以是负整数。

如果是正整数,则从小数点开始向右数,一直到舍人位置,从这一位开始四舍五入。
如果是负整数,则从小数点开始向左数,然后进行四舍五入。

TRUNC 函数的用法与ROUND 函数类似,只不过它的功能是对数据进行截取运算,只舍不[b]入,也就是把一个数据的指定位之后的数字全部舍去。[/b]

[b]3.日期型函数[/b]

[b]日期型函数的处理对象是日期型数据,处理的结果一般也是日期型数据。[/b]

[b](1)ADD_MONTHS函数[/b]

这个函数在某个日期的基础上,加上一个指定的月数,返回一个新的日期。

它的格式为:

ADD_MONTHS(日期,月数)

这个函数是在指定的日期上加上若干个整月数,所以日期中的日应该保持不变。

但是指定的日期如果是当月的最后一天,函数会做相应的调整,以保证返回的日期也是当月的最后一天。

在ADD_MONTHS 函数中,不能直接使用类似“ 12-05-1 。”这样的日期型数据,因为Oracle把这样的数据是当做字符串来处理的,所以首先要调用to_date 函数将它转换为真正的日期型数据。

(2)LAST_DAY函数

这个函数返回指定日期所在月份的最后一天。

(3)MONTHS_BETWEEN函数

这个函数有两个参数,都是日期型数据,返回的结果是两个日期之间相差的月数。

这个函数的语法格式为: months_between (日期1 ,日期2 )。

如果两个日期中的日相同,或者都是当月的最后一天,则返回结果是一个整数,否则将返回一个小数。
第一个参数如果比第二个参数小,则返回的结果为负数。

(4)NEXT_DAY函数

这个函数有两个参数,一个是日期,一个是与星期几对应的整数,返回的结果是这个日期之后最近的星期几所对应的日期。

函数的调用格式为:

NEXT_DAY(日期,整数)

(5)ROUND函数

这个函数对指定的日期进行四舍五入处理。

它有两个参数,一个是日期,一个是表示日期某个组成部分的格式字符串。
函数的语法格式为:

ROUND(日期,格式字符串)

其中格式字符串用于指定从日期的哪一部分开始四舍五入。

Oracle支持的格式宇符串包括yy (或yyyy )、mm 、dd 、hh ,分别表示从年、月、日、时位进行四舍五入。
(6)SYSDATE函数

这是个很常用的函数,它用来获得系统当前时间。

在有些日志操作中,常常需要记录当前时间,使用这个函数是很方便的。
这个函数没有任何参数。

这个函数返回的时间可以精确到秒,但在显示时可能只显示到日,根据系统的不同显示格式有所变化。
如果希望得到时、分、秒,则需要通过to_char 函数进行数据类型转换。
(7)TRUNC函数

这个函数的功能类似于ROUND 函数,但是它不进行四舍五入,而是从指定位开始,截断其后面的部分,它的语法格式与ROUND 函数相同。

类型转换函数

在进行数据处理时,常常需要对数据进行类型转换。

数据类型转换主要涉及字符型、数字型和日期型数据之间的相互转换, 涉及的函数有to_charto_dateto_number
(1)TO_CHAR

to_char函数的作用是将一个日期型或者数字型数据转换为字符串

如果操作对象是日期型数据,这个函数的语法格式为:
TO_CHAR(日期,格式字符串)

其中格式字符串是由日期格式元素隔离符号组成的字符串,用来规定转换的格式。

如果没有指定格式字符串,则按照当前系统默认的时间格式转换为字符串。

格式元素  说明

-/| 日期中不同部分的分隔符。实际上除数字、字母以外的任何可显示字符都可以作为分隔符
yyyy yy 年的表示。其中yyyy表示4位数的年. yy表示两位数的年
month mon mm 月的表示。month表示月份的全称mon表示月份名称的缩写mm表示两位数字的月份
dd ddd 日的表示。dd表示两位数字的日. ddd表示在一年中的编号
d dy day 星期的表示d表示数字编号dy 表示星期的缩写day星期的全称
hh hh24 小时的表示,分别表示12小时制和24小时制
am pm 分别表示12小时制中的上午和下午
mi SS 分别表示两位数的分、秒
如果操作对象是数字型数据, to_char 函数的语怯格式为:

TO_CHAR(数字,格式字符串)

其中格式字符串是由数字格式元素小数点分隔符组成的字符串,用来控制转换的格式。

这种转换主要用在财务报表中。

(2)TO_DATE函数   

这个函数的作用是把一个字符串转换为一个日期型数据,它有两个参数,处理的结果是一个日期型数据。
这个函数的语法格式为:

TO_DATE(字符串,格式字符串)

格式字符串中的每部分对字符串中的每部分是一一对应地进行解释的,所以日期字符串中的每一部分对于格式字符串中的对应部分来说,必须是合法的数据。
(3)TO_NUMBER函数

这个函数的作用是把一个字符串转换为数字,它有两个参数,处理的结果是一个数字型数据。
这个函数的语法格式为:

TO_NUMBER(字符串,格式字符串)

格式元素  说明

,      格式化数字中逗号的位置

.      小数点的位置

9      代表一位十进制数

0      代表一位十进制数,当对应位没有数字时,以0填充

$      在数字前面加上$符号

L      在数字前面加上本地货币符号

分组函数与分组统计

分组函数又称为聚集函数,是一种多行函数

之所以称为多行函数,是与单行函数对应的,因为这种函数对多行数据一起进行计算,只返回一个结果,而不是每行都返回一个结果。
聚集函数主要用来进行数据的统计,常用的聚集函数有以下几个:
AVG 求平均值
MIN 求最小值
MAX 求最大值
SUM 求和

COUNT 计数
(1) AVG 函数
AVG 函数用来求指定列上的平均值,它将自动忽略列上的空值。

如果要去掉重复值的计算,可在列名前加上DISTINCE选项。

(2) MIN与MAX 函数
MIN 函数的作用是求指定列的最小值, MAX 函数的作用是求指定列的最大值。

这两个函数都自动忽略空行。

(3) COUNT 函数
COUNT函数用来计算数据的行数。

在默认情况下,这个函数不计算空行。

如果要计算空行,可以用“*”代替列名。
如果要去掉重复值的计算,可在列名前加上DISTINCE选项,这样如果遇到重复值,只计算一次。

(4) SUM 函数
SUM 函数的作用是对指定列求和,它将自动忽略空值。

如果要去掉重复值的计算,可在列名前加上DISTINCE选项。

2.分组统计

分组函数最常见的用法是与GROUP子句一起使用,用来对表中的数据进行分组统计。

GROUP子句的语法格式为:
GROUP BY 列 1 ,列 2 •••
GROUP子句根据指定的列对数据进行分组统计。

首先根据第二个列进行分组统计,第一个列相同时再进一步根据第二个列进行分组统计。

与GROUP子句一起使用的还有一个子句,即HAVING子句。

这个子句是可选的,它不能单独使用,只能配合GROUP子句使用,作用是对GROUP子句设置条件,对统计后的结果进行限制。

HAVING子句中的关系表达式必须使用分组函数,可以是在SELECT语句中己经出现的分组函数,也可以是没有出现的函数。
虽然HAVING子句和WHERE子句都是用来设置条件的,但是WHERE子句设置的条件是在查询时起作用的,它决定b,如果要进行统计,这样的条件是在统计之前就已经起作用了。
而HAVING子句设置的条件只有在进行统计后才起作用,它决定了对于统计产生的数据,哪些需要显示给用户。

数据的排序

SELECT语句可以使用的最后一个子句是ORDER子句。

以前在查询数据时,数据显示的顺序是不可预知的。
如果要对数据进行某种方式的排序,就要借助于ORDER子句。

ORDER子句的语法格式为:
ORDER BY 列1 排序方式,列2 排序方式...
ORDER子句对查询到的数据按照指定列的大小排序。

如果指定了多个排序列,则首先按照第一个排序列排序,如果这个列的值相同,则再按照第二个排序列继续排序。
排序方式包括ASCDESC ,分别表示升序排序和降序排序,二者可选其一,默认的排序方式是升序排序。
如果指定了多个排序列,可以为每个排序列单独指定排序方式。

ORDER子句中的排序列可以是列名,可以是列的别名,也可以是其他的表达式,还可以
是它在SELECT语句中的排列序号

如果在SELECT语句中用到了所有的子句,那么将构成一条复杂的SQL语句。

这些子句的使用顺序是: WHERE子句、GROUP子句、HAVING子句、ORDER子句。

多表查询

以前讲述的查询语句都只涉及一个表的数据。

在很多情况下 ,需要查询的数据往往涉及多个表,这时需要对多个表进行连接查询

表间的连接关系有相等连接非相等连接外连接子连接等多种形式,其中最常用的连接形式是相等连接。
相等连接体现在WHERE子句中指定的条件上,在条件中要指定两个表通过哪些列进行连接。
一般情况下进行连接查询的两个表是通过主键和外键进行关联的,所以最简单的条件是一个表的外键与另一个表的主键相等。
如果一个列在两个表中同时存在,那么在SELECT语句中要用表名进行限定(表名. 列名或者表的别名.列名),否则系统将无法确定是哪个表中的列。

构造查询语句时,首先要仔细分析这个查询要涉及哪些表,
以及这些表通过哪些列进行连接,然后在SELECT语句中指定所有涉及的表,在WHERE子句中指定连接条件。

外连接是一种特殊的连接方式。

假设有两个表A和B ,用相等连接查询可以返回表A中的所有行,而表B 中的部分行因为不满足相等条件,所以是不会被查询到的,但是利用外连接可以返回表B中的所有行。
对于表A和B来说,外连接的条件表达式的格式为:
WHERE A. 列名(+)= B. 列名
如果要显示表B 中所有行,包括使用相等连接无法显示的行,则在表A的列名之后指定外连接的标志“(+)”。

自连接是一种特殊的相等连接。相等连接一般涉及多个不同的表,白连接也涉及多个表,但是它们是同一个表。

由于要把同一个表看成两个不同的表进行连接,所以在FROM子句中要为表定义两个不同的别名。

子查询

子查询就是嵌套在另一个SELECT语句中的查询

在SELECT语句中, WHERE子句或者HAVING子句中的条件往往不能用一个确定的表达式来确定,而要依赖于另一个查询,这个被嵌套使用的查询就是子查询,它在形式上是被一对圆括号限定的SELECT语句。
在子查询中还可以再嵌套子查询。

这种复杂的SELECT语句的执行过程为:首先执行子查询,将执行的结果返回给主查询,然后再根据条件执行主查询。
子查询一般出现在SELECT语句的WHERE子句或HAVING子句中,作为条件表达式的一部分。
子查询的结果是返回一行或多行数据,可以被看做一个集合。

条件表达式就是要将某个表达式与这个集合中的元素进行某种比较运算,根据运算的结果是真或是假来决定是否执行上一层查询。
常用的运算符如下:

运算符  用法  说明

EXISTS  EXISTS S  如果集合S不为空,条件表达式的值为真,否则为假

IN  表达式 IN S  如果表达式的值在集合S中,则条件表达式的值为真,否则为假

=  表达式=S  如果表达式的值与集合S中唯一一个元素相等,则条件表达式的值为真,集合S必须确保最多只有一个元素

> < <= >=  与=相同  进行相应的关系运算

ANY(SOME)  用在集合名之前  指定要与集合中的任一个元素进行比较

ALL  用在集合名之前  指定要与集合中的所有元素进行比较

其中EXISTS 运算符测试子查询的返回结果,只要结果不为空,条件就为真,而主查询和子查询之间可能没有直接关系。

IN运算符将某个列的值与子查询的返回结果进行比较,只要与其中的一个结果相等,条件即为真。

=”运算符号比较特殊,它将某个列的值与集合中的元素进行精确匹配。

如果子查询只返回单行结果,那么将这个列与这一行进行比较。
如果子查询返回多行结果,那么必须用ANY或ALL进行限定,否则将出错。
ANY运算符的作用是,只要列值与返回结果中的任何一个相等,条件即为真。
ALL运算符的作用是,列值要与返回结果中的所有行都要进行比较。

运算符〉、〈、〉=和〈=与=的用法相似,子查询可以返回单行结果,也可以返回多行结果
如果是多行结果,必须用ANY或ALL进行限定。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: