万蕊科技 发表于 2014-6-2 19:41

Oracle增删查改 day03

复习:
1.查询语句的基本格式。
select ...
from 表名
where 条件
group by 列名
having 带组函数的条件
order by 列名

2.函数
1)组函数:count / avg / sum / max / min

2)单行函数:
a.字符函数:upper / lower / initcap
          length / lpad / rpad

          l : left ; r: right

select rpad(ename, 10, '*') from emp_ning;

b.数字函数: round / trunc / mod
select mod(salary, 1000) from emp_ning;

c.日期函数: months_between / add_months /
             last_day(sysdate)

d.转换函数: to_char / to_date / to_number

            to_char         to_number
       日期--------->字符 ---------->数字
             <---------       <---------
             to_date         to_char


where password = '1234' and id = '1001'

select to_number('$7,912,345.67','$9,999,999.99')
from dual;

7912345.67

select to_char(7912345.67, '$9,999,999.99')
from dual;

$7,912,345.67

e.通用函数:nvl / coalesce / decode

使用频率比较高的单行函数:
upper / round / to_char / to_date / nvl


一、子查询
1.谁的薪水比张无忌高?
子查询
select salary from emp_ning
where ename = '张无忌';

10000

主查询
select ename from emp_ning
where salary > 10000;

张三丰

合并到一条SQL语句:
select ename from emp_ning
where salary > (select salary from emp_ning
                where ename = '张无忌');

><>=<==<>: 单行比较运算符,
只能和一个数字比较。

insert into emp_ning(empno, ename, salary)
values(1014, '张无忌', 8000);

谁的薪水比所有叫张无忌的人的薪水都高?大于最大
10000
8000

select ename from emp_ning
where salary > ALL(select salary from emp_ning
                where ename = '张无忌');

哪些人的薪水比任何一个叫张无忌的人高都行?大于最小
10000
8000

select ename from emp_ning
where salary > ANY(select salary from emp_ning
                where ename = '张无忌');

2.谁和刘苍松同部门?列出除了刘苍松之外的员工名字。
select deptno from emp_ning
where ename = '刘苍松';
10

select ename from emp_ning
where deptno = 10
and ename <> '刘苍松';

select ename,salary,job
from emp_ning
where deptno = (select deptno from emp_ning
                where ename = '刘苍松')
and ename <> '刘苍松';

--如果子查询得到的结果是多个,不能使用单行比较运算符
等号。改为:in
insert into emp_ning(empno, ename, deptno)
values(1015, '刘苍松', 20);

select ename,salary,job,deptno
from emp_ning
where deptno in (select deptno from emp_ning
                where ename = '刘苍松')
and ename <> '刘苍松';

根据子查询返回的结果的行数:
返回一行:> < >= <= = <>
返回多行:>ALL >ANY <ALL <ANY in

3.每个部门拿最高薪水的是谁?
--返回多行
select deptno, max(salary)
from emp_ning
where deptno is not null
group by deptno;

   30      5000
   20       15000
   10       10000

select ename, salary, job, deptno
from emp_ning
where (deptno, salary)
      in (select deptno, max(salary)
          from emp_ning
          where deptno is not null
          group by deptno);

4.哪个部门的人数比部门30的人数多?
select count(*) from emp_ning
where deptno = 30;
3

select deptno, count(*)
from emp_ning
group by deptno
having count(*) > (select count(*) from emp_ning
                   where deptno = 30);

5.哪个部门的平均薪水比部门20的平均薪水高?
select deptno, avg(nvl(salary,0)) avg_s
from emp_ning
group by deptno
having avg(nvl(salary,0)) >
       (select avg(nvl(salary,0))
      from emp_ning
      where deptno = 20);

6.列出员工名字和职位,这些员工所在的部门平均薪水
大于5000元。
select deptno, avg(nvl(salary,0))
from emp_ning
group by deptno
having avg(nvl(salary,0)) > 5000;
105750
208000

select ename, job
from emp_ning
where deptno in (select deptno
                from emp_ning
                group by deptno
                having avg(nvl(salary,0)) > 5000);

7.谁是张无忌的下属?
select empno from emp_ning
where ename = '张无忌';
1001
1014

select ename from emp_ning
where mgr in (1001, 1014);

select ename from emp_ning
where mgr in (select empno from emp_ning
            where ename = '张无忌');

8.研发部有哪些职位?
select distinct job from emp_ning
where deptno = (select deptno
                from dept_ning
                where dname = '研发部');


页: [1]
查看完整版本: Oracle增删查改 day03