ORACLE官方SQL语言参考笔记之Oracle SQL的基本元素篇(第三章-第三节-文字)

本文简述

此书下载方法:加入群技术交流群(免费)699712384,文件夹为ORACLE官方文档中 
CSDN技术网址 
简书技术网址 
ORACLE官网教程地址 
书名:

中文名:《SQL语言参考笔记》

英文名:《SQL Language Reference》

作者:二次猿

时间:阅读于2018年3月21日

准备工作:详情见:具体可以参考简书和二次猿公众号常用表

注意事项:跳过基本概念和非重要内容,重点举例说明,并且加粗,部分内容可能在其他章节会再次详细介绍,表格如果排版不美观,可以复制到excle进行直观展示,代码部分根据实际情况注释和说明


文字

术语文本常量值是同义词, 并引用固定的数据值。例如, "杰克"、"蓝岛" 和 "101" 都是字符文本;5001是数字文本。字符文本括在单引号中, 以便 Oracle 可以将它们与架构对象名称区分开来。

本节包含以下主题:

  • 文本文字

  • 数字文本

  • 日期时间文本

  • 间隔文本

许多 SQL 语句和函数都要求您指定字符和数字文本值。还可以将文本指定为表达式和条件的一部分。您可以使用 "text" 表示法、带有N'text'符号的国家字符文本和具有integer的数字文本或number表示法, 具体取决于文本的上下文。这些符号的句法形式出现在下面的章节中。

要将日期时间或间隔数据类型指定为文本, 必须考虑数据类型中包含的任何可选精度。将日期时间和间隔数据类型指定为文本的示例在"数据类型"的相关节中提供.

文本文字

每当'string'出现在该引用的其他部分的表达式、条件、sql 函数和 sql 语句的语法中时, 请使用文本文本符号来指定值。此引用使用术语文本文字字符文本字符串交替进行。文本、字符和字符串总是用单引号括起来。如果语法使用术语char, 则可以指定解析为字符数据的文本文字或其他表达式, 例如hr.employees表的last_name列。当语法中出现char时, 不使用单引号。

文本文字或字符串的语法如下所示:

字符串::=

Description of string.gif follows
插图 "字符串. gif" 的说明

其中Nn指定使用国家字符集 (NCHARNVARCHAR2数据) 的文本。默认情况下, 使用此表示法输入的文本在服务器使用时通过数据库字符集转换为国家字符集。为避免在文本转换到数据库字符集期间可能丢失数据, 请将环境变量ORA_NCHAR_LITERAL_REPLACE设置为TRUE这样做透明地在内部替换n' , 并保留用于 SQL 处理的文本文字。

