您的位置:首页 > 数据库 > Oracle

Oracle学习 1

2015-07-28 20:21 549 查看
博客内容主要来源:

视频:玩转oracle实战教程

书籍:Oracle实用教程+深入浅出Oracle

自己整理的一些笔记

数据操作(DML)

insert、update、delete

数据定义(DDL) 不允许rollback

create、alter、drop、rename、truncate

事务控制

commit、rollback、savepoint

安全(DCL)

grant、revoke

sql*plus常用命令

1 连接命令 (切换用户)

用法:conn[ect] 用户名/密码 当用特权用户身份连接时,必须带上as sysdba或者as sysoper

如:conn system/manager

注意:在连接命令中 conn 用户名/密码@网络服务名[as sysdba] 网络服务名指的是所要连接的数据库实例名

断开连接:disc[onnect]

2 修改密码

用法:password 需要用sys/system登录

3 显示当前用户

用法:show user 显示当前用户名

4 退出

用法:exit

5 文件操作命令

(1) start和@

说明:运行sql脚本

如:sql>@ d:\a.sql 或者start d:\a.sql

(2) edit

说明:编辑sql脚本

如:sql>edit d:\a.sql

(3) spool

说明:可以将sql*plus屏幕上的内容输出到制定文件中去

如:sql>spool d:\b.sql (开启了)

进行一些操作后

最后 输入sql>spool off (关闭了)

(4) &

说明:可以替代变量,而该变量在执行时,需要用户输入

如:sql> select * from emp where job=’&job’ 其实没什么用,还不如直接写job=’具体要查询的’

6 显示和设置环境变量

概述:可以用来控制输出的各种格式,set show 如果希望永久的保存相关的设置,可以去修改glogin.sql脚本

(1) linesize

说明:设置显示行的宽度,默认是80个字符

如:sql>show linesize

sql>set linesize 90

(2) pagesize

说明:设置每页显示的行数目,默认是14

用法与linesize一样

Oracle用户的管理

1 创建用户

概述:在oracle中要创建一个新的用户使用creat user语句,一般具有dba的权限才能使用

如:sql>creat user xiaoming identified by m123;

2 给用户修改密码

说明:如果给自己修改密码可以直接使用

sql>password 用户名(不写用户名都可以)

说明:如果给别人修改密码则需要具有dba的权限,或是拥有alter user的系统权限

sql>alter user 用户名 identified by 新密码

3 删除用户

说明:一般以dba的身份去删除某个用户,如果用其它用户去删除用户则需要具有drop user的系统权限

如:drop user 用户名【cascade】

如果要删除的用户,已经创建了表,那么就需要带参数cascade,级联删除

4 新创建的用户是没有任何权限的,甚至连登录数据库的权限都没有

需要为其制定相应的权限,给一个用户赋予权限使用命令grant,回收权限命令revoke

如:sql>grant connect to xiaoming;

(1) 权限分为2种

系统权限:用户对数据库的相关权限,如建库,建表,建索引,建存储过程,登录数据库,修改密码

对象权限:用户对其它用户的数据对象(表、函数、包、视图、触发器、存储过程)操作的权限,如查询、更新、插入、删除、all某些表

如:sql>grant select on scott.emp to xiaoming

如:sql>revoke select on scott.emp from xiaoming

(2) 角色

事先定义一些角色,包含了一些权限,如connect角色包含creat session权限等7种权限,DBA角色权限最高啊,resource权限在表空间建表的权限

角色也分两种

预定义角色:

自定义角色:

(3) 权限的维护

用户收到新权限后可以赋予给其它用户这个权限

如果是对象权限就在后面加上with grant option

如:sql>grant select on scott.emp to xiaoming with grant option

xiaoming就可以继续把select权限传递给其它用户

如果是系统权限就在后面加上with admin option

如:sql>grant connect to xiaoming with admin option

xiaoming就可以继续把connect传递给其它用户

重点:

对象权限会级联删除

系统权限不会级联删除

5 使用profile管理用户口令

说明:profile是口令限制,资源限制的命令集合,oracle会自动建立名称为default的profile

(1) 账户锁定

说明:指定用户登录时最多可以输入密码的次数,用户锁定的时间

如:sql>create profile lock_account(规则名称,自己随便定义的) limit failed_login_attempts 3 password_lock_time 2;(锁定时间为2天)

sql>alter user xiaoming profile lock_account

(2) 账户解锁

