|
该用户从未签到
|
复习:
2 o8 @3 k! c5 o. v$ c7 |1.查询语句的基本格式。
3 h* B2 A8 c3 fselect ...
( O+ K2 `1 @' B) J; }from 表名
4 }* ]3 F# h0 A/ U0 A% Zwhere 条件
) ]# ~% j x9 k# f6 T4 a! i' a' w0 e: Mgroup by 列名
9 b* t' z1 \& {1 nhaving 带组函数的条件
, L6 d8 l9 ~7 l+ e. [order by 列名3 W( t3 d" E( @7 M" F
0 M9 F6 h5 z/ u" m* p& k2.函数
4 o. L' m. o& a% p: J& D: N1)组函数:count / avg / sum / max / min9 z9 l# {0 X/ a# K( F
0 h6 Y: Q- ]$ ^0 n1 \. L" g1 _1 @2)单行函数:
3 z3 F& {( M$ j7 m: ya.字符函数:upper / lower / initcap0 x9 n: c9 v g9 y
length / lpad / rpad
7 @' O, N( v- k' ^. b W
$ ~" [2 ^) ~: ~# [5 | l : left ; r: right
0 d. C1 ?/ s3 m3 {
1 D$ m$ m% U1 m6 aselect rpad(ename, 10, '*') from emp_ning;
7 B. J7 W& l, d, Z6 C! s) D: W2 v l3 t4 N5 h
b.数字函数: round / trunc / mod
3 ]8 u! Q5 |) c$ V6 d( Xselect mod(salary, 1000) from emp_ning;6 V9 h C# q6 K/ e- k4 T" H! |9 m
& _2 D9 O' G: S& {- l
c.日期函数: months_between / add_months / : [' d' ?! \0 v+ W; O: y k6 k: Z
last_day(sysdate); h- Q) c! b0 O$ B8 @
* `7 v" \/ x' V+ o [# T
d.转换函数: to_char / to_date / to_number( c0 _9 C8 z& U: f6 i5 B
" |- Y0 W& `2 x, L
to_char to_number* p2 C& Y" M) G7 Z3 l
日期 ---------> 字符 ---------->数字
, |, |! e1 Z' @' m3 h <--------- <---------" R; t) R) o8 @8 f5 A! M
to_date to_char
: ?: t8 m7 _, H0 t, b5 p" J$ X* W3 k. p- j* v8 q
( H/ J: I, W5 u `5 v where password = '1234' and id = '1001'
" [# F! u) P$ }/ X* Y
+ k# y7 Q# o2 k3 G select to_number('$7,912,345.67','$9,999,999.99')3 n( x4 o4 n/ G0 M& j
from dual;3 \5 l4 e& Q6 G' `7 h% `+ F
9 ]4 o& {+ e, D i& F7912345.671 a! K; h+ ]& k- y/ k
: l/ _. }. f3 |. [# Dselect to_char(7912345.67, '$9,999,999.99')2 s% e/ w, U( d4 e
from dual;, `7 x& L6 @7 A7 Z( |1 D* | M2 u& D
6 C5 b. N4 e* s
$7,912,345.67" @3 C( t7 z( W" j) Y8 R
6 X5 K W: P' I: I
e.通用函数:nvl / coalesce / decode
, e2 ]: Q, i8 K
' `2 W4 |# v8 u* b使用频率比较高的单行函数:
3 I% ^6 k# i& d8 Y7 Rupper / round / to_char / to_date / nvl
/ H4 S; V; U U# U/ K h0 d% C% q. V( X4 D" a l
8 W; h, X3 ^+ [7 b一、子查询/ h5 ?+ @$ }* `' D. p
1.谁的薪水比张无忌高?
* I, B2 j" u$ ]子查询1 |. b' m7 {. X
select salary from emp_ning# ?- l9 q: H- E. U/ i
where ename = '张无忌';
1 Q$ d u" C' h+ [& M" N) m+ c; Q, a' ~ n9 T" i0 b" J
10000
( l6 e# T7 \0 z: z/ Z4 O* h& X6 S
主查询8 n8 t( S8 q1 O
select ename from emp_ning1 d1 ~# q$ [" [9 Z' h0 T2 q! A
where salary > 10000;4 g! g4 n/ \" j
: z/ s, \, [6 @2 T张三丰2 `3 o) C r) K, j0 O# l
. @* x' u0 c( q9 o合并到一条SQL语句:
' y4 D" q2 `+ c1 Q3 Gselect ename from emp_ning# F' T+ o. s( P. ~8 t
where salary > (select salary from emp_ning
) v( ?5 M+ p; [7 g where ename = '张无忌');6 W6 w, G9 i+ B! b: ?' W0 c
h% D5 X( ?# F7 y8 s1 q( r> < >= <= = <>: 单行比较运算符,
2 E1 T" ]; N+ d3 ^只能和一个数字比较。
, P! o# f# D$ M) p5 u3 w' `" p
5 ^9 J$ z4 O: ~insert into emp_ning(empno, ename, salary)7 T7 `% }- m: J4 H- Q
values(1014, '张无忌', 8000);
& C' D) [7 U D' q8 G& K
. x" [3 }0 Y7 U6 `8 t谁的薪水比所有叫张无忌的人的薪水都高?大于最大
8 U8 w% d: ]7 E10000% H- C$ B+ K4 B, e6 D6 n
8000
# x' W& v: d7 U) g3 F& l6 t; {
- n. M X0 W+ j3 X; _- ?9 Uselect ename from emp_ning6 B$ X# ^: h, R) c3 {: u# R
where salary > ALL(select salary from emp_ning( @/ h' s8 v4 Y3 ]# {* N6 U/ ?
where ename = '张无忌');
z2 t- V, u: ]& g3 x. A$ _
o) g# W6 F/ A* y1 E* p哪些人的薪水比任何一个叫张无忌的人高都行?大于最小; e- X! Z G' G& A9 Q% [$ _1 s9 s
10000
2 L" k# f2 o. c" x7 E8000) G% d( E3 C( f% s, g+ S5 ^7 T
3 q/ m; `4 J q; q8 _
select ename from emp_ning) Q* ^3 O: T+ m/ r! l
where salary > ANY(select salary from emp_ning* U3 w8 z# w& X; ]
where ename = '张无忌');
) r8 Z1 E) e8 G0 L6 b% j* ]6 v/ M5 M6 F# d* S: e/ d, B
2.谁和刘苍松同部门?列出除了刘苍松之外的员工名字。$ i2 e1 {5 L% H6 R+ K
select deptno from emp_ning
- h* `4 t; t+ {# uwhere ename = '刘苍松';
: Q1 l& O4 y- o: Q10
# h2 ]( b% ^3 j5 _
7 \* ?: Q" i4 t" e( O" k2 |; ~select ename from emp_ning3 v1 ^) J2 Q( Z1 S+ F, @
where deptno = 106 ]- b, g" } _* [# T
and ename <> '刘苍松';" V" k# b+ I% o1 v% u; Q
+ s: N, r I* E* t; Y1 V5 X% W% I
select ename,salary,job + l h# `" F6 k+ N/ C' E1 V
from emp_ning
0 T, [$ g& p0 J- H* jwhere deptno = (select deptno from emp_ning# j1 @. L$ T) ^( L$ o
where ename = '刘苍松')3 Y! E& j8 [" D% q, d$ _* W
and ename <> '刘苍松';
3 O1 k6 Z3 W/ f2 n& h
+ I8 [- }2 P# f2 d) r& t--如果子查询得到的结果是多个,不能使用单行比较运算符7 S9 M& v0 ^ Q K0 }
等号。改为:in& c k& i- t1 j, f2 p
insert into emp_ning(empno, ename, deptno)" o" D3 V$ {2 P3 z7 Y: R2 _
values(1015, '刘苍松', 20);: G$ E: L- E7 J9 W; ~% L( P
7 }1 ]4 R& r2 H# w+ T1 z; Zselect ename,salary,job,deptno
, g/ G: @) s! U7 W- Afrom emp_ning9 T4 t- H6 N$ w" ~4 H1 n: M% w" V
where deptno in (select deptno from emp_ning8 Y `1 \% {: u
where ename = '刘苍松')
5 K! P* S3 I% L! c: C1 Oand ename <> '刘苍松';9 v! N+ a/ w8 k3 @; l* Z4 j& T
4 }8 Q2 r0 e: x# O p根据子查询返回的结果的行数:4 ] j$ F- }# ~7 K! o
返回一行:> < >= <= = <>
* Z6 E& h; O0 @* y返回多行:>ALL >ANY <ALL <ANY in
2 L3 t4 Q+ H+ ~
) }" S$ R" o% d2 O+ j ]7 P3.每个部门拿最高薪水的是谁?) e; ~) l9 V; {9 e5 J* ?/ d! Q0 D
--返回多行0 Q# L6 B8 o, u( S! a1 U
select deptno, max(salary)
1 z [5 ^- h6 y3 M: j4 hfrom emp_ning
1 r! Z3 [ I0 V" M7 ~# }$ _$ Uwhere deptno is not null
) g" C) @4 X7 ^6 ?group by deptno;" |+ P6 M. }5 T
$ U+ Y. c' E9 ^! V( k 30 5000
, ] u/ S% f4 x, b/ Y 20 15000
$ Z# o: s( L- [- X 10 100006 F, ~0 I/ j7 Z' h8 E& P8 `
4 G+ J" g7 m( Z7 `6 N# h7 cselect ename, salary, job, deptno
- k* F6 a) {: R G: S- s( U( ufrom emp_ning
8 G2 ?- f& p/ v% c7 x* x4 ?. E/ Mwhere (deptno, salary) 6 I4 n- M# X J6 g; C$ }
in (select deptno, max(salary)' Y; c" z: s6 q
from emp_ning
* { J- Z8 {' y! S+ s where deptno is not null
7 M0 u4 D: _$ F O! } group by deptno);
* P# T$ w! v" |7 O
4 I. G5 z( r) I, F4.哪个部门的人数比部门30的人数多?
2 F; [- K9 y# u( }, {: jselect count(*) from emp_ning
" y" x/ m/ P8 h6 F; gwhere deptno = 30;- l) u! o. H$ ~+ D- l5 H; ]: n! k
3
. y3 Q" l# T4 @ o4 F
' R& k. X4 |7 c0 rselect deptno, count(*)
1 L7 O$ P( ?* B) y# xfrom emp_ning4 j" o8 ?% W0 y* r, A6 B
group by deptno
& m' f/ w7 |4 X; T j0 B; M% l' Ihaving count(*) > (select count(*) from emp_ning
! C+ R6 x5 S, n* U# }7 _ where deptno = 30);& P" f8 D6 I4 v+ A, ]
0 M) T$ k1 \8 Z u& Z: r5.哪个部门的平均薪水比部门20的平均薪水高?
/ b" t, C* ?+ l4 Y0 P( ?select deptno, avg(nvl(salary,0)) avg_s
, e" v; q! D* [from emp_ning+ e- x- |& ^0 C S5 K
group by deptno
4 P$ H- d! H( v2 {9 R7 g1 Bhaving avg(nvl(salary,0)) >
" Y& S0 E+ N8 I# t9 @ (select avg(nvl(salary,0))6 r8 B! ?0 p- }
from emp_ning+ ~! ~' _" z& p6 D h6 C; ]1 G
where deptno = 20);, V$ }! k) C+ G
1 y$ }0 B7 d- Y6 @- a$ K! [
6.列出员工名字和职位,这些员工所在的部门平均薪水
! U7 `- k* a% L6 |大于5000元。! p8 }7 [% z u/ d+ Y3 G0 y
select deptno, avg(nvl(salary,0))/ {: A, E; i) `) i- s! m
from emp_ning
3 R/ l8 ^! i+ B' W F. |group by deptno
' H7 @% Q' d0 N; B, [9 ?! r3 o8 W4 Phaving avg(nvl(salary,0)) > 5000;
( D1 n4 q5 N4 y9 ^( Z; u10 5750 z1 L# H" P; i9 S" H
20 8000 # S. D2 G' y" o
& j9 \5 S0 |! s2 _& O% Y
select ename, job t- H' d- w: i% d" Z6 l
from emp_ning
; {- C+ e- P h) zwhere deptno in (select deptno/ s2 h/ E# j7 l% x- x* V/ w
from emp_ning
0 S' I# ]7 g0 j+ p3 O" f3 m% `5 P3 @ group by deptno, V( _2 h2 V( L* G; E2 k$ H
having avg(nvl(salary,0)) > 5000);
- p& M, o4 R3 e4 l: _
* u8 A& h1 c( J: v7.谁是张无忌的下属?
9 h! D7 S) R" |5 G( {$ s' tselect empno from emp_ning; Y& T: `. h, V6 ]9 O" D9 \
where ename = '张无忌';& H# \( a5 k- |# {) \6 K
1001! j+ U$ X: \& z) K7 W
1014; j) `8 A) @( @4 H$ ~
+ j# J& H# c4 N( c; u/ y- Qselect ename from emp_ning
' C7 b& |* Y8 S) ^! b9 Ywhere mgr in (1001, 1014);
# S6 p9 M* p8 _2 S- _2 ^( ?1 \7 C2 B8 z
select ename from emp_ning. o. F d, k4 N3 h" u. r- P) c
where mgr in (select empno from emp_ning
" o) U+ n0 p) | where ename = '张无忌');
! X b% A6 r; o2 x! v2 [6 U- W* B' W4 l. r- n; P
8.研发部有哪些职位?, ~ u2 _$ ^: G7 L. v
select distinct job from emp_ning% m" N* V; f( S% [. g
where deptno = (select deptno
8 P# g2 ~ @! {& z6 \ from dept_ning
4 i2 e; C& k1 r. k: a- Q' m# t where dname = '研发部');
& d1 f0 {. i5 x! V$ b
* N4 f3 e1 Q V) q: n) p4 V6 l
( u, z7 _3 V8 V- ?0 o7 {# N |
|