Oracle增删查改 day02
SQL*Plussqlplus.exe
1)数据定义语言:create / drop / alter / truncate
对数据结构起作用。
********
Data Difinition Language: DDL
2)数据操纵语言:insert / update / delete
对数据起作用
****
Data Manipulation Language: DML
3)数据查询语言:select
****
Data Query Language: DQL
4)事务控制语句:commit / rollback
对DML操作确认
一、学习单表查询语句。
1.计算金额的四舍五入?
select ename, salary * 0.1234567 s1,
round(salary * 0.1234567, 2) s2,
round(salary * 0.1234567) s3,
trunc(salary * 0.1234567, 2) s4
from emp_ning;
round(数字, 小数点后的位数):四舍五入
如果没有第二个参数,默认是0.
trunc(数字,小数点后的位数):截取
如果没有第二个参数,默认是0.
2.Oracle中的日期
1)取系统时间的函数:sysdate
select sysdate from dual;
2)把时间数据按指定格式输出
select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss')
from dual;
select to_char(sysdate, 'year month dd day dy')
from dual;
to_char(日期数据,格式)
public String to_char(Date d, String style){
//SimpleDateFormat把d按照style的格式转变为字符串
return 字符串;
}
select to_char(sysdate, 'yyyy/mm/dd')
from dual;
yyyy: 四位数字年2011
year:全拼的年 twenty eleven
month: 全拼的月 november中文:11月
mm:两位数字月 11
mon:简拼的月 nov
dd:两位数字日
day:全拼的星期 tuesday
dy: 简拼的星期 tue
am: 上午/下午 am/pm
sqlplus中日期的默认格式是:DD-MON-RR
现在的时间是2011年
YY RR
05年 2005 2005
98年 2098 1998
假设现在的时间是1998年
05年 1905 2005
95年 1995 1995
insert into emp_ning(empno, ename, hiredate)
values(1012, 'amy', sysdate);
--实际入职时间是2011-10-10
insert into emp_ning(empno, ename, hiredate)
values(1012, 'amy', '10-OCT-11');
insert into emp_ning(empno, ename, hiredate)
values(1012, 'amy',
to_date('2011-10-10','yyyy-mm-dd'));
显示员工姓名和入职时间,显示格式为:
amy 2011-10-10
to_date
字符串 ---------> 日期
<---------
to_char
3.计算员工入职多少天?
select ename, hiredate, (sysdate - hiredate) days
from emp;
日期数据相减,得到两个日期之间的天数差。
不足一天用小数表示。
select ename, hiredate,
round(sysdate - hiredate) days
from emp;
4.计算员工入职多少个月?用整数表示。
select ename, hiredate,
months_between(sysdate, hiredate) months
from emp_ning;
select ename, hiredate,
round(months_between(sysdate, hiredate)) months
from emp_ning;
f3(f2(f1(p1,p2),p3),p4) : 函数的嵌套
5.计算员工的年终奖金
bonus不是null,发bonus的数字。
bonus是null,发salary * 0.5.
salary还是null, 100.
public double calculate(double bonus,
double salary,
double comm){
if (bonus != null) return bonus;
if (salary != null) return salary * 0.5;
return comm;
}
--返回参数列表中第一个非空数据
--最后一个参数通常是常量。
select ename, bonus, salary,
coalesce(bonus, salary*0.5, 100) bonus
from emp_ning;
6.根据员工的职位,计算加薪后的薪水数据:
Analyst: 10%
Programmer: 5%
clerk: 2%
其他职位:不变。
case语句:
select ename, salary, job,
case job when 'Analyst' then salary * 1.1
when 'Programmer' then salary * 1.05
when 'clerk' then salary * 1.02
else salary
end new_salary
from emp_ning;
select ename, salary, job,
decode(job, 'Analyst', salary * 1.1,
'Programmer', salary * 1.05,
'clerk', salary * 1.02,
salary) new_salary
from emp_ning;
7.薪水由低到高排序
select ename, salary from emp_ning
order by salary;
select ename, salary from emp_ning
order by salary desc;--倒序排列 descend
desc emp_ning; --查看表结构 describe
8.按入职时间排序,入职时间越早排在前面。
select ename, hiredate
from emp_ning
order by hiredate;
9.按部门排序,同一部门按薪水由高到低排序
select ename, deptno, salary
from emp_ning
order by deptno, salary desc;
10.员工表中有多少条记录?
select count(*) from emp_ning;
openlab帐户下有多少个表?
select count(*) from user_tables;
openlab帐户下有多少个名字中包含emp的表?
select count(*) from user_tables
where table_name like '%emp%';
--表名默认大写
select count(*) from user_tables
where table_name like '%EMP%';
--入职时间不是null的数据总数。
--count函数忽略空值。
select count(hiredate) from emp_ning;
11.计算员工的平均薪水和薪水总和是多少?
select avg(salary) avg_sal,
sum(salary) sum_sal
from emp_ning;
avg(salary) = sum(salary) / count(salary)
68500 / 10 = 6850
--纠正逻辑上的错误
select sum(salary)/count(*) avg_sal,
sum(salary) sum_sal
from emp_ning;
select avg(nvl(salary,0)) avg_sal,
sum(salary) sum_sal
from emp_ning;
12.计算员工的最高薪水和最低薪水
select max(salary) max_sal,
min(salary) min_sal
from emp_ning;
组函数:count / avg / sum / max / min 忽略空值
其中:avg / sum 针对数字的操作。
max / min 对所有数据类型都可以操作。
13.计算最早和最晚的员工入职时间。
select max(hiredate) max_hiredate,
min(hiredate) min_hiredate
from emp_ning;
14.按部门计算每个部门的最高和最低薪水分别是多少?
格式如下:
10 4500 3000
20 150008000
30 100005000
--group by 列名 : 表示按哪个列分组
select deptno, max(salary) max_s, min(salary) min_s
from emp_ning
group by deptno;
15.计算每个部门的薪水总和和平均薪水?
select deptno, sum(salary) sum_s,
avg(nvl(salary,0)) avg_s
from emp_ning
group by deptno;
16.每个部门的统计信息:格式如下:
deptno max_s min_s sum_s avg_s emp_num
10 10000 5000230006789 3
....
select deptno, max(salary) max_s,
min(salary) min_s,
sum(salary) sum_s,
avg(nvl(salary,0)) avg_s,
count(*) emp_num
from emp_ning
group by deptno;
select后出现的列,凡是没有被组函数处理的列,必须
出现在group by 短语中。
按职位分组,每个职位的最高、最低薪水和人数?
select job, max(salary) max_s,
min(salary) min_s,
count(*) emp_num
from emp_ning
group by job
order by emp_num;
17.平均薪水大于5000元的部门数据?
select deptno, avg(nvl(salary,0)) avg_s
from emp_ning
where deptno is not null
group by deptno
having avg(nvl(salary,0)) > 5000;
18.薪水总和大于20000元的部门数据?
select deptno, sum(salary) sum_s
from emp_ning
where deptno is not null
group by deptno
having sum(salary) > 20000;
19.哪些职位的人数超过2个人?
select job, count(*) emp_num
from emp_ning
where job is not null
group by job
having count(*) > 2
order by emp_num;
页:
[1]