• Oracle学习系列1-7


    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工具的使用

     

  • 相关阅读:
    线程的中断
    线程间的协作机制
    iOS app内打开safari完成google的OAuth2认证
    iOS ipa 重签名 resign
    iOS rebuild from bitcode对ipa大小的影响
    iOS URL Cache文章推荐 (待完成)
    iOS 推荐几篇关于Objective-c 动态语言的文章
    iOS Code Sign On Copy
    设计模式好文章汇总(不断更新中)
    Json 文件中value的基本类型
  • 原文地址:https://www.cnblogs.com/askDing/p/5468897.html
Copyright © 2020-2023  润新知