在语法的顶部分支中:

  • c是用户字符集的任何成员。文本中的单引号 (') 前面必须有转义字符。若要在文本中表示一个单引号, 请输入两个单引号。

  • ' ' 是两个单引号, 用于开始和结束文本文字。

在语法的底部分支中:

  • Qq表示将使用备选报价机制。此机制允许文本字符串的分隔符范围很广。

  • 最外层的' '是两个单引号, 分别位于开始和结束quote_delimiter的前面和后面。.

  • c是用户字符集的任何成员。可以在由c字符组成的文本文字中包括引号 (")。您还可以包括quote_delimiter, 只要它不紧跟在单引号后面。

  • quote_delimiter是除空格、制表符和返回外的任何单个或多字节字符。quote_delimiter可以是单引号。但是, 如果quote_delimiter出现在文本文字本身中, 请确保它不会紧跟在一个引号之后。

    如果打开的quote_delimiter[、 {、 <() 中的一个, 则关闭quote_delimiter必须是相应的]、 }、 >)在所有其他情况下, 打开和关闭quote_delimiter必须是相同的字符。

Text 文本具有CHARVARCHAR2数据类型的属性:

  • 在表达式和条件中, Oracle 使用空白填充的比较语义对文本文字进行比较, 就好像它们具有数据类型CHAR一样。

  • 文本文字最多可以有4000个字节的长度。

下面是一些有效的文本文字:

'Hello'
'ORACLE.dbs'
'Jackie''s raincoat'
'09-MAR-98'
N'nchar literal'

下面是一些使用备选报价机制的有效文本:

q'!name LIKE '%DBMS_%%'!'
q'<'So,' she said, 'It's finished.'>'
q'{SELECT * FROM employees WHERE last_name = 'Smith';}'
nq'ï Ÿ1234 ï'
q'"name like '['"'

另请参见:

"空白填充和 Nonpadded 比较语义学"

数字文本

使用数字文字符号来指定固定和浮点数字。

整数文本

每当integer出现在该引用的其他部分中描述的表达式、条件、sql 函数和 sql 语句中时, 必须使用整数表示法来指定整数。

integer的语法如下所示:

整数::=

Description of integer.gif follows
插图 "整数. gif" 的说明

其中digit是0、1、2、3、4、5、6、7、8、9中的一个。

整数最多可以存储38位精度的数字。

下面是一些有效的整数:

7
+255

数字和浮点文本

每当numbern在该引用的其他部分的表达式、条件、sql 函数和 sql 语句中出现时, 都必须使用数字或浮点表示法来指定值。

number的语法如下所示:

数量::=

Description of number.gif follows
插图 "数字. gif" 的说明

地方

  • + 或-表示正值或负值。如果省略该符号, 则正值为默认值。

  • digit是0、1、2、3、4、5、6、7、8或9中的一个。

  • e 或 e 表示数字是以科学记数法指定的。E 指定指数后的数字。指数可以从-130 到125不等。

  • f 或 f 表示该数字为BINARY_FLOAT类型的32位二进制浮点数字。.

  • d 或 d 表示该数字为BINARY_DOUBLE类型的64位二进制浮点数字。.

    如果省略 f 或 f 和 d 或 d, 则该数字的类型为NUMBER.

    后缀 f (f) 和 d (d) 只在浮点数字文本中支持, 而不是在要转换为NUMBER的字符串中。例如, 如果 Oracle 希望NUMBER, 并且它遇到字符串'9', 则它将字符串转换为数字9。但是, 如果 Oracle 遇到字符串'9f', 则转换失败并返回错误。

许多类型的NUMBER最多可以存储38位精度的数字。如果文字要求的精确度比NUMBER、 BINARY_FLOATBINARY_DOUBLE提供的精度高, 则 Oracle 将截断该值。如果文本范围超出NUMBER、 BINARY_FLOATBINARY_DOUBLE支持的范围, 则 Oracle 将引发错误。

数字文本是 SQL 语法元素, 对 NLS 设置不敏感。数字文本中的十进制分隔符始终是句点 (.)。但是, 如果在预期数值的位置指定了文本文字, 则文本文字将以 NLS 敏感的方式隐式转换为数字。文本文字中包含的十进制分隔符必须是用初始化参数NLS_NUMERIC_CHARACTERS建立的。Oracle 建议您在 SQL 脚本中使用数字文本, 使它们能够独立于 NLS 环境工作。

下面的示例阐释了数字文本和文本文字中小数分隔符的行为。这些示例假定您已将逗号 (,) 作为当前会话的 NLS 十进制分隔符 (以下列语句) 建立:

ALTER SESSION SET NLS_NUMERIC_CHARACTERS=',.';

上一语句还将句点 (.) 设置为 NLS 组分隔符, 但这与这些示例无关。

本示例在文本文字 "2,34'中使用数字文字1.23和已建立的 NLS 十进制分隔符 (,) 中所需的十进制分隔符 (.)。文本文字将转换为数值 2.34, 输出将使用逗号为十进制分隔符显示。

SELECT 2 * 1.23, 3 * '2,34' FROM DUAL;

    2*1.23   3*'2,34'
---------- ----------
      2,46       7,02

下一个示例显示逗号不被视为数值文本的一部分。相反, 逗号被视为两个数值表达式列表中的分隔符: 2*123.

SELECT 2 * 1,23 FROM DUAL;

       2*1         23
---------- ----------
         2         23

下一个示例显示文本文字中的十进制分隔符必须与 NLS 十进制分隔符匹配, 以使隐式文本到数字转换成功。以下语句失败, 因为十进制分隔符 (.) 与已建立的 NLS 十进制分隔符 (,) 不匹配:

SELECT 3 * '2.34' FROM DUAL;
           *
ERROR at line 1:
ORA-01722: invalid number 

下面是一些有效的NUMBER文本:

25
+6.34
0.5
25e-03
-1

下面是一些有效的浮点数字文本:

25f
+6.34F
0.5d
-1D

还可以在不能以数字文本表示值的情况下使用以下提供的浮点文本:

文字 意义 例子
binary_float_nan 条件IS NANBINARY_FLOAT类型的值为 true
SELECT COUNT(*) 
  FROM employees 
  WHERE TO_BINARY_FLOAT(commission_pct)
     != BINARY_FLOAT_NAN;
binary_float_infinity 单精度正无穷大
SELECT COUNT(*) 
  FROM employees 
  WHERE salary < BINARY_FLOAT_INFINITY;
binary_double_nan 条件IS NANBINARY_DOUBLE类型的值为 true
SELECT COUNT(*) 
  FROM employees 
  WHERE TO_BINARY_FLOAT(commission_pct)
     != BINARY_FLOAT_NAN;
binary_double_infinity 双精度正无穷大
SELECT COUNT(*) 
  FROM employees 
  WHERE salary < BINARY_DOUBLE_INFINITY;

日期时间文本

Oracle 数据库支持四 datetime 数据类型: DATETIMESTAMPTIMESTAMPWITHTIMEZONETIMESTAMPWITHLOCALTIME ZONE.

日期文本可以将DATE值指定为字符串文本, 也可以将字符或数字值转换为具有TO_DATE函数的日期值。DATE文本是 Oracle 数据库接受TO_DATE表达式代替字符串文本的唯一情况。

若要将DATE值指定为文本, 必须使用公历。您可以指定 ANSI 文本, 如下面的示例所示:

DATE '1998-12-25'

ANSI 日期文本不包含时间部分, 必须以 "年月日YYYY-MM-DD" 格式指定。或者, 您可以指定 Oracle 日期值, 如下面的示例所示:

TO_DATE('98-DEC-25 17:30','YY-MON-DD HH24:MI')

Oracle DATE值的默认日期格式由初始化参数NLS_DATE_FORMAT指定。此示例日期格式包括月份中的两位数字、月份名称的缩写、年份的最后两位数和24小时时间指定。

在日期表达式中使用时, Oracle 会自动将默认日期格式的字符值转换为日期值。

如果指定的日期值没有时间分量, 则默认时间为午夜 (分别为24小时和12小时时钟时间的00:00:00 或 12:00:00)。如果指定的日期值没有日期, 则默认日期为当前月份的第一天。

Oracle DATE列始终包含日期和时间字段。因此, 如果查询DATE列, 则必须在查询中指定时间字段, 或确保DATE列中的时间字段设置为 "午夜"。否则, Oracle 可能不会返回您所期望的查询结果。可以使用TRUNC date 函数将时间字段设置为 "午夜", 也可以在查询中包含大于或小于条件, 而不是相等或不等式条件。

下面是一些示例, 假定表my_table带有数字列row_numDATEdatecol:

INSERT INTO my_table VALUES (1, SYSDATE);
INSERT INTO my_table VALUES (2, TRUNC(SYSDATE));

SELECT *
  FROM my_table;

   ROW_NUM DATECOL
---------- ---------
         1 03-OCT-02
         2 03-OCT-02

SELECT *
  FROM my_table
  WHERE datecol > TO_DATE('02-OCT-02', 'DD-MON-YY');

   ROW_NUM DATECOL
---------- ---------
         1 03-OCT-02
         2 03-OCT-02

SELECT *
  FROM my_table
  WHERE datecol = TO_DATE('03-OCT-02','DD-MON-YY');

   ROW_NUM DATECOL
---------- ---------
         2 03-OCT-02

如果您知道DATE列的时间字段设置为 "午夜", 则可以查询DATE列, 如前面的示例所示, 或者使用DATE文本:

SELECT *
  FROM my_table
  WHERE datecol = DATE '2002-10-03';


   ROW_NUM DATECOL
---------- ---------
         2 03-OCT-02

但是, 如果DATE列包含午夜以外的值, 则必须筛选出查询中的时间字段以获得正确的结果。例如:

SELECT *
  FROM my_table
  WHERE TRUNC(datecol) = DATE '2002-10-03';


   ROW_NUM DATECOL
---------- ---------
         1 03-OCT-02
         2 03-OCT-02

Oracle 将TRUNC函数应用于查询中的每一行, 因此, 如果确保数据中时间字段的午夜值, 性能就会更好。要确保时间字段设置为 "午夜", 请在插入和更新过程中使用下列方法之一:

  • 使用TO_DATE函数可以屏蔽时间字段:

    INSERT INTO my_table
      VALUES (3, TO_DATE('3-OCT-2002','DD-MON-YYYY'));
    
  • 使用DATE文本:

    INSERT INTO my_table
      VALUES (4, '03-OCT-02');
    
  • 使用TRUNC函数:

    INSERT INTO my_table
      VALUES (5, TRUNC(SYSDATE));
    

date 函数SYSDATE日期返回当前系统日期和时间。函数CURRENT_DATE返回当前会话日期。有关SYSDATE日期、 TO_* * datetime 函数和默认日期格式的信息, 请参见"datetime 函数".

时间戳文本TIMESTAMP数据类型存储年、月、日、小时、分钟和秒以及小数第二个值。TIMESTAMP指定为文本时, fractional_seconds_precision值可以是任意数量的位数 (最多为 9), 如下所示:

TIMESTAMP '1997-01-31 09:26:50.124'

带时区文本的时间戳TIMESTAMPWITHTIMEZONE数据类型是TIMESTAMP的变体, 其中包含时区区域名称或时区偏移量。当您指定TIMESTAMPWITHTIMEZONE为文本时, fractional_seconds_precision值可以是任意数量的位数, 最多为9。例如:

TIMESTAMP '1997-01-31 09:26:56.66 +02:00'

如果两个TIMESTAMPWITHTIMEZONE值在 UTC 中表示相同的即时, 则不考虑数据中存储的TIMEZONE偏移量。例如,

TIMESTAMP '1999-04-15 8:00:00 -8:00'

TIMESTAMP '1999-04-15 11:00:00 -5:00'

上午8:00 太平洋标准时间与上午11:00 东部标准时间相同。

可以用TZR (时区区域名称) 格式元素替换 UTC 偏移量。例如, 下面的示例与前面的示例具有相同的值:

TIMESTAMP '1999-04-15 8:00:00 US/Pacific'

若要消除夏令时切换时边界情况的多义性, 请同时使用TZR和相应的TZD格式元素。下面的示例确保前面的示例将返回夏令时值:

TIMESTAMP '1999-10-29 01:30:00 US/Pacific PDT'

还可以使用 datetime 表达式表示时区偏移量:

SELECT TIMESTAMP '2009-10-29 01:30:00' AT TIME ZONE 'US/Pacific'
  FROM DUAL;

如果不添加TZD格式元素, 并且日期时间值不明确, 则如果将ERROR_ON_OVERLAP_TIME会话参数设置为TRUE, 则 Oracle 将返回错误。如果该参数设置为FALSE, 则 Oracle 将不明确的 datetime 解释为指定区域中的标准时间。

带本地时区文本的时间戳TIMESTAMPWITHLOCALTIME TIME ZONE数据类型不同, 时间TIMESTAMPWITHZONE在数据库中存储的数据规范化到数据库时区。时区偏移量不作为列数据的一部分存储。TIMESTAMPWITHLOCALTIMEZONE没有文字。相反, 您使用任何其他有效的 datetime 文本来表示此数据类型的值。下面的表显示了一些格式, 可用于将值插入TIMESTAMPWITHLOCALTIMEZONE列中, 以及查询返回的相应值。

插入语句中指定的值 查询返回的值
'19-FEB-2004' 19-FEB-2004.00.00.000000 AM
SYSTIMESTAMP 19-FEB-04 02.54.36.497659 PM
TO_TIMESTAMP('19-FEB-2004', 'DD-MON-YYYY') 19-FEB-04 12.00.00.000000 AM
SYSDATE 19-FEB-04 02.55.29.000000 PM
TO_DATE('19-FEB-2004', 'DD-MON-YYYY') 19-FEB-04 12.00.00.000000 AM
TIMESTAMP'2004-02-19 8:00:00 US/Pacific' 19-FEB-04 08.00.00.000000 AM

请注意, 如果指定的值不包含时间组件 (显式或隐式), 则返回的值默认为午夜。

间隔文本

间隔文本指定一段时间。您可以根据年份和月份、天数、小时数、分钟数和秒数来指定这些差异。Oracle 数据库支持两种类型的间隔文本, TOYEARtoMONTHDAYTOSECOND每个类型都包含一个前导字段, 并且可能包含尾随字段。前导字段定义要测量的日期或时间的基本单位。尾部字段定义了所考虑的基本单元的最小增量。例如,YEARto TO MONTH间隔考虑的时间间隔为最近的月份。DAYto TO MINUTE间隔将时间间隔视为最接近的分钟数。

如果您有数值形式的日期数据, 则可以使用NUMTOYMINTERVALNUMTODSINTERVAL转换函数将数值数据转换为间隔值。

间隔文本主要用于分析函数。

间隔年到月

使用以下语法指定YEARto TO MONTH间隔文本:

interval_year_to_month::=

Description of interval_year_to_month.gif follows
插图 "interval_year_to_month" 的说明

地方

  • 'integer [-integer]'指定文本的前导和可选尾随字段的整数值。如果前导字段为YEAR, 尾随字段为MONTH, 则月份字段的整数值范围为0到11。

  • precision是前导字段中的最大位数。前导字段精度的有效范围为0到 9, 其默认值为2。

对主导领域的限制如果指定尾随字段, 则它必须小于前导字段。例如,INTERVAL"0-1"MONTHTOYEAR无效。

下面的INTERVALYEARTOMONTH文本表示间隔为123年、2月:

INTERVAL '123-2' YEAR(3) TO MONTH

其他形式的文字跟随的例子, 包括一些缩写的版本:

间隔文本的形式 解释
INTERVAL '123-2' YEAR(3) TO MONTH 间隔123年, 2 月。如果大于默认值2位, 则必须指定前导字段精度。
INTERVAL '123' YEAR(3) 间隔为123年0月。
INTERVAL '300' MONTH(3) 间隔为300月。
INTERVAL '4' YEAR 映射到INTERVAL '4-0' YEAR TO MONTH, 表示4年。
INTERVAL '50' MONTH 映射到INTERVAL '4-2' YEAR TO MONTH, 表示50月或4年2月。
INTERVAL '123' YEAR 返回一个错误, 因为默认精度为 2, "123" 有3位数字。

可以向或从另一个INTERVALYEARTOMONTH的文本添加或减去另一种INTERVALYEARTOMONTH文本。例如:

INTERVAL '5-3' YEAR TO MONTH + INTERVAL'20' MONTH = 
INTERVAL '6-11' YEAR TO MONTH

间隔日到秒

使用以下语法指定DAYto TO SECOND间隔文本:

interval_day_to_second::=

Description of interval_day_to_second.gif follows
插图 "interval_day_to_second" 的说明

地方

  • integer指定天数。如果此值包含的数字多于由前导精度指定的数字, 则 Oracle 将返回一个错误。

  • time_expr指定的时间格式HH[:MI[:SS[.n]]]MI[:SS[.n]]SS[.n], 其中n指定秒的小数部分。如果n包含的数字多于fractional_seconds_precision指定的数字, 则n将四舍五入为fractional_seconds_precision值。只有在前导字段为DAY时, 才能在整数和空格的后面指定time_expr.

  • leading_precision是前导字段中的位数。接受值为0到9。默认值为2。

  • fractional_seconds_precisionSECONDdatetime 字段的小数部分中的位数。接受值为1到9。默认值为6。

对前导字段的限制:如果指定尾部字段, 则它必须小于前导字段。例如,INTERVALMINUTETODAY无效。由于此限制, 如果SECOND是前导字段, 则间隔文本不能有任何尾随字段。

尾随字段的有效值范围如下所示:

  • HOUR: 0 到23

  • MINUTE: 0 到59

  • SECOND: 0 到59.999999999

INTERVALDAYTOSECOND文本的各种形式的示例如下, 包括一些缩写版本:

间隔文本的形式 解释
INTERVAL '4 5:12:10.222' DAY TO SECOND(3) 4天, 5 小时, 12 分钟, 10 秒, 222 秒。
INTERVAL '4 5:12' DAY TO MINUTE 4天5小时12分钟
INTERVAL '400 5' DAY(3) TO HOUR 400天5小时
INTERVAL '400' DAY(3) 400天。
INTERVAL '11:12:10.2222222' HOUR TO SECOND(7) 11小时12分10.2222222 秒
INTERVAL '11:20' HOUR TO MINUTE 11小时20分钟
INTERVAL '10' HOUR 10小时。
INTERVAL '10:22' MINUTE TO SECOND 10分22秒
INTERVAL '10' MINUTE 10分钟
INTERVAL '4' DAY 4天。
INTERVAL '25' HOUR 25小时。
INTERVAL '40' MINUTE 40分钟
INTERVAL '120' HOUR(3) 120小时。
INTERVAL '30.12345' SECOND(2,4) 30.1235 秒小数秒 ' 12345 ' 四舍五入为 ' 1235 ', 因为精度为4。

可以将一个DAYtoSECOND间隔文本从另一个TO DAYTOSECOND文本中添加或减去。例如。

INTERVAL'20' DAY - INTERVAL'240' HOUR = INTERVAL'10-0' DAY TO SECOND

猜你喜欢

转载自blog.csdn.net/huyingzuo/article/details/80299541