Oracle学习系列1

两个服务必须启动:

OracleOraDb10g*TNListener 和 OracleService***

使用sqlplusw先进行环境的设置

set linesize 300    ;

set pagesize 30     ;

编辑sql命令:

ed a.sql

执行 @a

切换用户:

conn User/passwd   [as sysdba|sysoper ]

conn system/manager

conn sys/change_on_install  as sysdba

显示用户:

show user;

获取所有表的名字:

select * from tab;

查看表的结构:

desc emp;  //emp 表

清空屏幕

clear scr

****************************************************************

SQL语句:

简单查询   限定查询   单行查询

所需表:scott用户下的表 --  雇员表,部门表,奖金表,薪水表

查询语句的基本格式

使用DISTINCT 关键字去掉重复的查询列

使用限定查询

对查询结果进行排序

掌握Oracle中提供的各主要单行函数

***********************************************************************************************

SQL包含DML(数据操作语言)、DDL(数据定义语言)、DCL(数据控制语言)

简单查询 :

select  {distinct } *|具体的列  别名  from 表

select * from emp;

select empno,ename, job  from emp;

指定查询返回列的名称 ,为列起个别名

select  empno 编号 ,ename 姓名 ,job 工作 from emp;

要求查询所有工作:

select job from emp;   //出现重复值

sel distinct job from emp;  //消除重复列。但是在消除重复列时,如果要同时查询多列,则必须保证所有列都重复才能消除

查询雇员的编号和工作:

select ename, job   from emp;

查询雇员的编号,姓名,工作,显示格式为:编号是7369的雇员,姓名是:SMITH,工作是:CLERK   :

select   '编号是:' || empno ||' 的雇员,姓名是:||'ename ',工作是:' || gob  from emp;

要求求出每个雇员的姓名及年薪:

select ename , sal*12 from emp;

select ename , sal*12  income  from emp;  // 别名回避中文

***********************************************************************************************

限定查询(where子句):

格式: select  {distinct } *|具体的列  别名

from 表

{ where 条件s }

查询出工资大于1500的所有雇员信息:

select *

from emp

where  sal>1500;

查询每月可以得到奖金的雇员信息:

select *

from emp

where comm IS NOT NULL; //comm字段不为null

查询无奖金的雇员:

select *

from emp;

where comm IS NULL;

查询出基本工资大于1500,同时可以领取奖金的所有雇员信息:

select *

from emp

where sal>1500 and comm IS NOT NULL;

查询出基本工资大于1500,或者可以领取奖金的所有雇员信息:

select *

from emp

where sal>1500 or comm IS NOT NULL;

查询出基本工资不大于1500,同时不可以领取奖金的所有雇员信息:

select *

from emp

where  not ( sal>1500 or comm IS NOT NULL ) ; //通过()表示一组条件

查询基本工资大于1500,但是小于3000的全部雇员信息:

select *

from emp

where  sal>1500  and sal <3000 ;

****SQL专门制定范围的查询的过滤语句:between  min and  max (包含等于的功能)*****

select *

from emp

where sal between 1500 and 3000 ; //between and  等价于sal>=1500 and sal<=3000

查询出1981年雇佣的全部雇员信息:

select *

from emp

where  hiredate between ‘ 1-1月 -81 ‘and  ’31-12月 -81 ‘ ;//日期表示加上’‘

**结论:between ...and...查询除了支持数字之外,还支持日期的查询(日期实际上以数组的形式表示出来)**

查询出姓名是smith的雇员的信息:

select *

from emp

where ename ='SMITH' ;  //Oracle中对大小写敏感,smith不能查询出

查询出雇员编号7369,7499,7521的具体信息:

**查询的范围,可以用IN()操作符完成,还有NOT IN()**

select *

from emp

where  emp IN( 7369,7499,7521 );

查询出编号不是7369,7499,7521的具体信息:

select *

from emp

where  emp NOT IN( 7369,7499,7521 );

要求查询出姓名是SMITH,ALLEN,KING的雇员信息:

select *

from emp

where ename IN( 'SMITH','ALLEN','KING' );

结论:IN操作符可以用在数字和字符串上,指定的额外的值不影响程序的运行

模糊查找功能,SQL中使用LIKE语句,但要注意通配符:% -->匹配任意长度的内容

_ -->匹配一个长度的内容

查询出所有雇员姓名中第二个字母中包含“M”的雇员信息:

select *

from emp

where ename like '_M%';

查询出雇员姓名中包含字母“M”的雇员信息:

select *

from emp

where ename like '%M%' ;

查询出在1981年雇佣的雇员信息:

select *

from emp

where hiredate like '%81%';

查询雇员编号不是7369的雇员信息:

select * from emp where empno <>7369 ;

select * from emp where enpno !=7369 ;

***********************************************************************************************

对查询的结果进行排序(order by子句)(重点) -->排序操作永远放在SQL语句最后执行

格式: select  {distinct } *|具体的列  别名

from 表

{ where 条件s }

{ order by 排序字段1,排序字段2  ASC|DESC } //默认低->高(升序)

要求按照工资由低到高排序:

select *

from emp

order by sal ;

要求查询出10部门的所有雇员信息,信息按照工资降序排序,若工资相等,按照雇佣日期升序排序

select *

from emp

where deptno =10

order by sal desc, hiredate (asc) ;//asc可不写

***********************************************************************************************

单行函数(重点)

格式:function_name( column | expression , [ arg1,arg2,...] )

分类:

字符函数:接收字符输入并且返回字符或数值

数值函数:接收数值输入并返回数值

日期函数:对日期数据进行操作

转换函数:从一种数据类型转换成另一宗数据类型

通用函数:NVL函数,DECODE函数

字符函数:

专门处理字符的,例如将大小写转换

将小写字符转换成大写字符

select upper('smith') from dual ;// dual是张数据表

查询smith雇员的所有信息:

select *

from emp

where ename = upper('smith') ;

lower()函数:

select lower('SMITH') from dual ; //将字符串全部变为小写

initcap()函数:

select initcap('hello, world')

from dual ;  //将单词的第一个字母大写

将雇员表中的雇员姓名变为开头字母大写

select initcap(ename)

from emp;

<字符串可以使用’||‘ 连接之外,还可以使用concat()函数进行连接操作>

select concat('hello' , 'world') from dual ; //不如’||‘好用

字符串截取:substr()

select substr('hello',1,3) from dual ; //index从(0/1)开始  结果:hel

字符串长度:length()

select length('hello') from dual ; //  结果:5

内容替换:replace()

select replace('hello','l','x') from dual ; // 结果:hexxe

要求显示所有雇员的姓名及姓名的后三个字符:

tips:先求整个长度-2,再截取

select ename ,substr(ename, length(ename)-2)

from emp;

or:

select ename ename, substr(ename ,-3,3)

from emp;

***********************************************************************************************

数值函数:

四舍五入: round()

截断小数点: trunc()

取余: mod

执行四舍五入操作:

select round(789.536) from dual ; // result:790

保留两位小数:

select round(789.536,2) from dual ; // result:790.54

对整数进行四舍五入的进位:

select round(789.536,-2) from dual ; // result:800

验证trunc()函数:

select trunc(789.536) from dual ;//result : 789

