一些sql关键字详解

Truncate用法详解

当我们想要清空某张表时,往往会使用truncate语句。大多时候我们只关心能否满足需求,而不去想这类语句的使用场景及注意事项。本篇文章主要介绍truncate语句的使用方法及注意事项。

1.truncate使用语法
truncate的作用是清空表或者说是截断表,只能作用于表。truncate的语法很简单,后面直接跟表名即可,例如: truncate table tbl_name 或者 truncate tbl_name 。

执行truncate语句需要拥有表的drop权限,从逻辑上讲,truncate table类似于delete删除所有行的语句或drop table然后再create table语句的组合。为了实现高性能,它绕过了删除数据的DML方法,因此,它不能回滚。尽管truncate table与delete相似,但它被分类为DDL语句而不是DML语句。

2.truncate与drop,delete的对比
上面说过truncate与delete,drop很相似,其实这三者还是与很大的不同的,下面简单对比下三者的异同。

truncate与drop是DDL语句,执行后无法回滚;delete是DML语句,可回滚。
truncate只能作用于表;delete,drop可作用于表、视图等。
truncate会清空表中的所有行,但表结构及其约束、索引等保持不变;drop会删除表的结构及其所依赖的约束、索引等。
truncate会重置表的自增值;delete不会。
truncate不会激活与表有关的删除触发器;delete可以。
truncate后会使表和索引所占用的空间会恢复到初始大小;delete操作不会减少表或索引所占用的空间,drop语句将表所占用的空间全释放掉。
3.truncate使用场景及注意事项
通过前面介绍,我们很容易得出truncate语句的使用场景,即该表数据完全不需要时可以用truncate。如果想删除部分数据用delete,注意带上where子句;如果想删除表,当然用drop;如果想保留表而将所有数据删除且和事务无关,用truncate即可;如果和事务有关,或者想触发trigger,还是用delete;如果是整理表内部的碎片,可以用truncate然后再重新插入数据。

无论怎样,truncate表都是高危操作,特别是在生产环境要更加小心,下面列出几点注意事项,希望大家使用时可以做下参考。

truncate无法通过binlog回滚。
truncate会清空所有数据且执行速度很快。
truncate不能对有外键约束引用的表使用。
执行truncate需要drop权限,不建议给账号drop权限。
执行truncate前一定要再三检查确认,最好提前备份下表数据。

sql中英文括号

!!!!!!!!!!!!Oracle SQL语句中支持中文括号!!!!!!!!!!!!!
Oracle数据查询中英括号问题解决
如果查询数据有"(“和”("两种符号模式的话,就是所谓的中英文符号问题,换一种说法这种也叫全角和半角字符,对于全角和半角互换,oracle 提供了两个函数to_multi_byte和to_single_byte函数,如:

# TO_MULTI_BYTE:将半角字符串转化为全角
# TO_SINGLE_BYTE: 将全角字符串转化为半角
select to_multi_byte(')'), to_single_byte(')') from dual; 
注:字母和数字也可以使用该方法

两个表数据行合并/两个表列合并

两个表数据行合并 :用union all
两个表列合并:使用full join (全连接)来实现我们的需求
full join ... on ...
全连接的查询结果是左外连接和右外连接的并集,即使一些记录关联不上,也能够把信息查询出来;

两张表数据进行左外链接的时候需要注意:

当两张表的关联条件有多个的时候,需要注意要在每个关联条件上都加上(+)的外连接条件,并且检查数据条数是否正确
(需要注意的是要在外连接的表不能加其他特定条件,否则会舍弃两张表关联不上的数据)

数字函数

函数接受NUMBER类型的参数并返回NUMBER类型的数值.超越函数和三角函数的返回值精确到36位.ACOS、ASIN、ATAN、ATAN2的结果精确到36位.

l          ABS

语法:    ABS(x)

功能:    得到x的绝对值.

使用位置: 过程性语言和SQL语句。


l          ACOS

语法:   ACOS(x)

功能:   返回x的反余弦值. x应该从0到1之间的数,结果在0到pi之间,以弧度为单位.

使用位置: 过程性语言和SQL语句。


l          ASIN

语法:   ASIN(x)

功能:   计算x的反正弦值. X的范围应该是-1到1之间,返回的结果在-pi/2到pi/2之间,以弧度为单位.

