SQL命令:
1:改变初始化参数的值
常见的初始化参数:
DB_NAME=dbname 本地数据库名,如DB_NAME=student。
DB_DOMAIN=域名网络域名,如DB_DOMAIN=https://www.doczj.com/doc/dd824430.html,。
CONTROL_FILES=(“控制文件名“,…)数据库控制文件位置和名称。
DB_BLOCK_SIZE=n 设置数据块的大小。
DB_CACHE_SIZE=n SGA中数据库缓冲区大小,KB或MB为单位。
DB_FILES=n 同时可以打开的数据文件数,缺省值为200。
OPEN_CURSORS=n 一次会话中可以打开游标的最大值,缺省为50。
OPEN_LINKS=n 一次会话中连接的远程数据库数量,缺省为4。
SHARED_POOL_SIZE=n SGA中共享池大小,以KB和MB为单位。
SGA_MAX_SIZE=n SGA所能使用的最大内存。
PROCESS=n 能并发执行的操作系统进程最大数目。
INSTANCE_NAME=实例名数据库实例名,通常同DB_NAME。
(以后遇见初始化参数将继续添加到这里。)
修改动态初始化参数:
(1):编辑修改初始化参数文件,重启后将生效。
(2):使用SQL命令,许多参数将立即生效。
ALTER SESSION SET 参数名称= 参数值;使用此命令只影响调用该语句的会话以后的执行,并不改变其他会话同样参数的值。
ALTER SYSTEM SET 参数名称= 参数值[DEFERRED];使用此命令修改参数时,Oracle会将修改命令记录在警告日志文件中。如果不带DEFERRED子句,修改的值影戏哪个到所有实例中的所有会话。直到数据库关闭为止。如果带DEFERRED子句,修改的值不影响当前已经连接的会话,只影响以后建立连接的会话。
2:查看参数的当前值
显示所有参数并按字母排序。
SQL>SHOW PARAMETERS;
显示所有参数名称中包含DB字符串的初始化参数的值。
SQL>SHOW PARAMETERS DB;
如果要得到更详细的参数信息,可以查询V$parameters动态性能视图。
SQL>DESC v$parameter;
如果要得到当前会话中生效的参数及参数的值,可以查询v$parameter2视图。
SQL>desc v$parameter2;
3查看用户当前表
SQL> select * from user_tables;查看当前用户的tables
查看当前用户的单个表:
SQL> select * from user_tables where table_name='EMP';
查看当前用户模式的所有表:只显示表名
SQL> select table_name from user_tables;
4-- 查看正在运行的后台进程
SELECT * FROM v$bgprocess WHERE paddr <> '00';
5:创建表空间:
CREATE TABLESPACE tbs2
DA TAFILE 'D:\oracle\oradata\APTECH\tbs2_01.dbf'
SIZE 50M;
6:创建用户:
CREATE USER ACCP
IDENTIFIED BY ACCP
DEFAULT TABLESPACE USERS
TEMPORARY TABLESPACE TEMP;
7给用户授权
GRANT CONNECT TO ACCP;
GRANT RESOURCE TO ACCP;
-- Connect as SCOTT
GRANT SELECT ON EMP TO ACCP WITH GRANT OPTION;
--再次以sys登陆并创建一个用户
CREATE USER MARTIN
IDENTIFIED BY martinpwd
DEFAULT TABLESPACE USERS
TEMPORARY TABLESPACE TEMP;
-- 如果不使用CONNECT 角色,则需要逐个赋予用户权限
GRANT CREATE SESSION TO MARTIN;
GRANT CREATE TABLE TO MARTIN;
GRANT CREATE VIEW TO MARTIN;
GRANT CREATE SEQUENCE TO MARTIN;
-- 授予用户使用表空间USERS 的权限
ALTER USER MARTIN
QUOTA UNLIMITED ON USERS;
-- 查看用户MARTIN 的信息
select USERNAME,USER_ID,DEFAULT_TABLESPACE,TEMPORARY_TABLESPACE from dba_users
where username = 'MARTIN'; //注意字符串里的大小写MARTIN。
8 创建表,添加约束,添加列,删除约束,删除列:
SQL> create table goods(gid number(10),gname varchar2(20),gprice number(5,2),gsalesdate date);
给表添加约束:
SQL> alter table goods add constraint pk_gid primary key(gid);
删除约束:
SQL> alter table goods add constraint pk_gid primary key(gid);
?--添加列
?alter table goods add price number(5,3);
?--删除列
? alter table goods drop column name;
?--复制表结构和数据(不复制约束,not null可以)
? create table mygoods as select * from goods;
?--复制表结构(不能复制约束,not null可以)
?create table mygoods as s elect * from goods
?where 1>2;
修改列属性:
SQL> alter table goods modify(GPRICE number(9,2) not null);
插入数据:
SQL> insert into goods values(1001,'ibm',7456123.89,sysdate);
SQL> insert into goods values(1002,'ibm',7456123.89,sysdate);
更新数据:
SQL> update goods set gname='tcl',gprice=.019 where gid=1002;
9?数据字典
?user_tables --查询用户表
SQL> desc user_tables;
?dba_tables --dba使用查看数据库所有用户
10:查看系统时间
SQL> select sysdate from dual;
11:在SQL PLUS中暂时执行DOS命令;
SQL> host [dos 命令]
如:SQL> host dir/w
12:截断表,只删除表中的所有数据不删除表
TRUNCATE TABLE GOODS;
在select查询语句里可以嵌入select查询语句,称为嵌套查询。有些书上将内嵌的select语句称为子查询,子查询形成的结果又成为父查询的条件。
子查询可以嵌套多层,子查询操作的数据表可以是父查询不操作的数据表。子查询中不能有order by分组语句。
4.4.1 简单嵌套查询
在【命令编辑区】执行下列语句。―――――――――――――――――――――――――――――――――――――
select emp.empno,emp.ename,emp.job,emp.sal from scott.emp where sal>=(select sal from scott.emp where ename='WARD'); ―――――――――――――――――――――――――――――――――――――
单击【执行】按钮,出现如图4.19所示的结果。
【参见光盘文件】:\第4章\4.4\441.sql。
在这段代码中,子查询select sal from scott.emp where ename='WARD'的含义是从emp数据表中查询姓名为WARD的员工的薪水,父查询的含义是要找出emp数据表中薪水大于等于WARD的薪水的员工。上面的查询过程等价于两步的执行过程。
(1)执行―select sal from scott.emp where ename='WARD'‖,得出sal=1250;
(2)执行―select emp.empno,emp.ename,emp.job,emp.sal from scott.emp where sal>=1250;‖4.4.2 带【in】的嵌套查询
在【命令编辑区】执行下列语句。―――――――――――――――――――――――――――――――――――――
select emp.empno,emp.ename,emp.job,emp.sal from scott.emp where sal in (select sal from scott.emp where ename='WARD'); ―――――――――――――――――――――――――――――――――――――
单击【执行】按钮,出现如图4.20所示的结果。
【参见光盘文件】:\第4章\4.4\442.sql。
上述语句完成的是查询薪水和W ARD相等的员工,也可以使用【not in】来进行查询。4.4.3 带【any】的嵌套查询
在【命令编辑区】执行下列语句。―――――――――――――――――――――――――――――――――――――
select emp.empno,emp.ename,emp.job,emp.sal from scott.emp where sal >any(select sal from scott.emp where job='MANAGER'); ―――――――――――――――――――――――――――――――――――――
单击【执行】按钮,出现如图4.21所示的结果。
【参见光盘文件】:\第4章\4.4\443.sql。
带any的查询过程等价于两步的执行过程。
(1)执行―select sal from scott.emp where job='MANAGER'‖,其结果如图4.22所示。
【参见光盘文件】:\第4章\4.4\443-1.sql。
(2)查询到3个薪水值2975、2850和2450,父查询执行下列语句。
【参见光盘文件】:\第4章\4.4\443-2.sql。―――――――――――――――――――――――――――――――――――――― select emp.empno,emp.ename,emp.job,emp.sal from scott.emp where sal >2975 or sal>2850 or sal>2450; ――――――――――――――――――――――――――――――――――――――
4.4.4 带【some】的嵌套查询
在【命令编辑区】执行下列语句。―――――――――――――――――――――――――――――――――――――
select emp.empno,emp.ename,emp.job,emp.sal from scott.emp where sal =some(select sal from scott.emp where job='MANAGER'); ―――――――――――――――――――――――――――――――――――――
单击【执行】按钮,出现如图4.23所示的结果。
【参见光盘文件】:\第4章\4.4\444.sql。
带some的嵌套查询与any的步骤相同。
(1)子查询,执行―select sal from scott.emp where job='MANAGER'‖,其结果如图4.22所示。(2)父查询执行下列语句。―――――――――――――――――――――――――――――――――――――
select emp.empno,emp.ename,emp.job,emp.sal from scott.emp where sal =2975 or sal=2850 or sal=2450; ―――――――――――――――――――――――――――――――――――――
【参见光盘文件】:\第4章\4.4\444-2.sql。
带【any】的嵌套查询和【some】的嵌套查询功能是一样的。早期的SQL仅仅允许使用【any】,后来的版本为了和英语的【any】相区分,引入了【some】,同时还保留了【any】关键词。
4.4.5 带【all】的嵌套查询
在【命令编辑区】执行下列语句。―――――――――――――――――――――――――――――――――――――
select emp.empno,emp.ename,emp.job,emp.sal from scott.emp where sal >all(select sal from scott.emp where job='MANAGER'); ―――――――――――――――――――――――――――――――――――――
单击【执行】按钮,出现如图4.24所示的结果。
【参见光盘文件】:\第4章\4.4\445.sql。
带all的嵌套查询与【some】的步骤相同。
(1)子查询,结果如图4.22所示。
(2)父查询执行下列语句。―――――――――――――――――――――――――――――――――――――
select emp.empno,emp.ename,emp.job,emp.sal from scott.emp where sal >2975 and sal>2850 and sal>2450; ―――――――――――――――――――――――――――――――――――――【参见光盘文件】:\第4章\4.4\445-2.sql。
4.4.6 带【exists】的嵌套查询
在【命令编辑区】执行下列语句。―――――――――――――――――――――――――――――――――――――
select emp.empno,emp.ename,emp.job,emp.sal from scott.emp,scott.dept where exists (select * from scott.emp where scott.emp.deptno=scott.dept.deptno); ―――――――――――――――――――――――――――――――――――――
单击【执行】按钮,出现如图4.25所示的结果。
【参见光盘文件】:\第4章\4.4\446.sql。
4.4.7 并操作的嵌套查询
并操作就是集合中并集的概念。属于集合A或集合B的元素总和就是并集。在【命令编辑区】执行下列语句。―――――――――――――――――――――――――――――――――――――
(select deptno from scott.emp) union (select deptno from scott.dept); ―――――――――――――――――――――――――――――――――――――
单击【执行】按钮,出现如图4.26所示的结果。
【参见光盘文件】:\第4章\4.4\447.sql。
4.4.8 交操作的嵌套查询
交操作就是集合中交集的概念。属于集合A且属于集合B的元素总和就是交集。在【命令编辑区】执行下列语句。―――――――――――――――――――――――――――――――――――――
(select deptno from scott.emp) intersect (select deptno from scott.dept); ―――――――――――――――――――――――――――――――――――――
单击【执行】按钮,出现如图4.27所示的结果。
【参见光盘文件】:\第4章\4.4\448.sql。
4.4.9 差操作的嵌套查询
差操作就是集合中差集的概念。属于集合A且不属于集合B的元素总和就是差集。
在【命令编辑区】执行下列语句。―――――――――――――――――――――――――――――――――――――
(select deptno from scott.dept) minus (select deptno from scott.emp); ―――――――――――――――――――――――――――――――――――――
单击【执行】按钮,出现如图4.28所示的结果。
【参见光盘文件】:\第4章\4.4\449.sql。
并、交和差操作的嵌套查询要求属性具有相同的定义,包括类型和取值范围。
第二章:SQL查询和SQL函数:
幻灯片1:
幻灯片2:回顾
幻灯片3
目标:
了解Oracle 数据类型;
了解数据定义语言和数据操纵语言;
了解事务控制语言和数据控制语言;
掌握SQL 操作符和SQL 函数;
幻灯片4 SQL 简介2-1
问题一:什么是SQL?
SQL 是Structured Query Language(结构化查询语言)的首字母缩写词
SQL 是数据库语言,Oracle 使用该语言存储和检索信息
表是主要的数据库对象,用于存储数据
通过SQL可以实现与Oracle 服务器的通信
SQL Plus和SQL Plus Worksheet是在Oracle中执行SQL命令的环境。
SQL语言提供与关系数据库的接口,SQL命令是对数据库操作的指令。
结构化查询语言由一系列命令或语句组成,所有程序和用户可以使用这些命令来访问Oracle 数据库中的数据。用户以SQL命令提出要完成的工作,SQL语言编译程序自动将它们翻译成访问数据库的指令来完成指定的任务。通常终端用户不直接使用SQL命令而是通过应用程序和ORACLE工具来访问数据库。但是,服务器在响应用户请求时,应用程序或工具必须使用SQL命令来访问数据库中的数据。
幻灯片5 SQL 简介2-2
SQL 支持下列类别的命令:
数据定义语言(DDL)注意:DDL语句会自动COMMIT
?数据定义命令
―CREATE 命令
―ALTER 命令
―DROP 命令
―TRUNCATE 命令
SQL> create table goods(gid number(10),gname varchar2(20),gprice number(9,2),gsaledate date); //删除列
SQL> alter table goods drop column gsaledate;
//添加列:
SQL> alter table goods add gsalesdate date;
Drop删除表、列或者表空间
SQL> drop tablespace worktbs including contents;
SQL> drop table goods;
//drop后使用desc goods看一下
然后再使用TRUNCATE命令
TRUNCATE TABLE GOODS;
在实际应用中,三者的区别是明确的。
当你不再需要该表并释放存储空间时,用 drop;
当你仍要保留该表,但要删除所有记录时,用 truncate,注意truncate不释放存储空间;
当你要删除部分记录时(always with a WHERE clause), 用 delete.
数据操纵语言(DML)
?数据操纵命令
―INSERT
―SELECT
―UPDATE
SQL> update goods set gsalesdate='10-2月-05' where gid =1001;
―DELETE
注意:delete 语句always with where语句。
SQL> delete from goods where gid=1001;
Select * from goods;
Rollback;
Select * from goods;
我们可以发现出现了什么情况,即操作可以回退!DML语句可以回退,DDL语句会自动提交,无法回退。
事务控制语言(TCL)
用于事务控制的语句有:
COMMIT - 提交并结束事务处理
ROLLBACK - 撤销事务中已完成的工作
SA VEPOINT –标记事务中可以回滚的点
数据控制语言(DCL)
SQL语言的数据类型:
Oracle定义了许多内置的数据类型,同时允许用户自定义新的数据类型。
内置数据类型:
1字符数据类型(Character ):
―Char :固定长度,存储字母或者数字,长度在1----2000个字节之间,默认一个字节。
― Varchar2:可变长度,定义时需要指定大小,长度在1---4000个字节。
― Long:最大大小2G,表中只有一列可以定义为Long数据类型,long列上不能定义唯一或者主键约束。不能在long列上创建索引。过程或者存储过程不能接受long数据类型做参数。定义时必须指定长度。
char(n),定长的nB(字节)字符串,n取值范围1B—2000B。如果数据长度不到n的最大值,
Oracle将用空格填充。如果数据长度超过n的最大值则报错。
V ARCHAR2(n )
可变长的字符串,n的取值范围1B—4000B。如果数据长度没有达到n的最大值,Oracle根据数据大小自动调整字段长度。如果字符数据前后有空格,Oracle将自动删除空格。
V ARCHAR(n)
变长字符串,与V ARCHAR2(n)完全一样。未来Oracle可能不支持V ARCHAR。
三种字符类型,最好使用V ARCHAR2。
LONG(n)
变长字符串,n的取值范围1B—2GB。拥护不需要做字符串搜索的长串数据(即不能放在where子句中)。LONG可以用在Select语句、UPDA TE语句或INSERT语句的V ALUES中。对于LONG的使用限制:每个表中只能有一个LONG类型的列,该列不能用在Where条件中,不能对LONG列进行索引,不能用在GROUP BY或ORDER BY子句中,定义存储函数中不能返回LONG类型的值,有LONG列的表不能存放在自动增加大小的表空间。LONG是一种较老的数据类型,将逐渐被BLOB,CLOB等大对象类型所替代。
2 数值数据类型
NUMBER(P,S)
可变长的数值类型,P是所有有效数字的位数,S是小数点后的位数。P取值从1至38,S 取值从-84至-127为。S值可以大于P值,S值也可以取负值。没规定精度就是Number(38)。如果长度超过P,报错。如果精度超过S,四舍五入。
举例:
实际数据类型实际存储
7456123.89 NUMBER 7456123.89
7456123.89 NUMBER(9) 7456124
7456123.89 NUMBER(9,2) 7456123.89
7456123.89 NUMBER(9,1) 7456123.9
7456123.89 NUMBER(6) error
7456123.89 NUMBER(7, -2) 7456100
7456123.89 NUMBER(7,2) error
.000127 NUMBER(4,5) .00013
例子:scott
创建表:
SQL> create table goods(gid number(10),gname varchar2(20),gprice number(5,2),gsalesdate date);
添加约束:
SQL> alter table goods add constraint pk_gid primary key(gid);
SQL> show user
USER 为"SCOTT"
SQL> select table_name from user_tables;
//表已经创建
SQL> alter table goods modify(gprice number(9,2));
SQL> insert into goods values(1001,'ibm',7456123.89,sysdate);
SQL> insert into goods values(1002,'ibm',7456123.89,sysdate);
SQL> update goods set gname='tcl',gprice=.019 where gid=1002;
然后Insert不同的number类型,看是否合法;
3 日期数据类型DATE
DA TE数据类型存储日期和时间信息,它存储世纪、年、月、日、时、分和秒。DATE数据类型总是包括日期和时间,可以用TRUNC函数截断时间。
DA TE取值从公元前4712/01/01-----公元4712/12/31。
4大对象数据类型LOB
Oracle中LOB用来存储大的非结构化的数据,如格式文本、图象、视频、音频、空间数据等,最大值可达4GB。
LOB列是指向LOB对象的指针。LOB指向的对象在数据库的某个表空间中。一个表中可以有多个LOB列。
BLOB
无字符的二进制位流。SQL语句可以对它进行修改,支持事务提交和回滚,不能出现在SELECT命令中。
CLOB
存放单字节和多字节字符数据。支持定长或变长字符集。支持事务的提交和回滚。可以使用SQL命令修改。
NCLOB
存储使用国家字符集的Unicode数据。支持变长或定长的字符集。与CLOB类似。
BFILE
该类型可以访问存储在数据库之外的文件,但只能查询不能修改文件内容。BFILE字段存放的是文件位置。
BFILE数据类型的文件名和目录名用BFILENAME函数来修改。BFILE不参与事务处理,也不可恢复。
这里有一个使用lob的例子,参考一下把:
在internal这个用户下给scott用户授权如下:
SQL> conn internal
请输入口令: ******
已连接。
SQL>grant create any directory to scott;
SQL>grant create any library to scott;
在scott这个用户下执行下述语句:
SQL> conn scott/tiger;
已连接。
SQL>create table bfile_tab (bfile_column BFILE);
SQL>create table utl_lob_test (blob_column BLOB);
SQL>create or replace directory utllobdir as 'd:\temp';
SQL>set serveroutput on
然后执行下面语句就将d:\temp目录下的word文件COM.doc存入到utl_lob_test
表中的blob_column字段中了。
declare
a_blob BLOB;
a_bfile BFILE := BFILENAME('UTLLOBDIR','COM.doc'); --用来指向外部操作系统文件
begin
insert into bfile_tab values (a_bfile)
returning bfile_column into a_bfile;
insert into utl_lob_test values (empty_blob())
returning blob_column into a_blob;
dbms_lob.fileopen(a_bfile);
dbms_lob.loadfromfile(a_blob, a_bfile, dbms_lob.getlength(a_bfile));
dbms_lob.fileclose(a_bfile);
commit;
end;
/
SQL>show errors
此时可以使用DBMS_LOB包的getlength这个procedure来检测是否已经将该word文件存入
到blob字段中了。如:
SQL> select dbms_lob.getlength(blob_column) from UTL_LOB_TEST;
结果如下:
DBMS_LOB.GETLENGTH(BLOB_COLUMN)
-------------------------------
83968
说明该word文件已经存入到blob字段中去了。
5其它数据类型
RAW(n)
可变长的二进制数据,n取值范围1B---2KB。用这种格式的数据类型保存较小的图形文件而后带格式的文本文件。
LONG RAW
可变长的二进制数据,最大2GB。用于保存图形、多媒体文件和音频视频文件。在同一个表中,不能同时有LONG类型和LONG RAW类型。
ROWID
数据库表中的每一行都有一个地址,通过查询伪列ROWID可得到行的地址。可以在表中建立类型为ROWID的列。
6 自定义数据类型
Oracle允许用户使用CREATE TYPE或CREATE TYPE BODY来定义自己的数据类型。
二:SQL语言运算符
像其它语言,SQL语言可以进行各种运算,每种运算有相应的运算符。
1数字运算符
+或- 表示数字的正负符号。
+ 实现2个数字或表达式相加。
-实现2个数字或表达式相减。
* 实现2个数字或表达式相乘。
/ 实现2个数字或表达式相除。
SQL> insert into goods values(1003,'intel',1000.00+2000.22,sysdate);
2字符运算符
||:2个字符串或CLOB类型数据的合并。
SQL> insert into goods values(1004,'acc',7456123.89,sysdate);
//Select * from goods;
SQL> update goods set gname='acc'||'p' where gid=1003;
//Select * from goods;
3集合运算符
SQL查询语句返回的是数据集,即若干条记录。集合运算就是将2个或多个查询语句的返回结果组合成一个。集合运算符都有相同的优先级。如果SQL语句中有多个集合运算符且没有括号标明先后顺序,Oracle将从左至右计算。
UNION 两个查询语句返回的行进行合并,不包括重复行(集合的并集)。
UNION ALL 两个查询语句返回的行进行合并,包括重复行(集合的和)。
SQL> select * from goods where gid<=1002 union select * from goods where gid=1004;
INTERSECT 两个查询语句中所有相同的行(集合的交集);
SQL> select * from goods where gid<=1003 intersect select* from goods;
GID GNAME GPRICE GSALESDATE
---------- -------------------- ---------- ----------
1001 ibm 7456123.89 14-3月-06
1002 tcl .02 14-3月-06
1003 accp 2000 14-3月-06
MINUS 所有在第一个查询中但不在第二个查询中的行(集合的差集)。
SQL> select * from goods minus select * from goods where gid=1001;
集合运算中的两个或多个查询中的列名表在数据类型和个数上要一致。集合运算不能应用与CLOB、BLOB、BFILE或LONG列。
三SQL语言中的条件
1 比较条件
比较运算符:
= 等于
!= 不等于
<> 不等于
< 小于
> 大于
<= 小于或等于
>= 大于或等于
ANY/SOME:将一个值与列表中或查询结果中的每个值进行比较,如果列表中没有一个满足条件时,则返回FALSE,否则返回TRUE。在ANY或SOME的前面必须有比较运算符。ALL:将一个值与列表中或查询结果中的每个值进行比较,如果列表中所有都满足条件时返
回TRUE,否则返回FALSE。ALL的前面必须有比较运算符。
ANY:
SQL>select emp.empno,emp.ename,emp.job,emp.sal from scott.emp where sal >any(select sal from scott.emp where job='MANAGER');
SQL> select * from goods where gprice > any(select gprice from goods where gid=1002); SOME:
SQL> select * from goods where gid=some(select gid from goods where gprice<=.2);
2逻辑运算符:
NOT 对逻辑结果取反;
SQL> select * from goods where not(gprice>.2);
AND 两个条件同时为TRUE时返回TRUE;否则返回FALSE;
SQL> select * from goods where gprice>.2 and gid>=1003;
OR 两个条件只要有一个为真时返回真,否则返回FALSE;
SQL> select * from goods where gid=1002 or gid=1004;
3 成员条件
exp IN
SQL> select gid,gprice from goods where gid in (select gid from goods where gprice>2000);
exp NOT IN
SQL> select gid,gprice from goods where gid not in (select gid from goods where gprice>2000);
4 范围条件
exp1 BETWEEN exp2 AND exp3
如果exp1的值大雨或等于exp2并且小于等于exp3时,返回TRUE;
SQL> select * from goods where gid between 1001 and 1003;
Exp1 NOT BETWEEN exp2 AND exp3;
SQL> select * from goods where gid not between 1001 and 1003;
5 NULL测试
如果一行中的某列没有值,则该列为空NULL,或者说是包含NULL。NULL可以出现在任何数据类型的列中。
exp IS NULL //如果表达式exp的值为NULL,返回TRUE;否则返回FALSE。
SQL> select * from goods where((select gid from goods where gprice>90000000) is null);
exp IS NOT NULL
6 存在条件
EXISTS(子查询)
如果子查询至少返回一行,其结果为TRUE;否则结果为FALSE。
7 相似条件
expC_1 LIKE expC_2
如果字符表达式expC_1和expC_2相匹配,即是子串,则TRUE;否则返回FALSE。
_ 只匹配一个字符。
% 匹配零个或任何多个字符。
SQL> select * from goods where to_char(gid) like '%3';
SQL> select * from goods where to_char(gid) like '1__2';
嵌套查询:
查询薪水大于等于W ARD的所有记录。
select emp.empno,emp.ename,emp.job,emp.sal from scott.emp where sal>=(select sal from scott.emp where ename='WARD');
查询薪水和ward相同的所有记录。
SQL> select * from emp where sal in (select sal from emp where ename='WARD');
SQL函数
Oracle提供了许多类型的SQL存储函数,同时还允许用户自定义存储函数。
SQL存储函数建立在Oracle内部,所有用户都可以在SQL命令中使用它们。自定义存储函数是用户用PL/SQL或JA V A等语言编制的存储函数,它作为用户的一个模式对象,只有授权的用户才可以使用。
根据存储函数处理的行数,可将SQL语言的存储函数分为单行存储函数和多行存储函数。单行数字存储函数:
ABS()
第一部分、SQL&PL/SQL
[Q]怎么样查询特殊字符,如通配符%与_
[A]select * from table where name like 'A_%' escape ''
[Q]如何插入单引号到数据库表中
[A]可以用ASCII码处理,其它特殊字符如&也一样,如
insert into t values('i'||chr(39)||'m'); -- chr(39)代表字符'
或者用两个单引号表示一个
or insert into t values('I''m'); -- 两个''可以表示一个'
[Q]怎样设置事务一致性
[A]set transaction [isolation level] read committed; 默认语句级一致性set transaction [isolation level] serializable;
read only; 事务级一致性
[Q]怎么样利用游标更新数据
[A]cursor c1 is
select * from tablename
where name is null for update [of column]
……
update tablename set column = ……
where current of c1;
[Q]怎样自定义异常
[A] pragma_exception_init(exception_name,error_number);
如果立即抛出异常
raise_application_error(error_number,error_msg,true|false);
其中number从-20000到-20999,错误信息最大2048B
异常变量
SQLCODE 错误代码
SQLERRM 错误信息
[Q]十进制与十六进制的转换
[A]8i以上版本:
to_char(100,'XX')
to_number('4D','XX')
8i以下的进制之间的转换参考如下脚本
create or replace function to_base( p_dec in number, p_base in number ) return varchar2
is
l_str varchar2(255) default NULL;
l_num number default p_dec;
l_hex varchar2(16) default '0123456789ABCDEF';
begin
if ( p_dec is null or p_base is null ) then
return null;
end if;
if ( trunc(p_dec) <> p_dec OR p_dec < 0 ) then
raise PROGRAM_ERROR;
end if;
loop
l_str := substr( l_hex, mod(l_num,p_base)+1, 1 ) || l_str;
l_num := trunc( l_num/p_base );
exit when ( l_num = 0 );
end loop;
return l_str;
end to_base;
/
create or replace function to_dec
( p_str in varchar2,
p_from_base in number default 16 ) return number
is
l_num number default 0;
l_hex varchar2(16) default '0123456789ABCDEF';
begin
if ( p_str is null or p_from_base is null ) then
return null;
end if;
for i in 1 .. length(p_str) loop
l_num := l_num * p_from_base + instr(l_hex,upper(substr(p_str,i,1)))-1; end loop;
return l_num;
end to_dec;
/
[Q]能不能介绍SYS_CONTEXT的详细用法
[A]利用以下的查询,你就明白了
select
SYS_CONTEXT('USERENV','TERMINAL') terminal,
SYS_CONTEXT('USERENV','LANGUAGE') language,
SYS_CONTEXT('USERENV','SESSIONID') sessionid,
SYS_CONTEXT('USERENV','INSTANCE') instance,
SYS_CONTEXT('USERENV','ENTRYID') entryid,
SYS_CONTEXT('USERENV','ISDBA') isdba,
SYS_CONTEXT('USERENV','NLS_TERRITORY') nls_territory,
SYS_CONTEXT('USERENV','NLS_CURRENCY') nls_currency,
SYS_CONTEXT('USERENV','NLS_CALENDAR') nls_calendar,
SYS_CONTEXT('USERENV','NLS_DATE_FORMAT') nls_date_format,
SYS_CONTEXT('USERENV','NLS_DATE_LANGUAGE') nls_date_language,
SYS_CONTEXT('USERENV','NLS_SORT') nls_sort,
SYS_CONTEXT('USERENV','CURRENT_USER') current_user,
SYS_CONTEXT('USERENV','CURRENT_USERID') current_userid,
SYS_CONTEXT('USERENV','SESSION_USER') session_user,
SYS_CONTEXT('USERENV','SESSION_USERID') session_userid,
SYS_CONTEXT('USERENV','PROXY_USER') proxy_user,
SYS_CONTEXT('USERENV','PROXY_USERID') proxy_userid,
SYS_CONTEXT('USERENV','DB_DOMAIN') db_domain,
SYS_CONTEXT('USERENV','DB_NAME') db_name,
SYS_CONTEXT('USERENV','HOST') host,
SYS_CONTEXT('USERENV','OS_USER') os_user,
SYS_CONTEXT('USERENV','EXTERNAL_NAME') external_name,
SYS_CONTEXT('USERENV','IP_ADDRESS') ip_address,
SYS_CONTEXT('USERENV','NETWORK_PROTOCOL') network_protocol,
SYS_CONTEXT('USERENV','BG_JOB_ID') bg_job_id,
SYS_CONTEXT('USERENV','FG_JOB_ID') fg_job_id,
SYS_CONTEXT('USERENV','AUTHENTICATION_TYPE') authentication_type,
SYS_CONTEXT('USERENV','AUTHENTICATION_DATA') authentication_data
from dual
[Q]怎么获得今天是星期几,还关于其它日期函数用法
[A]可以用to_char来解决,如
select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day') from dual;
在获取之前可以设置日期语言,如
ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN';
还可以在函数中指定
select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from dual;
其它更多用法,可以参考to_char与to_date函数
如获得完整的时间格式
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
随便介绍几个其它函数的用法:
本月的天数
SELECT to_char(last_day(SYSDATE),'dd') days FROM dual
今年的天数
select add_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual 下个星期一的日期
SELECT Next_day(SYSDATE,'monday') FROM dual
[Q]随机抽取前N条记录的问题
[A]8i以上版本
select * from (select * from tablename order by sys_guid()) where rownum < N;