select trunc(789.536,-2) from dual ;//result : 700

使用mod()进行取余操作:

select mod(10,3) from dual ;//result : 1

***********************************************************************************************

日期函数:

当前日期: select sysdate  from dual ;

规则: 日期-数字=日期

日期+数字=日期

日期-日期=数字(天数)

函数: months_between() :求给定日期范围的月数

add_months(): 在指定日期上加指定的月数,求出之后的日期

next_day( date, char): 指定时间的下一个星期几(由char指定)所在的日期

last_day(): 返回指定日期对应月份的最后一天

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

显示10部门雇员进入公司的星期数:

tip: sysdate -hiredate = days /7 = weeks

select  empno, ename,round( (sysdate - hiredate)/7 ) weeks

from emp ;

验证months_between():

select empno, round( ename, months_between(sysdate, hiredate) ) months

from emp;

验证add_months():

select add_months(sysdate, 4) from dual ;

验证next_day():

select next_day(sysdate, '星期一') from dual ;//当前系统日期的下一个周一

验证last_day():

select last_day( sysdate ) from dual ;

***********************************************************************************************

转换函数 (重点)

函数:

to_char(): 转换成字符串

to_number(): 转换成数字

to_date():  转换成日期

===to_char()====

查询所有雇员的雇员编号,姓名,雇佣日期:

select enpno, ename, hiredate from emp ;

将年,月,日进行分开,可以用to_char()函数进行拆分,

必须指定通配符 yyyy-mm-dd

select enpno, ename, to_char( hiredate ,'yyyy') year,

to_char(hiredate, 'mm') months,

to_char(hiredate, 'dd') days

from emp;

to_char()函数具有日期显示转换的功能:

select empno, ename, to_char(hiredate ,'yyyy-mm-dd')   //1994-05-04

from emp ;

select empno, ename, to_char(hiredate ,'fmyyyy-mm-dd')  //1994-5-4

from emp ;

to_char()具有分隔数字功能:  (表示$:美元    L:本地货币)

select empno, ename,to_char(sal, '$99.999')

from emp;    // sal   $1,600

====to_number()=====

将字符串转变为数字

select to_number('123')+to_number('123') from dual ; //246

====to_number()=====

将字符串变为date类型

select to_date('2009-02-16','yyyy-mm-dd')  from dual ;

***********************************************************************************************

通用函数:

NVL() :  将指定的null值变为指定的内容

DECODE() :DECODE(value,if1,then1,if2,then2,if3,then3,...,else),表示如果value 等于if1时,   DECODE函数的结果返回then1,...,如果不等于任何一个if值,则返回else。

decode(value ,值1,返回值1,值2,返回值2,值3,返回值3,值4,返回值4,缺省值 )

求出年薪的时候应该加上奖金,格式:(sal+comm)*12:

select empno, ename,  (sal+comm)*12 from emp ; //错误,有些雇员的comm为null

select empno, ename, (sal+NVL(comm, 0)*12 ) income

from emp ;

<对需要进行计算时,必须对null使用NVL()函数进行转换操作>

验证decode()函数:

select decode(1, 1,'内容为1',2,'内容为2',3,'内容为3',4,'内容为4')

from dual ;   // result :内容为为1

雇员的工作:业务员clerk, 销售人员salesman   经理 manager  分析员analyst  总裁president

要求查询出雇员的编号,姓名,雇佣日期及工作,将工作替换成以上的信息:

select empno 雇员编号, ename 雇员姓名, hiredate 雇佣日期,

decode(job, 'clerk','业务员','salesman','销售人员','manager','经理','analyst','分析师','president','总裁') 职位

from emp ;

***********************************************************************************************

SUMMARY

1,oracle主要用户:

超级管理员:sys/change_on_install

普通管理员:system/manage

普通用户:scott/tiger

2,sqlplusw的一些常用命令:

设置行显示数量:set linesize 300

设置页显示数量:set pagesize 30

ed a.sql以及@a

连接:conn  user/passwd  as sysdba

3,SQL基础语法的格式

4,单行函数,decode()函数最重要

Oracle学习系列2

SQL语法练习:

1,选择部门30中的所有员工

select * from emp

where deptno=30;

2,列出办事员的姓名,编号和部门编号

select ename, empno, deptno

from emp

where job=upper('clerk');

3,找出佣金高于薪金的员工

select  *

from emp

where comm>sal ;

4,找出佣金高于薪金的60%的员工

select *

from emp

where comm > sal * 0.6;

5,找出部门10中所有经理和部门20中所有办事员的详细资料

select *

from emp

where (deptno=10 and job='manager') or ( deptno=20 and job='clerk' );

6,找出部门10中所有经理,部门20中所有办事员,既不是经理也不是办事员但其薪金大于或等于2000的所有员工 的详细资料

select *

from emp

where (deptno=20 and job='manager')or(deptno=20 and job='clerk')

or (job NOT IN('manager', 'clerk') and sal >=2000) ;

7,找出收取佣金的员工的不同工作

select distinct job

from emp

where comm IS NOT NULL;

8,找出不收取佣金或者收取的佣金低于100的员工

select *

from emp

where (comm is null ) or (comm<100);

9,找出各月倒数第三天受雇的所有员工

select *

from emp

where last_day(hiredate)-2 =hiredate ;

10,找出早于12年前受雇的员工

select *

from emp

where (months_between(sysdate, hiredate) /12 ) > 12 ;

11,以首字母大学的方式显示所有员工的姓名

select initcap(ename)

from emp;

12,显示正好为5个字符的员工的姓名

select ename

from emp

where length(ename)=5 ;

13,显示不带’R‘的员工的姓名

select ename

from emp

where ename not like '%R%' ;

14,显示所有员工姓名的前三个字符

select substr(ename,0,3)

from emp ;

15,显示所有员工姓名,用’a‘替换所有的’A‘

select replace(ename, 'A','a')

from emp ;

16,显示满10年服务年限的员工的姓名和受雇日期

select ename ,hiredate

from emp

where (months_between(sysdate, hiredate) /12 ) > 10 ;

17,显示员工的详细信息,按姓名排序

select *

from emp

order by ename;

18,显示员工的姓名和受雇日期,根据其服务年限,将最老的员工排在最前面

select ename, hiredate

from emp

order by hiredate;

19,显示所有员工的姓名,工作和薪金,按工作的降序排序,若工作相同则按薪金排序

select ename , job, sal

from emp

where job desc, sal ;

20,显示所有员工的姓名,加入公司的年份和月份,按受雇日期所在月排序,若月份相同则将最早年份的员工排在最前面

select ename,to_char(hiredate,'yyyy') year, to_char(hiredate,'yy') months

from emp

order by months ,year ;

21,显示在一个月为30天的情况的所有员工的日薪金,忽略余数

select ename ,round(sal/30)

from emp

22,找出在任何年份的2月受聘的所有员工

select *

from emp

where  to_char(hiredate,'mm') = 2 ;

23,对于每个员工,显示其加入公司的天数

select ename, round(sysdate-hiredate) days

from emp ;

24,显示姓名字段的任何位置包含’A‘的所有员工的姓名

select *

from emp

where ename like '%A%' ;