使用位置: 过程性语言和SQL语句。


l          ATAN

语法:   ATAN(x)

功能:   计算x的反正切值.返回值在-pi/2到pi/2之间,单位是弧度.

使用位置: 过程性语言和SQL语句。


l          ATAN2

语法:   ATAN2(x,y)

功能:   计算x和y的反正切值.结果在负的pi/2到正的pi/2之间,单位是弧度.

使用位置: 过程性语言和SQL语句。

l          CEIL

语法:   CEIL(x)

功能:   计算大于或等于x的最小整数值.

使用位置: 过程性语言和SQL语句。


l          COS

语法:   COS(x)

功能:   返回x的余弦值. X的单位是弧度.

使用位置: 过程性语言和SQL语句。


l          COSH

语法:   COSH(x)

功能:   计算x的双曲余弦值.


l          EXP

语法:   EXP(x)

功能:   计算e的x次幂. e为自然对数,约等于2.71828.

使用位置: 过程性语言和SQL语句。


l          FLOOR

语法:   FLOOR(x)

功能:   返回小于等于x的最大整数值.

使用位置: 过程性语言和SQL语句。


l          LN

语法:   LN(x)

功能:   返回x的自然对数. x必须是正数,并且大于0

使用位置: 过程性语言和SQL语句。


l          LOG

语法:   LOG(x)


功能:   计算以x为底的y的对数.底必须大于0而且不等于1, y为任意正数.

使用位置: 过程性语言和SQL语句。


l          MOD

语法:   MOD(x,y)

功能:   返回x除以y的余数.如果y是0,则返回x

使用位置: 过程性语言和SQL语句。


l          POWER

语法:   POWER(x,y)

功能:   计算x的y次幂.

使用位置: 过程性语言和SQL语句。


l          ROUND

语法:   ROUND(x[,y])

功能:   计算保留到小数点右边y位的x值. y缺省设置为0,这会将x保留为最接近的整数.如果y小于0,保留到小数点左边相应的位. Y必须是整数.

使用位置: 过程性语言和SQL语句。

l          SIGN

语法:   SIGN(x)

功能:   获得x的符号位标志.如果x<0返回-1.如果x=0返回0.如果x>0返回1.

使用位置: 过程性语言和SQL语句。


l          SIN

语法:SIN(x)

功能:计算x的正弦值. X是一个以弧度表示的角度.

使用位置: 过程性语言和SQL语句。


l          SINH

语法:SINH(x)

功能:返回x的双曲正弦值.

使用位置: 过程性语言和SQL语句。


l          SQRT

语法:   SQRT(x)

功能:   返回x的平方根. x必须是正数.

使用位置: 过程性语言和SQL语句。


l          TAN

语法:   TAN(x)

功能:   计算x的正切值, x是一个以弧度位单位的角度.

使用位置: 过程性语言和SQL语句。


TANH
语法:   TANH(x)

功能:   计算x的双曲正切值.

使用位置: 过程性语言和SQL语句。


l          TRUNC

语法:   TRUNC(x[,y])

功能:   计算截尾到y位小数的x值. y缺省为0,结果变为一个整数值.如果y是一个负数,那么就截尾到小数点左边对应的位上.

使用位置: 过程性语言和SQL语句。

字符函数

1字符函数——返回字符值
这些函数全都接收的是字符族类型的参数(CHR除外)并且返回字符值.除了特别说明的之外,这些函数大部分返回VARCHAR2类型的数值.字符函 数的返回类型所受的限制和基本数据库类型所受的限制是相同的,比如: VARCHAR2数值被限制为2000字符(ORACLE 8中为4000字符),而CHAR数值被限制为255字符(在ORACLE8中是2000).当在过程性语句中使用时,它们可以被赋值给VARCHAR2 或者CHAR类型的PL/SQL变量.


l          CHR

语法:   chr(x)

功能:返回在数据库字符集中与X拥有等价数值的字符。CHR和ASCII是一对反函数。经过CHR转换后的字符再经过ASCII转换又得到了原来的字符。

使用位置:过程性语句和SQL语句。


l          CONCAT

语法: CONCAT(string1,string2)

功能:返回string1,并且在后面连接string2。

使用位置:过程性语句和SQL语句。


l          INITCAP

