该用户从未签到
|
SQL*Plus 7 O: n: N/ l, E* b b
sqlplus.exe 2 Y8 l/ r& `, G! n0 G* V0 o
& V5 P; Q* m, Z7 X9 {
1)数据定义语言:create / drop / alter / truncate3 d- I* n/ k( D# Z% o O7 s7 r4 g
对数据结构起作用。3 ]# M8 N9 r" Y& J
********
6 e' @ g% t/ Q" c pData Difinition Language: DDL
V$ _* x `3 {2 F1 B2)数据操纵语言:insert / update / delete8 s, g0 ]/ j! C/ Z: U8 R
对数据起作用
" {5 U% B! s) P5 q8 N; z. O ****4 ?( {4 `& |' h2 b4 A K3 L2 `
Data Manipulation Language: DML
6 X* ?+ P2 Q- S8 Q9 A3 T3)数据查询语言:select
! f3 w" t: N4 ?1 C! N( D* b ****( ]8 O* D* u- ^# T/ v/ r# T$ d
Data Query Language: DQL) E% r4 B' ~" h/ Y2 y# k% j
4)事务控制语句:commit / rollback' I ]- V$ @! x8 N7 ]) P
对DML操作确认5 X& a0 K/ k; g
: Y8 U) W+ @0 g, c
一、学习单表查询语句。
* Z2 F3 ?7 {* g' w1.计算金额的四舍五入?
( X' |8 c1 z3 A" N) e P( b* o4 B% Gselect ename, salary * 0.1234567 s1,
- r9 h8 E' v& b9 l% C6 Eround(salary * 0.1234567, 2) s2,2 o; t1 c& e( w
round(salary * 0.1234567) s3,( A( b5 m% y& V1 U' s6 C% |0 p
trunc(salary * 0.1234567, 2) s4- s' K* a# r9 f& ~ H7 `& V7 D0 u
from emp_ning;2 [5 U. | {0 J7 @( M8 X" ] ~
+ K3 d- n2 b i5 v% c* ~" `( C! i
round(数字, 小数点后的位数):四舍五入! s+ s+ m, ^* {
如果没有第二个参数,默认是0.
: { a2 E: K, B/ a# o1 |& z
$ O) w8 T+ n5 u7 C q5 _trunc(数字,小数点后的位数):截取
2 u) ~( W: n- v1 ?/ n1 o' p如果没有第二个参数,默认是0.. Y4 j- z E( C& n6 t; X
1 x* h2 Y" C1 A9 v& m8 A
2.Oracle中的日期2 J) C8 [) M. v0 t- m4 L
1)取系统时间的函数:sysdate
) H2 [9 U# J" Y: Bselect sysdate from dual;$ y, x2 w9 ~9 Y: |" W
. R# o% \1 ?" K# X2)把时间数据按指定格式输出
/ l6 Z0 {7 e5 _, R; ~2 H4 N1 tselect to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss')
: t0 |2 y0 G7 [/ {& }from dual;
! b: s" j y* Y V- G; f
6 k) x t( W; L/ ^select to_char(sysdate, 'year month dd day dy')$ R3 o4 G4 g% I4 Z8 w
from dual;
/ _* G0 F& ~. G5 _9 k7 ]4 d5 ~/ `1 A& M1 n I1 y- _
to_char(日期数据,格式)
4 ~5 F. A$ d4 J7 {. W6 z$ F" l# Q1 m. n( i5 h6 _+ O
public String to_char(Date d, String style){9 x" q& @1 F: d1 d# K# W# f- [, {- Z
//SimpleDateFormat把d按照style的格式转变为字符串2 `1 W7 y2 O, }) x$ B2 C6 }
return 字符串;$ l- ?. @1 ~- a
}
( [" m/ M" x( i \
( K4 K4 U: W0 C) ]: gselect to_char(sysdate, 'yyyy/mm/dd')
* |' [+ q/ n1 S5 e0 z/ k5 d+ q* efrom dual;
! q. J G7 P$ u0 f: m. H. i7 e9 ?$ D- t9 P
yyyy: 四位数字年 20115 _* Q. @$ C. a" m- V
year:全拼的年 twenty eleven
6 P* j/ N8 y8 x8 M7 r2 \month: 全拼的月 november 中文:11月% f, p6 J: ^' ~* y, Q
mm: 两位数字月 11
& O% ~; k7 M2 `: ^3 V2 A3 t3 Bmon:简拼的月 nov, ]- w' T5 ?6 T# C
dd:两位数字日
O& {3 y& i- }" d' \. Oday:全拼的星期 tuesday
% `. L. p9 S8 p: R5 F$ ^dy: 简拼的星期 tue6 D1 N" u- |+ H1 j l/ ~$ A
am: 上午/下午 am/pm
3 s* f" m8 R6 `) B" ^. ^& v: u
]% ?' M! q% T7 E: |sqlplus中日期的默认格式是:DD-MON-RR" W# S9 E$ n. P5 o
现在的时间是2011年4 Z. p( {9 g) q; I/ q% c% C4 M
YY RR) ~) ]9 \3 G- @
05年 2005 2005% S) s1 x: H9 l# U: ~
98年 2098 1998
. _) H, [2 v% d5 t% x6 g' t
2 w; \: i) F+ b4 G" Z k假设现在的时间是1998年
1 p0 |! O: n5 |9 Z; ~7 P3 V0 k05年 1905 2005
0 P% T! \/ @2 } n95年 1995 1995
! T @( ~/ E+ l+ k) ]2 c/ o. K! G# W4 X. `8 f7 u) }8 E8 U) q- T# N+ A
insert into emp_ning(empno, ename, hiredate)
9 C1 e9 m9 Q1 d$ V6 Hvalues(1012, 'amy', sysdate);& ~/ b; p. `& ]+ ]
--实际入职时间是2011-10-10. U$ h6 c0 u( s8 `- q
insert into emp_ning(empno, ename, hiredate)* o* r, f8 d1 Y2 u7 M2 P7 j
values(1012, 'amy', '10-OCT-11');
" }) F7 t. \. q5 H, H# \6 y4 `6 @9 M: t& k* s) @
insert into emp_ning(empno, ename, hiredate): {) M0 Q0 B1 f& Y! O8 p/ c
values(1012, 'amy', 6 R! K) h' J# |
to_date('2011-10-10','yyyy-mm-dd'));9 G8 B2 e9 K: g" e+ Z2 Y2 V: t5 u
! P! a' D5 ~ W2 N: z5 b0 X& B显示员工姓名和入职时间,显示格式为:: |# u1 m4 F2 [# ^; b$ G4 R
amy 2011-10-10- z2 F7 {* ?# B2 h
* ]9 f) N+ K) d; g* H7 H; I to_date% ]5 U2 Y- U6 P1 N
字符串 ---------> 日期: } T6 U, b& u
<---------
$ y/ Y3 ^. v( i4 }& z" h' n/ o to_char- ]+ n3 |0 }0 x" w. E
3 N* ?3 m3 m' o+ A+ ` }0 I* h' x
3.计算员工入职多少天?( _ R+ X. u8 } V' _
select ename, hiredate, (sysdate - hiredate) days
# p+ B7 A7 \3 s+ t& @( H4 |from emp;
# V: u0 E9 l% e5 i3 U- q+ \1 ?: {# f2 ?1 G9 f
日期数据相减,得到两个日期之间的天数差。
4 I3 p! O; G. X6 B" `4 C; f不足一天用小数表示。
1 G4 H0 }' ^9 q+ s3 | c1 v5 W6 \- |7 K- [6 o9 H
select ename, hiredate,
4 j5 A" O0 @* U% D0 Uround(sysdate - hiredate) days* `: k. Z: n" r+ a
from emp;
5 O) F7 V& `$ v% Z" K
1 Z5 Y( G K1 `/ ?( S5 `4.计算员工入职多少个月?用整数表示。! ?1 t, {9 q% r9 P6 ?
select ename, hiredate,7 |) B3 D( e9 F
months_between(sysdate, hiredate) months7 r7 X4 Z4 T9 k) y X$ h
from emp_ning;* s0 g- e; X+ k. Z
{2 A c2 c$ c+ I8 { b/ I
select ename, hiredate,
- N% `% H9 T, s9 _) r/ W; Oround(months_between(sysdate, hiredate)) months! N W# f6 u9 n* s# v: N1 e! F2 T
from emp_ning;
9 J5 ^+ K/ y. s
3 n+ Z6 {* A& m- g9 I4 Cf3(f2(f1(p1,p2),p3),p4) : 函数的嵌套3 |# ]: H/ K; z2 P/ V7 i
, w3 m8 f0 D, B4 S# E0 X) g5.计算员工的年终奖金* x" F- }% i# y1 `0 g
bonus不是null,发bonus的数字。1 y; y) x+ D- o% H# \
bonus是null,发salary * 0.5.7 ^8 V3 ?2 e5 |8 n+ s+ I* C
salary还是null, 100.
* |* n8 v3 t2 j& \, o K/ s( o( k( Z% d7 `2 t6 b
public double calculate(double bonus, , r# B1 S6 g5 i8 Q; |$ M
double salary,
9 Y6 p' H# w' h1 G) |3 F2 \, l double comm){ l- {" u) T, E
if (bonus != null) return bonus;
- U) |9 Y6 g1 ^* ? if (salary != null) return salary * 0.5;
$ g+ F7 g$ ]! a3 e' |0 c return comm;
% k1 e2 y @7 @2 u" U}
& Q/ {( Y6 g2 A" @1 v$ y" R--返回参数列表中第一个非空数据$ X4 ?" w# X) c0 ~8 M3 o
--最后一个参数通常是常量。
# U% ?% g( Q3 z9 |select ename, bonus, salary, 1 j5 \6 M, |, M! N! k* o1 S
coalesce(bonus, salary*0.5, 100) bonus9 P5 t; }# `% z' q2 w# s' |( A9 Q
from emp_ning;
: O m# E" v; @. T: [ T+ o. Q6 F0 @( z7 V8 A/ f9 W9 C0 m
6.根据员工的职位,计算加薪后的薪水数据:
2 X( g/ R; j" ~5 \" WAnalyst: 10%
( J0 \( c5 `+ O. @Programmer: 5%
; [5 @$ u( e3 {8 U9 Yclerk: 2%
+ q- }1 U" g5 R, ^5 E S其他职位:不变。' P, V6 Z& T" @7 H: ?8 W
1 J7 R# t& o8 ~, l+ \- Mcase语句:
% |9 \) ?4 e. R: _select ename, salary, job,1 l! f7 w5 F2 V: b' ?, S% h8 j
case job when 'Analyst' then salary * 1.1
, t4 S O/ ~0 x9 q; D: L" c when 'Programmer' then salary * 1.05
8 Z; P' B+ N% Z when 'clerk' then salary * 1.02- b3 G+ i+ y/ e2 t1 A# ]( X8 i
else salary2 [5 c% U( \* C) A4 D
end new_salary1 r# a1 y N1 ?" `+ [" X; k
from emp_ning;
" _( {$ ?$ N! W4 h4 ^ W
/ A6 c. F! p$ {8 ^* u4 Pselect ename, salary, job,
4 l+ \; P9 k1 L3 Kdecode(job, 'Analyst', salary * 1.1,
: u- I: W* M9 g8 D 'Programmer', salary * 1.05,! p! G( ~0 _) p/ f6 h' }
'clerk', salary * 1.02,
/ j5 V$ ^( X. R9 Z4 s3 P# M salary) new_salary
3 [$ x: R$ Z! A9 p8 Xfrom emp_ning;2 P" N3 V1 U7 V3 p+ i) J; ^6 i' S! Y
- g7 H9 A _7 U6 \, O7.薪水由低到高排序$ a2 d: D Q& H7 ]$ R% m7 e
select ename, salary from emp_ning
, m3 J6 r, i8 p8 } b' dorder by salary;
5 x8 M# x3 t, _0 X- M2 [$ R# K
\6 W3 ]* E: {' D; U) Yselect ename, salary from emp_ning
8 J* G+ k" R% s! V" L( ^; e3 T Iorder by salary desc; --倒序排列 descend
6 T/ q5 t6 S& X, l& ^( ?; b) F1 \- O9 X. @5 V6 k
desc emp_ning; --查看表结构 describe6 o) o+ M5 ?0 a, W) G
z3 m' ~8 k8 b Z" p" e' N: d5 r3 t8.按入职时间排序,入职时间越早排在前面。& A" x8 D: T5 `6 }4 k& w
select ename, hiredate' p$ ^$ {' D8 V. A3 m
from emp_ning
% F0 _. Q8 d2 D! vorder by hiredate;- B) r; e' E) W. M
S' e; f( F6 g$ Y A3 K0 t ?4 [
9.按部门排序,同一部门按薪水由高到低排序9 [7 @3 z. x% ]! F0 ?
select ename, deptno, salary0 u( P/ J2 _6 A. k0 n; x5 r
from emp_ning" ?0 v! g2 O7 ?/ q# s% u1 d+ L2 M# n
order by deptno, salary desc;
( }, k& F8 ~+ E# L( O8 _7 G/ T. b7 R. d
/ O& u! I; Y) V' C. B5 H10.员工表中有多少条记录?$ a+ X' @* w5 m5 O6 ?! Q+ L3 r( C
select count(*) from emp_ning;
1 {; @, S7 O: ~) J1 b" l0 @6 O/ a) c1 L# O$ }& O0 N
openlab帐户下有多少个表?
# {$ f. L' q6 Q! t( l m; M6 Mselect count(*) from user_tables;) _ q; X0 P! `
" F6 I: }! s9 ]% d: |openlab帐户下有多少个名字中包含emp的表?
/ K8 b3 J+ W% d! Oselect count(*) from user_tables
: u9 a+ t* r" |" U" y3 Iwhere table_name like '%emp%';, [& Z o* k& ^' u" y6 z' W/ L- u
& T) Q( G1 y9 k: d" Y1 M--表名默认大写
T9 N$ z4 @' @$ fselect count(*) from user_tables, ]6 R. z2 z" z% u" i
where table_name like '%EMP%';
8 O7 y/ G3 h1 F4 U8 G3 T0 p' x2 j
--入职时间不是null的数据总数。
4 w- y/ ?+ E/ c4 O% T c--count函数忽略空值。$ c% C0 Q) z* E/ f* n3 ^! e
select count(hiredate) from emp_ning;
; b' Q% ^) C; q; h' p+ d
% W1 u! O t3 X. C% B4 k11.计算员工的平均薪水和薪水总和是多少?
; ~5 h: k9 g1 o4 U. u# e! c9 pselect avg(salary) avg_sal, 2 A" n6 l; x8 Q }8 K+ S4 i3 e8 w
sum(salary) sum_sal4 j3 B$ g7 G- d2 B
from emp_ning;/ |: D) q, z4 ^2 c6 f6 O: X
+ h' n; a% T- G V% o7 p2 J9 ?avg(salary) = sum(salary) / count(salary)
- o; c5 _- f, L% X+ V: [" ^ 68500 / 10 = 6850. w, {6 p) O4 J& J) v
--纠正逻辑上的错误6 A3 {9 F- i- k6 y
select sum(salary)/count(*) avg_sal,
% y9 x) P% ~+ S; D- s C& r1 w! R sum(salary) sum_sal5 y4 T9 |1 n1 @3 M) ]! {
from emp_ning;( y7 v, q: y* @, K$ ^9 f
9 W; }, G2 @4 u9 r* C$ [! vselect avg(nvl(salary,0)) avg_sal,0 H: F0 \- w, _- `
sum(salary) sum_sal
# |7 c" u8 u- {* Wfrom emp_ning;
$ W9 Z+ d; |# B( y, I
2 m9 s4 T$ o, t, k5 t6 \12.计算员工的最高薪水和最低薪水2 Q1 X8 ^9 M5 d- K
select max(salary) max_sal,0 w7 V. @5 g; o1 h+ S+ V
min(salary) min_sal9 C+ S1 ]; a+ a' W
from emp_ning;
7 m' l- c3 @5 v
9 x `0 G. L E d, h2 S3 r3 P% o组函数:count / avg / sum / max / min 忽略空值! ?, B: \: y1 }# W0 m# B( X* |
其中:avg / sum 针对数字的操作。
2 @5 p6 y1 Q" Q- h' d max / min 对所有数据类型都可以操作。+ M" B9 b! G+ I- ^0 P* n- O
9 k$ x. A7 s' m: v! @* R13.计算最早和最晚的员工入职时间。
2 c i; n) q, p/ S0 Oselect max(hiredate) max_hiredate,
: \2 a/ ]+ t/ X) w* m min(hiredate) min_hiredate3 L- \ `; C. M" c
from emp_ning;
S& m) l( D* ^+ t
+ Q2 \6 d' h0 A! o8 @14.按部门计算每个部门的最高和最低薪水分别是多少?
% u( i! A Z! d* x& Y- H格式如下: `( t' U% k) q% ?+ J
10 4500 3000
! L0 ]( ]; _( [- I# {20 15000 8000
2 Q# |# e" S1 u3 H3 e6 F# V8 b30 10000 50001 x9 x% S) \( w, z- H/ `, V
# V3 n& q$ l' E) L" W9 G. N
--group by 列名 : 表示按哪个列分组5 ?2 h: ^( q. }7 d/ o* Z h) W
select deptno, max(salary) max_s, min(salary) min_s
$ j0 T6 U5 }+ W; S7 M1 I# ` sfrom emp_ning
- m3 d) r/ O% {) Hgroup by deptno;
; C; Z& Y: B, G w
4 ]2 D6 ^3 ?8 J& T15.计算每个部门的薪水总和和平均薪水?; K* x7 I p, X2 G6 _. }
select deptno, sum(salary) sum_s,
! d0 A( U+ X7 d avg(nvl(salary,0)) avg_s
+ A$ u/ K4 n, O1 m/ Y% Yfrom emp_ning: V* t0 T& C+ _3 A- g! D
group by deptno;
- ^. l6 J: o: N/ ~: t
4 f$ d5 G9 u9 {+ j1 H; ?16.每个部门的统计信息:格式如下:4 s" o" V7 e$ x( w
deptno max_s min_s sum_s avg_s emp_num4 c1 _( a1 M. q, w' W- H
10 10000 5000 23000 6789 3( H0 u6 S2 U8 c$ ~! ]- Q
...." r6 f! n) D- b+ V& B2 y. F1 {
select deptno, max(salary) max_s,
; X1 c5 `7 }/ q# g6 e min(salary) min_s,2 o# t2 m$ I; Y; M7 m' I
sum(salary) sum_s,) C8 G# E' g4 F0 \ C3 H
avg(nvl(salary,0)) avg_s,; R q6 {0 `1 n h5 A
count(*) emp_num
# ?: ]- v& Q$ Zfrom emp_ning
3 Y5 _2 R* ^) i9 t1 z% g7 X' xgroup by deptno;) f* f& `& ?. i( M
! e% f6 `. ^* f
select后出现的列,凡是没有被组函数处理的列,必须* R) k5 ~$ e. X4 B. x
出现在group by 短语中。
- F2 ^" b0 r+ l% m+ S1 W
3 K3 |; a9 h2 _, v+ |- P4 k按职位分组,每个职位的最高、最低薪水和人数?
9 ^4 d4 |) s- E8 Aselect job, max(salary) max_s,- o6 d8 |7 D; A
min(salary) min_s,
) n! S: _8 A2 w, G# L: l% _7 J count(*) emp_num; P* d' Q$ u- `" ^9 m+ b
from emp_ning" o3 z3 }/ T9 m+ v" E" s" U
group by job
1 v" \" C X) C6 [/ p- b2 x( \8 @order by emp_num;8 s9 a5 ~, i/ ?! Z2 D! S% j% g' Y/ x
17.平均薪水大于5000元的部门数据?
: L |9 _3 G S) V/ aselect deptno, avg(nvl(salary,0)) avg_s
" U9 z8 @, ^7 ffrom emp_ning
\) ~" e" T/ Qwhere deptno is not null$ k4 k( h: J0 T Y% k3 X
group by deptno
2 E2 R$ g! ]- U2 xhaving avg(nvl(salary,0)) > 5000;6 u2 }/ W* a, [( Y, I
: Q: P2 v6 _9 }8 T; u18.薪水总和大于20000元的部门数据?
* D; c W5 J( K9 \! vselect deptno, sum(salary) sum_s; g# q A' ^0 ]% L
from emp_ning! i- y7 u, y/ Z8 F( R6 I# n+ Q% v
where deptno is not null, F" x5 y0 q( f7 S- s" q+ _4 p
group by deptno
/ L- |; I4 x: o0 ~; B8 Z# v6 Nhaving sum(salary) > 20000;
% z z3 g! }5 h- s# y& g# T5 ]6 J' n( r7 {" K+ U5 o: b$ i
19.哪些职位的人数超过2个人?
& i" i# Y0 [$ X* vselect job, count(*) emp_num( }: v- E! p, ^ l1 s
from emp_ning
4 U; }' p, B1 i) I* gwhere job is not null
2 p+ A0 w/ G# r xgroup by job
0 k; {3 d3 g& t2 k8 S7 L' a5 Khaving count(*) > 2
, K& J5 x9 B }9 R1 \( f5 worder by emp_num;+ J/ w+ p* m- H8 q; Z0 ~
' F9 N+ e& U a2 ?# Z
|
|