常用SQL语句2(Oracle)
                        
                            时间:2021-07-01 10:21:17
                            帮助过:3人阅读
							                        
                     
                    
                    
                     /********************************SCOTT Database*******************************/
  2 select * from EMP;
  3 select * from DEPT;
  4 select * from SALGRADE;
  5 
  6 select ename, sal
*12 from emp;
  7 
  8 /*system empty table*/
  9 select * from dual;
 10 select 2*3 from dual;
 11 
 12 select sysdate 
from dual;
 13 /*alias*/
 14 select ename, sal
*12 annual_sal 
from emp;
 15 /*alias with space*/
 16 select ename, sal
*12 "annual sal" 
from emp;
 17 
 18 /*0 not equal null value*/
 19 select ename, comm 
from emp;
 20 
 21 /*year salary + comm, any contains empty‘s math operation result is empty*/
 22 select ename, sal
*12 + comm 
from emp;
 23 
 24 select ename
||sal 
from emp;
 25 
 26 /*concat string*/
 27 select ename 
|| ‘abcdefg‘ from emp;
 28 
 29 /*2 ‘ instead of 1 ‘*/
 30 select ename 
|| ‘abcdefg‘‘abcd‘ from emp;
 31 
 32 select deptno 
from emp;
 33 
 34 /*remove duplicate*/
 35 select distinct deptno 
from emp;
 36 
 37 select distinct deptno, job 
from emp;
 38 
 39 select * from emp 
where deptno 
= 10;
 40 
 41 select * from EMP 
where ename 
= ‘CLARK‘;
 42 
 43 select ename, sal 
from emp 
where SAL 
> 1500; 
 44 
 45 select ename, sal 
from emp 
where deptno 
<> 10;
 46 
 47 select ename, sal 
from emp 
where ename 
> ‘CBA‘;
 48 
 49 select ename, sal 
from emp 
where sal 
between 800 and 1500;
 50 
 51 select ename, sal 
from emp 
where sal 
>= 800 and sal 
<= 1500;
 52 
 53 /*empty value*/
 54 select ename, sal, comm 
from emp 
where comm 
= null;
 55 
 56 select ename, sal, comm 
from emp 
where comm 
is null;
 57 
 58 select ename, sal, comm 
from emp 
where comm 
is not null;
 59 
 60 select ename, sal, comm 
from emp 
where sal 
in (
800, 
1500, 
2000);
 61 
 62 select ename, sal, comm 
from emp 
where ename 
in (
‘SMITH‘, 
‘KING‘, 
‘ABC‘);
 63 
 64 select ename, sal 
from emp 
where DEPTNO 
= 10 and sal 
> 1000;
 65 
 66 select ename, sal 
from emp 
where DEPTNO 
= 10 or sal 
> 1000; 
 67 
 68 select ename, sal 
from emp 
where DEPTNO 
= 10 and sal 
not in (
800, 
1500);
 69 
 70 /*% means 0 or more*/
 71 select ename 
from emp 
where ENAME 
like ‘%ALL%‘;
 72 
 73 select ename 
from emp 
where ename 
like ‘_A%‘;
 74 
 75 /*contains % in the selected rows need escape sequence*/
 76 
 77 select ename 
from emp 
where ENAME 
like ‘%\%%‘;
 78 
 79 /*default escapse sequence is \ but we can defintion by use <escape> ‘$‘ */
 80 select ename 
from emp 
where ename 
like ‘%$%%‘ escape ‘$‘;
 81 
 82 select * from DEPT;
 83 
 84 /*order by asc desc defalut is asc*/
 85 select * from DEPT 
order by DEPTNO 
desc;
 86 
 87 select empno, ename 
from emp;
 88 
 89 select empno, ename 
from emp 
order by EMPNO 
asc;
 90 
 91 select empno, ename 
from emp 
order by EMPNO 
desc;
 92 
 93 select empno, ename 