如:sql>alter user xiaoming account unlock;

(3) 终止口令

为了让用户定期修改密码可以使用终止口令的指令来完成

如:每隔10天修改自家的登录密码,宽限期为2天

sql>create profile myprofile limit password_life_time 10 password_grace_time 2;

sql>alter user xiaoming profile myprofile

(4) 口令历史

如果希望用户在修改密码时,不能使用以前使用过的密码,可使用口令历史

sql>create profile password_history limit password_life_time 10 password_grace_time 2 password_reuse_time

(指定口令可重用10天后即可以重用) 10;

sql>alter user xiaoming profile password_life_time

(5) 删除profile

sql>drop profile password_history 【cascade】

oracle表的管理

表名和列命名规则

必须以字母开头

长度不能超过30字符

(1) 字符型

char 定长 最长2000字符

如:char(10) ‘小韩’前4个字符放’小韩’,后添加6个空格补全

查询速度极快,查询时直接所有的位数一起匹配,身份证等定长的适合用char

varchar2 变长 最大4000字符

如:varchar2(10) ‘小韩’ 就只分配4个字符

??节省空间,比较时要一个个比较,先比第一个再比第二个

clob(character large object)

字符型大对象 最大4G

(2) 数字型

number 10的38次方取负到10的38次方

如:number(5,2) 表示一个数总共有5位有效数,2位小数

范围:-999.99—999.99

number(5) 表示一个5位整数 范围-99999到99999

(3) 日期类型

date 包含年月日和时分秒

timestamp 时间戳 精度更高

(4) 图片

blob 二进制数据 可以存放图片、声音

创建表

学生表

sql>create table student(

xh number(4), 学号

xm varchar2(20), 姓名

sex char(2),

birthday date,

sal number(7,2)

);

班级表

sql>create table class(

classid number(2),

cname varchar2(20)

);

修改表

(1) 添加一个字段

sql>alter table student add (classid number(2));

(2) 修改字段长度

sql>alter table student modify (classid number(5));

(3) 修改字段的类型 (空表时才能这样改)

sql>alter table student modify (classid char(5));

(4) 删除一个字段

sql>alter table student drop column sal;

(5) 修改表的名字

sql>rename student to stu;

(6) 删除表

sql>drop table student;

(7) 添加数据

1)所有字段都插入

insert into student values(‘A001’,’张三’,’男’,’06-5月-05’,10);

oracle中默认的日期格式为’DD-MON-YY’

1999年6月9号的默认格式为’09-6月-99’

修改日期格式的命令如下:

alter session set nls_date_format=’yyyy-mm-dd’;

修改后可使用我们熟悉的日期格式:

insert into student values(‘A001’,’张三’,’男’,’1905-05-06’,10);

2)插入部分字段

insert into student (xh,xm,sex) values (‘A002’,’张四’,’男’)

但插入部分字段时很容易出错,因为有些字段可能要求不能为空

3)插入空值

insert into student (xh,xm,sex,birthday

values (‘A004’,’MARTIN’,’男’,null);

查询为空的数据时,要用 is null 来查询

4)修改一个字段

sql>update student set sex=’女’ where xh=’A01’;

5)修改多个字段

sql>update student set sex=’女’ , birthday=’ 1980-04-01’ where xh=’A01’;

(7) 删除数据

delete from student;

删除所有记录,但是表结构还在,写日志,可以恢复的(rollback),速度慢

drop table student;

删除表的结构和数据

truncate table student;

删除表的所有记录,表结构还在,不写日志,无法找回删除的记录,速度快

查询表

(1) 简单的查询语句

查看表结构

sql>desc dept;

查询所有列

sql>select * from dept;

查询指定列

sql>select cname,sal,job from emp;

如何取消重复行

sql>select distinct deptno,job from emp;

注意:oracle对大小写是区分的(主要指引号里的),查询时要注意

使用算数表达式

sql>select sal*12 “年薪”,ename from emp;

使用列的别名

sql>select cname “姓名” from emp;

如何处理null值

注意:只要某列中含有null值,那么对其进行运算得到的结果都是null值

如计算年薪时,可能要加上奖金,但是有些人可能没奖金为null,那么他的年薪也将为null

使用nvl函数

select sal*13+nvl(comm,0)*13 “年薪”,ename from emp;如果为空值 那么用0代替

如何连接字符串(||)

select ename || ‘is a’|| job from emp;

如何查找1982年1月1号后入职的员工