25,以年月日的方式显示所有员工的服务年限。

select ename ,trunc( months_between( sysdate , hiredate )/12 ) years,

trunc( mod( months_between( sysdate,hiredate ),12 ) ) months,

trunc( mod( (sysdate-hiredate),30 ) )days

from emp ;

Oracle学习系列3

************************************************************************************

多表查询:

1,SQL1999语法对多表查询的支持

2,分组统计及统计函数的使用

3,子查询,并结合多表查询,分组统计做复杂查询

4,数据库的更新操作

5,事务处理和数据库死锁

************************************************************************************

多表查询:

语法:

select { distinct } * | col1 别名1   col2 别名2 ...

from  tab1 别名1 , tab2 别名2 , tab3 别名3 ,...

{where 条件s }

{ order by col1 ASC | DESC , col2  ASC | DESC, ...} ;

同时查询emp表和dept表:

select *

from emp, dept ;   //产生笛卡尔积

加入where语句:

select *

from emp  e,dept  d

where e.deptno = d.deptno;

要求查询出雇员的编号,姓名,部门编号,部门名称,部门位置:

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

from emp e, dept d

where e.deptno=d.deptno;

要求查询出每个雇员的姓名,工作,雇员的直接上级领导的姓名:

select e.ename, e.job, m.ename, d.dname

from emp e, emp m ,dept d

where e.mgr = m.empno and e.deptno=d.deptno ;

要求查询出每个雇员的姓名,工资,部门名称,工资在公司的等级,及其领导的姓名及工资所在公司的等级:

select e.ename, e.sal, d.dname, s.grade, m.ename, m.sal, ms.grade

from emp e, dept d, salgrade s, emp m, salgrade ms

where e.deptno=d.deptno and (e.sal between s.losal and s.hisal)

and e.mgr=m.empno     and ( m.sal between ms.losal and ms.hisal);

进一步:按照下面样式显示工资等级:

1:第五等工资

2:第四等工资

3:第三等工资

4:第二等工资

5:第一等工资

此时肯定使用decode()函数:

select e.ename, e.sal, d.dname, DECODE(s.grade, 1,'第五等工资',2,'第四等工资',3,'第三等工资',4,'第二等工资',1,'第一等工资'),

m.ename,m.sal,DECODE(ms.grade, 1,'第五等工资',2,'第四等工资',3,'第三等工资',4,'第二等工资',1,'第一等工资'),

from emp e, dept d, salgrade s, emp m, salgrade ms

where e.deptno=d.deptno and (e.sal between s.losal and s.hisal)

and e.mgr=m.empno

and ( m.sal between ms.losal and ms.hisal);

************************************************************************************

左、右连接<重点>

(+)=    -->右连接,

=(+)   -->左连接,  默认

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

from emp e, dept d

where e.deptno(+)=d.deptno; //表示以dept表为准  。右连接

************************************************************************************

SQL:1999语法对SQL的支持<了解>

交叉连接(cross join):  <产生笛卡尔积>

select * from emp corss join dept ;

自然连接(natural join):<自动进行关联字段的匹配>

select * from emp natural join dept ;

USING子句:<直接指定关联的操作列>

select *

from emp e join dept d USING(deptno)

where deptno=30;

ON子句:<用户自定义连接条件>

select *

from emp e join dept d  ON(e.deptno=d.deptno)

where e.deptno=30 ;

左连接(left join),右连接(right join):

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

from emp e right outer join dept d

on(e.deptno=d.deptno) ;

************************************************************************************

组函数和分组统计:<重点>

count(): //求出全部记录数

max(): // 求出一组中最大值

min(): //最小值

avg(): //平均值

sum():      //求和

count()函数:

select count(emp) from emp ;  //查询多少行记录

max(),min()函数:求出所有员工的最低工资

select max(sal) ,min(sal) , sum(sal) from emp ;

分组统计<group by>:

语法:

select { distinct } * | col1 别名1   col2 别名2 ...

from  tab1 别名1 , tab2 别名2 , tab3 别名3 ,...

{where 条件s }

{group by 分组条件}

{ order by col1 ASC | DESC , col2  ASC | DESC, ...} ;

求出每个部门的雇员数量,可定按照部门编号划分:

select deptno, count(empno)

from emp

group by deptno ;

求出每个部门的平均工资:

select deptno, avg(sal)

from emp

group by deptno ;

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

select deptno, count(empno) from emp ;// error:不是单组分组函数

/**

若程序使用了分组函数,条件如下;

1.程序中存在group by ,并且指定了分组条件,这样可以将分组条件一起查询出来

2.若不用分组的话,则只能单独使用分组函数

3.在使用分组函数时,不能出现分组函数和分组条件(group by )之外的字段

|

*/     |

|

^

select deptno ,empno, count(empno)   //error:empno不是group by 的表达式

from emp

group by deptno ;

按部门分组,并显示部门的名称,及每个部门的员工数:

select d.dname, count(e.empno)

from dept d, emp e

where d.deptno = e.deptno

group by d.dname ;

要求显示出平均工资大于2000的部门编号和平均工资:

error: select deptno , avg(sal)

from emp

where avg(sal) >2000    //此处不允许使用分组函数

group by deptno ;

/**

分组函数只能在分组中使用,不允许出现在where语句中,若现在假设要指定分组条件,则只能通过第二种指令:having,此时SQL语法格式:

select { distinct } * | col1 别名1   col2 别名2 ...

from  tab1 别名1 , tab2 别名2 , tab3 别名3 ,...

{where 条件s }

{group by 分组条件   { having  分组条件 }  }

{ order by col1 ASC | DESC , col2  ASC | DESC, ...} ;

*/

correct: select deptno, avg(sal)

from emp

group by deptno  having avg(sal)>2000 ;

显示非销售人员工作名称以及从事统一工作雇员的月工资的总和,并且满足从事同一工作的雇员的月工资合计大于$5000,输出结果按月工资的合计升序排列:

/**

分组简单的原则:

1,只要一列上存在重复的内容才有可能考虑到分组

2,分组函数可以嵌套使用,但是嵌套使用时不能再出现group by 后的字段:

ex:求出平均工资最高的部门:

error: select  deptno, max(avg(sal))  //不是单组分组函数

from emp

group by deptno;

correct: select max(avg(sal))

from emp

group by deptno ;

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

分析:1,显示全部非销售人员:job<> 'salesman'

select * from emp  where job <>'salesman' ;

2,按工作分组,同时求出工资的总和:

select job,sum(sal)

from emp

where job<> 'salesman'

group by job ;

3,对分组条件进行限制,工资总和大于500:

select job,sum(sal)

from emp

where job<> 'salesman'

group by job having sum(sal)>5000 ;

4,按升序排序:

select job,sum(sal) su

from emp

where job<> 'salesman'

group by job having sum(sal)>5000

order by su ;

*/

************************************************************************************

子查询:

在一个查询内部还可以包括另一个查询:

分类:

单列子查询:返回的结果是一列的一个内容 (出现几率最高)

单行子查询:返回多个列,有可能为一条完整的记录

多行子查询:返回多个记录

格式:

select { distinct } * | col1 别名1   col2 别名2 ...

from  tab1 别名1 , tab2 别名2 ,

