=============oralce安装===============

基本位置:Oracle安装在哪一个目录(注意不同版本的区别)

%driver_name%\app\username

目标驱动器:一般Oracle自动选择剩余空间最多的驱动器

Oracle主目录:用于设置环境变量OracleHome,一般指向Oracle

程序文件所在的目录(db_1)

类型:版本区别与操作系统无关

个人版

标准版

企业版

选择Oracle产品时,是与OS有关的。win32,unix/linux、Mac OS、visita

附加启动数据库

如果不选,只安装软件,没有数据库

如果选,需要设置数据库名

全局数据库名:在网络上唯一标识数据库的名字

格式:dbname.domain :db.hy.com

SID.Domain

数据库的SID:数据库在本地计算机上的唯一标识

hy.com,域名,是此数据库在网络上的后缀

db.hy.com:在整个Internet是唯一的,称为全局数据库名

全局数据库名可以没有后缀(域名),一般用于内部网络

数据库口令:

不是数据库本身的口令,数据库用户的口令

sys(数据库中最高权限用户),

system(数据库中DBA用户),sysman、dbsnmp用户

此处设置的口令同时应用于以上用户

数据库配置:

1、一般用途(OLTP)

OLTP:联机事务处理:主要应用于Web,管理系统,电子商务等

事务在整个应用中数量很多,但是执行时间都很短

2、数据仓库(OLAP)

OLAP:联机分析处理:主要应用于数据分析、数据仓库和数据挖掘等

事务的数量是有限的,但是,每一个事务可能开销很大

启用自动备份:

归档或非归档模式

归档模式:开销大,但可恢复,适用于高可靠性和高可用性环境

非归档模式:开销小,用于普通环境,数据的恢复依赖于备份

用户的密码:

对于9i及老版本,数据库用户使用默认密码

sys:change_on_install

system:manager

对于10g及以上的新版本,有用户自己设置密码(password)

安装完成后的准备

因为Oracle对系统资源占用很大,一般需要把Oracle服务修改为手动

需要使用时才启动,如何启动Oracle服务

Oracle要正常使用至少启动两个服务:

1、OracleOraDb11g_home1TNSListener:监听服务

用于处理网络中对Oracle访问的请求

2、OracleServiceHY:数据库服务

数据库服务(Oracle实例)

在机房使用Oracle时:修改两个文件

Oracle11g:

D:\app\administrator\product\11.1.0\db_1\network\ADMIN

Oracle10g:

D:\oracle\product\10.2.0\db_1\network\ADMIN

1、listener.ora

2、tnsnames.ora

修改HOST的取值:

(ADDRESS = (PROTOCOL = TCP)(HOST = YourHostName)(PORT = 1521))

只能用主机名,不能用IP、localhost和127.0.0.1

修改完成后,再启动服务

可选的服务:OracleDBConsolehy,可以使用也可以不使用

启动Oralce的web管理界面的。

管理Oracle的方法:

1、SQL*Plus(重点,以后主要的工具)

2、Web的管理界面

3、第三方工具(以后开发时常用)

启用scott帐户:scott(密码是tiger)

是Oracle中比较小的, 范例方案,经常被用于教学。

Oracle10g及以上的数据库中scott用户是被锁定的,需要开启此帐户

1、在运行中sqlplus system/manager(数据库已经启动)

2、在提示符下,执行命令

1、alter user scott account unlock; --解锁

2、alter user scott identified by tiger; --设置密码

3、grant connect,resource,create view to scott; --授权

3、利用scott身份登录:运行:sqlplus scott/tiger

1、查询当前用户的表

select table_name from user_tables;

2、查询表的结构

desc table_name

4、在sqlplus中如何提交语句

1、在语句后加“;”提交语句到Oracle

2、如果换行行了,“;”或者“/”

Web管理:

1、httpserver开启:http://127.0.0.1/isqlplus(只适合于Oracle 9i)

2、OracleDBConsolehy开启:

第三方工具(以后开发时常用)

1、SQL Devepler

2、PL/SQL Devepler

3、Data Studio

Oracle卸载

1、执行卸载程序

2、删除注册表项

HLM\software\oracle

HLM\system\currentcontrolset\service

3、删除目录

driver:\oracle(app)

C:\program file\oracle

===============SQL*PLUS================

SQL*PLUS:是SQL加强版,具有通用性,所有的Oracle产品中都有此工具

这个工具不需要图形界面

在SQL*PLus中可以执行以下操作

1、SQL语句

2、SQL*Plus命令

3、PL/SQL语句(T-SQL)(编程)

SQL*Plus的启动方法:

在Oracle10g及以前的老版本中有两个SQL*Plus命令:

sqlplus   :在命令行(shell、DOS提示符)中运行,也可以在图形界面

sqlplusw:在图形界面中运行的(Windows)

在11g以后的新版本中,sqlplusw不再支持。

1、在菜单中启动——“应用程序开发”

2、在“运行”直接输入:SQLPLUS 或者 sqlplusw

3、打开CMD,运行SQLPLUS 或者 sqlplusw

SQL*Plus的登录(重点)

提示符界面SQLPLUS:

sqlplus username/password@localservicename

sqlplus 用户名/密码@本地服务名

图形界面

用户名:Oracle用户名

口令:密码

主机字符串:= 本地服务名,如果留空默认连接本机

本地服务名:

主机字符串==网络服务名==本地服务名

=主机名+端口号+协议+数据库名

