sql 语句练习

--创建部门表和员工表
CREATE TABLE DEPT
       (DEPTNO NUMBER(2) CONSTRAINT PK_DEPT PRIMARY KEY,
       DNAME VARCHAR2(14) ,
       LOC VARCHAR2(13) ) ;
 
CREATE TABLE EMP
       (EMPNO NUMBER(4) CONSTRAINT PK_EMP PRIMARY KEY,
        ENAME VARCHAR2(10),
        JOB VARCHAR2(9),
        MGR NUMBER(4),
        HIREDATE DATE,
        SAL NUMBER(7,2),
        COMM NUMBER(7,2),
        DEPTNO NUMBER(2) CONSTRAINT FK_DEPTNO REFERENCES DEPT);




--插入数据
iNSERT INTO DEPT VALUES(10,'ACCOUNTING','NEW YORK');
INSERT INTO DEPT VALUES (20,'RESEARCH','DALLAS');
INSERT INTO DEPT VALUES(30,'SALES','CHICAGO');
INSERT INTO DEPT VALUES(40,'OPERATIONS','BOSTON');




INSERT INTO EMP VALUES
(7369,'SMITH','CLERK',7902,to_date('17-12-1980','dd-mm-yyyy'),800,NULL,20);
INSERT INTO EMP VALUES
(7499,'ALLEN','SALESMAN',7698,to_date('20-2-1981','dd-mm-yyyy'),1600,300,30);
INSERT INTO EMP VALUES
(7521,'WARD','SALESMAN',7698,to_date('22-2-1981','dd-mm-yyyy'),1250,500,30);
INSERT INTO EMP VALUES
(7566,'JONES','MANAGER',7839,to_date('2-4-1981','dd-mm-yyyy'),2975,NULL,20);
INSERT INTO EMP VALUES
(7654,'MARTIN','SALESMAN',7698,to_date('28-9-1981','dd-mm-yyyy'),1250,1400,30);
INSERT INTO EMP VALUES
(7698,'BLAKE','MANAGER',7839,to_date('1-5-1981','dd-mm-yyyy'),2850,NULL,30);
INSERT INTO EMP VALUES
(7782,'CLARK','MANAGER',7839,to_date('9-6-1981','dd-mm-yyyy'),2450,NULL,10);
INSERT INTO EMP VALUES
(7788,'SCOTT','ANALYST',7566,to_date('13-7-1987','dd-mm-yyyy'),3000,NULL,20);
INSERT INTO EMP VALUES
(7839,'KING','PRESIDENT',NULL,to_date('17-11-1981','dd-mm-yyyy'),5000,NULL,10);
INSERT INTO EMP VALUES
(7844,'TURNER','SALESMAN',7698,to_date('8-9-1981','dd-mm-yyyy'),1500,0,30);
INSERT INTO EMP VALUES
(7876,'ADAMS','CLERK',7788,to_date('13-7-1987','dd-mm-yyyy'),1100,NULL,20);
INSERT INTO EMP VALUES
(7900,'JAMES','CLERK',7698,to_date('3-12-1981','dd-mm-yyyy'),950,NULL,30);
INSERT INTO EMP VALUES
(7902,'FORD','ANALYST',7566,to_date('3-12-1981','dd-mm-yyyy'),3000,NULL,20);
INSERT INTO EMP VALUES
(7934,'MILLER','CLERK',7782,to_date('23-1-1982','dd-mm-yyyy'),1300,NULL,10);
INSERT INTO EMP VALUES
 (7948,'MIKE','CLERK',7934,to_date('23-4-1982','dd-mm-yyyy'),2700,NULL,10);
INSERT INTO EMP VALUES
 (7951,'OLIVEN','CLERK',7948,to_date('23-3-1982','dd-mm-yyyy'),2100,NULL,10);
 
 COMMIT;


SELECT * FROM emp;
SELECT*FROM dept;


select deptno,avg(sal) from emp group by deptno having avg(sal)<2000;


--查询练习  max min avg count sum  函数中可以加入表达式
SELECT '最高年工资是:'||MAX(sal*12+NVL(comm,0)*12) AS 年工资 FROM emp;


--avg()会不会把为空的值统计进去?:不会将NULL统计进去,会将0统计进去


SELECT SUM(sal)/COUNT(sal) FROM emp;


--查询各个部门的平均薪水
SELECT avg(sal) AS 平均薪水,deptno AS 部门号 FROM emp GROUP BY deptno ORDER BY deptno;




create table salgrade(
        grade number(2),
        losal number(5),
        hisal number(5)
);




insert into salgrade values(1,700,1200);
insert into salgrade values(2,1201,1400);
insert into salgrade values(3,1400,2000);
insert into salgrade values(4,2001,3000);
insert into salgrade values(5,3001,9999);
COMMIT;


SELECT*FROM salgrade;
----显示部门号为10的部门名、员工名和工资
SELECT d.dname,e.ename,e.sal FROM emp e,dept d WHERE e.deptno=d.deptno AND d.deptno=10;


--显示高于自己部门平均工资的员工信息
SELECT t2.ename,t2.sal,t1.myavg,t2.deptno FROM emp t2,(SELECT AVG(sal) AS myavg,
deptno FROM emp GROUP BY deptno) t1 WHERE t2.deptno=t1.deptno AND t2.sal>t1.myavg;


--查询每个部门工资最高人的详细资料
SELECT MAX(sal),deptno FROM emp GROUP BY deptno;
SELECT*FROM emp ,(SELECT MAX(sal) maxsal,deptno FROM emp GROUP BY deptno) t1
 WHERE emp.deptno = t1.deptno AND emp.sal = t1.maxsal;


--显示各个部门的编号信息(部门编号,名称)和人员数量
SELECT d.deptno,d.dname,c1.numb FROM dept d,(SELECT COUNT(*) numb,deptno FROM emp GROUP BY deptno ) c1
 WHERE d.deptno = c1.deptno ;--不显示人数为null的部门;
 
 SELECT d.deptno,d.dname,c1.numb FROM dept d,(SELECT COUNT(*) numb,deptno FROM emp GROUP BY deptno ) c1
 WHERE d.deptno = c1.deptno(+) ;--显示人数为null的部门;+表示有外链接
 
 
 --分页查询
 SELECT * FROM (SELECT e.*,ROWNUM rn FROM emp e WHERE ROWNUM <=10) r WHERE r.rn > 5;
 select * from (select a1.*,rownum rn from (select e.*  from emp e order by sal) a1 where rownum<=10) where rn >=6;


--模拟分页效率
--快速创建表和插入数据
--CREATE TABLE mytest as select empno,ename,sal,comm,deptno from emp;
--自我复制
--insert into mytest(empno,ename,sal,comm,deptno)  select empno,ename,sal,comm,deptno from mytest;
--COMMIT;




SELECT count(*) FROM mytest;
--rownum 效率高 0.047s


 SELECT * FROM (SELECT e.*,ROWNUM rn FROM mytest e WHERE ROWNUM <=10000) r WHERE r.rn > 9980;
--按id 来查询 效率低 0.172s
select * from mytest where rowid in (select rid from (select rownum 
rn, rid from(select rowid rid, deptno from mytest order by deptno desc) where 
rownum<10000) where rn>9980) order by deptno DESC;


--UNION会自动去掉重复的行
SELECT ename, sal, job FROM emp WHERE sal >2500 
UNION
SELECT ename, sal, job FROM emp WHERE job = 'MANAGER'; 


--查询每个部门每个岗位的平均工资,每个部门平均工资,每个岗位平均工资
SELECT AVG(sal),deptno,job FROM emp GROUP BY CUBE(deptno,job);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值