(1)连接命令:
1》 conn[ect]:用法,conn 用户名/密码@网络服务名 [as sysdba/sysoper],当用特权用户身份连接时,必须带上as sysdba或者as sysoper
SQL> conn sys/lipeng @orcl as sysdba;
2》 disc[onnect]:该命令用来断开与当前数据库的连接
3》passw[ord]:该命令用于修改用户的密码,如果要想修改其他用户的密码,需要用sys/system登录
4》show user:显示当前用户名
5》exit:该命令会断开与数据库的连接,同时会退出
(2)文件操作命令
1》start和@:运行sql脚本;例如:SQL>@ d:\a.sql或者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
(3)显示和设置环境变量:可以用来控制输出的各种格式,set show如果希望永久地保存相关的设置,可以去修改glogin.sql脚本
1》linesize:设置显示行的宽度,默认是80个字符:
SQL>show linesize
SQL>set linesize 90
2》pagesize:设置每页显示的行数目,默认是14,用法和linsize一样
(4)权限的授予与回收
希望xxxxx用户可以去查询emp表
希望xxxxx用户可以去查询scott的emp表:grant select on emp to xxxxxx
希望xxxxx用户可以去修改scott的emp表:grant update on emp to xxxxxx
希望xxxxx用户可以去修改/删除/查询/添加scott的emp表:grant all on emp to xxxxxx
scott希望收回xxxxxx对emp表的查询权限:revoke select on emp from xxxxxxx
//对权限的维护:希望xxxxx用户可以去查询scott的emp表/还希望xxxxx可以把这个权限继续给别人(如果是对象权限,就加入 with grant option): grant select on emp to xxxx with grant option;(表示xxxxx有把这个权限继续给别人的权利)
(如果是系统权限)grant connect to xxxx with admin option
????如果scott把xxxxx对emp表的查询权限回收,那么xxxxx把这个权限继续给yyyy的话,那么yyyy会怎样?
答:那么yyyy的权限也会被回收了
(5)使用profile管理用户口令:
profile是口令限制,资源限制的命令集合,当建立数据库时,oracle会自动建立名称为default的profile;当建立用户没有指定profile选项,那oracle就会将default分配给用户。
1》账户锁定:制定该账户(用户)登录时最多可以输入密码的次数,也可以指定用户锁定的时间(天)一般用dba的身份去执行该命令,例如:
制定tea这个用户最多只能尝试3次登录,锁定时间为2天,实现代码如下:
SQL>create profile lock_account(lock_account代表创建规格的名称,可以自己任意定义) limit failed_login_attempts 3 password_lock_time 2;(创建profile文件即创建一种规则)
SQL>alter user tea profile lock_account;(表示将这种规格(lock_account)赋给tea)
2》给账户(用户)解锁
SQL>alter user tea account unlock;
3》终止口令:为了让用户定期修改密码可以使用终止口令的指令来完成,同样这个命令也需要dba身份来操作
例如:给用户tea创建一个profile文件,要求该用户每隔10天要修改自己的登录密码宽限期为2天,实现代码如下:
SQL>create profile myprofile limit password_life_time 10 password_grace_time_2;
SQL>alter user tea profile myprofile
(6)口令历史:
如果希望用户在修改密码时,不能使用以前使用过的密码,可使用口令历史,这样oracle就会将口令修改的信息存放到数据字典中,这样当用户修改密码时,oracle就会对新旧密码进行比较,当发现新旧密码一样时,就提示用户重新输入密码。例如:
1)建立profile:
SQL>create profile password_history(password_history文件名,可随意更改) limit password_life_time 10 password_grace_time 2 password_resuse_time 10
password_reuse_time//指定口令可重用时间即10天后就可以重用
2)删除profile:当不需要某个profile文件时,可以删除该文件
SQL>drop profile password_history [cascade]
(7)表的修改
1》添加一个字段:
SQL>alter tables student add(classid number(2));
2》修改字段的长度:
SQL>alter table student modify (xm varchar2(30));
3》修改字段的类型/名字(不能有数据):
SQL>alter table student modify(xm char(30));
4》删除一个字段:
SQL>alter table student drop column sal;
5》修改表的名字:
SQL>rename student to stu;
6》删除表:
SQL>drop table student;
(8)查看
1》表结构:
SQL>desc student;
2》所有列:
SQL>select * from 表名;
3》制定列:
SQL>select ename,sal,job,deptno from emp;
4》取消重复行;
SQL>select distinct deptno,job from emp;
(9)添加数据
1》所有字符段都插入
SQL>insert into student values(‘A001‘,‘张三‘,‘男‘,‘01-5月-01‘,10);
友情提示:oracle中默认的日期格式是‘DD-MON-YY‘ 例如:‘09-6月-99‘
修改日期的默认格式:alter session set nls_date_format=‘yyyy-mm-dd‘;
修改后可以用我们熟悉的格式添加日期类型,即:
SQL>insert into student values(‘A002‘,‘MIKE‘,‘男‘,‘1905-02-30‘,10);
2》插入部分字段
SQL>insert into student(xh,xm,sex)values(‘A003‘,‘JOHN‘,‘女‘);
3》插入空值
insert into student(xh,xm,sex,birthday) values(‘A004‘,‘MARTIN‘,‘男‘,null);
友情提醒:当需要查询某个表中的某列上的某个值为空时,代码如下:
SQL>select * from student where birthday is null;
4》修改一个字段
SQL>update student set sex=‘女‘ where xh=‘A001‘;
5》修改多个字段
SQL>update student set sex=‘男‘,birthday=‘1980-04-01‘ where xh=‘A001‘;
6》修改含有null值的数据
7》删除数据
SQL>delete from student; 删除所有记录,表结构还在,写日志,可以恢复的,速度慢
友情提示:要想恢复,必须在删除所有数据之前保存一下节点(保存点),即:savepoint xxx;
删除之后只需要回滚到保存的节点即可:rollback to xxx;
SQL>drop table student; 删除表的结构和数据
SQL>delete from student where xh=‘A001‘; 删除一条记录
SQL>truncate table student; 删除表中的所有记录,表结构还在,不写日志,无法找回删除的记录,速度快
(10)表的简单查询
1》给列取别名:
SQL>select sal*12 "年工资",ename from emp;
2》如何处理null值:使用nvl函数来处理
SQL>select sal*12+nvl(comm,0) "年工资",ename from emp;
其中nvl(comm,0)表示如果comm为空值那么就用0来代替,如果comm不为空值,那么就用comm来代替
3》如何连接字符串
SQL>select ename || ‘is a‘|| job from emp;
4》使用where子句
SQL>select * from emp where sal>2000 and sal<2500;
5》如何使用like操作符
%:表示任意的0到多个字符,例如:SQL>select ename from emp where ename like ‘S%‘;(用来查询首字符为S的员工姓名)
_:表示任意的单个字符,例如:SQL>select ename from emp where ename like ‘__O%‘;(用来查询第三个字符为大写的O的员工姓名)
6》在where条件中使用in:
SQL> select * from emp where empno in(7369,7521,7934); 表示在表中查询empno是7369,7521,7934的员工信息
7》使用is null 的操作符:
SQL> select * from emp where mgr is null; 表示没有上级的员工情况
8》使用逻辑操作运算符号:
SQL> select * from emp where (sal>500 or job=‘MANAGER‘) and ename like ‘J%‘;
表示查询工资高于500或者职位是MANAGER并且员工手写字符是J
9》使用order by字句:
SQL> select * from emp order by sal; 表示将按照员工的工资从低到高进行排序
SQL> select * from emp order by sal desc; 表示将按照员工的工资从高到低进行排序
SQL> select * from emp order by deptno ,sal desc; 表示将按照部门从低到高排序并且在部门内部将员工工资按照从高到低排序
10》使用列的别名排序:
SQL>select ename,sal*12 "年薪" from emp order by "年薪";
(11)表的复杂查询
1》数据分组----max,min,avg,sum,count函数
SQL> select max(sal),min(sal) from emp; 表示查询最高工资与最低工资是多少
SQL> select * from emp where sal=(select max(sal) from emp); 表示查询最高工资的员工的信息(此处运用到了子查询)
2》group by和having字句
group by用于对查询的结果分组统计,having子句用于限制分组显示结果
温馨提示:having是将group by分好的组再进行一次筛选
SQL> select avg(sal),max(sal) from emp group by deptno; 表示查询每个部门的平均工资和最高工资
SQL> select avg(sal),min(sal),deptno,job from emp group by deptno,job;
表示查询每个部门的每个职位的平均工资与最低工资
SQL> select avg(sal),deptno from emp group by deptno having avg(sal)>2000;
表示将查询出来的每个部门的平均工资筛选出平均工资高于2000的部门
对数据分组的总结:
1。分组函数只能出现在选择列表、having、order by子句中;
2.如果在select语句中同时包含有group by、having、order by,那么它们的顺序是group by,having,order by
3.在选择列表中如果有列、表达式、分组函数,那么这些列和表达式必须有一个出现在group by子句中,否则会出错
(12)多表查询
1》多表
SQL> select table1.ename,table1.sal,table2.dname from emp table1,dept table2 where table1.deptno=table2.deptno; 表示查询员工的姓名、薪水、所在公司名称(其中姓名、薪水在emp表中,所在公司名称在dept表中)
2》自连接:是指在同一张表的连接查询
SQL> select work.ename,boss.ename from emp work,emp boss where work.mgr=boss.empno;
表示员工的名字与其直接上司的名字
(13)子查询
1》子查询:子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询
2》单行子查询:是指只返回一行数据的子查询语句
SQL> select * from emp where deptno=(select deptno from emp where ename = ‘SMITH‘);
表示查询出与SMITH在同一个部门的所有员工的信息
3》多行子查询:是指返回多行数据的子查询
SQL> select * from emp where job in (select distinct job from emp where deptno=10);
表示查询出与部门号为10的职位相同的员工信息
在多行子查询中使用all操作符:
SQL> select ename,sal,deptno from emp where sal>(select max(sal) from emp where deptno=30);
SQL> select ename,sal,deptno from emp where sal>all (select sal from emp where deptno=30);
表示查询工资比部门30的所有员工的工资高的员工的姓名、工资和部门号
在多行子查询中使用any操作符:
SQL> select ename,sal,deptno from emp where sal>(select min(sal) from emp where deptno=30);
SQL> select ename,sal,deptno from emp where sal>any (select sal from emp where deptno=30);
表示查询工资比部门30的任意一个员工的工资高的员工的姓名、工资和部门号
4》多列子查询:
单行子查询是指子查询只返回单列、单行数据;
多行子查询是指返回单列多行数据,都是针对单列而言的;
而多列子查询则是指返回多个列数据的子查询语句
SQL> select * from emp where (deptno,job)=(select deptno,job from emp where ename = ‘SMITH‘);
表示查询与SMITH的部门和岗位完全相同的所有员工信息
5》在from子句中使用子查询
查询出高于自己部门平均工资的员工的信息:
步骤1:查询出各个部门的平均工资和部门号:
SQL>select deptno,avg(sal) mysal from emp group by deptno;
步骤2:把步骤1的查询结果看作是一张子表;
步骤3:列出结果:
SQL>select * from emp table1,(select deptno,avg(sal) mysal from emp group by deptno) table2 where table1.deptno=table2.deptno and table1.sal>table2.mysal;
温馨提示:当在from子句中使用查询时,该子查询会被作为一个视图来对待,因此也叫做内嵌视图,当在from子句中使用子查询时必须给子查询指定别名
(14)分页查询(oracle分页查询一共有三种方式)
1》rownum分页
第一步:先查询出一张子表,例如:
SQL>select * from emp;
第二步:在子表中加入行ID:
SQL>select table1.*,rownum rn from (select * from emp) table1;
温馨提示:rn表示行ID
第三步:截取第六行到第十行的数据
select * from (select table1.*,rownum rown from (select * from emp) table1 where rownum<=10) table2 where rown>5;
温馨提示:几个查询的变化:
1.所有的更改(只显示部分信息、排序等等)只需要更改from最里面的字表即可,例如:
SQL> select * from (select table1.*,rownum rown from (select ename,job,sal from emp) table1 where rownum<=10) table2 where rown>5;
2》rowid分页
SQL>select * from t_xiaoxi where rowid in (select rid from
(select rownum rn,rid from (select rowid rid,cid from t_xiaoxi order by cid desc)
where rownum<10000) where rn>9980) order by cid desc;
(15)用查询结果创建新表
SQL>create table mytable (id,name,sal,job,deptno) as select empno,ename,sal,job,deptno from emp;
(16)合并查询
1》union:该操作符用于取得两个结果集的并集,当使用该操作符时,会自动去掉结果集中重复行,例如:
SQL> select ename,sal,job from emp where sal>2500 union select ename,sal,job from emp where job=‘MANAGER‘;
2》union all:合并所有并不取消重复行
3》intersect:取得交集
4》minus:取得两个结果的差集,只会取得存在第一个集合中而不存在第二个集合中的数据
(17)用Java操作数据库
1》如何使用jdbc_odbc桥连接方式
public class Test{
public static void main(String[] arge){
try{
//1.加载驱动
Class.froName("sun.jdbc.odbc.JdbcOdbcDriver");
//2.得到连接
Connection ct=DriverManager.getConnection("jdbc:odbc:testsp//配置数据源","scott","lipeng");
Statement sm=ct.createsStatement();
//查询总页数
int pagecount=0; //分页数
int rowcount=0; //共有几条记录
int pagesize=0; //每页显示几行记录
ResultSet rs=sm.executeQuery("select * from emp");
while(rs.next()){
System.out.println("用户名:"+rs.getString(2)); //2表示ename在表中第二列(默认从1开始的)
}
//关闭各种打开资源
rs.close();
ct.close();
sm.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
2》使用jdbc连接oracle
public class Test{
public static void main(String[] arge){
try{
//1.加载驱动
Class.froName("oracle.jdbc.driver.OracleDriver");
//2.得到连接
Connection ct=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1(127.0.0.1为要连接的oracle的IP地址):1521(1521位oracle数据库的端口号):ORACLE(ORACLE为要连接的数据库的数据库实例)//数据库的URL","scott","lipeng");
Statement sm=ct.createsStatement();
ResultSet rs=sm.executeQuery("select * from emp");
while(rs.next()){
System.out.println("用户名:"+rs.getString(2)); //2表示ename在表中第二列(默认从1开始的)
}
//关闭各种打开资源
rs.close();
ct.close();
sm.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
(18)在oracle中操作数据
1》使用特定格式插入日期值
使用 to_date函数
:
to_date(‘1992/09/01‘,‘yyyy/mm/dd‘)
2》使用子查询插入数据
当使用values子句时,一次只能插入一行数据,当使用子查询插入数据时,一条insert语句可以插入大量的数据.当处理行迁移或者装载外部表的数据到数据库时,可以使用子查询来插入数据.
例如:
SQL>insert into xxx (id,name,sal,job,deptno) as select empno,ename,sal,job,deptno from emp;
3》使用子查询更新数据
使用update语句更新数据时,既可以使用表达式或者数值直接修改数据,也可以使用子查询修改数据。
SQL> update emp set (job,sal)=(select job,sal from emp where ename=‘SMITH‘) where ename=‘SCOTT‘;
希望员工scott的岗位、工资、补助与smith员工一样
(19)sql函数
1》字符函数
lower(char):将字符串转化为小写的格式
SQL> select lower(job) from emp; 表示将工作转换成小写
upper(char):将字符串转化为大写的格式
length(char):返回字符串的长度
SQL> select * from emp where length(ename)=5; 表示查询出名字只有五个字幅的员工信息
substr(char,m,n):取字符串的子串 //n表示截取n个字符
SQL> select substr(ename,1,3) from emp; 表示截取姓名的前三个字符
SQL> select concat(substr(ename,1,1),lower(substr(ename,2,length(ename)))) from emp;
表示以首字母大写的方式显示所有员工的姓名
SQL> select concat(lower(substr(ename,1,1)),substr(ename,2,length(ename))) from emp;
表示以首字母小写的方式显示所有员工的姓名
replace(char1,search_string,replace_string) 在char1字符串中用replace_string字符串替换
SQL> select replace(ename,‘A‘,‘a‘) from emp;
表示显示所有员工的姓名,用”a”替换所有"A“
instr(char1,char2,[,n[,m]])取子串在字符串的位置
2》数学函数
round(n,[m])
该函数用于执行四舍五入,如果省掉m,则四舍五入到整数;如果m是正数,则四舍五入到小数点的m位后.如果m是负数,则四舍五入到小数点的m位前
trunc(n,[m])
该函数用于截取数字.如果省掉m,就截去小数部分,如果m是正数就截取到小数点的m位后,如果m是负数,则截取到小数点的前m位
mod(m,n)
m对n求模(即求余)
floor(n)
返回小于或是等于n的最大整数(即向下取整)
ceil(n)
返回大于或是等于n的最小整数(即向上取整)abs(n) 返回数字n的绝对值
select abs(-13) from dual;
acos(n) :返回数字的反余旋值asin(n): 返回数字的反正旋值
atan(n): 返回数字的反正切cos(n)
exp(n): 返回e的n次幂
log(m,n)返回对数值
power(m,n):返回m的n次幂
特别提示:在做oracle测试时用dual表
3》日期函数
(1)sysdate: 该函数返回系统时间
SQL> select sysdate from dual;(2)add_months(d,n) 该函数指从d这个时间开始加n个月
SQL> select * from emp where sysdate>add_months(hiredate,8);
查找已经入职8个月多的员工
SQL> select ename,hiredate from emp where sysdate>add_months(hiredate,120);
显示满10年服务年限的员工的姓名和受雇日期.SQL> select trunc(sysdate-hiredate) "入职天数" ,ename from emp;
对于每个员工,显示其加入公司的天数.
(3)last_day(d):返回指定日期所在月份的最后一天SQL> select * from emp where (last_day(hiredate)-hiredate)=2;
找出各月倒数第3天受雇的所有员工.
4》转换函数
转换函数用于将数据类型从一种转为另外一种.在某些情况下,oracle server允许值的数据类型和实际的不一样,这时oracle server会隐含的转化数据类型,比如:create table t1(id number);
insert into t1 values(’10’) -->这样oracle会自动的将‘10‘-->10
create table t2 (id varchar2(10));
insert into t2 values(1); -->这样oracle 就会自动的将1--->‘1‘;
我们要说的是尽管oracle可以进行隐含的数据类型的转换,但是它
并不适应所有的情况,为了提高程序的可靠性,我们应该使用转换函
数进行转换to_char
:
yy: 两位数字的年份 2004-->04
yyyy: 四位数字的年份 2004年mm :两位数字的月份 8月-->08dd: 2位数字的天 30号-->30
hh24: 8点--》20hh12: 8点--》08
mi、ss -->显示分钟\秒
9:显示数字,并忽略前面0
0:显示数字,如位数不足,则用0补齐
.:在指定位置显示小数点
,: 在指定位置显示逗号
$: 在数字前加美元
L: 在数字前加本地货币符号
C: 在数字前加国际货币符号
G:在指定位置显示组分隔符、
D:在指定位置显示小数点符号(.)
select ename,to_char(sal,‘L99G999D99‘) from emp ;
SQL> select * from emp where to_char(hiredate,‘yyyy‘)=1980;
显示1980年入职的所有员工
to_date
函数to_date用于将字符串转换成date类型的数据.
5》系统函数
sys_context:
1) terminal :当前会话客户所对应的终端的标识符2) lanuage: 语言
3) db_name: 当前数据库名称
4) nls_date_format:当前会话客户所对应的日期格式
5) session_user: 当前会话客户所对应的数据库用户名
6) current_schema: 当前会话客户所对应的默认方案名?
7) host: 返回数据库所在主机的名称以上7个全部都是sys_context的参数
通过该函数,可以查询一些重要信息,比如你怎在使用哪个数据库?select sys_context(‘userenv‘,‘db_name‘) from dual;
温馨提示:userenv是不可改变的
(20)数据字典(就是sys用户的静态表和动态视图)
1)user_tables:用于显示当前用户所拥有的所有表,它只返回用户所对应方案的所有表
SQL> select table_name from user_tables;
2)all_tables:用于显示当前用户可以访问的所有表,他不仅会返回当前用户反感的所有表,还会返回当前用户可以访问的其它方案的表
SQL> select table_name from all_tables;
3)dba_tables:它会显示所有方案拥有的数据库表,但是查询这种数据库字典视图,要求用户必须是dba角色或者是有select any table系统权限,例如:当用system用户查询数据字典视图dba_tables时,会返回system,sys,scott……方案所对应的数据库表
SQL> select table_name from dba_tables;
4)用户名、权限、角色
在建立用户时,oracle会把用户的信息存放到数据字典中,当给用户授予权限或者是角色时,oracle会将权限和角色的信息存放到数据字典。
通过查询dba_users可以显示所有数据库用户的详细信息;
通过查询数据字典视图dba_sys_privs,可以显示用户所具有的系统权限;
通过查询数据字典视图dba_tab_privs可以显示用户具有的对象权限;
通过查询数据字典dba_col_privs可以显示用户具有的列权限;
通过查询数据库字典视图dba_role_privs可以显示用户所具有的角色
oracle究竟有多少种角色?
SQL>select * from dba_roles;
查询oracle中所有的系统权限,一般是dba
SQL>select * from system_privilege_map order by name;
查询oracle中所有对象权限,一般是dba
SQL>select distinct privilege from dba_tab_privs;
查询数据库的表空间
SQL>select tablespace_name from dba_tablespaces;
查询用户具有怎样的角色
SQL>select * from dba_role_privs where grantee=‘用户名‘
查看某个角色包括哪些系统权限
SQL>select * from dba_sys_privs where grantee=‘DBA‘(DBA表示一个角色)
或者是
SQL>select * from role_sys_privs where role=‘DBA‘;
查看某个角色包括的对象权限:
SQL>select * from dba_tab_privs where grantee=‘角色名‘
显示当前用户可以访问的所有数据字典视图:
SQL>select * from dict where comments like ‘%grant%‘;
显示当前数据库的全称:
SQL>select * from global_name;
(21)建表
1》主键:create talbe customer(customerId char(8) primary key,--主键
2》外键:create table purchase(customerId char(8) references customer(customerId),--外键
3》其他约束条件直接写在定义变量的后面
4》设置默认选项和几选一选项:sex char(2) default ‘男‘ check (sex in (‘男‘,‘女‘))