=IP+端口号+协议+数据库名

本地服务名是用来说明客户端连接的数据库服务器的相关信息

保存的是服务器的相关信息

什么是服务器的信息????

哪一个服务器:IP、服务器的主机名

哪一个端口:端口决定了所提供的服务的类型

比如:80代表是web应用,21代表FTP应用,1433代表SQL Server数据库

Oracle的默认端口号是1521

用什么语言?:协议(计算机间通信的语言就是协议)

使用什么数据库呢?:数据库名(SID)

在客户端创建一个本地服务名,用于方便的连接服务器

scott/tiger@hygj

交互模式:先输入命令然后在根据提示输入信息

sqlplus

1、用户名:scott@ora,然后输入密码

2、用户名:scott/tiger@ora

非交互模式:直接在命令的后面跟用户/密码@本地服务名

SQL*PLUS的退出:

quit    exit都可以

直接点击“关闭”按钮不是正常的退出!!!!

没有提交的事务会自动回退,所以不推荐使用

当在SQL*plus中输入错误命令,可以使用ed命令

编辑错误的语句(edit),只能编辑刚刚执行过的指令

SQL*Plus调用外部脚本

命令1:start driver\path\filename

命令2:@  driver\path\filename

命令@和start区别:@可以在脚本中使用,而start不行

sqlplus scott/tiger@ora @c:\mysql.txt

把上面命令放到一个以bat或cmd为扩展名的文件中,就可以执行了

用户的切换:

可以在不退出SQL*Plus的情况下,可以切换用户

connect=conn

如果不想退出SQL*Plus,只是想注销用户

disconnect=disc

SQL*Plus会自动为查询结果进行分页,设置行宽

默认行宽是

show linesize pagesize

set linesize 100

set pagesize 16

设置列格式

1、对字符列设置格式(列宽)

在默认情况下,列宽是根据列的定义显示的

column col_name format anumber

column ename format a20

2、对数字列设置格式(数字的表现形式)

定义数字的小数点位置、千分位位置、货币类型等

column col_name format exp_format

0:强制显示前导0,不够位数的,用0补齐

9:不显示前导0,原来多少位就显示多少位

L:本地货币符号

$:代表美元

,:千分位分隔符

.:小数点

SQL*Plus不是自动提交的

set autocommit on

设置脱机:

开始脱机:

设定将运行结果脱机到那个文件

spool driver:\path\filename

结束脱机:

结束脱机,并将结果保存到目标文件

spool off

一旦结束脱机,SQL*Plus中的数据就自动存储在上面设置的文件中

show all:显示SQL*Plus所有的设定

================DML==============

SQL语言

SQL支持关系数据库的三级模式结构

1、外模式:开发人员所面对的一层,视图和部分基本表(安全性低)

2、模式层:描述商业需求,实体与实体间的关系,基本表,数据库设计主要完成的内容

3、内模式:解决数据库底层的实现,表空间和数据文件

一般来讲,应用程序的开发,主要操作的外模式的对象

SQL特点:

综合统一

SQL语言风格一致,可以实现数据库生命周期中的全部活动

高度非过程化

典型的第4代语言,不能进行过程化控制

面向集合的操作

数据操作一次可以针对若干记录的集合操作

提供两种使用方法

自含式语言:直接在SQL*PLUS或其他客户端输入即能运行

嵌入式语言:SQL语句可以作为高级语言的一个字符串,提交给数据库

简洁易用

英语式语法,无须编程经验

SQL语言的分类:(仅对于当前的学习,简单分类)

DML(数据操纵语言):

Inert、Update、delete(Commit、Rollback、Savepoint、select)

DDL(数据定义语言):

Create、Drop、Alter

DCL(数据控制语言):

Grant、Revoke

DML语言:

insert

1、字面值如何提供

insert into emp(empno,ename,hiredate)

values(20,'hygj','01-1月-2009')

数字型: 直接提供数字,不需要单引号,由于

数据库支持自动的隐式数据类型转换,所以即使加上单引号也不会报错

字符串型:需要单引号引起,如果提供的字面值包含单引号,需要处理

'Tom''s Mohter'

日期型: 日期默认提供的值字符串,此字符串需要遵循Oracle默认的日期格式

如果不想遵循默认格式需要to_date转换

2、满足约束:

not null、unique、primary key、Check、foreign key

3、提供的数据顺序和列顺序一致

子查询插入数据:(Oracle=SQL Server)

insert into tab_name(col_list) select col_list from tab_name

注意:列的个数、顺序和数据类型

多表插入:(Oracle)

Insert [all | first] insert_into_clause [value_clause] subQuery;

范例:

Insert all 【first】

when deptno=10 then into dept10

when deptno=20 then into dept20

when job=‘clerk’ then into clerk

else into other

select * from emp;

dept10、dept20、clerk、other:表名

deptno=10 deptno=20 job=‘clerk’ 匹配的条件

all和first区别

如果一行部门是10,且岗位是clerk

all:分别向dept10、clerk插入,同一行插入两次

first:只匹配第一次,只向第一个满足条件的表插入

update:(MSSQL相同)

Update

set =[, =]

[where ];

delete:(MSSQL相同)

Delete from

在事务内部,即可以回退,创建日志

Truncate table table_name

DDL语句,不能回退也不做日志,因此,数据不能恢复

delete from table_name

truncate table table_name

结果一样,表的数据全部删除

