回 帖 发 新 帖 刷新版面

主题:[转帖]sql语句编程手册(实用+练习)

一、SQL PLUS  
1 引言  

SQL命令  
以下17个是作为语句开头的关键字:  
alter  drop  revoke  
audit  grant  rollback*  
commit*  insert  select  
comment  lock  update  
create  noaudit  validate  
delete  rename  
这些命令必须以“;”结尾  
带*命令句尾不必加分号,并且不存入SQL缓存区。  

SQL中没有的SQL*PLUS命令  
这些命令不存入SQL缓存区  
@  define  pause  
#  del  quit  
$  describe  remark  
/  disconnect  run  
accept  document  save  
append  edit  set  
break  exit  show  
btitle  get  spool  
change  help  sqlplus  
clear  host  start  
column  input  timing  
compute  list  ttitle  
connect  newpage  undefine  
copy  

---------  
2 数据库查询  

数据字典  
TAB 用户创建的所有基表、视图和同义词清单  

DTAB 构成数据字典的所有表  

COL 用户创建的基表的所有列定义的清单  

CATALOG 用户可存取的所有基表清单  

select * from tab;  

describe命令 描述基表的结构信息  
describe dept  

select *  
from emp;  

select empno,ename,job  
from emp;  

select * from dept  
order by deptno desc;  

逻辑运算符  
= !=或<> > >= < <=  
in  
between value1 and value2  
like  
%  
_  
in null  
not  
no in,is not null  

谓词in和not in  
有哪些职员和分析员  
select ename,job  
from emp  
where job in ('clerk','analyst');  

select ename,job  
from emp  
where job not in ('clerk','analyst');  

谓词between和not between  
哪些雇员的工资在2000和3000之间  
select ename,job,sal from emp  
where sal between 2000 and 3000;  

select ename,job,sal from emp  
where sal not between 2000 and 3000;  

谓词like,not like  
select ename,deptno from emp  
where ename like 'S%';  
(以字母S开头)  
select ename,deptno from emp  
where ename like '%K';  
(以K结尾)  
select ename,deptno from emp  
where ename like 'W___';  
(以W开头,后面仅有三个字母)  
select ename,job from emp  
where job not like 'sales%';  
(哪些雇员的工种名不以sales开头)  

谓词is null,is not null  
没有奖金的雇员(即commision为null)  
select ename,job from emp  
where comm is null;  

select ename,job from emp  
where comm is not null;  

多条件查询  
select ename,job  
from emp  
where deptno=20  
and job!='clerk';  

表达式  
+ - * /  

算术表达式  
选择奖金高于其工资的5%的雇员  
select ename,sal,comm,comm/sal from emp  
where comm>.05*sal  
  order by comm/sal desc;  

日期型数据的运算  
add two days to 6-Mar-87  
6-Mar-87 + 2 = 8-Mar-87  
add two hours to 6-Mar-87  
6-Mar-87 + 2/24 = 6-Mar-87 and 2hrs  
add 15 seconds to 6-Mar-87  
6-Mar-87 + 15/(24*60*60) = 6-Mar-87 and 15 secs  

列名的别名  
select ename employee from emp  
  where deptno=10;  
(别名:employee)  
select ename,sal,comm,comm/sal "C/S RATIO" from emp  
  where comm>.05*sal  
  order by comm/sal desc;  

SQL命令的编辑  
list or l 显示缓冲区的内容  
list 4 显示当前SQL命令的第4行,并把第4行作为当前行,在该行号后面有个*。  
change or c 用新的内容替换原来在一行中第一次出现内容  
SQL>c/(...)/('analyst')/  
input or i 增加一行或多行  
append or a 在一行后追加内容  
del  删除当前行 删除SQL缓冲区中的当前行  
run  显示并运行SQL缓冲区中的命令  
/  运行SQL缓冲区中的命令  
edit  把SQL缓冲区中的命令写到操作系统下的文本文件,  
并调用操作系统提供的编辑器执行修改。  

-------------  
3 数据操纵  
数据的插入  
insert into dept  
  values (10,'accounting','new york');  

