/*将查询结果生成新表*/
CREATE TABLE A AS SELECT * FROM B
/*将查询结果插入到新表中*/
insert into b select * from a
/*以左表(C)为准连接右表*/
SELECT *
FROM t_class c LEFT /*OUT*/ JOIN t_studentss
ON c.c_id=s.s_class
/*以右表(S)为准连接左表*/
SELECT *
FROM t_class c RIGHT /*OUT*/ JOIN t_studentss
ON c.c_id=s.s_class
/*以上两种情况合并*/
SELECT *
FROM t_class c RIGHT /*OUT*/ JOINt_students s
ON c.c_id=s.s_class
在Oracle PL-SQL中,左连接和右连接以如下方式来实现
查看如下语句:
SELECT emp_name, dept_name
FORM Employee, Department
WHERE Employee.emp_deptid(+) = Department.deptid
此SQL文使用了右连接,即“(+)”所在位置的另一侧为连接的方向,右连接说明等号右侧的所有记录均会被显示,无论其在左侧是否得到匹配,也就是说上例中无论会不会出现
某个部门没有一个员工的情况,这个部门的名字都会在查询结果中出现。
反之:
SELECT emp_name, dept_name
FORM Employee, Department
WHERE Employee.emp_deptid =Department.deptid(+)则是左连接,无论这个员工有没有一个能在Department表中得到匹配的部门号,这个员工的记录都会被显示。
SELECT col1, col2,
CASE
WHEN col3 > 1 AND col3 <2
THEN '1'
WHEN col3 > 2 AND col3 <3
THEN '2'
WHEN col3 > 3 AND col3 <4
THEN '3'
ELSE '4'
END mylevel
FROM table1
注意点:
1、以CASE开头,以END结尾
2、分支中WHEN 后跟条件,THEN为显示结果
3、ELSE 为除此之外的默认情况,类似于高级语言程序中switch case的default,可以不加
4、END 后跟别名
select u.creator_id 创建者ID,
sum( case u.sex when 1 then 1 else 0 end) 男性,
sum( case u.sex when 2 then 1 else 0 end) 女性,
sum( case when u.sex<>1 andu.sex<>2 then 1 else 0 end) 性别为空
from users u
group by u.creator_id;
Oracle中没有已定义好的自动编号列,需要自己创建,下面总结Oracle 10g中自动编号列的创建方法:
1. 首先需要给要添加自动编号列的表创建索引,被索引的列就是后面要实现的自动编号列,这样的列往往是名为“ID”的列。创建索引可以通过OEM创建,也可以在SQL*Plus或PL/SQL中通过SQL语句创建。以方案LY中的表HARD为例,给其hard_id列创建索引的SQL语句为:
CREATE UNIQUE INDEX LY.HARD ONLY.HARD(hard_id);
2. 然后需要创建一个最小值为1,最大值不限,递增值为1的序列。序列的创建同样可以通过OEM或直接输入SQL语句创建。创建序列的SQL语句为:
drop sequence HARD_SEQ;
create sequence HARD_SEQ
minvalue 1
maxvalue999999999999999999999999999
start with 21
increment by 1
cache 20
order;
3.最后为表LY.HARD创建触发器,以实现在每次插入行时,hard_id列自动递增编号。触发器的创建同样可以方便的由OEM创建,也可以用SQL语句创建。下面为创建触发器的SQL语句:
CREATE OR REPLACE TRIGGER"HARD_ID_TRIGGER" BEFORE
INSERT ON"LY"."HARD" FOR EACH ROW
declare
next_checkup_no number;
begin
select hard_seq.nextval
into next_checkup_no
from dual;
:NEW.hard_id := next_checkup_no;
end;
需要注意的是,在用OEM创建触发器时,有可能出现“Failedto commit: 索引中丢失 IN 或 OUT 参数:: 1”的错误提示,在网上查阅了一些资料,认为这可能是Oracle中的一个BUG,所以建议使用SQL语句创建触发器。
首先,你要有一张表! CREATE TABLE example( ID Number(4) NOT NULL PRIMARY KEY, NAME VARCHAR(25), PHONE VARCHAR(10), ADDRESS VARCHAR(50)); 如果对于以上的建表语句还有疑问的话,建议您不要继续了!有那么些时间您还不如去看看金庸读读琼瑶! 然后,你需要一个自定义的sequence CREATE SEQUENCE emp_sequence INCREMENT BY 1 -- 每次加几个 START WITH 1 -- 从1开始计数 NOMAXVALUE -- 不设置最大值 NOCYCLE -- 一直累加,不循环 NOCACHE -- 不建缓冲区 以上代码完成了一个序列(sequence)的建立过程,名称为emp_sequence,范围是从1开始到无限大(无限大的程度是由你机器决定的),nocycle 是决定不循环,如果你设置了最大值那么你可以用cycle 会使seq到最大之后循环.对于nocache顺便说一下如果你给出了cache值那么系统将自动读取你的cache值大小个seq ,这样在反复操作时会加快运行速度,但如果遭遇意外情况如当机了或oracle死了,则下次取出的seq值将和上次的不连贯.(如果连不连贯无所谓建议用cache,因为时间就是金钱呀!跑题了!) 书接上文,你只有了表和序列还不够,还需要一个触发器来执行它!代码如下: CREATE TRIGGER "触发器名称" BEFORE INSERT ON example FOR EACH ROW WHEN (new.id is null) begin select emp_sequence.nextval into: new.id from dual; end; 打完收工!下面你就试试插入数据吧! INSERT INTO example(Name,phone,address) Values('Cao','56498543','Heibei');