Oracle备忘录(七)--综合

本文介绍了 Oracle 数据库中 SQL 的实用技巧,包括管理员登录、解锁和更改用户密码的方法,以及如何进行分页查询、统计特定年份入职员工数量等操作。还详细讲解了如何查询高于部门平均工资的员工及使用相关子查询。
摘要由CSDN通过智能技术生成
1. 管理员登录
c:\>sqlplus sys/你的密码 as sysdba  (密码认证)
c:\>sqlplus / as sysdba             (主机认证  优先)


2. 解锁
SQL>alter user scott account unlock;

3. 改密码
SQL>alter user scott identified by 新密码;


SQL> -- rownum 行号  伪列
SQL> --查询工资的前3位

SQL> /*
SQL> --关于行号(注意点)
SQL> --1. 按照默认的顺序生成
SQL> --2. rownum只能使用< <=, 不能> >=
SQL> -- */
SQL> select rownum, empno,ename,sal
  2  from emp
  3  order by sal desc;

    ROWNUM      EMPNO ENAME        SAL                                                                                  
---------- ---------- ---------- -----                                                                                  
         9       7839 KING        5000                                                                                  
        13       7902 FORD        3000                                                                                  
         8       7788 SCOTT       3000                                                                                  
         4       7566 JONES       2975                                                                                  
         6       7698 BLAKE       2850                                                                                  
	...      ...  ...         ...
已选择14行。

SQL> host cls

SQL> --第一题 查询工资的前3位
SQL> select rownum,empno,ename,sal
  2  from (select * from emp order by sal desc)
  3  where rownum<=3;

    ROWNUM      EMPNO ENAME        SAL                                                                                  
---------- ---------- ---------- -----                                                                                  
         1       7839 KING        5000                                                                                  
         2       7788 SCOTT       3000                                                                                  
         3       7902 FORD        3000                                                                                  


---不能使用>=
SQL> select rownum,empno,ename,sal
  2  from emp
  3  where rownum>=5 and rownum<=8;

未选定行


--Oracle分页查询
SQL> select *
  2  from (select rownum r,e1.*
  3  	      from (select * from emp order by sal) e1
  4  	      where rownum <=8
  5  	   )e2 
  6  where e2.r >=5; 
-- 这时的r>=5 是 e2的一个字段,而不是行数,r为e1的行数,所以在e1这个表,不能使用>=


         R      EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO                        
---------- ---------- ---------- --------- ---------- -------------- ----- ---------- ----------                        
         5       7654 MARTIN     SALESMAN        7698 28-9月 -81      1250       1400         30                        
         6       7934 MILLER     CLERK           7782 23-1月 -82      1300                    10                        
         7       7844 TURNER     SALESMAN        7698 08-9月 -81      1500          0         30                        
         8       7499 ALLEN      SALESMAN        7698 20-2月 -81      1600        300         30                        

SQL> host cls

SQL> --第二题
SQL> --查询出比部门平均工资高的员工
SQL> select e.empno,e.ename,e.sal,d.avgsal
  2  from emp e,(select deptno,avg(sal) avgsal from emp group by deptno) d
  3  where e.deptno=d.deptno and e.sal>d.avgsal;

     EMPNO ENAME        SAL     AVGSAL                                                                                  
---------- ---------- ----- ----------                                                                                  
      7698 BLAKE       2850 1566.66667                                                                                  
      7499 ALLEN       1600 1566.66667                                                                                  
      7902 FORD        3000       2175                                                                                  
      7788 SCOTT       3000       2175                                                                                  
      7566 JONES       2975       2175                                                                                  
      7839 KING        5000 2916.66667                                                                                  

已选择6行。


---重要:
SQL> --相关子查询: 将主查询中的某个值  作为参数传递给子查询
SQL> select empno,ename,sal,(select avg(sal) from emp where deptno=e.deptno) avgsal
  2  from emp e
  3  where sal> (select avg(sal) from emp where deptno=e.deptno); --传入父查询的deptno

     EMPNO ENAME        SAL     AVGSAL                                                                                  
---------- ---------- ----- ----------                                                                                  
      7499 ALLEN       1600 1566.66667                                                                                  
      7566 JONES       2975       2175                                                                                  
      7698 BLAKE       2850 1566.66667                                                                                  
      7788 SCOTT       3000       2175                                                                                  
      7839 KING        5000 2916.66667                                                                                  
      7902 FORD        3000       2175                                                                                  

已选择6行。

SQL> host cls

SQL> --第三题,统计在某一年入职员工的数目

--RR表示后面两位数的年份
--decode(表达式,'条件',条件成立值,条件不成立值)
SQL> select
  2    sum(decode(to_char(hiredate,'RR'),'81',1,0))
  3  from emp
SQL> /

--我的解决方法:
SQL> select 
	sum(
		case to_char(hiredate,'yyyy')
			when '1981'
			then 1
			else 0
		end
            ) "1980"
     from emp

     

SQL> --组函数 行转列  wm_concat                                                                                                             
SQL> col 部门成员 for a50
SQL> select deptno 部门编号, wm_concat(ename) 部门成员 from emp group by deptno;

  部门编号 部门成员                                                                                                     
---------- --------------------------------------------------                                                           
        10 CLARK,KING,MILLER                                                                                            
        20 SMITH,FORD,ADAMS,SCOTT,JONES                                                                                 
        30 ALLEN,BLAKE,MARTIN,TURNER,JAMES,WARD                                                                         
SQL> spool off

传智播客---Oracle视频教程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值