JAVAOracle.docx
《JAVAOracle.docx》由会员分享,可在线阅读,更多相关《JAVAOracle.docx(37页珍藏版)》请在冰豆网上搜索。
![JAVAOracle.docx](https://file1.bdocx.com/fileroot1/2023-1/7/e8339047-617f-48dc-8265-ca7ef94afb3e/e8339047-617f-48dc-8265-ca7ef94afb3e1.gif)
JAVAOracle
Oracle
1、介绍
v数据库基本概念
数据库:
存储数据的仓库,DataBaseDB?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
:
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
DBMSDatabasemanagersystem.
数据库管理员:
DBA
v关系型数据库
Oracle?
MySQL?
SQLServer?
DB2?
Access?
?
?
?
?
?
:
1--»11--»nn--»1n--»n
vOracle
?
?
?
?
?
?
:
1.?
?
?
?
?
?
?
?
?
?
?
?
?
Solaris?
Linux?
Unix?
2.?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
3.?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
:
8i:
Oracle?
?
?
?
?
?
?
9i:
10g:
?
?
?
?
gridcomputing?
11g:
2、安装
注意事项:
1.计算机名建议用英文字符,不要使用中文字符。
2.将防火墙关闭
3.路径不要使用中文字符。
建议不要安装到C盘。
4.先不要安装数据库实例。
5.安装数据库过程中会要求用户是否输入【sys、system管理数据库的用户】、scott用户的密码。
记住sys、system密码。
卸载:
因为如果Windows系统下已经安装过Oracle的话,如果想再次安装,原来的版本就会对新的安装产生这样那样的影响,不幸的是,出于保护原有数据的目的,Oracle并不能够简简单单的运行Uninstall就可以彻底删除,要彻底删除原有的Oracle系统,需要遵照下面的步骤进行:
(当然,如果你的机器上原来没有安装过Oracle,可以直接略过这一小节)
1.以administrator帐户登录
2.停止所有的oracle服务(开始-->控制面板-->管理工具-->服务)
3.运行oracle的universalinstaller(开始-->程序-->oracleinstallatioinproducts-->universalinstaller)删除所有的oracle产品
4.卸载程序执行完毕后,oracle并不能别干净的清除,这时候还需要手动的将文件清除。
5.修改注册表regedit,将HKEY_CLASS_ROOT-->删除所有以ORACLE或者ORAL开头的注册表项
6.将HKEY_LOCAL_MACHINE\SOFTWARE下ORACLE注册表项删除
7.将HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Service下的以Oracle开头的注册表项
8.删除HKEY_CURRENT_USER\SOFTWARE下的oracle注册表项然后退出注册表
9.重启计算机
10.删除c:
\ProgramFiles\Oracle目录
11.删除所有硬盘上ORACLE_BASE(一般为c:
\oracle)目录
sysman:
如何查看服务名:
1.查看位置C:
\oracle\product\10.2.0\db_1\NETWORK\ADMIN
2.修改tnsnames.ora
EDU_SUSHE=
(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=TCP)(HOST=172.16.10.210)(PORT=1521))
)
(CONNECT_DATA=
(SERVICE_NAME=orcl)
)
)
用户名:
hibernate密码123456
3.目录介绍
vFunction:
函数库
vProcedures:
过程
vTriggers:
触发器
vTables:
表【CRUD操作C:
CreateR:
ReadU:
UpdateD:
Delete】
vView:
视图,虚拟表【多个表之间的一个结果集】
vSequence:
序列
vUsers:
用户【测试用户:
scott密码:
tiger】
针对用户进行解锁操作:
alteruserSCOTTaccountlock;锁定账户
alteruserSCOTTaccountunlock;解锁账户
作业:
编写tnsnames.ora,实现连接172.16.10.210数据库服务器,访问boss表中数据,有多少行有多少列。
使用工具PLSQLDevelop。
3、开发工具
1.命令行
Cmd进入DOS界面------------>
sqlplusscott/tiger@edu访问外部数据库服务器
sqlplusscott/tiger访问本地数据库服务器
2.SQLPLUS
3.SQLDevelop
4、SQL语句介绍
SQL语句是关系数据库最基本的操作语言。
基本上不同的数据库厂商支持的SQL大部分都相似,但有些特殊的存在着不同【MySQL、Oracle分页】。
SQL:
结构化查询语言StructuredQueryLanguage
SQL语句包括数据查询语言select、数据操作语言DML(insert、update、delete)【作用级别是在表中行数据上】,事务控制语言(commit提交、rollback回滚),数据定义语言DDL(create创建、alter修改、drop删除)【作用级别在表、视图、用户等】,数据控制语言DCL(grant授权、revoke回收)。
DML:
DataManipulationLanguage【使用场所最多】
DDL:
Datadefinitionlanguage
DCL:
DataControlLanguage
v创建用户【默认使用scott】
createuser"120";创建用户
identifiedby"1"指定密码
grantconnectto"120";允许用户连接至数据库
grantresourceto"120";允许用户使用数据库中存储空间
grantunlimitedtablespaceto"120";允许用户不受表空间的限制
用户在Oracle中又叫一个方案Schema。
也就是用户下面可以有专门的表、视图、存储过程、函数等。
修改:
alteruser"120"identifiedby"1";修改密码
删除:
dropuser“120”
[扩展:
]
如何访问别的用户下的表:
select*fromhibernate.bosst
但是实现跨用户访问,有时无法访问到表中数据,处理方式--->提高访问权限:
grantselect,insertonBOSSto"120";赋予查询、插入Boss表的权限给用户120
v创建表
createtablestudent--创建表
(
idnumber(10)notnull,--ID
namevarchar2(50),--姓名
sexnumber
(1)--性别
)
添加列:
altertablestudentaddagenumber(3);
删除列:
altertablestudentdropcolumnage;
列重命名:
altertablestudentrenamecolumnagetoage1;
修改列的数据类型或者长度:
altertablestudentmodifyage1number(10);
删除表:
droptablestudent;
Truncatetablestudent;
数据类型:
包括:
字符、数值、时间日期、LOB、RAW
字符数据类型:
VARCHAR2()、char()、nvarchar()
当使用长度固定的字符数据类型时,采用char,其长度为1-2000个字节。
VARCHAR2和nvarchar支持可变长度。
其长度为1-4000个字节
数值类型:
number,可以存储整数、浮点数、实数,精度可以高达38位。
其格式number(p,s)p:
表示精度s:
表示小数点位数【s可以忽略】
日期类型:
date、timestamp
LOB:
大对象数据类型,可以存储高达4GB的非结构化数据。
包括CLOB(存储大量的字符数据),BLOB(存储较大的二进制对象,例如图像、视频等)。
RAW:
存储二进制数据。
5、数据操作语言
v插入
1.insertintostudent(id,name,sex,age1)values(1000,'姚明',1,35)
往student表中四个字段添加数据。
2.insertintostudentvalues(1000,'姚明',1,35)
不用定义往数据库中哪个字段填充数据,student表中任何字段都会插入新值
3.insertintostudent(id)values(1001)
对固定的某一列添加新值。
4.添加大量数据
insertintostudentselect*fromstudentt
注意:
PLSQL中要求选中某一段SQL语句然后选择执行,此时执行的就是选中的SQL语句。
v更新
1.更新全部的字段数据
updatestudentsetname='姚小明';
2.更新某一行的列的数据
updatestudentsetname='姚大明'whereid=1000;
3.更新某一行中多列数据
updatestudentsetname='姚大明',age1=80whereid=1000;
v删除
1.删除指定条件数据行【from可省略】
deletefromstudentwhereid=1000;
2.删除所有数据行
deletefromstudent
3.直接截断整个表数据,使用truncate
truncatetablestudent效率比delete高
6、数据查询语言
Select是用于检索数据库中表数据。
基本结构:
Select<*,column[alias]>from表名
其中*号表示匹配所有的列,alias给列指定别名。
v基本查询
1 检索所有的列
select*fromdept;
2 检索特定的列
selectename,job,salfromemp;
3 指定别名
SELECTEname“?
?
”,Job,SalFROMEmp;
SELECTEnameas?
?
Job,SalFROMEmp;
as?
?
?
SELECTEnameas?
?
t.job?
?
SalFROMEmpt;?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
4 检索日期列
selectt.ename,t.hiredatefromempt;--?
F6?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
:
?
?
?
?
?
?
selectt.ename,to_char(t.hiredate,'yyyy/mm/dd')?
?
fromempt;
to_char(?
?
?
?
?
?
?
?
?
?
)
5 取消重复行
?
?
?
?
?
:
distinct
selectdistinctt.mgr,t.deptnofromempt;
6 使用算数表达式
算术表达式有加减乘除,其中乘除优先级要高。
如果要执行加减运算,则采用括号进行处理。
selectt.ename"姓名",t.job"职位",t.sal*12"年薪"fromempt;
selectt.ename"姓名",t.job"职位",t.sal+m"月薪"fromempt;
7 处理null
null?
?
?
?
?
?
?
?
?
?
?
?
?
0.?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
publicclassEmp{
privateStringempNo;
privateStringename;
privateStringjob;
privateFloatsal;
将薪水字段设置为包装类类型,原因是因为如果没有对薪水字段设置值,那么添加到数据中的数据就是0.
}
Stringsql="insertintoemp(empno,ename,sal)values('"
+emp.getEmpNo()+"','"+emp.getEname()+"',"+emp.getSal()+")";
selectt.ename"姓名",t.job"职位",t.sal+m"月薪"fromempt;
?
?
?
?
?
?
?
?
null?
?
?
?
?
?
?
null?
select1+null*1fromdual;测试结果均为空
那么去处理空情况,需要使用函数
Ø使用函数nvl函数
nvl(exp1,exp2):
表示如果exp1为null,那么值返回exp2.如果exp1不为null,那么值返回exp1.
【注意:
SQL语句中不分大小写】
selectt.Ename"姓名",t.job"职位",t.sal,m,
t.sal+nvl(m,0)"月薪"fromempt;
Ø使用nvl2函数
Nvl2(exp1,exp2,exp3):
如果exp1为空,那么值采用exp3.如果exp1不为空,那么采用exp2对应的值。
selectt.Ename"姓名",t.job"职位",
nvl2(t.sal+m,t.sal+m,t.sal)"月薪"fromempt;
?
?
?
:
?
?
?
?
?
?
?
?
?
?
altertablesalemodifyNAMEdefault'姚明';
altertablesaleaddsexnumber
(1)default1notnull;--添加sex列默认值为1
altertablesaleaddtimesdatedefaultsysdatenotnull;--提供默认时间点
8 连接字符串
JAVA?
?
?
?
?
?
?
?
?
?
+,?
?
Oracle?
?
||?
?
?
?
?
?
?
?
?
select'姓名:
'||t.ename||'他的薪水为:
'||t.sal"介绍"fromempt;
?
?
?
?
?
?
?
:
concat('A','B')
错误情况:
1.没有足够的值情况
insertintosalevalues(2001069,2001064);错误
2.单引号、双引号情况
3.单词写错
4.修改date类型的值,文字与字符串格式不匹配问题
updatesaletset
t.times=to_date('2013-04-2811:
24:
51','yyyy-MM-ddhh:
mi:
ss')
wheret.id=2001069
vWhere条件过滤
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
where?
?
?
?
?
where?
?
?
?
?
?
?
?
?
?
?
?
?
?
and?
or?
?
not?
?
?
?
?
?
?
?
?
?
?
=
?
?
!
=或者<>
?
?
?
>=>
大于等于大于
<=<
小于等于小于
Between....And
在两者之间
In(,,,,)
?
?
?
?
?
like
匹配字符样式,常用模糊查询
isnull
测试null
Ø检索数字
SELECT*FROMEmptwheret.empno=7369;
Ø?
?
?
?
?
SELECT*FROMEmptwheret.ename='SMiTH2';
使用单引号进行标识。
注意:
SQL中不分大小写,传递进来的值分大小写。
函数:
处理大小写
selectupper('a')fromdual
selectlower('S')fromdual
Ø?
?
?
?
?
?
?
?
?
?
:
?
?
?
?
?
?
?
?
1982?
?
?
?
?
?
?
SELECT*FROMEmptwheret.hiredate>to_date('1982-01-01','yyyy-MM-dd')
SELECT*FROMEmptwhereto_char(t.hiredate,'yyyy-MM-dd')>'1982-01-01'
'yyyy-MM-ddhh24:
mi:
ss'指定24小时制
'yyyy-MM-ddhh:
mi:
ss'指定12小时制
ØWhere?
?
?
?
betweenand
Betweenand?
?
?
?
?
?
?
?
?
?
?
between?
and?
?
?
?
?
?
?
?
?
and?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
select*fromemptwheret.salbetween3000and5000
ØWhere?
?
?
?
like
Like?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
select*fromemptwheret.enamelike'%AM%'
模糊查询统配符有两种:
%和_
其中%号表示匹配0个或者多个字符。
_下划线表示匹配一个字符。
select*fromemptwheret.enamelike'_AM%'
但是在处理过程中,如果有字符刚好为通配符,那么如何处理?
使用关键字escape。
select*fromemptwheret.enamelike'%s_%'escape's'
表示escape指定的字符其后面的通配符当成普通字符使用。
ØWhere?
?
?
?
?
in?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
:
?
?
?
?
?
?
900?
?
3000?
?
?
?
?
?
select*fromemptwheret.salin(900,3000)
select*fromemptwheret.salnotin(900,3000)
ØWhere?
?
?
?
?
isnull
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
null,?
?
?
true,?
?
?
?
?
?
null,?
?
?
false?
select*fromemptwheremisnull
注意:
当与null进行比较时,不要使用等于或者不等于。
select*fromemptwheremisnotnull
?
?
:
1.查询薪金在800到1600之间的员工信息
2查询员工SMITH,ALLEN,JAMES的信息
3.查询员工编号为7369和7876的员工信息
4.查询姓名以S开头的员工信息
5.查询姓名的第二个字符为L的员工信息
6.查询姓名包含ME的员工信息
7.选择在部门30中员工的所有信息
8.列出职位为(MANAGER)的员工的编号,姓名
9.找出奖金高于工资的员工
10.找出每个员工奖金和工资的总和
ØWhere?
?
?
?
?
?
?
?
?
?
?
?
?
?
:
andornot
?
?
?
?
?
?
true,?
?
?
true------and
如果条件有一个为true,那么返回true--------or
如果条件为false,使用not转变为true-------not
优先级not最高,其次为and,再然后为or。
示例1:
查询部门编号为20,职位为经理的个人信息。
select*fromemptwheret.deptno=20andlower(t.job)='manager'
示例2:
查询工资高于2500,或者岗位为经理的个人信息。
select*fromemptwheret.sal>2500orlower(t.job)='manager'
?
?
?
true?
?
:
?
?
or
?
?
?
?
?
?
?
?
?
?
?
?
?
?
SQL?
?
?
SELECT*
FROMLoginusert
WHEREt.Username='admin'
ANDt.Password=''
OR'1'='1'
Ø?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
oracle?
?
?
orderby?
?
?
?
?
?
?
?
?
?
desc?
?
?
?
?
asc?
?
?
?
?
?
select*fromemptorderbyt.sal
select*fromemptorderbyt.saldesc
?
?
?
?
?
?
?
?
?
?
?
?
selectt.ename,nvl(t.sal+m,t.sal)薪水fromemptorderby薪水
?
?
?
?
?
?
?
?
?
?
selectt.ename,nvl(t.sal+m,t.sal)薪水fromemptorderby2
2表示薪水所在查询的列的位置。
使用多列排序。
示例:
按照工资升序,按照奖金降序排列。
select*fromemptorderbyt.salasc,mdesc;
注意优先级,先执行orderby前面的排序条件,执行完之后再去执行后面的条件排序。
?
?
:
1.找出部门10中的经理(MANAGER)和部门20中的普通员工(CLERK)
2.找出部门10中既不是经理也不是普通员工,而且工资大于等于2000的员工
3.找出有奖金的员工的不同工作
4.找出没有奖金或者奖金低于500的员工
5.显示雇员姓名,根据其服务年限,将最老的雇员排在最前面
6.查询工资高于800,或者岗位是manager的员工,并且姓名首字母为S开头的员工信息
7.查询岗位不是分析师(ANALYST)和经理(MANAGER)的所有员工
v数据分组
?
?
?
?
:
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
groupby?
?
?
?
?
?
?
?
?
?
groupby,?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
:
Max:
?
?
?
?
?
?
?
Min:
?
?
?
?
?
?
?
Avg:
?
?
?
?
?
?
?
Sum:
?
?
?
?
?
?
Count:
?
?
?
?
?
?
?
?
?
selectmax(t.sal)"?
?
?
",min(t.sal)"?
?
?
"fromEmpt
selectavg(t.sal)"?
?
?
"fromEmpt
selectsum(t.sal)"?
?
"fromEmpt
selectcount(*)"?
?
"fromEmpt?
?
?
?
?
?
selectcount(distinctt.sal)fromempt
⏹Groupby:
?
?
groupby?
?
?
?
?
?
?
?
?
?
?
?
?
?
:
?
?
?
?
?
?
?
?
?
?
?
?
SELECTt.Deptno,SUM(t.Sal)"月值",AVG(t.Sal)"平均值",MAX(t.Sal)"最高值",MIN(t.Sal)"最小值"FROMEmptGR