delete:在删除大量数据,速度慢

truncate:在删除大量数据,速度快

==============事务=============

必须完整地完成或取消的逻辑操作单位;没有可以接受的中间状态。

"begin"

1、update a set x=x+100 where y=111; 111=1000 ——> 1100

2、update b set x=x-100 where z=222;  222=2000 ——> 1900

3、commit;

"end"

事务的性质

原子性:事务不可分割

一致性:保持数据文件中的数据和日志中记录的数据一致

数据的修改前,需要在日志中记录

当提交(commit)了数据,则数据就变成永久的数据

当数据提交后,修改的数据,还是在内存中的,磁盘中的数据还是没有修改的。

而日志数据却一定会在磁盘中

日志记录的是:111=1100     222=1900

磁盘中的数据:111=1000     222=2000(修改的数据只是在内存中)

数据文件中的数据和日志中记录的数据不一致

如果两个语句在一个事务中则:

数据库在下次重启时,自动检查日志数据和数据文件数据

发现不一致,则按照日志中的数据,重新执行数据修改。

最终磁盘中数据:111=1100     222=1900

隔离性:不受其他事务的干扰

两个事务之间,在没有结束事务之前,数据的修改不会影响对方的数据操作

持续性:事务一旦被提交,数据的修改就是永久性的

提交:commit,Oracle中事务默认不是自动提交的(MS SQL Server是自动提交的)

回退:rollback,把没有提交的事务取消

保留点:savepoint:savepoint sp_name

在事务的内部添加标记,用于部分的回退相应的操作。

事务:

手工提交:

DML语句是事务语句,需要手工提交,才能将数据变成永久的

自动提交:

DDL、DCL语句,不需要提交,自动将数据变成永久。

=================select===============

===============基本查询================

1、单表执行Select:

select 列列表或表达式 from 表名或视图或其他 where 条件 order by 排序

关系型数据库中查询操作:

1、选择(where)

2、投影(列列表)

3、连接(join)

1、检索所有列:列列表 或 *

select * from emp

select deptno,dname,loc from dept

推荐使用列列表,不推荐使用*

因为*会降低程序的可读性,增加系统开销

2、理解行标识符:rowid

select rowid,ename from emp

Oracle中ROWID伪列是用于表示每一行的物理地址的

3、执行算术运算:+ - * /

select sal+comm from emp

对空值的处理:空值与任何表达式进行算术运算都是空

4、日期运算:

select hiredate+3 from emp          ——日期

select to_date('12-2月-09')-hiredate from emp    --天数

5、列运算(3和4属于列运算)

6、使用列别名:空格或AS,

需要双引号引起:特殊符号、大小写区分等

select ename "employee's name" from emps

7、串联操作符:“||”(SQL Server “+”)

select '姓名:'||ename||'  岗位:'||job from emp

8、理解空值:表示该列的值未知,判断使用is null或is not null,处理函数

select * from emp where comm is null

select sal+comm from emp;

select sal+nvl(comm,0) from emp;

9、禁止显示重复的行:distinct

distinct:消除重复:

select count(distinct job) from emp

--确定列基数

select count(distinct job)/count(*) from emp

--确定数据的重复几率

2、使用Where子句过滤数据

1、使用比较运算符

= > < <= >= <> != any all in

select * from emp where deptno=20;

select * from emp where deptno<>20;

select * from emp where sal>3000;

select * from emp where deptno in (10,20)

select * from emp where sal > ANY(2000,3000,4000) --大于最小的(小于最大的)

select * from emp where sal > ALL(2000,3000,4000) --大于最大的(小于最小的)

2、SQL操作符

like、in、between、is null

1、使用like操作符:字符串匹配,"_"匹配一个字符,"%"匹配任意多个字符

2、IN操作符:匹配值列表

3、Between操作符:匹配范围 == 大于等于小的 而且小于等于大的

3、逻辑操作符

and or not:优先级 not and or

4、使用Order by执行排序  ASC DESC

===========rownum=========

rownum:Oracle中的“伪列”在执行desc命令显示的列名中不存在的列

rownum为查询出的数据添加顺序的编号

可以基于编号的数据过滤

获得emp表的前10行(MS SQL Server “TOP”)

select rownum,ename from emp where rownum<=10

获得emp表的后4行

select rownum,ename from emp where rownum>10

以上语句不能得到相应的结果

rownum是在提取一行后就添加rownum,并且比较查询条件

如果提取第一行,rownum=1,rownum>10对于1来讲,是不符合条件的

第一行就是不满足条件的,如果再取一行,因为刚才的顺序编号1没有被使用

再次使用1,再次匹配条件也是不符合条件的,以此类推,就没有一行是,满足条件的了

1、select rownum id,ename from emp

create or replace view a

as

select rownum id,ename from emp

通过创建视图,实现先给要提取的每一行添加编号

2、select * from a where id>10

视图a是先被执行的,然后在执行以上语句

3、上面两步合并

select  * from a where id>10   ===>

select * from (select rownum id,ename from emp) a where a.id>10;

其中a称为内嵌视图,SQL解析器,首先解释执行a对应的SQL语句

获得工资收入最高的前5个人

1、先对根据工资进行数据排序

create view b

as

select * from emp order by sal desc;

2、再对排序后的数据加上编号

create view c

as

select rownum id,b.* from b;

3、根据编号获得前5位

select  * from c where id<=5;

4、合并成一条SQL语句