select { distinct } * | col1 别名1   col2 别名2 ...

from  tab1 别名1 , tab2 别名2 , tab3 别名3 ,...

{where 条件s }

{group by 分组条件   { having  分组条件 }  }

{ order by col1 ASC | DESC , col2  ASC | DESC, ...} ;

)别名x tab3 别名3 ,...

{where 条件s

select { distinct } * | col1 别名1   col2 别名2 ...

from  tab1 别名1 , tab2 别名2 , tab3 别名3 ,...

{where 条件s }

{group by 分组条件   { having  分组条件 }  }

{ order by col1 ASC | DESC , col2  ASC | DESC, ...} ;

}

{group by 分组条件   { having  分组条件 }  }

{ order by col1 ASC | DESC , col2  ASC | DESC, ...} ;

要求查询出比7654工资高的全部雇员的信息:

分析:

1,7654雇员的工资是多少:

select sal from emp where empno=7654 ;

2,只要是其他工资大于7654编号雇员的工资,则符合条件:

select *

from emp

where sal > (

select sal from emp where empno=7654;  //子查询语句处

) ;

要求查询出工资比7654高,同时与7788从事相同工作的全部雇员信息:

查询出7654雇员的工资:

select sal from emp where empno=7654 ;

与7788从事相同的工作:

select job from emp

where empno = 7788;

综合查找:

select *

from emp

where sal >(

select sal from emp where empno=7654

)and  job =(

select job from emp where empno =7788

) ;

要求查询出工资最低雇员姓名,工作,工资:

最低工资:

select min(sal) from emp ;

查询所有:

select *

from emp

where sal =(

select min(sal) from emp

) ;

要求查询:部门名称,部门员工数,部门的平均工资,部门的最低收入的雇员的姓名:

1,求出每个部门的员工数量,平均工资

select deptno,count(empno) ,avg(sal)

from emp

group by  deptno ;

2,查出部门的名称:

select d.dname, ed.c, ed.a

from dept d, (

select deptno,count(empno) ,avg(sal)

from emp

group by  deptno

) ed

where d.deptno=ed.deptno ;

3,求出最低收入的雇员姓名:

select d.dname, ed.c, ed.a  ,e.ename

from dept d, (

select deptno,count(empno) ,avg(sal),min(sal) min from emp

group by  deptno

) ed ,emp e

where d.deptno=ed.deptno

and e.sal =ed.min ;

//若一个部门中存在两个最低工资的雇员,则该脚本会出现错误

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

子查询中的三种操作符:

IN, ANY, ALL

求出每个部门的最低工资的雇员信息:

select *

from emp

where sal IN (  //指定查询范围

select min(sal)

from emp

group by deptno

) ;

=ANY : 与IN功能一样

select *

from emp

where sal =ANY (  //指定查询范围

select min(sal)

from emp

group by deptno

) ;

>ANY:比里面最小的值要大

select *

from emp

where sal >ANY (  //指定查询范围

select min(sal)

from emp

group by deptno

) ;

<ANY :比里面最大的值要小

select *

from emp

where sal <ANY (  //指定查询范围

select min(sal)

from emp

group by deptno

) ;

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

>ALL:比最大的值要大

select *

from emp

where sal >ALL (  //指定查询范围

select min(sal)

from emp

group by deptno

) ;

<ALL:比最大的值要小

select *

from emp

where sal <ALL (  //指定查询范围

select min(sal)

from emp

group by deptno

) ;

/**

对于子查询中,还可以进行多列子查询,一个子查询中同时返回多个查询的列

select  *

from emp

where (sal, NVL(comm,-1)) IN(

select sa,NVL(comm, -1)

from emp

where deptno=20

) ;

*/

Oracle学习系列4

************************************************************************************

数据库更新操作:

分类:

查询操作:select

更新操作:insert ,update , delete

为了保存原始的emp表的信息,在进行增删改之前备份词表:

create table emp_bak as select * from emp ; //将表emp结构和数据完整的复制出来

添加数据:

insert into table ( [ col1,col2,col3,. . .] )

values( 值1,值2,值3,...) ;

ex:

insert into emp(enpno, ename, job, mgr, hiredate, sal, comm, deptno)

values (7899,'kevin_dfg','captian',7369,'14-2月-95',100000,300,40) ;

select * from emp;//查询记录是否添加

ex:插入新雇员,无领导,无奖金:

insert into emp(enpno, ename, job, hiredate, sal, deptno)

values (7879,'Dustin_fg','captian','14-2月-95',10000,40) ;

ex: 使用to_date()函数将字符串类型的数据变为date类型的数据

insert into emp(enpno, ename, job, mgr, hiredate, sal, comm, deptno)

values (7899,'kevin_dfg','captian',7369,to_date('2016-04-05','yyyy-mm-dd '),100000,300,40) ;

更新数据:

update table

set  字段1=值1 , 字段2=值2 ,... ;//全部修改

update table

set  字段1=值1 , 字段2=值2 ,...

where 修改条件 ;//局部修改(重点推荐)

ex: update emp

set comm=1000

where empno=7899 ;

ex: update emp

set mgr=null

where empno=7899 ;

ex:将7399,8899,7788的领导及奖金取消:

update emp

set mgr=null, comm=null

where empno IN( 7399,8899,7788 ) ;

删除数据:

delete from table   ;//全部删除

delete from table

where  条件;   //局部删除

ex: delete from emp

where empno =7899;

delete from emp

where emp IN( 7399,8899,7788 ) ;

where comm is not null ;

************************************************************************************

数据库的事务处理:

事务处理:保证数据的完整性,具有ACID特性

创建一张包含10部门的临时表:

create table emp10

as select * from emp

where deptno=10 ;

delete from emp10

where empno=7772 ;

/**

在oracle中,每个连接到数据库上的用户都表示创建了一个session,一个session队数据库所做的修改不会立刻反映到数据库的真实数据之上,当session提交所有的操作之后,数据库才真正做出修改。

提交事务:commit

回滚事务:rollback

>>>>>>>>若事务已经提交了,则肯定无法回滚<<<<<<<<<<

*/

************************************************************************************

死锁:

一个session更新了数据库中的记录,其他session事无法立刻更新的,要等待对方提交后才允许更新

SQL语法练习:

1,列出至少有一个员工的所有部门:

a,列出所有部门的员工数量

select deptno ,count(empno)

from emp

group by deptno ;

b,列出部门人数大于1的所有部门编号

select deptno ,count(empno)

from emp

group by deptno  having count(empno)>1 ;

c , 通过部门表,查询出部门的信息即可:

select d.*, ed.cou

from emp d, (

select deptno,count(empno) cou

from emp

group by deptno having count(empno) >1

) ed

where d.deptno=ed.deptno ;

2,列出新金比Smith多的所有员工:

a,先求出smith的工资:

select sal from emp where ename ='SMITH';

b,以上面的结果为条件,查询所有符合条件的雇员信息

select * from emp

where sal > (

select sal from emp where ename ='SMITH';

) ;

3,列出所有员工的姓名及其直接上级的姓名:

select e.ename, m.ename

from emp e, emp m

where e.mgr=m.empno(+);

