insert into with用法 小修witheditor要多久
大家好,如果您还对insert into with用法不太了解,没有关系,今天就由本站为大家分享insert into with用法的知识,包括小修witheditor要多久的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!
数据库中in、on、with的用法及示例。
in
select* from tab where field in('A','B','C')
等价于select* from tab where field='A' or field='B' or field='C'
on永在表连接的时候
select* from a inner/left/right join b on a.xx= b.xx
with用法:
创建一个表:
create table regr(pid integer,id integer, name char(20))
alter table regr alter id set not null add primary key(id)
insert into regr values(-1,1,'library'),(1,2,'news'),(2,3,'world news'),(2,4,'politics'),(2,5,'bussiness')
(2,6,'science'),(2,7,'technology'),(1,8,'sports'),(8,9,'local'),(8,10,'collegiate'),(8,11,'professional')
(9,12,'soccer'),(10,13,'soccer'),(11,14,'soccer'),(9,15,'football'),(10,16,'football'),(11,17,'football'
使用with得到数据树
WITH RPL(PID, ID, name) AS
(SELECT ROOT.PID, ROOT.ID, ROOT.NameFROM regr ROOT
WHERE ROOT.PID= 8
UNION ALL
SELECT CHILD.PID, CHILD.ID, CHILD.Name
FROM RPL PARENT, regr CHILD
WHERE PARENT.ID= CHILD.PID)
SELECT DISTINCT PID, ID, Name
FROM RPL
ORDER BY PID, ID, Name
RPL作为一个具有以下三列的虚拟表:PID、ID和 name。
WITH子句内的第一个 SELECT语句是初始化表。它只执行一次。它的结果形成虚拟表的初始内容以作为递归的种子。在上面的示例中,种子是 PID为 8的一行或多行。
第二个 SELECT语句执行多次。将种子作为输入(JOIN中的辅助表)传递给第二个 SELECT语句以产生下一个行集合。将 JOIN的结果添加(UNION ALL)到虚拟表的当前内容中,并放回到其中以形成用于下一次传递的输入。只要有行产生,这个过程就会继续。
SQL With As 用法
一.WITH AS的含义
WITH AS短语,也叫做子查询部分(subquery factoring),可以定义一个SQL片断,该SQL片断会被整个SQL语句用到。可以使SQL语句的可读性更高,也可以在UNION ALL的不同部分,作为提供数据的部分。
对于UNION ALL,使用WITH AS定义了一个UNION ALL语句,当该片断被调用2次以上,优化器会自动将该WITH AS短语所获取的数据放入一个Temp表中。而提示meterialize则是强制将WITH AS短语的数据放入一个全局临时表中。很多查询通过该方式都可以提高速度。
二.使用方法
先看下面一个嵌套的查询语句:
上面的查询语句使用了一个子查询。虽然这条SQL语句并不复杂,但如果嵌套的层次过多,会使SQL语句非常难以阅读和维护。因此,也可以使用表变量的方式来解决这个问题,SQL语句如下:
虽然上面的SQL语句要比第一种方式更复杂,但却将子查询放在了表变量@t中,这样做将使SQL语句更容易维护,但又会带来另一个问题,就是性能的损失。由于表变量实际上使用了临时表,从而增加了额外的I/O开销,因此,表变量的方式并不太适合数据量大且频繁查询的情况。为此,在SQL Server 2005中提供了另外一种解决方案,这就是公用表表达式(CTE),使用CTE,可以使SQL语句的可维护性,同时,CTE要比表变量的效率高得多。
下面是CTE的语法:
现在使用CTE来解决上面的问题,SQL语句如下:
其中cr是一个公用表表达式,该表达式在使用上与表变量类似,只是SQL Server 2005在处理公用表表达式的方式上有所不同。
在使用CTE时应注意如下几点:
1. CTE后面必须直接跟使用CTE的SQL语句(如select、insert、update等),否则,CTE将失效。如下面的SQL语句将无法正常使用CTE:
2. CTE后面也可以跟其他的CTE,但只能使用一个with,多个CTE中间用逗号(,)分隔,如下面的SQL语句所示:
3.如果CTE的表达式名称与某个数据表或视图重名,则紧跟在该CTE后面的SQL语句使用的仍然是CTE,当然,后面的SQL语句使用的就是数据表或视图了,如下面的SQL语句所示:
4. CTE可以引用自身,也可以引用在同一 WITH子句中预先定义的 CTE。不允许前向引用。
5.不能在 CTE_query_definition中使用以下子句:
(1)COMPUTE或 COMPUTE BY
(2)ORDER BY(除非指定了 TOP子句)
(3)INTO
(4)带有查询提示的 OPTION子句
(5)FOR XML
(6)FOR BROWSE
6.如果将 CTE用在属于批处理的一部分的语句中,那么在它之前的语句必须以分号结尾,如下面的SQL所示:
sql中sequence的用法
sequence是序列号的意思,每次取的时候它会自动增加。sequence与表没有从属关系,与表一样属于用户。
在oracle中sequence就是所谓的序列号,每次取的时候它会自动增加,一般用在需要按序列号排序的地方。
1、Create Sequence语法
首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE权限,CREATE SEQUENCE emp_sequence
INCREMENT BY 1--每次加几个
START WITH 1--从1开始计数
NOMAXVALUE--不设置最大值
NOCYCLE--一直累加,不循环
CACHE 10;
一旦定义了emp_sequence,你就可以用CURRVAL,NEXTVAL
CURRVAL=返回 sequence的当前值
NEXTVAL=增加sequence的值,然后返回 sequence值
比如:
emp_sequence.CURRVAL
emp_sequence.NEXTVAL
可以使用sequence的地方:
-不包含子查询、snapshot、VIEW的 SELECT语句
- INSERT语句的子查询中
- NSERT语句的VALUES中
- UPDATE的 SET中
可以看如下例子:
INSERT INTO emp VALUES
(empseq.nextval,'LEWIS','CLERK',7902, SYSDATE, 1200, NULL, 20);
SELECT empseq.currval FROM DUAL;
但是要注意的是:
第一次NEXTVAL返回的是初始值;随后的NEXTVAL会自动增加你定义的INCREMENT BY值,然后返回增加后的值。CURRVAL总是返回当前SEQUENCE的值,但是在第一次NEXTVAL初始化之后才能使用CURRVAL,否则会出错。
一次NEXTVAL会增加一次SEQUENCE的值。但是如果你在同一个条SQL语句里面针对同一个sequence使用多次NEXTVAL,其值都是一样的。
如果指定CACHE值,ORACLE就可以预先在内存里面放置一些sequence,这样存取的快些。cache里面的取完后,oracle自动再取一组到cache。
使用cache或许会跳号,比如数据库突然不正常down掉(shutdown abort),cache中的sequence就会丢失.所以可以在create sequence的时候用nocache防止这种情况。
2、Alter Sequence
你或者是该sequence的owner,或者有ALTER ANY SEQUENCE权限才能改动sequence.可以alter除start至以外的所有sequence参数.如果想要改变start值,必须 drop sequence再 re-create.
Alter sequence的例子:
ALTER SEQUENCE emp_sequence
INCREMENT BY 10
MAXVALUE 10000
CYCLE--到10000后从头开始
NOCACHE;
影响Sequence的初始化参数:
SEQUENCE_CACHE_ENTRIES=设置能同时被cache的sequence数目。
可以很简单的Drop Sequence
DROP SEQUENCE order_seq;
修改sequence参数:
拥有ALTER ANY SEQUENCE权限才能改动sequence.可以alter除start至以外的所有sequence参数.如果想要改变start值,必须 drop sequence再create。例:
alter sequence SEQ maxvalue 9999999;
alter sequence SEQ cache 10;
在Sql语句中可以使用sequence的地方:
(1)不包含子查询、snapshot、VIEW的 SELECT语句
(2)INSERT语句的子查询中
(3)INSERT语句的values中
(4)UPDATE的 SET中
例如:
insert into student(id,name) values(seq.Nextval,'jack');
注意:
第一次NEXTVAL返回的是初始值,随后的NEXTVAL会返回增加后的值。CURRVAL总是返回当前SEQUENCE的值,但是在第一次NEXTVAL初始化之后才能使用CURRVAL,否则报如下错误:
ORA-08002序列currval尚未在会话中定义。
使用一次NEXTVAL会增加一次 SEQUENCE的值,所以如果你多次执行包含NEXTVAL的一条语句,其值就是不一样的。
删除sequence:drop sequence seq_a;
当删除sequence后,对应它的同义词会被保留,但是引用时会报错。
oracle为了在rac环境下为了sequence的一致性,使用了三种锁:row cache lock、SQ锁、SV锁。
row cache lock的目的是在sequence指定nocache的情况下调用sequence.nextval过程中保证序列的顺序性;
SQ锁是应用于指定了cache+noorder的情况下调用sequence.nextval过程中。
SV锁(dfs lock handel)是调用sequence.nextval期间拥有的锁。前提是创建sequence时指定了
cache和order属性(cache+order)。order参数的目的是为了在RAC上节点之间生成sequence的顺序得到保障。
扩展资料:定义Sequence:定义一个seq_test,最小值为10000,最大值为99999999999999999,从20000开始,增量的步长为1,缓存为20的循环排序Sequence。
定义方法:
create sequence seq_test
minvalue 10000
maxvalue 99999999999999999
start with 20000
increment by 1
cache 20
cycle
order;
DB2的写法:
create sequence seq_test
as bigint
start with 20000
increment by 1
minvalue 10000
maxvalue 99999999999999999
cycle
cache 20
order;
PostgreSQL的写法:
create sequence seq_test
increment by 1
minvalue 10000
maxvalue 99999999999999999
start 20000
cache 20
cycle;
二、Oracle、DB2、PostgreSQL数据库Sequence值的引用参数为:currval、nextval,分别表示当前值和下一个值。下面分别从三个数据库的Sequence中获取nextval的值。
Oracle中:seq_test.nextval
例如:select seq_test.nextval from dual;
DB2中:nextval for SEQ_TOPICMS
例如:values nextval for seq_test;
PostgreSQL中:nextval(seq_test)
例如:select nextval('seq_test');
三、Sequence与indentity的区别与联系
Sequence与indentity的基本作用都差不多。都可以生成自增数字序列。
Sequence是数据库系统中的一个对象,可以在整个数据库中使用,和表没有任何关系;indentity仅仅是指定在表中某一列上,作用范围就是这个表。
四、postgresql中的Sequence分配策略(postgresql8.3.x)
调用select nextval(seq_test);后,系统马上分配一个序号给用户,然后系统的次Sequence马上加上之前设置的步长(increment by 1),不论此序号用户是否使用。
调用select currval(seq_test);返回当前的序列号,该序列号只要没有使用,就不会变化,直到被使用后,才会变化,并且该序列号已经分配给当前请求,不会再分配给其他的请求。
所以,减少浪费时,使用currval,不在乎浪费,而且id不连续的话,可以使用nextval。因为一旦分配给你后,使用失败,将会把该序列号丢弃!
参考资料:百度百科-sequence
参考资料:百度百科-结构化查询语言
好了,文章到此结束,希望可以帮助到大家。