select  * from (select rownum id,t.* from

(select * from emp order by sal desc) t) tt where tt.id<=5;

获得工资第五到第八位的人员信息

select  * from (select rownum id,b.* from

(select * from emp order by sal desc) b) c where c.id between 5 and 8;

数据库分页程序需要用到Rownum伪列

==========聚合函数和分组查询==========

聚合函数:同时对一组数据进行操作,并每组返回一行输出,也称之为分组函数

聚合函数主要是数字处理函数(忽略空值)

avg(X)          :平均值

count(X)        :计数(返回查询的行数)

max(X)          :最大值

min(X)          :最小值

sum(X)          :求和

variance(X)     :方差(用于测算离散趋势)

stddev(X)       :标准差(离均差,用于测算离散趋势,推荐使用)

1、avg()

列出员工的平均工资

select avg(sal) from emp

列出20部门的员工的平均工资

select avg(sal) from emp where deptno=20

2、count()

列出员工总数

select count(*) from emp

select count(empno) from emp

select count(rowid) from emp ——Oracle特定用法,效率较高——Rowid:行的物理地址(伪列)

列出所有员工中岗位的个数

select count(distinct job) from emp

列出有补助的员工数

select count(*) from emp where nvl(comm,0)>0

3、min、max

列出工龄最长的员工姓名和入职日期

select ename,hiredate from emp where (sysdate-hiredate)=(select max(sysdate-hiredate) from emp)

4、stddev、variance

查询部门员工收入差异最大的组

select stddev(sal) from emp group by deptno

使用Group by子句进行分组

1、Group by可以将行分组为具有相同列值的多个部分

查询emp表中存在的部门号

select deptno from emp group by deptno

2、在分组中使用多列

列出员工的岗位和部门号的不同情况

3、行分组使用聚集函数

聚合函数对每一组中的行进行计算机,并为每一组返回一个结果

查询各个部门的平均工资

select avg(sal),deptno from emp group by deptno

4、使用Order by子句对组进行排序

查询各个部门的平均工资,并以平均工资的从高至低的顺序排序

5、调用聚和函数的错误用法

获得各个岗位的总工资

select job,sum(sal) from emp group by job

select job,deptno,sum(sal) from emp group by job

sum(sal)要把获得每一个岗位的总工资,但是deptno,却要试图从每一行

获得部门号,这两个操作是不能同时完成的

因此:包含聚合函数的分组查询中,所选择的列,如果不出现在分组子句中是非法的

6、使用Having子句进行分组过滤

查询部门号为10和20的部门的平均工资

select avg(sal),deptno from emp

group by deptno

having deptno in(10,20);

7、组合使用where和Group by子句

查询部门号为10和20的部门的平均工资

select deptno,avg(sal) from emp where deptno in(10,20) group by deptno

8、组合使用Where、group by和Having

查询10、20的部门的平均工资中低于2500的记录

select deptno,avg(sal) from emp where deptno in(10,20) group by deptno

having avg(sal)<2500

where的作用:行的过滤(选择)

having:组过滤

分组查询中

在列列表中出现的列名,必须出现在分组条件中

聚集函数:min max avg count  忽略空值

=================连接查询====================

大部分数据库中都是有多个表的,这些表存储着企业的多方面的信息,

如何同时从多个表中获得所需要的信息——多表查询(连接,子查询)

1、入门

范例:

列出员工名和员工的部门名:

可以通过两步完成:

1、获得SCOTT所在的部门号

select deptno from emp where ename=员工名

2、通过部门号获得部门名

select dname from emp where deptno=部门号

如果需要在同一行中显示员工名和部门名,就需要将两个表连接起来,也就意味着

在同一个查询中同时指定两个表,然后指明两个表的关联列

select ename,dname from emp,dept where deptno=deptno

问题1:两个deptno到底哪一个是表(emp、dept)的,是没有办法搞明白的——限定词

select ename,dname from emp,dept where emp.deptno=dept.deptno

问题2:现在两个deptno可以区分开了,但是,如果两个表中都有dname,列列表

中的dname就没法区分了——列限定词

select dept.dname from emp,dept where emp.deptno=dept.deptno

问题3:每一次都输入表的全名,是一项冗余的徒劳的事情——表别名

select e.ename,d.dname from emp e,dept d where e.deptno=d.deptno

以上就是连接查询的基本知识

===============扩展==================

连接查询目前主要应用两种标准:SQL/86和SQL/92标准

SQL/86:使用where子句中表示连接条件

SQL/92:是用join关键字和“on 连接条件”建立连接

以上语句是使用的SQL/86标准,如果使用SQL/92标准,则写法如下:

select e.ename,d.dname from emp e join dept d using(deptno)

使用using子句的条件

1、查询必须是等值连接(连接条件表达式应该是用等号的)

2、等值连接中的列名必须是相同的9(d.deptno=e.deptno)

以下3条语句等价:

92:select e.ename,d.dname from emp e JOIN dept d ON e.deptno=d.deptno

92:select e.ename,d.dname from emp e JOIN dept d USING(deptno) --JOIN ... ON的特例

86:select e.ename,d.dname from emp e,dept d where e.deptno=d.deptno

2、其他

关于笛卡尔积:如果在查询中不指定连接条件就会产生笛卡尔积

SQL86:select ename,dname from emp,dept

在SQL92标准中,如果是取得笛卡尔积,需要使用交叉连接