语法:INITCAP(string)

功能:返回字符串的每个单词的第一个字母大写而单词中的其他字母小写的string。单词是用.空格或给字母数字字符进行分隔。不是字母的字符不变动。


使用位置:过程性语句和SQL语句。


l          LTRIM

语法:LTRIM(string1,string2)

功能:返回删除从左边算起出现在string2中的字符的string1。String2被缺省设置为单个的空格。数据库将扫描string1,从最左边开始。当遇到不在string2中的第一个字符,结果就被返回了。LTRIM的行为方式与RTRIM很相似。

使用位置:过程性语句和SQL语句。


l          NLS_INITCAP

语法:NLS_INITCAP(string[,nlsparams])

功能:返回字符串每个单词第一个字母大写而单词中的其他字母小写的string,nlsparams

指定了不同于该会话缺省值的不同排序序列。如果不指定参数,则功能和INITCAP相同。Nlsparams可以使用的形式是:

‘NLS_SORT=sort’

这里sort制订了一个语言排序序列。

使用位置:过程性语句和SQL语句。


l          NLS_LOWER

语法:NLS_LOWER(string[,nlsparams])

功能:返回字符串中的所有字母都是小写形式的string。不是字母的字符不变。

       Nlsparams参数的形式与用途和NLS_INITCAP中的nlsparams参数是相同的。如果nlsparams没有被包含,那么NLS_LOWER所作的处理和LOWER相同。

使用位置;过程性语句和SQL语句。


l          NLS_UPPER

语法:nls_upper(string[,nlsparams])

功能:返回字符串中的所有字母都是大写的形式的string。不是字母的字符不变。nlsparams参数的形式与用途和NLS_INITCAP中的相同。如果没有设定参数,则NLS_UPPER功能和UPPER相同。

使用位置:过程性语句和SQL语句。

l          REPLACE

语法:REPLACE(string,search_str[,replace_str])

功能:把string中的所有的子字符串search_str用可选的replace_str替换,如果没有指定replace_str,所有的string中的子字符串search_str都将被删除。REPLACE是TRANSLATE所提供的功能的一个子集。

使用位置:过程性语句和SQL语句。


l          RPAD

语法:RPAD(string1,x[,string2])

功能:返回在X字符长度的位置上插入一个string2中的字符的string1。如果string2的长度要比X字符少,就按照需要进行复制。如 果string2多于X字符,则仅string1前面的X各字符被使用。如果没有指定string2,那么使用空格进行填充。X是使用显示长度可以比字符 串的实际长度要长。RPAD的行为方式与LPAD很相似,除了它是在右边而不是在左边进行填充。

使用位置:过程性语句和SQL语句。


l          RTRIM
语法:   RTRIM(string1,[,string2])

功能:   返回删除从右边算起出现在string1中出现的字符string2. string2被缺省设置为单个的空格.数据库将扫描string1,从右边开始.当遇到不在string2中的第一个字符,结果就被返回了RTRIM的行为方式与LTRIM很相似.

使用位置:过程性语句和SQL语句。


l          SOUNDEX

语法:   SOUNDEX(string)

功能:   返回string的声音表示形式.这对于比较两个拼写不同但是发音类似的单词而言很有帮助.

使用位置:过程性语句和SQL语句。


l          SUBSTR

语法:   SUBSTR(string,a[,b])

功能:   返回从字母为值a开始b个字符长的string的一个子字符串.如果a是0,那么它就被认为从第一个字符开始.如果是正数,返回字符是从左边向右边进行计 算的.如果b是负数,那么返回的字符是从string的末尾开始从右向左进行计算的.如果b不存在,那么它将缺省的设置为整个字符串.如果b小于1,那么 将返回NULL.如果a或b使用了浮点数,那么该数值将在处理进行以前首先被却为一个整数.

使用位置:过程性语句和SQL语句。


l          TRANSLATE

    语法:   TRANSLATE(string,from_str,to_str)

    功能:   返回将所出现的from_str中的每个字符替换为to_str中的相应字符以后的string. TRANSLATE是REPLACE所提供的功能的一个超集.如果from_str比to_str长,那么在from_str中而不在to_str中而外 的字符将从string中被删除,因为它们没有相应的替换字符. to_str不能为空.Oracle把空字符串认为是NULL,并且如果TRANSLATE中的任何参数为NULL,那么结果也是NULL.

