该用户从未签到
|
SQL*Plus
9 l7 `5 D8 ~& f, P4 L u& a4 Qsqlplus.exe + i% k! L$ J; Q9 P6 q
1 c* w5 L" [, g5 [* i1)数据定义语言:create / drop / alter / truncate
) J2 y7 Z! r. e8 Y, \& G2 i对数据结构起作用。
# p+ b3 l5 t! Z$ f( M2 D$ _' U3 ` ********5 f9 n3 C' Q, m2 y
Data Difinition Language: DDL
/ K$ P) ?- Y# C7 E, J: V2)数据操纵语言:insert / update / delete* H7 ]" S/ R: ~+ q' e# u# j5 |7 e
对数据起作用1 C4 K, H% w) ~3 u7 t+ h
****
; h1 Q! ?4 Q0 [8 r" D; _Data Manipulation Language: DML
. r$ z0 M! H" S+ X6 f# y+ E3)数据查询语言:select* _* G5 i2 r$ R
****$ w0 h0 f0 Y0 {
Data Query Language: DQL
& z2 H9 l1 h. W- m# Q' E4)事务控制语句:commit / rollback t+ W0 U( x6 `) K' l) w4 U7 z
对DML操作确认! q( Q( p( F* A3 y( H
" @+ O2 @4 V3 [9 u/ u; ]6 _% w4 f. o5 ~
一、学习单表查询语句。/ q3 X' R+ ^1 h. y7 S) |& O9 S8 y
1.计算金额的四舍五入?2 _9 Q* V" a2 U
select ename, salary * 0.1234567 s1,
2 A4 R5 R' X- f8 h) r4 z3 Bround(salary * 0.1234567, 2) s2,
- s# n9 s* z& ~( v. E. Y) Pround(salary * 0.1234567) s3,
# f5 `, v2 Q4 N& C2 Vtrunc(salary * 0.1234567, 2) s49 y" D2 D: I# E+ s f
from emp_ning;' n) t1 F' r+ K% J. T* w
0 \! C- V2 J/ `
round(数字, 小数点后的位数):四舍五入
$ }, O9 P3 i' d- Q. A8 F2 W如果没有第二个参数,默认是0. V$ L# w' q6 O+ a* l0 V
$ o0 X- T9 B4 I& w
trunc(数字,小数点后的位数):截取
1 y4 m' N- N' J" U4 E! n如果没有第二个参数,默认是0.
- ?% B- K+ g* G$ d% F6 F$ [& p6 N) l/ P. `; B8 t
2.Oracle中的日期
, Y7 \4 o: Y* t( y* E1 r5 p5 i1)取系统时间的函数:sysdate
+ J: F1 j4 m; N! q( X0 n, vselect sysdate from dual;
& ~" y4 h7 z: _" x$ F
. J* y; P' y4 H, F2)把时间数据按指定格式输出
6 [' i, c) _: d; kselect to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss')
: O* P7 t, b( p! v X* U. }, bfrom dual;& l) C9 L9 M2 e0 R& O
1 g- a( S7 I0 N4 x; G' p/ fselect to_char(sysdate, 'year month dd day dy')% D7 m; o Z0 Z' E) R0 e8 H8 h$ [
from dual;
( @. q! S7 k7 q& p @
8 _, g( I! b( f9 ?0 u# H) o. B! Xto_char(日期数据,格式)" c5 c' E/ r- d( e# G- e i
$ v0 Q9 G" @) N3 i2 e+ }: L8 Hpublic String to_char(Date d, String style){; T, M% f4 L1 o
//SimpleDateFormat把d按照style的格式转变为字符串
8 w: v( |: R; v/ d& }6 u* B5 b8 T return 字符串;
. \! m! c# x! d}
5 i9 j/ ?7 c. k! a7 ?$ S% g- a5 }$ Z) h/ h2 p
select to_char(sysdate, 'yyyy/mm/dd')3 j6 g6 F. b# F5 s- B) \* S
from dual;
" ~8 c' e3 E: I* w- V
) l$ M+ L! F8 R! @6 T+ C4 myyyy: 四位数字年 20116 i; d/ `+ F; A
year:全拼的年 twenty eleven% h: k) p2 N! c! g" d* O
month: 全拼的月 november 中文:11月
! f- f% b0 P6 Z/ W, w- Emm: 两位数字月 11
9 }3 J( `! d+ F! O: ]mon:简拼的月 nov
$ |+ z# z0 w" Sdd:两位数字日
- a- C( a5 ?. E# p) V7 b' ]3 uday:全拼的星期 tuesday* n! o% M0 p& I9 \6 s9 s
dy: 简拼的星期 tue
" t3 o0 g" u: n; u6 y% }0 Eam: 上午/下午 am/pm1 g( o& X0 { U$ H9 h0 X) W1 |
' G0 R, j, v5 A% v0 B wsqlplus中日期的默认格式是:DD-MON-RR
1 \) c: R: q; L5 e现在的时间是2011年
4 t# E, e- a5 ^* B! X YY RR7 A2 G+ n ]& M: w6 t
05年 2005 20056 ~: h% B `$ \6 g% H4 S* c
98年 2098 19984 `. a* A/ u5 P5 f' w5 A2 X# S
2 T6 P7 \- h' O$ q* X) }! H }
假设现在的时间是1998年
2 o* J0 y. _$ U05年 1905 20052 ~5 o' h( a' Y5 v" @
95年 1995 1995
- J( z/ B) h, b8 [
8 F9 K' R" Z0 E! pinsert into emp_ning(empno, ename, hiredate)
( h6 b! W/ a- F$ Pvalues(1012, 'amy', sysdate);. g7 ?+ m% d4 |( T4 I
--实际入职时间是2011-10-10
5 R: P4 f' y# B- L5 g3 n) ]insert into emp_ning(empno, ename, hiredate)
: F. g/ ~7 T3 Dvalues(1012, 'amy', '10-OCT-11');1 @ z7 l" B# I* m# L: z( u
( \% r% I* V4 Linsert into emp_ning(empno, ename, hiredate)6 ?5 r' y% S: I/ Y
values(1012, 'amy',
) B& [) |6 |( a- f0 ^to_date('2011-10-10','yyyy-mm-dd'));% U, A0 I7 H1 Q- x5 H% S t/ q) d" ]
- u# _: q5 b, W/ ]% w
显示员工姓名和入职时间,显示格式为:. [" h' S' B& t
amy 2011-10-10
8 C* ?0 P' ]( Y8 r; J5 m
+ D, v3 R, s& |$ B' t% l to_date, A+ i9 m6 T/ J( M, m1 J9 D
字符串 ---------> 日期; Z# ?" \: l$ }5 u4 n5 [# `
<---------
) B7 R4 q% w/ H3 K/ {5 R to_char7 ]8 |; o: ^1 l$ p7 o; U4 W
5 Z8 x) [# y) ?; M1 o4 W3 {, b0 M
3.计算员工入职多少天?
. s& a* u4 `; J7 T" L1 K* Gselect ename, hiredate, (sysdate - hiredate) days; L7 M; q0 i8 \' s
from emp;
^2 e: ~. K0 c5 E. u1 n, @6 C
0 P+ \2 b& L I6 K5 V, J6 O日期数据相减,得到两个日期之间的天数差。' Z. w% x0 X( P' q5 F
不足一天用小数表示。2 Z7 A6 }9 [. V5 l7 E$ |0 D( o# _
+ _: b, @+ }& Lselect ename, hiredate, + W. _8 N: n1 S7 W9 ~. V6 K
round(sysdate - hiredate) days; n/ [8 j: q \3 w8 |/ y
from emp;4 l" Y) ?: X8 i
2 M& R4 N) \2 B5 U6 f+ l4 o4.计算员工入职多少个月?用整数表示。
" i% H- d. M; v# G/ l% f7 Nselect ename, hiredate,
0 E7 |3 Y8 \( t: o2 T# ?: B1 W# j0 y1 Emonths_between(sysdate, hiredate) months
% e3 O+ ?7 H) E3 lfrom emp_ning;
% m$ ?% @0 o* T+ V
, A9 i% }2 s. B0 v; h6 Kselect ename, hiredate,& z, o- Q* j2 p& ^
round(months_between(sysdate, hiredate)) months' ^( Y, R/ }% \+ z- W6 l8 C# ~
from emp_ning;! X3 ?' a$ y+ }" Y: Z: s y
0 d0 h6 V0 i& I* P: K( ~+ b% D5 t& tf3(f2(f1(p1,p2),p3),p4) : 函数的嵌套
" h5 A& Z7 y# |6 `! |. u5 {
+ _+ K- r& T i0 N: X1 s5 I6 R5.计算员工的年终奖金# K& u. b y4 r f7 ~& }6 B
bonus不是null,发bonus的数字。
, L+ L/ D6 p: i: R8 C) n4 m8 T/ `bonus是null,发salary * 0.5.
7 T) G1 t' Q; [- H: t zsalary还是null, 100.
+ g0 L3 p3 W- J- _' w/ _4 o
3 w: _' Q5 {4 }) H) p' O: k& bpublic double calculate(double bonus,
! S/ G& q2 m* g% E& \ double salary,7 x w/ b. H* ?0 w7 w% _
double comm){6 g. D# m. Z* r& b7 T8 p" ]
if (bonus != null) return bonus;9 O! g) F8 S+ Y
if (salary != null) return salary * 0.5;4 `9 |4 x+ G0 V( n0 N+ Z1 r2 a9 Q
return comm;
* j7 ]. G8 Z8 C' t5 P1 ?; N}7 h7 c4 V. B3 d
--返回参数列表中第一个非空数据. f1 N& K4 V5 Z* G
--最后一个参数通常是常量。
7 N: [* G# ~6 z6 g" C( Y& wselect ename, bonus, salary, 8 v' D, n' P8 k4 L" u6 t/ i# D
coalesce(bonus, salary*0.5, 100) bonus
m0 y% A+ ~! d1 a9 Lfrom emp_ning;9 K5 l3 Z: y0 w! e, o& v
! v( E8 |- m# @8 r9 }1 V( a. g, n5 U0 q6.根据员工的职位,计算加薪后的薪水数据:3 ~! D! i' f9 M, ?% `8 s: p
Analyst: 10%
8 Z& \- p& [2 N6 L+ y* e& j) O2 ]9 B! DProgrammer: 5%
; ]/ n9 K# d4 P" D) lclerk: 2%; B! ?0 }0 j* v
其他职位:不变。6 |* C" R3 z" f" `) [
4 {* U* ?* _! b
case语句:, z4 ]/ Y' t4 x5 D4 j3 Z" p+ g$ B
select ename, salary, job,
6 U2 U8 ?( H4 ?+ v9 `, `! Xcase job when 'Analyst' then salary * 1.1
7 M" Z0 Z* A4 `9 {" T when 'Programmer' then salary * 1.05
% A* D2 R& |; e2 w0 W- e7 i when 'clerk' then salary * 1.02" q [7 h# N& M1 @) J" @# l6 M
else salary
/ C% t' }6 \' Z# L. aend new_salary
- O' A+ M1 w$ X+ O. }1 zfrom emp_ning;
& \: K9 ^+ A2 E8 ^0 |' s$ \
! Y% g J J+ {- X% M8 L% Eselect ename, salary, job,7 V( B& E4 N6 u0 G' [6 ]9 g0 d
decode(job, 'Analyst', salary * 1.1,3 H& N: I: w5 |+ j
'Programmer', salary * 1.05,
- X/ x+ V* u6 I9 ^. ^ 'clerk', salary * 1.02,2 ~8 P& x: ]$ ]! A0 q) d" k
salary) new_salary
+ o' g! V A- z0 f7 s8 Y. sfrom emp_ning;
2 k' U8 @" U H( z( |7 J9 C. P! i9 s- c3 _6 j% Q5 Z
7.薪水由低到高排序
( |& x9 i* n0 I: w$ `2 ~' L6 sselect ename, salary from emp_ning4 s* y6 j0 Q; ~ Q
order by salary;1 y" @/ C; B# i9 Q( I$ Q" S
1 W2 y, d/ ^# F5 h7 u
select ename, salary from emp_ning# M/ l' M( L- F
order by salary desc; --倒序排列 descend
1 L2 s# [; @) m: O8 O
1 ~% @$ L7 p/ ?# [" ^desc emp_ning; --查看表结构 describe2 V0 T! W1 x9 c: N/ l7 \& q
. K' {; y9 H: \( k6 |6 h8.按入职时间排序,入职时间越早排在前面。
5 c/ W& Y# k" G7 K3 O( W1 J, dselect ename, hiredate) O& Y l- C" i _3 S+ O' c" N
from emp_ning
9 H8 p; |# K: a6 J3 jorder by hiredate;
7 h# \1 U0 [) s" z0 Z1 K. _- a# Q- o3 k. l; c9 N
9.按部门排序,同一部门按薪水由高到低排序
- G/ p1 x# X e O. Eselect ename, deptno, salary) g. w3 b2 i$ \6 c, ]* ^
from emp_ning6 _( z1 l9 l- ]6 f
order by deptno, salary desc;
4 c1 F c$ J- w7 x3 O$ Z' n) Q& G' g+ D, e8 s" u0 x" U4 x; U- D
10.员工表中有多少条记录?/ |) s) {! u$ d' J; w
select count(*) from emp_ning;
, J4 m% }& A0 m Q( y" C
; ~7 f7 Z& a/ J: j" yopenlab帐户下有多少个表?& s% x. A+ G J4 m- ?
select count(*) from user_tables;3 E* L. {" ~) k6 O* Q
2 R$ I# l, o: x& iopenlab帐户下有多少个名字中包含emp的表?
) e: m ^" ~) ^& } Kselect count(*) from user_tables7 \1 R! @" Q2 G8 Y& ~
where table_name like '%emp%';5 ^- Z* h/ J( R. M
' }$ g/ a' o, ^) B% a--表名默认大写# G8 S8 ]% |0 w1 l
select count(*) from user_tables8 E: [9 j9 E* R3 z% H
where table_name like '%EMP%';/ l7 p" ?+ ]* q
, L# y# y7 u% C. ?1 u) w& w--入职时间不是null的数据总数。
0 T: `; s5 U0 M* w--count函数忽略空值。
w6 u. _. U- f, p- Lselect count(hiredate) from emp_ning;9 T7 U$ \ l, k, K' o. R$ w- U0 k8 s
- d0 H# |" ^4 d) H4 r( T11.计算员工的平均薪水和薪水总和是多少?! v/ W* a8 Z. ]8 O# k0 M1 B
select avg(salary) avg_sal, 3 @5 L" }- O! O [: {2 h6 `5 r
sum(salary) sum_sal% z4 }- b6 E7 u6 N# S9 I
from emp_ning;
3 L6 V9 D$ R j& K
$ h% D k6 t3 \avg(salary) = sum(salary) / count(salary)
( [# L0 d0 z% Y ]; S 68500 / 10 = 6850
; u! }0 L1 x. w: I W5 _, j--纠正逻辑上的错误
" O0 ]& e0 j5 I. n4 H" @& s. Pselect sum(salary)/count(*) avg_sal,
1 X* S0 X: b. Y sum(salary) sum_sal
+ ], w% B& n$ efrom emp_ning;
0 E4 t3 i3 J) V- ]
- _" ]7 H2 W5 b) Z9 J# Gselect avg(nvl(salary,0)) avg_sal,) E) ` E8 w; J2 |; }. W6 F
sum(salary) sum_sal+ k0 j$ }4 ~2 m5 t. V
from emp_ning;; r( {1 P9 i: m( x( E
! e% O( s7 A! `5 o/ o7 ^
12.计算员工的最高薪水和最低薪水1 w0 U- I2 Q" D$ P+ M
select max(salary) max_sal,# W; O/ J% K: n* Y& a+ G* m
min(salary) min_sal* j$ S' [! Y& T! d+ W( k
from emp_ning;
4 Q! n Y% `- N1 h" P" z( E
6 \2 L9 T$ _6 d组函数:count / avg / sum / max / min 忽略空值
8 S0 e- U0 @" G" v' x其中:avg / sum 针对数字的操作。( p- k% W) @0 s+ X: M' y, Z# W
max / min 对所有数据类型都可以操作。
M, m$ h, _0 |# f; _! Z0 t6 G% v8 z- j
13.计算最早和最晚的员工入职时间。
5 Z) q, {$ D% uselect max(hiredate) max_hiredate,
7 f- G" B2 n; E/ ?7 @ min(hiredate) min_hiredate8 C3 f5 u! C0 }5 Z
from emp_ning;
( r( w4 F- l9 n% Q/ ]; |4 }8 M a0 g* t
14.按部门计算每个部门的最高和最低薪水分别是多少?
. l8 @: q* N; l/ J+ M8 ]. U格式如下:
2 D5 T, W, |- i& {10 4500 3000/ `; u8 Q% q1 z7 d5 P3 G
20 15000 8000* N1 ]. M$ s* z# `
30 10000 5000
8 J. r" c: A6 F) P
7 }+ S/ ^1 u3 ^* b( [7 X, J3 J--group by 列名 : 表示按哪个列分组
7 c6 d/ [6 m6 |. Sselect deptno, max(salary) max_s, min(salary) min_s H7 u7 c- _( b: R5 w$ [: m* j. b
from emp_ning
( A1 Q6 D, ?3 s9 k$ @4 ?group by deptno;4 F: ]3 ^4 U6 X1 ]: n
c0 d$ W8 e! l; Y0 y
15.计算每个部门的薪水总和和平均薪水?
5 ^7 O7 z) r8 ^! f# y6 @! Bselect deptno, sum(salary) sum_s,
) O4 G- `* H3 k/ `% J avg(nvl(salary,0)) avg_s" d9 P n, i5 w P) {9 J: k d
from emp_ning
5 X" G) o0 P/ g9 D8 V3 E! ggroup by deptno;, d5 Q" a0 c6 e2 M% V' W0 L
( b, E: V7 `4 b/ o/ _& Z
16.每个部门的统计信息:格式如下:" y/ u) V* U/ C1 Z- M7 S; H# G
deptno max_s min_s sum_s avg_s emp_num
4 i# ^/ `* G# s: b& i2 l4 n' @10 10000 5000 23000 6789 3- U* \* c4 J- K$ @, I# S
....
6 E5 B, J/ w# |7 Uselect deptno, max(salary) max_s,
% |3 _- m5 r+ V) {5 @# F min(salary) min_s,1 g/ t+ d# g) e
sum(salary) sum_s,
' f6 r* w |: C8 I" y" `5 ^ avg(nvl(salary,0)) avg_s,
8 b: c1 T+ q4 A% ` count(*) emp_num9 } f3 E# Y% M, @5 u& G* I
from emp_ning
) \: o* k ? t) K1 @6 Tgroup by deptno;* O% h/ p- [9 i( S# a. R# D
?, N6 e. @8 I. t4 C3 Fselect后出现的列,凡是没有被组函数处理的列,必须
9 B! P3 D' D- t1 f2 z0 f出现在group by 短语中。
& F0 T9 d+ P& f- N& r+ ~9 A# z# D) Y3 p
按职位分组,每个职位的最高、最低薪水和人数?9 n5 {% r8 v: }$ y2 {/ l7 C
select job, max(salary) max_s,
' w8 Q4 X* E5 q min(salary) min_s,+ t- V& K( B6 s* e/ L% X
count(*) emp_num
8 ?5 ? }3 F, @from emp_ning, z% h( g+ Q$ j# K
group by job
+ v' F v5 C3 W; ?8 B7 corder by emp_num;2 _( I' h- T6 @$ t' Z$ l2 T
17.平均薪水大于5000元的部门数据?
$ ]1 r: X+ o) Sselect deptno, avg(nvl(salary,0)) avg_s5 n/ T" U1 j* G7 ~5 Q( r, F/ q
from emp_ning
; G0 ~! X( M, T, M D# Q% {where deptno is not null
5 z+ @1 H0 y1 I, {; E+ Dgroup by deptno ?1 b9 }* \' M }4 Y' X
having avg(nvl(salary,0)) > 5000;
; [2 l6 q0 Z# |6 v6 y9 d1 \- n( l, w% `4 O7 s/ _: I
18.薪水总和大于20000元的部门数据?9 I' i* |( ?" I* i6 f8 J; H) V
select deptno, sum(salary) sum_s
, [( m$ M, u; g3 s+ h7 q+ pfrom emp_ning
; p: U' b- o) l; Z" c7 N4 k5 Pwhere deptno is not null
! J0 d5 v$ R, H9 Pgroup by deptno- w) V/ A1 J0 g7 }8 j) E
having sum(salary) > 20000;7 ?% b' P, k2 v4 y; G F
- L7 a+ @4 s5 g# G19.哪些职位的人数超过2个人?
7 J) z$ s, }2 q# a" ?* d' f( kselect job, count(*) emp_num
- b, ~- U6 @. `from emp_ning
5 R- D$ _& D! l5 i) K8 ^- Pwhere job is not null
) e' @2 l9 J, G# cgroup by job1 B6 s1 w( P8 D
having count(*) > 2
- d O$ w9 }& O- M" S5 O; Xorder by emp_num; p- u& U! p7 U# G V. @
' `% P& M$ {/ t |
|