4,列出受雇日期早于其直接上级的所有员工的编号,姓名,部门名称:

a,查找mgr=empno的同时还要比较hiredate,先查询编号,姓名

select e.empno, e.ename

from emp e, emp n

where e.mgr=m.empno and e.hiredate < m.hiredate ;

b, 查询部门编号

select e.empno, e.ename ,d.dname

from emp e, emp n, dept d

where e.mgr=m.empno and e.hiredate < m.hiredate

and e.deptno=d.deptno;

5,列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门:

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

from dept d, emp e

where d.deptno=e.deptno(+);

6,列出所有办事员的姓名及其部门名称,部门人数:

select e.ename, d.dname, ed.cou

from emp e, dept d, (

select deptno, count(empno) cou

from emp

group by deptno

) ed

where job='CLERK' and e.deptno=d.deptno and ed.deptno=e.deptno;

7,列出最低薪金大于1500的各种工作及从事此工作的全部雇员人数:

select e.job, count(e.empno)

from emp e

where e.job in(

select job

from emp

group by job having min(sal)>1500

)

group by e.job ;

8,列出部门销售部工作的员工的姓名,假定不知道销售部的部门编号:

select ename

from emp

where deptno=(

select deptno from dept

where dname='SALES'

) ;

9,列出薪金高于公司平均薪金的所有员工,所在部门,上级领导,公司的工资等级:

select e.empno, e.ename, s.grade, m.empno, m.ename, d.deptno, d.dname, d.loc

from emp e, dept d, emp m, salgrade s

where e.sal>(

select avg(sal) from emp

)and e.deptno=d.deptno

and e.mgr=m.empno(+)

and e.sal between s.losal and s.hisal ;

10,列出与“SCOTT”从事相同工作的所有员工及部门名称:

select e.empno, e.ename, e.job, e.sal, d.dname, d.loc

from emp e, dept d

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

and ename !='SCOTT'

and e.deptno=deptno ;

11,列出薪金等于部门30中员工的薪金的所有员工的姓名和薪金:

select ename,sal

from emp

where sal IN(

select sal from emp where deptno=30

)

and deptno !=30 ;

12,列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金,部门名称:

select e.ename, e.sal, d.dname, d.loc

from emp e, dept d

where e.sal >ALL(

select sal from emp where deptno=30

)

and e.deptno!=30 and e.deptno = d.deptno ;

13,列出每个部门工作的员工数量,平均工资和平均服务期限:

select d.dname, count(e.empno), avg(e.sal), avg(months_between(sysdate,e.hiredate)/12) years

from emp e, dept d

where e.deptno=d.deptno

group by d.dname ;

14,列出所有员工的姓名,部门名称和工资:

select e.ename, d.dname , e.sal

from emp e,dept d

where e.detpno=d.deptno ;

15,列出所有部门的详细信息和部门人数:

select d.* ,nvl(ed.cou ,0)

from dept d,(

select deptno dno,count(empno) cou from emp group by deptno

) ed

where d.deptno=ed.dno (+);

16,列出各种工作的最低工资及从事此工作的雇员姓名:

select * from emp

where sal IN (

select min(sal) from emp group by job

)  ;

17,列出各个部门的manager的最低薪金:

select deptno ,min(sal)

from emp

where job='MANAGER'

group by deptno ;

18,列出所有员工的年工资,按年薪升序排序:

select ename, ( sal+NVL(comm,0))*12 income

from emp

order by income ;

19,查出某个员工的上级主管,并要求这些主管中的年薪不超过3000:

select distinct m.*

from emp e , emp m

where e.mgr=m.empno and m.sal >3000 ;

20,求出部门名称中带“S“字符的部门员工的,工资合计,部门人数:

select deptno, sum(sal), count(empno)

from emp

where deptno in(

select deptno from dept where dname like '%S%'

)

group by deptno ;

21,给任职日期超过10年的人加薪10%:

update emp

set sal=sal*0.1

where months_between(sysdate,hiredate)/12 >10 ;

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

commit ;

************************************************************************************

SUMMARY

1,多表查询,注意产生笛卡尔积

2,分组统计,所有统计函数只能在分组语句中使用

3,子查询:子查询可以在任意的位置上编写,多表查询,子查询,分组统计一起完成复杂查询

4,数据库的增删改

5,了解一下事务的处理方式,commit,rollback

Oracle学习系列5

************************************************************************************

1,掌握表的建立与删除

了解Oracle中的主要数据类型

2,约束的分类和使用

3,表的关联:交,并,补

4,掌握ROWNUM伪列的作用

5,掌握序列的使用

6,掌握视图的作用

7,了解同义词,用户管理,权限分配与撤销,数据库的备份

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

创建和管理表(重点):

常用的数据类型:

number[int ,float], varchar ,date ,clob, blob,

表的建立:

create  table tab_name(

col1    type   [defalut 默认值],

col2    type   [default 默认值],

...

coln    type    [default 默认值]

) ;

create table  tab_name as (子查询)  ;//赋值表

create table  tab_name as (select * from emp  where 1=2) ;//仅复制表结构

ex:创建表person

create table person(

UID  varchar(18),

name  varchar(200),

age   number(3),

birthday  date,

sex     varchar(2)  default '男'

) ;

ex:向表中增加数据:

insert into person(UID,name,age,birthday,sex)

values('111111111111111111','keivn',30,to_date('1994-04-09','yyyy-mm-dd'),'女');

ex:表的删除:

drop table tab_name ;

eg:drop table person;

ex:修改表结构:增加列,修改列

alter  table tab_name  add (col1 type default 默认值,

col2 type default 默认值,

...

coln type default 默认值

) ;  //增加列

alter table person add (address  varchar(200)  default '暂无地址') ;

alter table tab_name  modify (col1 type default 默认值,

col2 type default 默认值,

...

coln type default 默认值

) ;  //修改列

alter table person modify (name varchar2(20) default '无名氏');

/**

若数据库中对应字段里有一个很长的数据,则无法将表长度缩小

*/

ex:为表重命名

在oracle中提供了rename命令,对表进行重新命名。

rename  tab_name_old   to   tab_name_new ;

ex:

rename person to tperson ;

ex:截断表

若要清空一张表的数据,同时不需要回滚,可以立即释放资源就要使用

截断表的语法:

truncate  table tab_name ;

ex: truncate table tperson ;  //清空表数据

rollback ;     //使用rollback无效

************************************************************************************

思考题:

现有一张国家表,里面有字段:中国,美国,巴西,荷兰,

现要求通过查询实现对战功能:

中国 ----> 美国

中国 ----> 巴西

中国 ----> 荷兰

美国 ----> 中国

美国 ----> 巴西

美国 ----> 荷兰

问:此程序该如何实现?

分析:使用笛卡尔积完成

create table national(

name varchar(30)

) ;

insert into national(name)

values('中国') ;

insert into national(name)

values('美国') ;

insert into national(name)

values('巴西') ;

insert into national(name)

values('荷兰') ;

select t1.name ,t2.name

from national t1, national t2

where t1.name <>t2.name ;

************************************************************************************

约束(重点):

分类:

1,主键约束 -->是唯一的表示,本身不能为空,如身份证