SQL92:select ename,dname from emp cross join dept

关于多于两个表的连接

体现在连接条件中,连接条件的个数是表的个数减去1

--查询所有员工的员工名、部门名和工资等级

SQL86

select e.ename,d.dname,g.grade from emp e,dept d,salgrade g

where d.deptno=e.deptno and e.sal between g.losal and g.hisal;

SQL92

select e.ename,d.dname,g.grade from emp e join dept d

on

d.deptno=e.deptno

join salgrade g

on

e.sal between g.losal and g.hisal

3、连接条件和类型

表连接的连接表达式格式:

表中的列+操作符+另一个表中的列

e.deptno = d.deptno

针对连接表达式的连接操作符不同,连接可以分为:

1、等值连接(=)

2、不等值连接(<> > < >= <= ...)

除了根据连接操作符不同的分类外,连接本身还有3个类型:

1、内连接(inner join):完全满足连接条件的数据

2、外连接(outer join):对不满足连接条件的数据进行有选择的列出(即使连接中的列包含空值也返回)

3、自连接(self join):连接同一个表

4、不等值连接

在连接表达式中使用不是等号的其他操作符(<>、>、=、 like、 in、 between)

--查询所有员工的工资等级

SQL86:select e.ename,g.grade from emp e,salgrade g where e.sal between g.losal and g.hisal

SQL92:select e.ename,g.grade from emp e join salgrade g

on

e.sal between g.losal and g.hisal

5、外连接

准备数据:(添加一名员工,没有部门号)

insert into emp(empno,ename) values('1212','HYGJ');

列出部门名和员工名,包含没有部门的员工名

1、SQL86(内连接不能满足要求:因为内连接只能显示哪些满足连接表达式的行

而在此,null=10或者20或者30,都是不成立的)

select e.ename,d.dname,e.deptno,d.deptno

from emp e,dept d

where e.deptno=d.deptno

2、SQL92(内连接不能满足要求)

select e.ename,d.dname,e.deptno,d.deptno

from emp e join dept d

on e.deptno=d.deptno

3、SQL86(外链接,这里显示员工的部门号为空的,就要在相反的部门表的连接上加(+)

包含满足连接条件的所有组合,和哪些没有标识“+”的表中的取值为空的行)

select e.ename,d.dname,e.deptno,d.deptno

from emp e,dept d

where e.deptno=d.deptno(+)

4、SQL92(右外连接,显示空值的表在必须在join的右边

把Join左边的表中的连接列取值为空的行也显示出来)

select e.ename,d.dname,e.deptno,d.deptno

from emp e left outer join dept d

on e.deptno=d.deptno

列出所有的部门名和所有的员工名,包含没有部门的员工和没有员工的部门

5、SQL92(对两个表中所有的空值都列出来,用全外部连接)

select e.ename,d.dname,e.deptno,d.deptno

from emp e full outer join dept d

on e.deptno=d.deptno

6、自连接:对同一个表进行连接,解决表中行与行之间的关系

列出每一个员工的上司

1、SQL86

select e.ename 员工,m.ename

from emp e,emp m where e.mgr=m.empno

2、SQL92

select e.ename 员工,m.ename

from emp e join emp m on e.mgr=m.empno

=======================================================================================

子查询:

在select、insert、update或delete语句内部使用的select语句。这个select语句称为子查询。

子查询的类型:

1、单行子查询

不向外部SQL语句返回结果,或者只是返回一行

2、多行子查询

向外部的SQL语句返回一行或多行

3、多列子查询

向外部SQL语句返回多列数据

4、关联子查询

子查询引用了外部SQL语句中的一列或多列。

5、嵌套子查询

子查询位于另一个子查询中,最多可以嵌套255层

=================

1、单行子查询

不向外部SQL语句返回结果,或者只是返回一行

子查询可以放在Select语句中的Where、Having或From子句中

1、在Where子句中的子查询

--查询和SCOTT用户相同岗位的员工的姓名和岗位

select ename,job from emp where job=(select job from emp where ename='SCOTT')

select job from emp where ename='SCOTT':这条语句返回的只有一行数据

在上面的单行子查询操作中使用的是“=”,还可以使用的运算符是比较运算符

--查询高于平均工资的所有员工的姓名和工资

select ename,sal from emp where sal>(select avg(sal) from emp)

2、在having子句中使用子查询

--查询部门平均工资高于全部员工的总平均工资的部门号和其平均工资

select deptno,avg(sal) from emp group by deptno

having avg(sal)>(select avg(sal) from emp);

3、from子句中使用子查询(内联视图)

Oracle中的伪列Rownum的使用方法(前面已经讲了)

=================

2、多行子查询

子查询返回一行或多行数据,要处理多行记录可以使用IN、ANY或ALL操作符

1、使用IN操作符:IN检查值列表中是否包含指定的值

查询和SCOTT、SMITH同一岗位的所有员工的名字和岗位

select ename,job from emp

where job in(select job from emp where ename in('SCOTT','SMITH'))

2、使用ANY、ALL操作符,

Any用来对子查询返回值列表中的任意值进行比较

ALL用来对子查询返回值列表中的所有值进行比较

在ANY和ALL操作符之前必须使用比较运算符

查询工资低于salgrade表中低级工资的员工名和其工资

select ename,sal from emp where sal

>any (2000,3000,4000)

查询工资低于salgrade表中所有的低级工资的员工名和其工资

select ename,sal from emp where sal

