sql

.大于avg(sal)的人名和SAL
select ename,sal from emp where sal >(select avg(sal) from emp)


2.大于部门平均工资的人名和工资
select ename,sal,s from emp,
(select deptno dn ,avg(sal) s from emp group by deptno) temp
 where sal>s and emp.deptno=dn
3.每个部门的人数,部门名
select dept.deptno,count(empno) c from emp,dept
where emp.deptno(+)=dept.deptno  group by dept.deptno

4.每个职位有多少人,每个工种
select job,count(*) from emp group by job
5.工种人数大于2人的工种及他的人数
select job,count(*) from emp group by job having count(*)>2
6.每个员工级他对应的部门名.
select ename,dname from emp,dept where emp.deptno=dept.deptno

7.平均工资最高的部门名及平均工资.
select dname,av from dept,
( select deptno,avg(sal) av from emp group by deptno having avg(sal) =
(select max(avg(sal)) from emp group by deptno )) temp
where dept.deptno=temp.deptno

 

 

1. 编写一个sql语句。要求查询出1998年,船属国家是USA的订单数量
alter session set nls_date_format='yyyy-mm-dd hh:mi:ss'
select count(*) from orders where shipcountry='USA'
 and orderdate >='1998-1-1' and orderdate<'1999-1-1'

2. 编写一个SQL语句。要求显示出员工的名称及其对应的客户企业名称(companyname)(员工表是Employees,顾客表是customers,订单表是orders,订单表跟员工表都有employeeid,客户表跟订单表都有customerid)
select distinct lastname||' '||firstname ,companyname from
 customers c,employees e,orders o
 where o.customerid=c.customerid and o.employeeid=e.employeeid

3. 编写一个sql语句,要求查询每个员工的名称及其对应的最贵的单价
 select lastname||firstname,maxx from employees,
(select employeeid,max(freight) maxx from orders group by employeeid) temp
where employees.employeeid=temp.employeeid


4. 编写一个sql语句。要求显示有订单的员工姓名及其订单数量(员工姓名是lastname+firstname。员工表是Employees,订单表是orders,员工表跟订单表中都有employeeid
select lastname||firstname,cc from employees,
(select employeeid,count(*) cc from orders group by employeeid) temp
where employees.employeeid = temp.employeeid


5. 显示全部员工的姓名及其对应的订单数量(其它同上)
select lastname||firstname,nvl(cc,0) from employees,
(select employeeid,count(*) cc from orders group by employeeid) temp
where employees.employeeid = temp.employeeid(+)

 


6.顾客表(customers表)中电话(phone)以0921开头的企业名称(companyname)
select companyname from customers where phone like '0921%'

 

7.国籍(country)是美国(USA)职位(contacttitle)是Owner或Sales Manager的联系人名称(contactName),要求用两种写法写出
select contactName from customers
where country='USA' and
(contacttitle='Owner' or contacttitle='Sales Manager')

select contactName from customers
where country='USA' and
contacttitle in('Owner','Sales Manager')

 

8.显示年龄最大的3个员工信息(员工表为employees,出生日期为birthdate)
select * from (select * from employees order by birthdate) where rownum <=3
 

9.显示出销售订单最多的船属国家
select shipcountry from orders group by shipcountry having count(*)=
(select max(count(*)) from orders group by shipcountry)

 

 

练习一:查看员工的姓名和员工部门号:(要考虑到表中实际数据中空值的影响)
select ename,dname from emp,dept where emp.deptno(+)=dept.deptno


练习二:每个员工所在的部门和部门所在的地区
select ename,dname,loc from emp,dept where emp.deptno=dept.deptno(+)

练习三:查出每个员工和每个员工的工资级别
 select ename,sal,grade from emp ,salgrade where sal>=losal and sal<=hisal
 select ename,sal,grade from emp ,salgrade where sal between losal and hisal
 

练习四:查出所有员工的部门领导的名称:
SELECT ename,e from emp,
 (select deptno,ename e from emp where job='MANAGER') temp
  where emp.deptno=temp.deptno


练习五:找出没有员工的部门:
select deptno ,dname from dept where deptno not in
  (select distinct deptno from emp where deptno is not null)


练习六:查询员工有多少人有提成:
select count(comm) from emp
select count(*) from emp where comm is not null


练习七:员工分部在多少个不同的部门:
select count(distinct deptno) from emp


练习八:求各个部门的平均工资:
select avg(sal) ,deptno from emp group by deptno
select avg(nvl(sal,0)) ,deptno from emp group by deptno


练习九:求各个部门不同工种的平均工资:
select dname,job,avgs from dept ,(select job,deptno,avg(sal) avgs from emp group by deptno,job) temp where dept.deptno=temp.deptno

 

练习十:查询哪些部门的平均工资比2000高:
select dname from dept where deptno
  in (select deptno from emp group by deptno having avg(sal)>2000)

 

练习十一:除了30部门以外的部门的平均工资:
select dname,avgs from dept,
(select deptno,avg(sal) avgs from emp group by deptno  ) temp
where dept.deptno=temp.deptno(+) and dept.deptno!=30

 

练习十三:找出所有员工中,工资最低的那个员工:
select ename ,sal from emp where sal =(select min(sal) from emp)


练习十四:查询谁跟Smith的工种一样:
select ename ,job from emp
where job=(select job from emp where ename='SMITH') AND ename!='SMITH'


练习十五:查出哪些员工的工资比平均工资低:
SELECT ENAME ,SAL FROM EMP WHERE SAL <(SELECT AVG(SAL) FROM EMP)

 

 

 

 

 

 

--有奖金的人数
select count(comm) from emp
--有奖金的人数
select count(*) from emp where comm is not null

select deptno,avg(sal) from emp group by deptno
having avg(sal)>(select avg(sal) from emp)

--显示出部门平均工资高于公司平均工资的部门名称
select dname from dept,(select deptno,avg(sal) from emp group by deptno
having avg(sal)>(select avg(sal) from emp)) temp where dept.deptno=temp.deptno
--显示出部门平均工资高于公司平均工资的部门名称
select dname from dept where deptno in (select deptno from emp group by deptno
having avg(sal)>(select avg(sal) from emp))

--求出工资最高的人
select ename from emp where sal=(select max(sal) from emp)

select nvl(comm,0)+300 from emp

select * from A a,A b,A c

select * from emp where sal >all(select sal from emp where deptno=20)
select * from emp where sal >(select max(sal) from emp where deptno=20)

select * from emp where sal >any(select sal from emp where deptno=20)
select * from emp where sal >(select min(sal) from emp where deptno=20)

select * from emp where sal <all(select sal from emp where deptno=20)
select * from emp where sal <(select min(sal) from emp where deptno=20)

select * from emp where sal <any(select sal from emp where deptno=20)
select * from emp where sal <(select max(sal) from emp where deptno=20)

--有员工的部门有哪些
select dname from dept where
 exists (select * from emp where emp.deptno=dept.deptno)
--有员工的部门有哪些
select dname from dept where deptno in(select distinct deptno from emp)
--有员工的部门有哪些
select dname from dept ,(select distinct deptno from emp) temp
where dept.deptno=temp.deptno

set serveroutput on
declare
myemp emp%rowtype;
begin
select * into myemp from emp where empno='7369';
dbms_output.put_line(myemp.ename);
end;

select abc.nextval from dual


declare
myempno emp.empno%type;
begin
select abc.nextval into myempno from dual;
insert into mytemp (empno,sal,hiredate)  values(myempno,46464,sysdate);
end;

create table mytemp as (select * from emp where 1=2)


declare
myempno emp.empno%type;
myename emp.ename%type;
mysal emp.sal%type;
mysize number(5);
cursor empcur is select empno,ename,sal from emp where deptno=10 order by sal;
begin
select count(*) into mysize from emp where deptno=10;
open empcur;
for i in 1..mysize loop
    fetch empcur into myempno,myename,mysal;
    dbms_output.put_line(myempno||'  '||myename||'  '||mysal);
end loop;
close empcur;
end;

 

 

--哪个员工卖的最多
select lastname||' '||firstname,maxsum from employees,
(select employeeid tid ,sum(freight) maxsum from orders group by employeeid having sum(freight)=
(SELECT max(sum(freight)) from orders group by employeeid)) where employees.employeeid=tid
--哪个顾客买的最多
select companyname,maxsum from customers,
(select customerid cid ,sum(freight) maxsum from orders group by customerid having
sum(freight)=(SELECT max(sum(freight)) from orders group by customerid))
where customers.customerid=cid

 

 

表的种类
业务表:主要用于存储业务逻辑的数据
master:管理单一种类物品的信息

template表:


1.表的连接方式:
a,b           a,c  
a1,b1    a1,c1   
a2,  b2     a3,c3


inner join:
select table1.a,table2.b from table1 inner join table2 on 条件一 and 条件二
例:select table1.a,table2.c from table1 inner join table2 on table1.a = table2.a
      结果为:a1,c1

left join:
select table1.a,table2.b from table1 left join table2 on 条件一 and 条件二
例:select table1.a,table2.c from table1 left join table2 on table1.a = table2.a
结果为:a1,c1
                a2,
select *
from table1, table2
where table1.a = table2.a(+)(oracle写法)


right join:
同left join 不过主表在右

cross join:
a,b           c,d  
a1,b1    c1,d1   
a2,  b2     c2,d2
例:select * from table1 cross join table2
结果为:a1,b1 ,c1, d1
                a1,b1 ,c2, d2
                a2,  b2 , c1, d1
                a2,  b2 , c2, d2

常用的注意点:
union 起码保证上下两个表的字段as的别名一样

用max min avg count时候
对选出的其他字段要用group by
(select  a from table1 where) as  a,做个虚拟字段

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值