2,唯一约束 -->在一个表中只能建立一个主键约束,其他列不想出现重复值可使用唯一性约束

3,非空约束 -->列的内容不能为空

4,检查约束 -->检查一个列的内容是否合法

5,外键约束 -->在两张表中进行的约束操作

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

1,主键约束:

create table person(

UID  varchar(18)  primay key,     //主键约束

name  varchar(200),

age   number(3),

birthday  date,

sex     varchar(2)  default '男'

) ;

/**

create table person(

UID  varchar(18)

name   varchar(200),

age      number(3),

birthday  date,

sex       varchar(2)  default '男',

constraint person_uid_pk primary key(uid)  //指定uid主键约束名称

) ;

*/

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

2,唯一约束 :unique

表示一个字段中的内容是唯一的,其他列不允许重复

create table person(

UID  varchar(18)

name   varchar(200)  unique  not null,  //非空约束,唯一约束

age      number(3) not null,      //非空约束

birthday  date,

sex       varchar(2)  default '男',

constraint person_uid_pk primary key(uid)  //指定uid主键约束名称

<constraint person_name_uk unique(name)  >  //指定name唯一约束名称

) ;

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

3,非空约束: not null

表示一个字段的内容不允许为空,即插入数据时必须插入该字段的值

create table person(

UID  varchar(18)

name   varchar(200)  not null,  //非空约束

age      number(3) not null,      //非空约束

birthday  date,

sex       varchar(2)  default '男',

constraint person_uid_pk primary key(uid)  //指定uid主键约束名称

<constraint person_name_nk not null(name)  >  //指定name非空约束名称

) ;

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

4,检查约束

create table person(

UID  varchar(18)

name   varchar(200)  not null,  //非空约束

age      number(3) not null  check( age between 0 and 150),   //非空约束,检查约束

birthday  date,

sex       varchar(2)  default '男' check(sex in('男','女',‘中’)), //检查约束

constraint person_uid_pk primary key(uid)  //指定uid主键约束名称

<constraint person_name_ck check(name)  >  //指定name检查约束名称

<constraint person_sex_ck check(sex)  >  //指定sex检查约束名称

) ;

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

5,外键约束(foreign key):

create table person(

UID  varchar(18)

name   varchar(200)  not null,  //非空约束

age      number(3) not null  check( age between 0 and 150),   //非空约束,检查约束

birthday  date,

sex       varchar(2)  default '男' check(sex in('男','女',‘中’)), //检查约束

constraint person_uid_pk primary key(uid)  //指定uid主键约束名称

<constraint person_name_ck check(name)  >  //指定name检查约束名称

<constraint person_sex_ck check(sex)  >  //指定sex检查约束名称

) ;//创建person表

create table book(

bid    number  primary key not null,

bname   varchar(30),

bprice    number(5,2)

uid     varchar(18)

constraint person_book_uid_fk  foreign key(uid)  references person(uid)  //外键约束

);//创建book表

/**

1,在子表book中设置的外键在父表person中必须是主键

2,删除时,先删除子表book,再删除父表person:

drop table book;

drop table person ;

*/

ex:插入测试数据:

insert into person(UID,name,age,birthday,sex)

values('111111111111111111','keivn',30,to_date('1994-04-09','yyyy-mm-dd'),'女');

insert into book (bid,bname,bprice)

values(1,'java',89.8,'1111111111111111111');

级联删除:

create table book(

bid    number  primary key not null,

bname   varchar(30),

bprice    number(5,2)

uid     varchar(18)

constraint person_book_uid_fk  foreign key(uid)  references person(uid) on delete cascade  //外键约束,级联删除

);//创建book表

delete from person where pid ='1111111111111'; //删除一条记录,同时删除子表book中的记录

Oracle学习系列6

************************************************************************************

删除约束(重点):

格式:

alter table person drop constraint constraint_name ;

创建person表:

create table person(

UID  varchar(18)

name   varchar(200)  not null,  //非空约束

age      number(3) not null,      //非空约束

birthday  date,

sex       varchar(2)  default '男',

) ;

/**

主键约束:主键字段_PK

唯一约束:字段_UK

检查约束:字段_CK

外键约束:父字段_子字段_FK

*/

ex:为表添加若干个约束,

格式:

alter table tab_name add constraint constraint_name   constraint_type(constrain_colx)  ;

ex:添加约束

alter table person add constraint person_uid_PK primary key(uid);//增加主键约束

alter talbe person add constraint person_name_UK unique(uid); //增加唯一约束

alter table person add constraint person_age_CK checke(age between 0 and 150) ;

alter table person add constraint person_sex_CK check(sex in ('男','女','中')) ;

ex:删除约束

alter table person drop constraint person_uid_PK ;//删除主键约束

alter talbe person drop constraint person_name_UK ; //删除唯一约束

alter table person drop constraint person_age_CK  ; //删除检查约束

alter table person drop constraint person_sex_CK  ; //删除检查约束

************************************************************************************

rownum(重点):

rownum: 表示行号,手机上是一个伪列,可在每张表中出现

select rownum, empno, ename ,job,sal,hiredate

from emp ;  //  ROWNUM 采用自动编号的方式呈现

ex:

select rownum, empno, ename, job, sal hiredate

from emp

where rownum <=5 ;

************************************************************************************

建表、约束、查询综合练习:

题目背景:

有某个学生运动会比赛信息的数据库,保存了如下的表:

运动员sporter(运动员编号sporterid, 运动员姓名name, 运动员性别sex, 所属系好department)

项目item (项目编号itemid, 项目名称itemname, 项目比赛地点location)

成绩grade(运动员编号sportid,项目编号itemid, 积分mark)

1建表要求:

a,定义各个表的主键外码约束

b,运动员的姓名和所属系别不能为空值

c,积分要么为null,要么为6,4,2,0,分别代表第一二三和其他名词的积分

create table sporter(

sporterid       nummber(4)  primary key  not null,

name        varchar2(50)  not null,

sex varchar2(2)  not null,

department varchar2(30)  not null,

constraint sporter_sex_CK  check(sex in('男','女'))

);

create table item(

itemid varchar2(4)  primary key not null,

itemname varchar2(50)  not null,

location varchar2(50)  not null

);

create table grade(

sporterid number(4),

itemid varchar2(4),

mark number(2),

constraint sporter_grade_sporterid_FK  foreign key(sporterid)

references sporter(sporterid)  on delete cascade

constraint item_grade_itemid_FK  foreign key(itemid)

references item(itemid)  on delete cascade

constraint grade_mark_CK check(mark in (6,4,2,0))

);

查看错误:show error

测试数据:

insert into  sporter(sportid, name, sex, department )

values(1101,'黎明','男','计算机系');

insert into  sporter(sportid, name, sex, department )

values(1102,'张三','男','数学系系');

insert into  sporter(sportid, name, sex, department )

values(1103,'李四','男','计算机系');

insert into  sporter(sportid, name, sex, department )

values(1104,'王五','男','物理系');

insert into  sporter(sportid, name, sex, department )

values(1105,'李楠','女','心理系');

insert into  sporter(sportid, name, sex, department )

values(1106,'孙俪','女','艺术系');

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

insert into item(itemid ,itemname, location)

values('x001','男子五千米','一操场') ;