select ename,hiredate from emp where hiredate>’1-1月-1982’;注意日期格式

如何查找工资在2000到3000的员工

select ename from emp where sal>2000 and sal<3000;

如何使用like操作符

%:表示0到多个任意字符

_:表示任意单个字符

显示首字母为S的员工信息:select ename,sal from emp where ename like ‘S%’;

如何在where中使用in

显示显示empno为123,345,800..的雇员情况:select * from emp where empno in(123,345,800);

如何使用逻辑运算符

sql>select ename from emp where (sal>500 or job=’MANAGER’) and ename like ‘J%’;

如何使用order by 字句

sql>select * from emp order by sal;默认是升序(asc) desc 是从高到低

sql>select ename,sal*12 “年薪” from emp order by “年薪”;注意年薪要有引号

如:按照部门号升序而雇员的工资降序排列

sql>select * from emp order by deptno,sal desc;

(2) 复杂的查询语句

1)数据分组函数—max,min,avg,sum,count

如:显示所有员工中最高工资和最低工资(显示姓名)

sql>select max(sal) “最高工资”,min(sal) “最低工资” from emp;

sql>select ename,sal from emp where sal=(select max(sal) from emp)

注意不能使用select ename,sal from emp where sal=max(sal) 这样是错误的

2)group by 和having字句

group by用于对查询的结果分组统计

having子句用于限制分组显示结果

如:显示每个部门的平均工资和最高工资

sql>select max(sal),avg(sal),deptno from emp group by deptno; 注意:分组的字段一定要出现在查询里,如此中的deptno

如:显示每个部门的每种岗位的平均工资和最高工资

sql>select max(sal),avg(sal),deptno,job from emp group by deptno,job;

如:显示平均工资低于2000的部门号和它的平均工资

sql>select avg(sal),deptno from emp group by deptno having avg(sal)<2000;

总结:分组函数只能出现在选择列表、having、order by 子句中 决不能出现在where中

如果在select语句中同时包含group by,having,order by 那么他们的顺序是group by having order by

在选择列中如果有列、表达式和分组函数,那么这些列和表达式必须有一个出现在group by 子句中,否则会出错

(3) 复杂的多表查询语句

多表查询是基于两个和两个以上的表或是视图的查询

如:显示雇员名,雇员工资及所在部门的名字

sql>select emp.cname,emp.sal,dept.dname from emp,dept where emp.deptno=dept.deptno;

假如最后不加where任何条件,那么就会形成笛卡尔集,是表1行数*表2行数

为了避免形成笛卡尔集,多表查询的条件是 至少不能少于 表的个数-1

如:显示部门号为10的部门名,员工名和工资

sql>select a1.dname,a2.cname,a2.sal from dept a1,emp a2 where a1.deptno=a2.deptno and a1.deptno=10;

如:显示各个员工的姓名、工资及其工资的级别

sql>select a1.cname,a1.sal,and a2.grade from emp a1,salgrade a2 where a1.sal between a2.losal and a2.hisal;

如:显示各个员工的姓名、工资及其所在部门的名字,并按部门排序

sql>select a1.cname,a1.sal,a2.dname from emp a1,dept a2 where a1.deptno=a2.deptno order by a1.deptno;

自连接

自连接是指在同一张表的连接查询

如:显示某个员工的上级领导的姓名

sql>select worker.ename,boss.ename from emp worker,emp boss where worker.MGR=boss.empno and worker.ename=’FORD’;

好像也可以sql>select ename from emp where MGR=(select MGR from emp where ename=’FORD’);

(4) 子查询

子查询是嵌套在其它sql语句中的select语句,也叫嵌套查询

1)单行子查询

单行子查询是指只返回一行数据的子查询语句

如:如何显示与SMITH同一部门的所有员工

sql>select * from emp where deptno=(select deptno from emp where cname=’SMITH’);

2)多行子查询

多行子查询指返回多行数据的子查询

如:查询和部门号为10的工作相同的雇员的名字,岗位,工资,部门号

sql>select * from emp where job in (select distinct job from emp where deptno=10);

小细节:数据库在执行sql时是从右到左开始执行的,如where ename=’a’ and job=’b’,它会先找job等于b的数据,所以我们最好能把一下子筛选出数据的条件放在右边,这样能加快查询效率

在多行子查询中使用all、any操作符

如:显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号

sql>select cname,sal,deptno from emp where sal> all (select sal from emp where deptno=30)