在一个例子

查询比各个部门平均工资都要低的员工名和工资

select ename,sal from emp where sal

查询低于任意部门平均工资的员工的名字和工资

select ename,sal from emp where sal

3、多列子查询:

列出每个部门中工资最低的员工的姓名和工资

select ename,sal from emp

where (sal,deptno) in

(select min(sal),deptno from emp group by deptno)

=======关联子查询=============

引用外部查询中的一列或多列的子查询,称之为关联子查询。

1、范例

查询高于自己部门平均工资的员工名和工资

select ename,sal from emp out

where sal>(

select avg(sal) from emp inner where inner.deptno=out.deptno

)

2、exists、not exists:检查行的存在性

查询可以管理其他员工的员工姓名

1、select ename from emp where exists(select 1 from emp inner where emp.empno=inner.mgr)

2、select ename from emp where empno in(select mgr from emp)

查询没有员工的部门号

1、select deptno from dept where not exists(select 1 from emp where dept.deptno=emp.deptno)

2、select deptno from dept where deptno not in(select deptno from emp)

关于exists(not exists)与in(not in)的比较

通常来讲,因为in(not in)需要检查实际值,而exists(not exists)只需要检查存在性,

所以exists(not exists)效率更高一些。

======嵌套子查询===========

在子查询内部嵌套其他子查询

知识点:rownum伪列:

在desc table_name 中不出现的列

此列用于对查询的结果添加顺序的编号

原理可以如下理解

通过查询语句在数据库中依次取出指定的行,然后根据

取出的先后顺序添加编号,编号从1开始

此时是指在没有排序和分组的前提下完成的。

--查询前5个员工序号和姓名

select rownum,ename from emp where rownum<=5

--查询第6到第10个员工的序号和名字

--查询工资最高的前5个员工的序号和名字

===========高级查询=============

集合操作:(SQL Server中只是支持Union和Union all)

Union  结果并集,去掉重复行

Union all 结果并集,保留重复行

Intersect 结果的交集

Minus  结果的差集

select * from emp where deptno=10 and job='CLERK';

交集:取两个查询公共的数据

select * from emp where deptno=10

intersect

select * from emp where job='CLERK'

差集:

把第一个查询结果中和第二个查询结果相同的行去掉,剩下的数据

两个查询的先后顺序就敏感了

select ename from emp where deptno=10 minus

select ename from emp where job='CLERK'

select ename from emp where job='CLERK' minus

select ename from emp where deptno=10;

2、使用case表达式:

case表达式可以在SQL中实现类似if...else语句,其功能和decode相似。

1、使用简单case表达式

case search_express

when express1 then result1

when express2 then result2

...

when expressn then resultn

else default_result

end

列出所有员工的名字和部门代码,代码对应如下:

10——A,20——B,30——C,其余的——X

select ename,

case deptno

when 10 then 'A'

when 20 then 'B'

when 30 then 'C'

else 'X'

end deptno

from emp

2、使用搜索case表达式

case

when condition1 then result1

when condition2 then result2

...

when conditionn then resultn

else default_result

end

1、列出所有员工的名字和部门代码,代码对应如下:

10——A,20——B,30——C,其余的——X

select ename,

case

when deptno=10 then 'A'

when deptno=20 then 'B'

when deptno=30 then 'C'

else 'X'、

end from emp;

2、有数据表如下:

create table a(

id int,

name varchar2(20),

subject varchar2(10),

score number(5,2));

insert into a values(1,'张三','物理',78);

insert into a values(2,'张三','化学',80);

insert into a values(3,'张三','英语',90);

insert into a values(1,'吴用','物理',60);

insert into a values(1,'吴用','化学',70);

insert into a values(1,'吴用','英语',98);

ID NAME                 SUBJECT         SCORE

-- -------------------- ---------- ----------

1 张三                    物理               78

2 张三                    化学               80

3 张三                    英语               90

1 吴用                    物理               60

1 吴用                    化学               70

1 吴用                    英语               98

行列转换

姓名 物理 化学 英语

张三 78 80 90

吴用 60 70 98

select name 姓名,

sum(case subject when '物理' then score end) 物理,

sum(case subject when '化学' then score end) 化学,

sum(case subject when '英语' then score end) 英语

from a group by name

====================Oracle函数====================

分类:

多行函数:

也叫聚集函数、统计函数、分组函数:min max avg。。。

输入一组值,返回一个值

单行函数:

输入一个值,返回一个值

既可以在select表达式中使用也可以在PL/SQL程序中使用

表达式:

select 1+2

SQL Server合法的,求取表达式的值

Oracle中不合法的

在Oracle中Select是选择语句,后面一定会有一个from与之对应

From后跟表名,如果没有表,就用dual返回表达式的值

dual表实际上是不存在的虚表,数据库启动就动态建立,数据库关闭,dual表就没有了

单行函数分类:

1、字符函数

2、数字函数

3、日期函数

4、转换函数

字符函数:

ASCII(c):返回字符c的ASCII码

CHR(x):返回ASCII码为x的字符

LOWER(c):小写转换

UPPER(c):大写转换

INITCAP(c):把字符串中每一个单词的首字母大写,其他字母小写

CONCAT(x,y):将y附件加到x上,并返回所得到的字符串

LENGTH(c):返回字符串的字符个数

INSTR(字符串,要查找的字符串[,开始查找位置][,第几次出现])

LPAD(字符串,字符串长度[,追加的字符])

