`
gaobaoxiong
  • 浏览: 8568 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

sql基础大全

    博客分类:
  • sql
sql 
阅读更多
--建表 (雇员表)
create table EMP
(
  EMPNO    NUMBER(5),--员工号
  ENAME    VARCHAR2(10),--员工名称
  JOB      VARCHAR2(30),--职位
  MGR      NUMBER(5),--上级的员工号
  HIREDATE DATE,--入职时间
  SAL      NUMBER(8,2),--工资
  COMM     NUMBER(8,2),--奖金
  DEPTNO   NUMBER(6)--部门编号
)
--部门表
create table DEPT
(
  DEPTNO NUMBER(2),--部门编号
  DNAME  VARCHAR2(14),--部门名称
  LOC    VARCHAR2(13)--部门地址
)

--工资等级表
create table SALGRADE
(
  GRADE NUMBER,--工资等级编号
  LOSAL NUMBER,--最低数
  HISAL NUMBER--最高数
)

--奖金表
create table BONUS
(
  ENAME VARCHAR2(10),
  JOB   VARCHAR2(20),
  SAL   NUMBER,
  COMM  NUMBER
)



/*基础查询语句*/

--部门一中的所有员工
select * from emp where deptno=1
--找出职位为中级工程师的所有员工
select * from emp where job='中级工程师'
--找出奖金高于工资的员工
select * from emp where comm>sal
--找出每个员工工资和奖金的总和
select t.*,(t.sal+t.comm) totalM from emp t
--找出部门1中的项目经理和部门2 中的初级工程师
select t.* from emp t where (t.deptno=1 and t.job = '项目经理') or (t.job ='初级工程师' and t.deptno =2)
--找出部门1中既不是项目经理也不是初级工程师,而且工资大于等于3000 的员工
select t.* from emp t where t.deptno =1 and t.job !='项目经理' and t.job !='初级工程师' and t.sal>3000
--找出有奖金的员工的不同工作
select distinct(t.job) from emp t where t.comm !=0
--找出没有奖金或者奖金低于600 的员工
select t.* from emp t where t.comm<600 or t.comm = 0
--显示雇员姓名,根据其服务年限,将最老的雇员排在最前面
select t.ename,t.hiredate from emp t order by t.hiredate

/*单行函数用法*/

--找出每个月倒数第三天受雇的员工 *(用到last_day函数)
select * from emp where last_day(hiredate)-3 = hiredate 
--找出1年前雇的员工 *(用到add_months函数)
select * from emp where hiredate<=add_months(sysdate,-1*12)
--所有员工名字前加上Dear ,并且名字首字母大写 *(用到last_day函数)
select 'Dear '|| initcap(t.ename) from emp t
--找出姓名为5 个字母的员工
select * from emp t where length(t.ename) = 3
--找出姓名中不带'张'这个字的员工
select * from emp where ename not like '%张%'
--显示所有员工的姓名的第一个字
select substr(ename,0,1) from emp
--显示所有员工的姓
select distinct(substr(ename,0,1)) from emp
--显示所有员工,按名字降序排列,若相同,则按工资升序排序
select * from emp order by ename desc,sal
--假设一个月为30 天,找出所有员工的日薪,不计小数 *(去掉小数点floor,四舍五入:round  直接去小数点后几位:trunc)
select t.*,floor(t.sal/30,1) ri from emp t
select t.*,round(t.sal/30,1) ri from emp t
select t.*,trunc(t.sal/30,1) ri from emp t
--找到1月份受雇的员工*(to_char的用法)
select * from emp where to_char(hiredate,'fmmm')='1'
--列出员工加入公司的天数(四舍五入)
select t.*,round(sysdate-t.hiredate) from emp t
--分别用case 和decode 函数列出员工所在的部门,deptno=10 显示'部门10' 用2种方法实现
select t.ename,t.empno,(case when t.deptno='1' then '部门1' when t.deptno='2' then '部门2' else '管理部门' end) 部门 from emp t order by t.deptno
select t.ename,t.empno,decode(t.deptno,'1','部门1','2','部门2','管理部门') 所在部门 from emp t order by t.deptno


/*分组函数用法*/

---分组统计各部门下工资>5000 的员工的平均工资
select round(avg(t.sal)) from emp t where t.sal>5000 group by t.deptno
--统计各部门下平均工资大于500 的部门
select avg(t.sal) avgsal from emp t where t.sal>5000 group by t.deptno having avg(t.sal)>7000
       --或
select t.* from (select t.deptno,avg(t.sal) avgsal from emp t where t.sal>5000 group by t.deptno) t where t.avgsal>7000
--算出部门1中得到最多奖金的员工奖金
select max(comm) from emp where deptno = 1
select t.* from (select t.* from emp t order by t.comm desc) t where rownum<2 and t.deptno =2
--算出部门30 中得到最多奖金的员工姓名
select * from emp t1 where t1.comm = (select max(comm) from emp where deptno = 1) and t1.deptno =1
       --或
select t.* from (select t.* from emp t order by t.comm desc) t where rownum<2 and t.deptno =2
--算出每个职位的员工数和最低工资
select job,count(*),min(sal) from emp group by job
--算出每个部门,每个职位的平均工资和平均奖金(平均值包括没有奖金),如果平均奖金大于300,显示“奖
--   金不错”,如果平均奖金100 到300,显示“奖金一般”,如果平均奖金小于100,显示“基本没有奖金”,
--   按部门编号降序,平均工资降序排列
select t.deptno,t.job,avg(sal),avg(comm),(case when avg(comm)>800 then '奖金不错'
when 500<=avg(comm) and 800>= avg(comm) then '奖金一般' else '基本没有奖金' end)
奖金情况 from emp t group by t.deptno,t.job order by t.deptno desc,avg(sal) desc
--列出员工表中每个部门的员工数,和部门no
select t.deptno,count(*) from emp t group by t.deptno
--得到工资大于自己部门平均工资的员工信息
select t.* from emp t,(select avg(t.sal) pj,t.deptno from emp t group by t.deptno) t1 where t.sal>t1.pj and t1.deptno = t.deptno
--分组统计每个部门下,每种职位的平均奖金(也要算没奖金的人)和总工资(包括奖金) *(函数nvl 没有就算是0)
select deptno,job,avg(nvl(comm,0)),sum(sal+nvl(comm,0)) from emp group by deptno,job;


/*多表查询*/

--列出员工表中每个部门的员工数,和部门no
select count(*),deptno from emp group by deptno
--列出员工表中每个部门的员工数(员工数必须大于3),和部门名称
select d.* ,ed.cou from dept d,(select deptno,count(*) cou from emp group by deptno having count(*)>3) ed where d.deptno=ed.deptno;
--找出工资比张老大 多的员工
select t2.* from emp t1,emp t2 where t1.ename='张老大' and t1.sal<t2.sal
       --或
select * from emp t1,(select sal from emp where ename='张老大') t where t1.sal>t.sal
--列出所有员工的姓名和其上级的姓名
select * from emp t1,(select empno,ename from emp) t where t1.mgr = t.empno
--以职位分组,找出平均工资最高的两种职位
select t1.* from (select job,avg(sal) jabsal from emp group by job order by avg(sal) desc) t1 where rownum<3
--查找出不在部门2,且比部门2中任何一个人工资都高的员工姓名、部门名称
select * from emp t1,(select max(sal) maxsal from emp where deptno = '2') t where t1.sal>t.maxsal and t1.deptno !='2'
--得到平均工资大于8000 的工作职种
select job,avg(sal) jobsal from emp group by job having(avg(sal)>8000)
--分部门得到工资大于4000 的所有员工的平均工资,并且平均工资还要大于7500
select deptno,avg(sal) depavgsal from emp where sal>4000 group by deptno having(avg(sal)>7500)
--得到每个月工资总数最少的那个部门的部门编号,部门名称,部门位置
select t1.*
  from dept t1,
       (select e.deptno, sals
          from (select deptno, sum(sal) sals
                  from emp
                 group by deptno
                 order by sum(sal)) e
         where rownum = 1) t
where t1.deptno = t.deptno
--分部门得到平均工资等级为2 级(等级表)的部门编号
select t.deptno from (select deptno,avg(sal) avgsal from emp group by deptno) t,(select losal,hisal from salgrade where GRADE = 2) t1
where t1.losal<t.avgsal and t1.hisal>t.avgsal
--查找出部门10 和部门20 中,工资最高第3 名到工资第5 名的员工的员工名字,部门名字,部门位置

     /*对于rownum的重要说明:rownum是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列 (强调:先要有结果集)。
      简单的说 rownum 是对符合条件结果的序列号。它总是从1开始排起的。所以你选出的结果不可能没有1,而有其他大于1的值。
      另外还要注意:rownum不能以任何基表的名称作为前缀。*/

select t.*
  from (select rownum rn, t.*
          from (select empno, sal, deptno
                  from emp
                 where deptno = '1'
                    or deptno = '2'
                 order by sal desc) t) t
where t.rn > 2
   and t.rn < 6
   --或
select emp.ename, emp.empno, emp.sal, dept.dname, dept.loc
  from emp,
       dept,
       (select rownum no, new.*
          from (select *
                  from emp
                 where emp.deptno = 1
                    or deptno = 2
                 order by emp.sal desc) new) e
where emp.deptno = dept.deptno
   and e.no >= 3
   and e.no <= 5
   and e.empno = emp.empno;
--查找出收入(工资加上奖金),下级比自己上级还高的员工编号,员工名字,员工收入
select e.ename, e.empno, e.sal + nvl(e.comm, 0)
  from emp e, emp m
where e.mgr = m.empno
   and (e.sal + nvl(e.comm, 0)) > (m.sal + nvl(m.comm, 0));
--查找出工资等级不为4 级的员工的员工名字,部门名字,部门位置
select t.ename, t.empno, t.sal, t.deptno, d.DNAME, d.loc
  from emp t, (select * from salgrade where grade = 4) t1, dept d
where t.deptno = d.deptno and (t.sal > t1.hisal or t.sal < t1.losal)
--查找出职位和'张小' 或者'李三'一样的员工的平均工资
select avg(t1.sal) from emp t1,(select job from emp where ename='张小' or ename='李三') t where t1.job in t.job
   --或
select avg(sal) from emp where job in (select job from emp where ename='张小' or ename='李三');
--查找出不属于任何部门的员工
select * from emp where deptno is null or deptno not in(select deptno from dept)
--按部门统计员工数,查处员工数最多的部门的第二名到第五名(列出部门名字,部门位置)
select t.counts,d.dname,d.loc from dept d,
(select rownum nos,t.* from (select deptno,count(*) counts from emp group by deptno order by count(*) desc) t) t
where d.deptno = t.deptno and (t.nos<5 and t.nos>1)
   --或
select dept.dname, dept.loc
from (select rownum no, deptno from
(select count(*) employeeSum, deptno from emp group by deptno order by employeeSum
desc)) e,dept where e.no between 2 and 5 and e.deptno = dept.deptno;
--查询出张小所在部门的部门号\部门名称\部门人数  ****
select count(*),deptno from emp where deptno in (select deptno from emp where ename='张小') group by deptno

select t.countno, d.dname, d.loc
  from dept d,
       (select count(*) countno, deptno
          from emp
         where deptno in (select deptno from emp where ename = '张小')
         group by deptno) t
where d.deptno = t.deptno;
--查询出张小所在部门的工作年限最大的员工名字
select ename, hiredate
  from emp
where hiredate in
       (select min(hiredate)
          from emp
         where deptno in (select deptno from emp where ename = '张小'));
--查询出工资成本最高的部门的部门号和部门名称
select deptno,total from
(select rownum rw,t.deptno,t.total from (select sum(sal) total,deptno from emp group by deptno order by sum(sal) desc) t) t
where t.rw=1
--或
select d.deptno, d.dname, t.sum_sal
  from dept d,
       (
       select deptno, sum(sal) sum_sal
          from emp
         group by deptno
        having sum(sal) = (select max(sum(sal)) from emp group by deptno)
        ) t
where d.deptno = t.deptno



--随机返回5 条记录
select *
  from (select ename, job from emp order by dbms_random.value())
where rownum <= 5
--查询跳过表中的偶数行
select ename from (select row_number() over (order by ename) rn,ename
from emp) x where mod(rn,2)=1;
--查询员工信息与其中工资最高最低员工
select ename,sal,max(sal) over(), min(sal) over() from emp;
--连续求和
select ename,sal,sum(sal) over(), sum(sal) over(order by ename) from
emp;
--分部门连续求和
select deptno, sal, sum(sal) over(partition by deptno order by ename) as s
  from emp
--查询EMP 员工表下每个部门工资前二名的员工信息
select deptno, ename, sal
from emp e1
where
(select count(1)
from emp e2
where e2.deptno=e1.deptno and e2.ename!=e1.ename and e2.sal>e1.sal)
<2
order by deptno, sal desc;[/color][color=blue][align=center][/align]
分享到:
评论

相关推荐

    SQL语法,SQL语句大全,SQL基础

    ### SQL语法、SQL语句大全及SQL基础知识 #### 一、SQL简介 SQL(Structured Query Language)是一种用于管理关系数据库的标准编程语言。SQL最初由IBM研发,并在1970年代后期作为SEQUEL(Structured English Query ...

    课程课件\经典SQL语句大全+SQL基础教程.rar

    这个压缩包文件"经典SQL语句大全+SQL基础教程.rar"包含了关于SQL的重要学习资源,包括"SQL语句教程.doc"和"经典SQL语句大全.doc"两份文档,旨在帮助初学者掌握SQL的基础知识和常见操作。 1. **SQL基础**: - ...

    sql server 2012 T-SQl基础教程 源码和示例数据库

    《SQL Server 2012 T-SQL基础教程——源码与示例数据库》 本教程专注于Microsoft SQL Server 2012中的Transact-SQL(T-SQL)语言,这是SQL Server的主要查询语言,用于数据操作、查询、存储过程和数据库对象的编程...

    SQL基础知识第2版.pdf

    本文将详细介绍SQL的基础知识,包括SELECT语句的用法、DISTINCT关键词以及TOP子句的概念与应用。 首先,关于SELECT语句,它是SQL中用来从数据库表中选择数据的最重要的命令之一。SELECT语句的基本用法是从表中选取...

    SQL基础教程_sql基础教程_

    本书是畅销书《SQL基础教程》第2版,介绍了关系数据库以及用来操作关系数据库的SQL语言的使用方法。书中通过丰富的图示、大量示例程序和详实的操作步骤说明,让读者循序渐进地掌握SQL的基础知识和使用技巧,切实提高...

    SQL基础教程-Mick-示例程序&习题答案

    本教程“SQL基础教程-Mick-示例程序&习题答案”由Mick编写,旨在为初学者提供一个实用的学习资源,帮助他们快速掌握SQL的核心概念和操作。 1. SQL基础知识: - 数据类型:SQL支持多种数据类型,如整数(INT)、...

    SQL语句基础教程

    SQL语句基础教程旨在帮助新手和需要复习SQL的资料仓储业界老将,学习SQL基础知识和语法。 SQL指令 -------- SQL指令是SQL语言的基础,用于储存、读取、处理数据库中的资料。常用的SQL指令包括: * SELECT:从...

    SQL基础 (ppt)

    本教程"SQL基础 (ppt)"是针对初学者设计的,旨在帮助你从零开始掌握SQL的基本概念和常用操作。 首先,我们从01.SQL命令基础.ppt开始。这部分主要介绍了SQL语言的基础构成,包括如何创建数据库、数据表以及对数据的...

    sql基础教程对应源码

    通过学习这个“SQL基础教程”,你将能够熟练地掌握SQL的基本操作,包括查询、插入、更新和删除数据,创建和管理数据库结构,以及使用视图和存储过程。在实践中不断练习,你将能够更有效地管理和利用数据库资源。

    SQL基础查询语句大全集锦

    SQL基础查询语句大全集锦,初学的必备的查询宝典。走过路过千万不要错过。

    SQL基础代码1

    SQL基础是每个数据库管理员、数据分析师和开发者的必备技能。本文将深入讲解SQL的基础知识,包括数据库的基本操作,如创建、查询、更新和删除数据。 首先,我们从创建数据库开始。在SQL中,可以使用`CREATE ...

    SQL基础教程(第二版)_思维导图.zip

    《SQL基础教程(第二版)_思维导图》是由日本作者MICK编写的一本关于SQL学习的经典著作,虽然这里无法提供完整的书籍内容,但通过提供的思维导图,我们可以深入探讨SQL的基础知识及其在数据库管理中的重要性。...

    数据库SQL基础知识

    数据库SQL基础知识是IT领域中至关重要的一环,尤其对于初学者来说,掌握好SQL语言是进入数据管理和分析世界的敲门砖。SQL(Structured Query Language),结构化查询语言,是用于管理和处理关系型数据库的标准语言。...

    SQL基础知识

    SQL基础.sql SQL基础知识 

    SQL 基础教程 + 目录 + 高清扫描版

    本教程基于“SQL基础教程(第2版)”的高清扫描版,将带你深入理解和掌握SQL的基本概念和核心技能。 首先,我们要理解SQL的主要功能。SQL可以用来创建数据库、定义数据结构、插入和更新数据、查询数据以及管理...

    SQL基础教程(mick).zip

    SQL基础学习代码,MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database ...

Global site tag (gtag.js) - Google Analytics