insert into item(itemid ,itemname, location)

values('x002','男子标枪','一操场') ;

insert into item(itemid ,itemname, location)

values('x003','男子跳远','二操场') ;

insert into item(itemid ,itemname, location)

values('x004','女子跳高','二操场') ;

insert into item(itemid ,itemname, location)

values('x005','女子三千米','三操场') ;

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

insert into grade(sporterid, itemid,mark)

values(1001,'x001',6);

insert into grade(sporterid, itemid,mark)

values(1002,'x001',4);

insert into grade(sporterid, itemid,mark)

values(1003,'x001',2);

insert into grade(sporterid, itemid,mark)

values(1004,'x003',2);

insert into grade(sporterid, itemid,mark)

values(1005,'x006',6);

insert into grade(sporterid, itemid,mark)

values(1006,'x004',0);

insert into grade(sporterid, itemid,mark)

values(1003,'x005',2);

insert into grade(sporterid, itemid,mark)

values(1003,'x003',4);

insert into grade(sporterid, itemid,mark)

values(1003,'x002',6);

要求:

求出目前总积分最高的系名,及其积分:

select * from (

select s.department , sum(g.mark) sum

from  sporter s, grade g

where s.sporterid=g.sporterid

group by s.department

order by sum desc

)

where rownum=1

找出在一操场进行比赛的各项目名称及其冠军的姓名:

select i.itemname, s.name, g.mark

from item i, grade g,sporter s

where i.location='一操场'

and i.itemid=g.itemid

and s.sporterid=g.sporterid

and g.mark=6 ;

找出参加了张三所参加过的项目的其他同学的姓名:

select distinct s.name

from sporter s, grade g

where s.sporterid=g.sporterid and s.name <>'张三'

and g.itemid IN (

select g.itemid from sporter s ,grade g

where s.sporterid=g.sporterid

and s.name='张三'

) ;

经查张三使用了违禁药品,其成绩都记0分,请在数据库中做出相依修改:

update grade

set mark=0

where sporterid =(

select sportid from sporter where name ='张三'

) ;

经组委会协商,需要删除女子跳高比赛项目:

delete from item

where itemname='女子跳高' ;

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

删除顺序:    //先删子表,再删主表

drop table grade;

drop table sporter;

drop table item ;

************************************************************************************

集合操作:

分类:

并(UNION) :将多个查询的结果组合到一个查询结果中,无重复值 //UNIONALL:包含重复值

交(INTERSECT):返回多个查询结果相同的部分

差(MINUS) :返回两个结果的差集

复制emp表,将部门20的雇员信息取出来:

create table emp20

as select * from emp

where deptno=20 ;

验证UNION:

select * from emp

union

select * from emp20 ;

验证UNIONALL:

select * from emp

unionall

select * from emp20 ;

验证INTERSECT:

select * from emp

INTERSECT

select * from emp20 ;

验证MINUS:

select * from emp

minus

select * from emp20 ;

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

SQL查询最终格式:

////////////////////////////////////////////////////////////////////////////////////////////

select { distinct } * | col1 别名1   col2 别名2 ...

from  tab1 别名1 , tab2 别名2 ,

select { distinct } * | col1 别名1   col2 别名2 ...

from  tab1 别名1 , tab2 别名2 , tab3 别名3 ,...

{where 条件s }

{group by 分组条件   { having  分组条件 }  }

{ order by col1 ASC | DESC , col2  ASC | DESC, ...} ;

)别名x tab3 别名3 ,...

{where 条件s

select { distinct } * | col1 别名1   col2 别名2 ...

from  tab1 别名1 , tab2 别名2 , tab3 别名3 ,...

{where 条件s }

{group by 分组条件   { having  分组条件 }  }

{ order by col1 ASC | DESC , col2  ASC | DESC, ...} ;

}

{group by 分组条件   { having  分组条件 }  }

{ order by col1 ASC | DESC , col2  ASC | DESC, ...} ;

{UNION | INTERSECT |MINUS}

select { distinct } * | col1 别名1   col2 别名2 ...

from  tab1 别名1 , tab2 别名2 ,

select { distinct } * | col1 别名1   col2 别名2 ...

from  tab1 别名1 , tab2 别名2 , tab3 别名3 ,...

{where 条件s }

{group by 分组条件   { having  分组条件 }  }

{ order by col1 ASC | DESC , col2  ASC | DESC, ...} ;

)别名x tab3 别名3 ,...

{where 条件s

select { distinct } * | col1 别名1   col2 别名2 ...

from  tab1 别名1 , tab2 别名2 , tab3 别名3 ,...

{where 条件s }

{group by 分组条件   { having  分组条件 }  }

{ order by col1 ASC | DESC , col2  ASC | DESC, ...} ;

}

{group by 分组条件   { having  分组条件 }  }

{ order by col1 ASC | DESC , col2  ASC | DESC, ...} ;

////////////////////////////////////////////////////////////////////////////////////////////

Oracle学习系列7

************************************************************************************

关联表的约束:

强制删除关联表中的父表:

drop table tab_name cascade constraint ;

约束本身是可以修改的,但是不建议修改约束

知识点:

1,掌握视图的作用及定义

2,掌握序列的使用:SEQUENCE

3,掌握PowerDesigner设计工具的使用

4,了解同义词,了解用户管理,了解嵌套表及可变数组

5,理解数据库的设计范式

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

1,视图:

封装了一条复杂的查询语句

语法:

create view view_name

as 子查询

{with check option | with read only } ; //不能更新视图的创建条件,不能更改视图数据

建立一个视图,此视图包含了全部部门20的信息:

create view view_emp20

as

select  empno,ename, job,hiredate

from emp

where deptno=20 ;

查询视图:

sele * from view_emp20 ;

删除视图:

drop view view_name ;

ex:

drop view view_emp20 ;

完整语法格式:

create or replace view  view_name

as 子查询   //系统会为用户自动进行删除及重建的功能

ex:

create or replace view view_emp20

as

select d.dname, count(e.empno), avg(e.sal), avg(months_between(sysdate,e.hiredate)/12) years

from emp e, dept d

where e.deptno=d.deptno

group by d.dname ;

更新视图:

修改视图中7369的部门编号:

update view_emp20

set deptno=30

where empno=7369; //提示更新成功,但是视图表中无编号7369的雇员

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

序列(重点)

在oracle完成自动序列增长的功能,则只能依靠序列完成

格式:

create sequence  seq_name

[increment by n] [start with n]

[{maxvalue n |nomaxvalue}]

[{minvalue n | nominvalue }]

[{cycle | nocycle}]

[{cache n | nocache }];

删除:

drop sequence seq_name

ex:创建一个myseq的序列,验证自动增长的操作:

create sequence myseq  increment by 2;

在序列中提供两种操作:

nextVal:取得序列的下一个内容

currVal:取得序列的当前内容

创建表test_seq:

create table test_seq(

curr number,

next number

);

使用序列:

insert into test_seq(curr,next)

values(myseq.currval,myseq.nextVal)  ;

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

同义词(了解):

功能:可以让其他用户通过一个名称方便的访问‘user.table_name’.

语法:

create  synonym  syn_name  for  user.tab_name  ; //建立