insert into dept (dname,deptno)  
  values ('accounting',10);  

从其它表中选择插入数据  
insert into emp (empno,ename,deptno)  
select id,name,department  
from old_emp  
where department in(10,20,30,40);  

使用参数  
insert into dept  
  values(&deptno,&dname,&loc);  
执行时,SQL/PLUS对每个参数将有提示用户输入  

参数对应日期型或字符型数据时,可在参数上加引号,输入时就可不用引号  
insert into dept  
  values(&deptno,'&dname','&loc');  

插入空值(NULL)  
insert into dept  
  values(50,'education',null);  

插入日期型数据  
日期型数据缺省格式:DD-MON-YY  
insert into emp  
(empno,ename,hiredate)  
values(7963,'stone','07-APR-87');  

系统时间:SYSDATE  
insert into emp  
(empno,ename,hiredate)  
values(7600,'kohn',SYSDATE);  

数据更新  
update emp  
set job='manager'  
where ename='martin';  

update emp  
set job='market rep'  
where ename='salesman';  

update emp  
set deptno=40,job='market rep'  
where job='salesman';  

数据删除  
delete emp  
where empno=765;  

更新的提交  
commit  

自动提交方式  
set autocommit on  
如果状态设为开,则使用inesrt,update,delete会立即提交。  

更新取消  
rollback  

两次连续成功的commit之间的操作,称为一个事务  

---------------  
4  创建基表、视图  
创建基表  
create table dept  
(deptno number(2),  
dname char(14),  
loc char(13));  

数据字典会自动更新。  
一个基表最多254列。  

表名列名命名规则:  
限制  
第一个字符必须是字母,后面可任意(包括 $ # _ 但不能是逗号)。  
名字不得超过30个字符。  

唯一  
某一用户的基表名必须唯一,不能是ORACLE的保留字,同一基表的列名互不相同。  

使用双引号  
如果表名用双引号括起来,则可不满足上述规则;  
只有使用双引号,才能区别大、小写;  
命名时使用了双引号,在以后的操作也必须使用双引号。  

数据类型:  
char(n)    (不得超过240字符)  
number(n,d)  
date  
long    (最多65536字符)  
raw    (二进制原始数据)  

空值处理  
有时要求列值不能为空  
create table dept  
(deptno number(2) not null,  
dname char(14),  
loc char(13));  

在基表中增加一列  
alter table dept  
add (headcnt number(3));  

修改已有列属性  
alter table dept  
modify dname char(20);  
注:只有当某列所有值都为空时,才能减小其列值宽度。  
只有当某列所有值都为空时,才能改变其列值类型。  
只有当某列所有值都为不空时,才能定义该列为not null。  
例:  
alter table dept modify (loc char(12));  
alter table dept modify loc char(12);  
alter table dept modify (dname char(13),loc char(12));  

创建视图  
create view managers as  
select ename,job,sal  
from emp  
where job='manager';  
为视图列名取别名  
create view mydept  
(person,title,salary)  
as select ename,job,sal  
from emp  
where deptno=10;  

with check option选项  
使用with check option,保证当对视图插入或更新数据时,  
该数据必须满足视图定义中select命令所指定的条件。  
create view dept20 as  
select ename,job,sal,deptno  
from emp  
where deptno=20  
with check option;  
在做下述操作时,会发生错误  
update dept20  
set deptno=30  
where ename='ward';  

基表、视图的拷贝  
create table emp2  
as select * from emp;  

基表、视图的删除  
drop table 表名  
drop view 视图名  

回复列表 (共45个回复)

21 楼

很好 收下了

22 楼

真的很不错

23 楼

谢谢,够全

24 楼

楼主啊!你辛苦啦!
你累不累啊!!

25 楼

………………………………

26 楼

写点有深度的吧!
这些随便再那个论坛上都有的!!!

27 楼

感谢非常!

28 楼

收藏了。。感谢非常!

29 楼

看了半天,,内容很丰富
不过我看不大懂
55

30 楼

我来回复

您尚未登录,请登录后再回复。点此登录或注册