RPAD(字符串,字符串长度[,追加的字符])

TRIM([剔除的字符串 from] 要剔除的字符串):默认剔除两端的空格

LTRIM(字符串[,要剔除的字符串])

RTRIM(字符串[,要剔除的字符串])

SUBSTR(字符串,开始位置[,提取长度])

REPLACE(字符串,查找的字符串,要替代的字符串)

数学函数:

ABS(x):绝对值

CEIL(x):大于等于x的最小整数

FLOOR(x):小于等于x的最大整数

MOD(x,y):x除以y的余数

ROUND(x[,y]):从第y位小数点进行取整,默认是0,四舍五入

SIGN(x):取符号

TRUNC(x[,y]):从第y位小数点进行取整,默认是0,不四舍五入

日期函数

ADD_MONTHS(x,y):在X日期的基础上添加y个月后的日期

LAST_DAY(x):本月的最后一天是什么日期

MONTHS_BETWEEN(x,y):x和y之间间隔了几个月

NEXT_DAY(x,星期几):从x日开始,下一个星期几是什么日期

ROUND(x[,unit]):unit:指明所取的单元:日期的四舍五入,过半进1

TRUNC(x[,unit]):日期的截断

SYSDATE():获得当前服务器系统时间

CURRENT_DATE():获得当前客户端时间

SYSTIMESTAMP(p):获得当前服务器的时间戳(带有时区标记)

LOCALSYSTIMESTAMP(p):获得当前服务器的时间戳(时间自动转换为当前时区时间)

日期的四舍五入和截断:精度

取时间单位的一半

2009-5-20 15:07:21

按年:7月1号:2009年

按月:15号:6月

按日:12:00

转换函数:不同数据类型的数据之间的转换

SQL Server :

convert

cast

Oracle:

to_char         :number转换到char,date转换到char

to_date         :char转换到date

to_number   :char转换到number

注意:在SQL Server或Oracle中都存在隐含数据类型转换

insert into emp(empno,hiredate,sal) values('1234','12-1月-2009','2000');

单引号界定符在数据库中一般是界定字符或字符串的,

只要是单引号引起来的就是字符或字符串

上面的语句是正确的,原因是:

Oracle自动数据类型的转换——隐含数据类型转换

隐含数据类型的转换是有条件的??

对字符串格式的要求和取值的要求

格式:日期——字符串(日期-月份(月)-年)

取值:数字——字符串(只能取可以作为数字用的字符)

隐含数据类型转换:

总是存在各种限制,

如果不能满足其格式的或取值的要求就会出错

显式数据类型转换,可以更加自由的定义格式和值

to_date(字符串,格式表达式):字符串==>日期

select to_date('2009-01-12','yyyy-mm-dd') from dual;

insert into emp(empno,hiredate,sal)

values('1234',to_date('2009-01-12','yyyy-mm-dd'),'2000');

to_char(日期,格式表达式):日期===>字符串

显示所有员工的雇用日期,其格式为2009-01-23

select to_char(hiredate,'yyyy--mm--dd') from emp

通过一个查询返回当前查询时刻,今天还剩多少秒?

格式表达式:

公元:

CC      两位的世纪

SCC    两位的世纪,公元前加-(负号)

年份:

Y   YY    YYY     YYYY     Year    YEAR    year

2009年

9    09  009      2009     Two Thousand Nine

DY 天的名称简写(英文星期几简称,中文中没有简称 )

DAY 天的名称全称(英文:星期几的英文全称,中文:=DY)

D         星期中的天(7)

DD     月中的天(31)

DDD  年中的天(365)

W 月中的周

WW 一年中的第几周(52)

MM 两位数表示月份

MON 月份缩写

MONTH 月份

HH24/HH12 24/12小时制时间

MI/SS 分钟/秒

SSSSS 一天中的秒

-/,.;: "text" 原样显示

to_char(数字,格式):数字===>字符串

显示员工的工资,需要工资的格式为¥2,300.00(RMB 2,300.00)

1、select to_char(sal,'L0,000,00') from emp

2、column sal format 'L0,000,00'

都能满足查询的要求

1、是查询语句,返回的数据字符串(已经不是原来的数据类型了)

2、是格式设置,返回的数据数字,只不过是显示进行格式化,数据还是原来的数据

只是显示形式变了

to_number(字符串,格式):字符串===>数字

select to_number('$1,900.00','$0,000.00') from dual;

格式表达式:

9:返回指定位置处的数字,如果该数字是负数,前面加负号

0:返回指定位置处的字符,没有数字的位置用0补齐

. :在指定位置返回小数点

, :在指定位置返还逗号

$:返回美元符号

C:返回ISO货币符号

D:本地小数点

G:本地分隔符

EEEE:科学计数法

L:本地货币符号

MI:正数返回数字后加空格,负数返回数字后加负号(减号)

PR:正数返回数字前后加空格,负数返回数字前后加尖括号(<>)

S:正数返回数字,并在指定位置添加号,负数在指定位置添加负号

杂项函数:

DECODE函数==case操作

非常类似于if ... else语句

if deptno=20 then

sal=sal+20;

elsif deptno=30 then

sal=sal+30;

elsif deptno=10 then

sal=sal+10;

else

sal=sal;

end if;

使用decode函数:

decode(deptno,

10,

sal+10,

20,

sal+20,

30,

sal+30,

sal

)

decode函数是一个无限参数函数,格式:

decode(表达式,值1,返回表达式1,值2,返回表达式2,....,返回表达式n)

1、根据以下规则,列出员工的新工资

10——+100元,20——+200元,30——+300元,其他部门不变

select sal,decode(

deptno,

10,sal+100,

20,sal+200,

30,sal+300,

sal) newsal from emp

2、有数据表如下:

&nb

离均差oracle 函数,Oracle的学习详解(一)相关推荐

  1. Oracle函数lag和lead详解

    1.函数功能 Lag和Lead函数可以在一次查询中取出同一字段的前N行的数据和后N行的值.这种操作可以使用对相同表的表连接来实现,不过使用LAG和LEAD有更高的效率. 2.lag和lead语法: a ...

  2. oracle out参数查询,Oracle的out参数实例详解

    Oracle的out参数实例详解 一 概念 1.一般来讲,存储过程和存储函数的区别在于存储函数可以有一个返回值:而存储过程没有返回值. 2.过程和函数都可以通过out指定一个或多个输出行.我们可以利用 ...

  3. oracle的userenv和nls_lang详解

    oracle的userenv和nls_lang详解 1.userenv最常见的使用 userenv函数返回当前会话(session)的相关信息.以下sql语句可以查询当前会话连接的数据库字符集 sel ...

  4. oracle select执行顺序,oracle select执行顺序的详解

    oracle select执行顺序的详解 SQL Select语句完整的执行顺序:1.from子句组装来自不同数据源的数据: 2.where子句基于指定的条件对记录行进行筛选: 3.group by子 ...

  5. 删除oracle数据库的三种方法,oracle数据库的删除方法详解

    oracle数据库的删除方法详解 1.图形界面删除 练习之前记得创建快照 执行命令之前要保证数据库属于open状态 SQL> alter database open; [oracle@local ...

  6. oracle存储过程报错 跳过,oracle调试存储过程的过程详解

    oracle调试存储过程的过程详解 oracle如果存储过程比较复杂,我们要定位到错误就比较困难,那么可以存储过程的调试功能 先按简单的存储过程做个例子,就是上次做的存储过程(proc_test) 1 ...

  7. oracle数据库中索值,Oracle数据库中的索引详解

    Oracle数据库中的索引详解以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一 ROWID的概念 存储了row在数据文 ...

  8. win7 64位操作系统中Oracle 11g + plsql安装教程详解(图解)

    这篇文章主要介绍了win7 64位操作系统中Oracle 11g + plsql安装教程详解(图解),详细的介绍了Oracle 11g 安装的步骤,有兴趣的可以了解一下. 先去网上把下面列表里的文件下 ...

  9. ORACLE的索引和约束详解数据库

    ORACLE的索引和约束详解数据库 Oracle的约束 * 如果某个约束只作用于单独的字段,即可以在字段级定义约束,也可以在表级定义约束,但如果某个约束作用于多个字段, 必须在表级定义约束 * 在定义 ...

  10. Oracle之DBMS_SQL包用法详解

    Oracle之DBMS_SQL包用法详解 原文  http://zhangzhongjie.iteye.com/blog/1948093 通常运用 DBMS_SQL 包一般分为 如下 几步: 1. o ...

最新文章

  1. 资源 | Yann LeCun最新演讲:大脑是如何高效学习的?(附PPT+视频)
  2. html xhtml and css,HTML与XHTML的重要区别
  3. 二进制转换为八进制-栈方式实现
  4. ECCV 2012 CSK:《Exploiting the circulantstructure of tracking-by-detection with kernels》论文笔记
  5. Nginx中Gzip压缩功能的实例配置
  6. 编译php7.0.17报错提示 undefined reference to `libiconv_open'
  7. 通过路由远程计算机重启,华为无线路由器三种常用重启的方法
  8. Impala入门笔记
  9. delphi中的函数传参如何传枚举参数_Python基础笔记Day05函数
  10. ijkplayer 消息循环处理过程分析
  11. 移动游戏市场Testin云测占有率超过90%
  12. JavaSE基础知识(6)—异常和异常处理
  13. Asp.net mvc 实时生成缩率图到硬盘
  14. 如何用c语言编写工程文件夹,利用makefile实现c语言项目编译
  15. revit二次开发概念_BIM百科 | Revit二次开发入门--创建一个简单的程序
  16. ue4模型为啥这么亮_坐好了,仔细听,资深建模师介绍UE4视口中的可视化模式(一)...
  17. JAVA 入门教程 2
  18. 成人高考自考资讯网源码 织梦dedecms模板
  19. 使用Battery Historian采集android耗电数据
  20. 计算机其它离的360云盘,win7系统将360云盘文件快速转移到百度云盘的方法

热门文章

  1. 解决Maven项目pom文件中出现的错误:Missing artifact oracle:ojdbc7:jar:12.1.0.2.0:compile
  2. Oracle数据库驱动包ojdbc7.jar,ojdbc8.jar
  3. ubuntu 安装log4cpp
  4. rpcbind 、nfs无法启动问题
  5. android购物车计数器,Axure教程:计数器的实战应用场景 —— 商品购件数
  6. 基于与非门和多路开关结构的一位全加器实现方法
  7. LOL登录后黑屏,主界面一直加载解决办法
  8. 中山大学delphi视频下载(51讲)
  9. Backup Exec启动时,系统报“CLR20r3“错误
  10. PMP考试有哪些技巧?