drop  synonym syn_name ;   //删除

ex: create synonym   dual  for sys.dual ;

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

select  sysdate from dual ;//dual是张虚拟表

conn sys/change_on_install as sysdba ;

select * from tab

where TNAME='DUAL';//在sys用户下存在此表

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

用户管理(了解):

语法:

create user user_name  identified by passwd //创建用户(sys用户权限)

[default tablespace  default_tablespace]

[temporary tablespace  temporary_tablespace ]

grant 权限1,权限2,权限3.. to user ;//给用户授权   create session

alter user user_name identified by passwd_new ; //修改用户密码

eg:

create user kevin  identified by root ;

grant  conncet, resource to kevin ;

角色:connect 、resource   //每个角色有好多不同的权限

解/锁住用户:

alter user user_name  account  lock /unlock;

eg:

alter user kevin account lock /unlock ;

授权emp表:

grant 权限1,权限2  on   user_name.tabl_name  to user_name ;

将scott用户下的emp表的查询权限及删除权限给kevin:

grant select ,delete on scott.emp to kevin;

回收权限:

revoke 权限1,权限2,.. on  user.tab_name  from user_name ;

eg:

revoke select ,delete on scott.emp from kevin ;

grant/(revoke)  权限1,权限2,权限3   on  user.tab_name  to / (from)  user_name ;

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

数据库的备份与恢复(了解):

数据库备份: exp

D:\data>exp

数据库恢复: imp

D:\data>impf

查看错误:show error

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

嵌套表(了解):

在一个表中包含另外一个子表

//创建project_ty类型

create type project_ty as object(

proid number(4),

proname  varchar(50),

prodate date

) ;

/                 //最后一个‘/' 不可少

//使用porject_nt类型

create type project_nt as table of project_ty;

/                    //最后一个‘/' 不可少

create table department(

deptno  number(2) primary key not null,

dname   varchar2(50) not null,

projects   project_nt

) nested table projects store  as project_nt_tab_temp ;

对于插入数据来讲,需要指定每个project_ty的数据类型

insert into department(deptno,dname,projects)

values(

1,'技术部',

project_nt(

project_ty(1001,'erp',sysdate),

project_ty(1002,'crm',sysdate),

project_ty(1003,'oa',sysdate),

)

);

查询:

select * from department ;

若此时需要查看一个部门的全部项目的话,则需要查询嵌套表:

select * from table( select projects from department where deptno=1 ) ;

更新:

update table (select projects from department where deptno=1 ) pro

set values(pro )=project_ty('1001','测试项目',to_date('2016-02-12','yyyy-mm-dd'))

where pro.proid=1001 ;

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

可变数组(了解):

属于嵌套表的升级版,在可变数组中手机上就是将内部的嵌套表的内容的长度进行了限制。

//定义类型

create type worker_info as object(

id number,

name varchar2(50),

sex varchar2(6)

);

/

//定义数组类型

create type worker_info_list as varray(10) of worker_info ;

/

//创建可变数组表

create table department(

deptno number(2) primary key not null,

dname varchar2(50) not null,

workers worker_info_list

);

//插入数据

insert into department(deptno,dname,workers)

values( 20,'后勤部',

worker_info_list(

worker_info(1,'dustin','F'),

worker_info(2,'kevin','F'),

worker_info(3,'allen','M')

)

);

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

数据库设计范式(了解):

1.第一范式(确保每列保持原子性)

2.第二范式(确保表中的每列都和主键相关)

3.第三范式(确保每列都和主键列直接相关,而不是间接相关)

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

数据库设计工具(重点):

powerDesigner工具的使用

Oracle学习系列1-7的更多相关文章

  1. Oracle学习系列7

    Oracle学习系列7 ************************************************************************************ 关联表 ...

  2. Oracle学习系列6

    Oracle学习系列6 ************************************************************************************ 删除约 ...

  3. Oracle学习系列5

    Oracle学习系列5 ************************************************************************************ ,掌握 ...

  4. Oracle学习系列4

    Oracle学习系列4 ************************************************************************************ 数据库 ...

  5. Oracle学习系列3

    Oracle学习系列3 ************************************************************************************ 多表查 ...

  6. Oracle学习系列1

    两个服务必须启动: OracleOraDb10g*TNListener 和 OracleService*** 使用sqlplusw先进行环境的设置 set linesize 300 ; set pag ...

  7. oracle学习系列之四 (视图)

    视图视图是数据库中特有的对象.视图用于存储查询,但不会存储数据(物化视图除外).这是视图和数据表的重要区别.可以利用视图进行查询,插入,更新和删除数据.Oracle有如下四种视图(关系视图,内嵌视图, ...

  8. oracle学习系列之三 (约束)

    主键约束:外键约束:唯一性约束:检查约束:默认值约束 -——————五大约束 一. 主键约束: --创建表的主键约束  create table student (student_id number ...

  9. Oracle 学习系列之二(会话与事务级临时表和dual表 )

    一. 会话临时表 --创建会话临时表create global temporary table tmp_user_session(user_id int, user_name varchar2(20) ...

随机推荐

  1. 《BI项目笔记》创建标准维度、维度自定义层次结构

  2. STM32学习笔记(四) RCC外设的学习和理解

    RCC时钟模块并不好理解,初次接触我也是一头雾水,而且我真正掌握它的时候也比较晚,是我在学习uC/os-II,需要分析时钟时才有了深刻认识.但在学习中我却一定要把放在了前列,因为这是整个嵌入式最重要的 ...

  3. iOS中JS 与OC的交互(JavaScriptCore.framework)

    iOS中实现js与oc的交互,目前网上也有不少流行的开源解决方案: 如:react native 当然一些轻量级的任务使用系统提供的UIWebView 以及JavaScriptCore.framewo ...

  4. Ipad Safari iframe cookie 当浏览器默认禁用第三方COOKIE

    前一阵子,我们发现高版本的Safari中默认会阻止第三方cookie,如下图所示. 问题 什么是第三方cookie呢?在访问一个网站A时,网站A算作第一方,如果网站A中引用了另一个网站X(网站X的域名 ...

  5. ABAP字符串翻转

    就这个函数STRING_REVERSE 略显蛋疼,好搞那么复杂.... 简单的转换嘛: FUNCTION ZSTRING_REVERSE. *"----------------------- ...

  6. 树(一)——线段树

    问题 现在有1~30这30个数,数N被抽上的概率正比于1/sqrt(N+1),求满足这个概率分布的随机数发生器. 思路 第一,如何解决这个"概率正比"问题. 第二,如何产生满足条件 ...

  7. google应用商店的解决

    { "enabled_plugins": [ "SimpleReloadPlugin", "SimpleRefresh" ] } git c ...

  8. JDE FORM开发--checkBox

    checkBox设置时,必须指定DD.

  9. Top Five Hacker Tools Every CISO Should Understand

    As the role of the CISO continues to evolve within organizations towards that of an executive level ...

  10. Install Java1.6

    声明:一下内容主要来自网络,本来在此基础上根据自己的成功经验做了一些浅陋的(但有价值的)备注说明和修改. (本人也是ubuntu 11.10版本,但是是64位的,因此安装的java也是64位版本.) ...