from emp 
where deptno 
<> 10 order by empno 
asc;
 94 
 95 select ename, sal, deptno 
from emp 
order by deptno 
asc; 
 96 
 97 select ename, sal, deptno 
from emp 
order by deptno 
asc, ename 
desc;
 98 
 99 select ename, sal
*12 annual_sal 
from emp 
where ename 
not like ‘_A%‘ and sal 
> 800 order by sal 
desc; 
100 
101 select lower(ename) 
from emp
102 
103 select ename 
from emp 
where lower(ename) 
like ‘_a%‘;
104 
105 select ename 
from emp 
where ename 
like ‘_a%‘ or ename 
like ‘_A%‘;
106 
107 select substr(ename, 
1, 
3) 
from emp;
108 
109 select substr(ename, 
2, 
3) 
from emp;
110 
111 select chr(
65) 
from dual;
112 
113 select ascii(
‘A‘) 
from dual;
114 
115 select round(
23.652) 
from dual;
116 
117 select round(
23.652, 
2) 
from dual;
118 
119 select round(
23.652, 
-1) 
from dual;
120 
121 /* 9 means number, is this position has no number, it will not be displayed
122    ‘$99,999.9999‘ --> $800.0000
123    ‘$99,999.9999‘ --> $1,500.0000
124    ‘L99,999.9999‘ --> Y1,500.0000
125    ‘$00000.0000‘ --> $00800.0000
126    ‘$00000.0000‘ --> $01500.0000
127    
128    to_char
129 */
130 
131 select to_char(sal, 
‘$99,999.9999‘) 
from emp;
132 
133 select to_char(sal, 
‘$00000.0000‘) 
from emp;
134 
135 select hiredate 
from emp;
136 
137 /* Date format
138  YYYY -- year
139  MM   -- month
140  DD   -- day
141  HH   -- 12 hour
142  HH24 -- 24 hour
143  MI   -- minute
144  SS   -- second
145 */
146 select to_char(hiredate, 
‘YYYY-MM-DD HH:MI:SS‘) joindate 
from emp;
147 
148 /*to_date*/
149 select ename, hiredate 
from emp 
where HIREDATE 
> to_date(
‘1981-2-20 12:34:56‘, 
‘YYYY-MM-DD HH24:MI:SS‘);
150 
151 /*to_number*/
152 select sal 
from EMP 
where sal 
> to_number(
‘$1,250.00‘, 
‘$9,999.99‘);
153 
154 select ename, sal
*12 + comm 
from emp;
155 
156 
157 /* 
158    function nvl to deal with null value to math operation
159    if comm is null then o instead of null or it will be comm
160 */
161 select ename, sal
*12 + nvl(comm, 
0) 
from emp;
162 
163 
164 /*
165    group function : min, max, avg, count, sum   
166 */
167 select max(sal) maxsal 
from emp;
168 
169 select min(sal) minsal 
from emp;
170 
171 select avg(sal) avgsal 
from emp;
172 
173 select to_char(
avg(sal),
‘999999999.99‘) avgsal 
from emp;
174 
175 select round(
avg(sal),
2) avgsal 
from emp;
176 
177 select sum(sal) 
from emp;
178 
179 select count(
*) records 
from emp;
180 
181 select count(
*) 
from emp 
where deptno 
= 10;
182 
183 select count(ename) 
from emp;
184 
185 /*count the field which is not null*/
186 select count(comm) 
from emp;
187 
188 select count(deptno) 
from emp;
189  
190 select count(
distinct deptno) 
from emp;
191 
192 /*
193     function : group by
194 */
195 
196 /* which department‘s avg salary is highest*/
197 select sal, deptno 
from emp;
198 
199 
200 /*department avg salary*/
201 select deptno, to_char(
avg(sal),
‘99999999.99‘) depavgsal 
from emp 
group by deptno;
202 
203 select deptno, job, 
max(sal) maxsal 
from emp 
group by deptno, job;
204 
205 /*the highest salary in the company*/
206 select max(sal) 
from emp;
207 
208 /*who is the highest salary in the company*/
209 select ename 
from emp 
where sal 
= (
select max(sal) 
from emp);
210 
211 /*the highest salary in the department*/
212 select deptno, 
max(sal) 
from emp 
group by deptno;
213 
214 select to_char(
avg(sal), 
‘99999999.99‘) avgsal, deptno 
from emp 
group by deptno;
215 
216 /* having is limited with grouping*/
217 select to_char(
avg(sal), 
‘99999999.99‘) avgsal, deptno 
from emp 
group by deptno 
having avg(sal) 
> 2000;
218 
219 select deptno, 
max(sal) 
from emp 
where SAL 
> 1000 group by deptno 
having avg(sal) 
> 2000 order by deptno 
desc; 
220 
221 select deptno, to_char(
avg(sal), 
‘99999999.99‘) 
from emp 
where sal 
> 1200 group by deptno 
having avg(sal) 
> 1500 order by avg(sal) 
desc;
222 
223 
224 select ename, sal 
from emp 
where SAL 
= (
select max(sal) 
from emp);
225 
226 select ename, sal 
from emp 
where sal 
> (
select avg(sal) 
from emp);
227 
228 select ename, sal 
from emp 
join (
select max(sal) maxsal, deptno 
from emp 
group by deptno) t 
on (emp.sal 
= t.maxsal 
and emp.deptno 
= t.deptno);
229 
230 select * from SALGRADE;
231 
232 select deptno, to_char(
avg(sal), 
‘999999999.99‘) s 
from emp 
group by deptno;
233 
234 SELECT dname,grade,to_char(S, 
‘999999.999‘) 
FROM dept,(
SELECT deptno,grade,s 
FROM (
SELECT deptno,grade,s 
FROM (
SELECT deptno,
avg(sal) s 
FROM emp 
GROUP BY deptno),salgrade 
WHERE s 
BETWEEN losal 
AND hisal 
ORDER BY grade 
DESC) t 
WHERE ROWNUM
=1) t 
WHERE dept.deptno
=t.deptno;
235 
236 SELECT dname,grade,to_char(S, 
‘999999.999‘) 
FROM dept,(
SELECT deptno,grade,s 
FROM (
SELECT deptno,grade,s 
FROM (
SELECT deptno,
avg(sal) s 
FROM emp 
GROUP BY deptno),salgrade 
WHERE s 
BETWEEN losal 
AND hisal 
ORDER BY grade 
DESC) t 
WHERE ROWNUM
=1) t 
WHERE dept.deptno
=t.deptno;
237 
238 
239 /*self table connection*/
240 
241 select empno, ename, mgr 
from emp;
242 
243 select e1.ename, e2.ename 
from emp e1, emp e2 
where e1.MGR 
= e2.EMPNO;
244 
245 select ename, dname 
from EMP, DEPT 
where emp.DEPTNO 
= dept.DEPTNO;
246 
247 select ename, dname 
from EMP 
join DEPT 
on (emp.DEPTNO 
= dept.DEPTNO); 
248 
249 select ename, dname 
from EMP 
join DEPT using (deptno);
250 
251 select ename, grade 
from emp e 
join salgrade s 
on (e.SAL 
between s.LOSAL 
and s.HISAL);
252 
253 select ename, dname, grade 
from emp e 
join dept d 
on (e.DEPTNO 
= d.DEPTNO) 
join salgrade s 
on (e.SAL 
between s.LOSAL 
and s.HISAL) 
where ename 
not like ‘_A%‘;  
254 
255 /*left join == left outer join*/
256 select e1.ename, e2.ename 
from emp e1 
left join emp e2 
on (e1.mgr 
= e2.empno);
257 
258 select e1.ename, e2.ename 
from emp e1 
left outer join emp e2 
on (e1.mgr 
= e2.empno);
259 
260 select * from dept;
261 
262 select ename, dname 
from emp e 
right join DEPT d 
on (e.DEPTNO 
= d.DEPTNO);
263 
264 select ename, dname 
from emp e 
right outer join DEPT d 
on (e.DEPTNO 
= d.DEPTNO);
265 
266 /* full join */
267 select ename, dname 
from emp e 
full join DEPT d 
on (e.DEPTNO 
= d.DEPTNO);
268 
269 /*department avg salary*/
270 select deptno, to_char(
avg(sal), 
‘9999999.99‘) 
from emp 
group by deptno;
271 
272 /*department avg salary‘s grade*/
273 select deptno, avg_sal, grade 
274 from (
select deptno, to_char(
avg(sal), 
‘999999.99‘) avg_sal 
from emp 
group by deptno) t 
275 join SALGRADE s 
276 on (t.avg_sal 
between s.LOSAL 
and s.HISAL);
277 
278 /*salary grade for every employee*/
279 select ename, deptno, grade 
from emp e 
join SALGRADE s 
on (e.SAL 
between s.LOSAL 
and s.HISAL);
280 
281 select deptno, to_char(
avg(grade), 
‘9.9‘) avg_grade
282 from (
select ename, deptno, grade 
from emp e 
join SALGRADE s 
on (e.SAL 
between s.LOSAL 
and s.HISAL)) t
283 group by t.deptno;
284 
285 /* who is manager*/
286 select ename 
from emp 
where EMPNO 
in (
select mgr 
from emp);
287 
288 select ename 
from emp 
where EMPNO 
in (
select distinct mgr 
from emp);
289 
290 select * from emp;
291 
292 /*select highest salary*/
293 select max(sal) 
from emp;
294 
295 select distinct e1.sal 
from emp e1 
join emp e2 
on (e1.SAL 
< e2.SAL);
296 
297 /* please don‘t use group function to find the max salary*/
298 select distinct sal 
from emp 
where SAL 
not in (
select distinct e1.sal 
from emp e1 
join emp e2 
on (e1.SAL 
< e2.SAL));
299 
300 select deptno, avg_sal 
from (
select to_char(
avg(sal), 
‘99999.99‘) avg_sal, deptno 
from emp 
group by deptno) 
301 where avg_sal 
= (
select max(avg_sal) 
from (
select to_char(
avg(sal),
‘999999.99‘) avg_sal, deptno 
from emp 
group by deptno));
302 
303 
304 select max(avg_sal) 
from (
select to_char(
avg(sal),
‘999999.99‘) avg_sal, deptno 
from emp 
group by deptno);
305 select to_char(
avg(sal), 
‘99999.99‘) avg_sal, deptno 
from emp 
group by deptno;
306 
307 
308 /*avg salary is highest*/
309 select deptno, avg_sal 
from (
select to_char(
avg(sal), 
‘99999.99‘) avg_sal, deptno 
from emp 
group by deptno) 
where avg_sal 
= (
select max(avg_sal) 
from (
select to_char(
avg(sal),
‘99999.99‘) avg_sal, deptno 
from emp 
group by deptno));
310 
311 /*the depatname of the highest avg salary*/
312 select dname 
from dept 
where deptno 
= 
313 (
select deptno 
from (
select to_char(
avg(sal), 
‘99999.99‘) avg_sal, deptno 
from emp 
group by deptno) 
where avg_sal 
= (
select max(avg_sal) 
from (
select to_char(
avg(sal),
‘99999.99‘) avg_sal, deptno 
from emp 
group by deptno)));
314 
315 
316 select avg(sal) sal_avg 
from emp 
group by deptno;
317 
318 select deptno, 
avg(sal) sal_avg 
from emp 
group by deptno;
319 
320 select deptno, to_char(sal_avg, 
‘999999.99‘) sal_avg, grade 
321 from (
select deptno, 
avg(sal) sal_avg 
from emp 
group by deptno) t 
322 join salgrade s
323 on (t.sal_avg 
between s.LOSAL 
and s.HISAL);
324