使用位置:过程性语句和SQL语句。


l          UPPER

语法: UPPER(string)

功能: 返回大写的string.不是字母的字符不变.如果string是CHAR数据类型的,那么结果也是CHAR类型的.如果string是VARCHAR2类型的,那么结果也是VARCHAR2类型的.

使用位置: 过程性语句和SQL语句。

F.2     字符函数——返回数字

这些函数接受字符参数回数字结果.参数可以是CHAR或者是VARCHAR2类型的.尽管实际下许多结果都是整数值,但是返回结果都是简单的NUMBER类型的,没有定义任何的精度或刻度范围.


l          ASCII

语法:   ASCII(string)

功能: 数据库字符集返回string的第一个字节的十进制表示.请注意该函数仍然称作为ASCII.尽管许多字符集不是7位ASCII.CHR和ASCII是互为相反的函数.CHR得到给定字符编码的响应字符. ASCII得到给定字符的字符编码.

使用位置: 过程性语句和SQL语句。


l          INSTR

语法:   INSTR(string1, string2[a,b])

功能:   得到在string1中包含string2的位置. string1时从左边开始检查的,开始的位置为a,如果a是一个负数,那么string1是从右边开始进行扫描的.第b次出现的位置将被返回. a和b都缺省设置为1,这将会返回在string1中第一次出现string2的位置.如果string2在a和b的规定下没有找到,那么返回0.位置的 计算是相对于string1的开始位置的,不管a和b的取值是多少.

使用位置: 过程性语句和SQL语句。

l          INSTRB

语法:   INSTRB(string1, string2[a,[b]])

功能:   和INSTR相同,只是操作的对参数字符使用的位置的是字节.

使用位置: 过程性语句和SQL语句。


l          LENGTH

语法:   LENGTH(string)

功能:   返回string的字节单位的长度.CHAR数值是填充空格类型的,如果string由数据类型CHAR,它的结尾的空格都被计算到字符串长度中间.如果string是NULL,返回结果是NULL,而不是0.

使用位置: 过程性语句和SQL语句。


l          LENGTHB

语法:   LENGTHB(string)

功能:   返回以字节为单位的string的长度.对于单字节字符集LENGTHB和LENGTH是一样的.

使用位置: 过程性语句和SQL语句。


l          NLSSORT

语法: NLSSORT(string[,nlsparams])

功能: 得到用于排序string的字符串字节.所有的数值都被转换为字节字符串,这样在不同数据库之间就保持了一致性. Nlsparams的作用和NLS_INITCAP中的相同.如果忽略参数,会话使用缺省排序.

使用位置: 过程性语句和SQL语句。

计算本星期的起始结束日期

--得到星期一的日期
select trunc(sysdate,''DD'')-to_char(sysdate,''D'')+2 from dual; 
--得到星期天的日期
select trunc(sysdate,''DD'')-to_char(sysdate,''D'')+8 from dual; 

merge函数用法

Merge的语法例如以下:

MERGE [hint] INTO [schema .] table [t_alias] USING [schema .] 
{ table | view | subquery } [t_alias] ON ( condition ) 
WHEN MATCHED THEN merge_update_clause 
WHEN NOT MATCHED THEN merge_insert_clause;
MERGE是什么,怎样使用呢?让我们先看一个简单的需求:
 

需求是,从T1表更新数据到T2表中。假设T2表的NAME 在T1表中已存在,就将MONEY累加,假设不存在。将T1表的记录插入到T2表中。

大家知道,在等价的情况下,一定需要至少两条语句,一条为UPDATE,一条为INSERT,并且语句中必需要与推断的逻辑,或者写在过程中,假设是单条语句,就要写全条件。
写在UPDATE和INSERT的语句中,显的比較麻烦并且easy出错。假设了解MERGE,我们能够不借助存储过程,直接用单条SQL便实现了该业务逻辑,且代码非常简洁。详细例如以下:

 

MERGE INTO T2
USING T1
ON (T1.NAME=T2.NAME)
WHEN MATCHED THEN
UPDATE
SET T2.MONEY=T1.MONEY+T2.MONEY
WHEN NOT MATCHED THEN
INSERT
VALUES (T1.NAME,T1.MONEY);
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值