你的位置:首页 > 数据库

[数据库]Oracle_查询语句


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语句不仅可以进行简单的查询,还可以对查询的列进行简单的计算,也可以在两个列之间进行计算,或者将某个列与其他表达式,或者两个表达进行计算。

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

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

如果在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子句中构造条件时,还要注意空值的运算。空值与任何数据进行赋值运算、四则运算以及关系运算时,结果都为空值。

查询语句中的单行函数

在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 函数类似,只不过它的功能是对数据进行截取运算,只舍不入,也就是把一个数据的指定位之后的数字全部舍去。

3.日期型函数

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

(1)ADD_MONTHS函数

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

它的格式为:

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(字符串,格式字符串)