也可以sql>select cname,sal,deptno from emp where sal>(select max(sal) from emp where deptno=30)

如:显示工资比部门30的任意一个员工的工资高的员工的姓名、工资和部门号

sql>select cname,sal,deptno from emp where sal> any (select sal from emp where deptno=30)

也可以sql>select cname,sal,deptno from emp where sal>(select min(sal) from emp where deptno=30)

3)多列子查询

单行子查询是指子查询只返回单列、单行数据,多行子查询是指返回单列多行数据,都是针对单列而言的

而多列子查询则是指查询返回多个列数据的子查询语句

如:显示与smith的部门和岗位完全相同的所有雇员

sql>select * from emp where (deptno,job)=(select deptno,job from emp where ename=’SMITH’);

4)在from子句中使用子查询

如:显示高于自己部门平均工资的员工的信息

select deptno,avg(sal) mysal from emp group by deptno 把这个查询结果看成一个子表

sql>select a2.ename,a2.sal,a1.mysal from emp a2,(select deptno,avg(sal) mysal from emp group by deptno) a1 where a2.deptno=a1.deptno and a2.sal>a1.mysal;

说明:在from子句中使用子查询时,该子查询会被作为一个视图来对待,因此叫内嵌视图,并且要给子查询指定别名 而给表取别名时不要加as

5)分页查询

//oracle分页分以下几步

1.rownum分页

select a1.,rownum rn from (select from emp) a1; rownum 是oracle分配的行号

2.挑选6到10行数据

select a1.,rownum rn from (select from emp) a1 where rownum<=10; 注意此时不能and rownum>=6,这样是不行的,oracle规定rownum只能用一次

再做一次子查询 select * from (select a1.,rownum rn from (select from emp) a1 where rownum<=10)a2 where rn>=6;

3.注意几个查询的变化

指定查询列,只需修改最里层的子查询

如何排序,只需修改最里层的子查询

6)用查询结果创建新表

这个命令是一个快捷的建表方法

create table mytable (id,name,sal,job,deptno) as select empno,ename,sal,job,deptno from emp;

7)合并查询

有时在实际应用中,为了合并多个select语句的结果,可以使用集合操作符

union:取得两个结果集的并集,自动去除结果集中的重复项

select ename,sal,job from emp where sal>2500 union

selece ename,sal,job from emp where job=’manager’;

union all:取得两个结果集的并集,包含结果集中的重复项,而且不会排序

intersect:使用该操作符用于取得两个结果集的交集

minus:使用该操作符用于取得两个结果集的差集,它只会显示存在第一个集合中,而不存在第二个集合中的数据

用第一个集合减去第二个集合

这种集合操作其实比and、or等操作符快很多

(5) 创建新的数据库

两种方法:

通过oracle提供的向导工具 DATABASE Configuration Assistant(dbca 数据库配置助手)

我们可以用手工步骤直接创建

Java操作oracle

1 Java连接oracle

举例说明:写一个showemp.java 分页显示emp表的用户信息

//演示如何使用jdbc_odbc桥连接方式 不能远程连接,只能本地连接

import java.sql.*;

try{

//1.加载驱动

Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);

//2.得到链接

Connection ct=DriverManager.getConnection(“jdbc:odbc:testsp(管理工具中的数据源管理器里配置的名字)”,”scott”,”m123”);

//3

Statement sm==ct.createStatement();

ResultSet rs=sm.executeQuery(“select * from emp”);

while(rs.next()){

//用户名

System.out.println(“用户名”+rs.getString(2)); //写2代表第二个字段

}

//关闭打开的资源

rs.close();

sm.close();

ct.close();

}

//演示如何使用jdbc连接方式 可以远程连接 (事先要配置oracle驱动包,要自己下载、配置到Java里的)

import java.sql.*;

try{

//1.加载驱动

Class.forName(“oracle.jdbc.driver.OracleDriver”);

//2.得到链接

Connection ct=DriverManager.getConnection(“jdbc:oracle:thin:@127.0.0.1:1521:myoral(IP地址+端口号+数据库实例)”,”scott”,”m123”);

//3

Statement sm==ct.createStatement();

ResultSet rs=sm.executeQuery(“select * from emp”);

while(rs.next()){

//用户名

System.out.println(“用户名”+rs.getString(2)); //写2代表第二个字段

}

//关闭打开的资源

rs.close();

sm.close();

ct.close();

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: