oracle-sql练习
创建以下表格用于练习
CREATE TABLE tb_emp
(
ID number PRIMARY KEY,--职员编号
NAME VARCHAR2(20) NOT NULL,--职员姓名
Sex VARCHAR2(2) NOT NULL CHECK(sex IN ('男','女')),--职员性别
Age number NOT NULL CHECK(age>=18),--职员年龄
Address VARCHAR2(50) NOT NULL, --职员地址
Tel VARCHAR2(30) NOT NULL,--职员电话
Email VARCHAR2(30)--职员邮箱
);
CREATE TABLE tb_Prod
(
ID number PRIMARY KEY,--商品编号
TYPE VARCHAR2(20) NOT NULL,--商品类型
Mark VARCHAR2(20) NOT NULL,--商品品牌
Spec VARCHAR2(20)--商品规格
);
CREATE TABLE tb_Sales
(
srNO number PRIMARY KEY,--记录编号
eID number NOT NULL REFERENCES tb_emp(id),--职员编号
pID number NOT NULL REFERENCES tb_prod(id),--商品编号
pQty number NOT NULL CHECK(pqty>0),--销售数量
pAmount number NOT NULL CHECK(pamount>0),--销售价值
sDate date default sysdate --销售时间
);
tb_emp员工表的数据插入
INSERT INTO tb_emp
(ID,NAME,sex,age,address,tel)
VALUES
(1,'赵龙','男',25,'湖南省长沙市伍家岭江南苑9栋203号','0731-4230123');
INSERT INTO tb_emp
(ID,NAME,sex,age,address,tel)
VALUES
(2,'李云','女',23,'湖南省长沙市东风路东风新村21栋502号','0731-4145268');
INSERT INTO tb_emp
(ID,NAME,sex,age,address,tel)
VALUES
(3,'孙一成','男',24,'湖南省株洲市601厂宿舍15栋308号','0732-8342567');
INSERT INTO tb_emp
(ID,NAME,sex,age,address,tel)
VALUES
(4,'林笑','男',27,'湖南省郴洲市人民医院20栋301号','0735-2245214');
INSERT INTO tb_emp
(ID,NAME,sex,age,address,tel)
VALUES
(5,'卫晴','女',23,'湖南省长沙市望月湖12栋403号','0731-8325124');
tb_Prod产品表的数据插入
INSERT INTO tb_prod VALUES(1,'电视机','长虹','29英寸纯平');
INSERT INTO tb_prod VALUES(2,'电视机','长虹','29英寸纯平艺术');
INSERT INTO tb_prod VALUES(3,'电视机','长虹','32英寸背投');
INSERT INTO tb_prod VALUES(4,'电视机','熊猫','29英寸纯平');
INSERT INTO tb_prod VALUES(5,'电视机','熊猫','29英寸纯平艺术');
INSERT INTO tb_prod VALUES(6,'电视机','熊猫','32英寸背投');
INSERT INTO tb_prod VALUES(7,'笔记本','联想','P4-1.8G');
INSERT INTO tb_prod VALUES(8,'笔记本','联想','P4-2.4G');
INSERT INTO tb_prod VALUES(9,'笔记本','紫光','P4-1.8G');
INSERT INTO tb_prod VALUES(10,'笔记本','紫光','P4-2.4G');
tb_Sales销售表的数据插入
INSERT INTO tb_sales VALUES(1,1,1,10,21000,to_date('2004-3-12','yyyy-mm-dd'));
INSERT INTO tb_sales VALUES(2,1,2,5,20000,to_date('2004-3-12','yyyy-mm-dd'));
INSERT INTO tb_sales VALUES(3,1,1,4,23500,to_date('2004-3-14','yyyy-mm-dd'));
INSERT INTO tb_sales VALUES(4,1,5,4,16500,to_date('2004-3-14','yyyy-mm-dd'));
INSERT INTO tb_sales VALUES(5,2,3,3,31000,to_date('2004-3-11','yyyy-mm-dd'));
INSERT INTO tb_sales VALUES(6,2,6,4,40000,to_date('2004-3-13','yyyy-mm-dd'));
INSERT INTO tb_sales VALUES(7,3,7,5,40000,to_date('2004-3-13','yyyy-mm-dd'));
INSERT INTO tb_sales VALUES(8,3,8,3,36000,to_date('2004-3-14','yyyy-mm-dd'));
INSERT INTO tb_sales VALUES(9,4,9,6,41500,to_date('2004-3-12','yyyy-mm-dd'));
INSERT INTO tb_sales VALUES(10,4,10,5,50000,to_date('2004-3-14','yyyy-mm-dd'));
INSERT INTO tb_sales VALUES(11,1,1,10,21000,to_date('2004-4-12','yyyy-mm-dd'));
INSERT INTO tb_sales VALUES(12,1,2,5,20000,to_date('2004-4-12','yyyy-mm-dd'));
INSERT INTO tb_sales VALUES(13,1,4,12,23500,to_date('2004-4-14','yyyy-mm-dd'));
INSERT INTO tb_sales VALUES(14,1,5,4,16500,to_date('2004-4-14','yyyy-mm-dd'));
INSERT INTO tb_sales VALUES(15,2,3,3,31000,to_date('2004-4-11','yyyy-mm-dd'));
INSERT INTO tb_sales VALUES(16,2,6,4,40000,to_date('2004-4-13','yyyy-mm-dd'));
INSERT INTO tb_sales VALUES(17,3,7,5,40000,to_date('2004-4-13','yyyy-mm-dd'));
INSERT INTO tb_sales VALUES(18,3,8,3,36000,to_date('2004-4-14','yyyy-mm-dd'));
INSERT INTO tb_sales VALUES(19,4,9,6,41500,to_date('2004-4-12','yyyy-mm-dd'));
INSERT INTO tb_sales VALUES(20,4,10,5,50000,to_date('2004-4-14','yyyy-mm-dd'));
查询所有职员的所有信息
select * from tb_emp;
查询所有职员的姓名,电话,地址
select name,tel,address
from tb_emp;
查询所有女职员的详细信息
select *
from tb_emp
where sex='女'
查询年龄在24到26岁之间的职员的姓名,性别
select name,sex
from tb_emp
where age between 24 and 26
查询家住长沙的女职员的姓名,电话,地址
select name,tel,address
from tb_emp
where sex='女' and address like ('%长沙%')
查询李云,孙一成,林笑的电话,地址
select tel,address
from tb_emp
where name in ('李云','孙一成','林笑')
查询郴洲和株洲的职员的姓名,性别,年龄
select name,sex,age
from tb_emp
where address like ('%郴洲%') or address like ('%株洲%')
查询家住长沙,年龄在25到28岁之间的男职员的姓名
select name
from tb_emp
where (age between 25 and 28)
and
(address like '%长沙%')
and
(sex='男')
查询邮件地址为空的职员
select name
from tb_emp
where email is null
总共有多少个职员?
select count(*)
from tb_emp
年龄最小的女职员的年龄
select name
from tb_emp
where sex='女'
and
age in (select min(age)
from tb_emp
where sex='女'
group by sex)
这里两个人都是23岁,原本用的是age = (select。。。)来查询,但是只查询出李云一个人,因为这个子查询返回两行数据,改成in之后,结果正确。
按性别统计职员的最大年龄和最小年龄
select sex,max(age),min(age)
from tb_emp
group by sex
笔记本单笔销售价值最高的单笔销售价值
select max(pamount)
from tb_prod p,tb_sales s
where p.id=s.pid
group by type
having type='笔记本'
5. 熊猫电视机的平均销售价格
select avg(pamount)
from tb_prod p,tb_sales s
where p.id=s.pid
group by mark
having mark='熊猫'
紫光笔记本4月份的销售总额
select sum(pamount)
from tb_prod p,tb_sales s
where p.id=s.pid and to_char(sdate,'mm')=4
group by mark
having mark='紫光'
这里to_char
函数获得的月数是字符类型,和数字4比较的时候会隐式转换成数字类型。
按类型,品牌统计商品的销售总数量,销售总数量,低于20的不统计
select type,mark,sum(pqty)
from tb_prod p,tb_sales s
where p.id=s.pid
group by type,mark
having sum(pqty)>=20
按品牌,规格统计笔记本的平均销售价格,按销售价格从高到低的顺序显示
select mark,spec,avg(pamount) a
from tb_prod p,tb_sales s
where p.id=s.pid
group by mark,spec
order by a desc
按姓名统计男职员3月份的销售总额,销售总额低于80000的不统计
select e.name,sum(pamount) 销售总额
from tb_prod p,tb_sales s,tb_emp e
where p.id=s.pid and e.id=s.eid
and e.sex='男'
and to_char(sdate,'mm')=3
group by e.name
having sum(pamount) >=80000
找出销售总额最高的职员的姓名
select e.name,sum(pamount) sp
from tb_emp e,tb_sales s
where e.id=s.eid
group by e.name
having sum(pamount)=(select max(a)
from (select sum(pamount) a
from tb_emp e,tb_sales s
where e.id=s.eid
group by e.id
order by a desc) )
1.先求出每个员工的销售总额倒序排序
2.再求出销售总额最高的额度用max()
函数来实现
3.再求出每个人的姓名与销售额度,当销售额度等于最高的销售总额时,输出这个人的姓名和销售额度
按姓名统计每个职员一共完成了多少笔销售业务
select e.name,count(s.eid) 业务数量
from tb_emp e,tb_sales s
where e.id=s.eid(+)
group by e.name
找出完成销售业务笔数最少的职员的姓名和他完成的业务数
select e.name,count(s.eid) 业务数量
from tb_emp e,tb_sales s
where e.id=s.eid(+)
group by e.name
having count(s.eid) = (select min(ct)
from (select e.name,count(s.eid) ct
from tb_emp e,tb_sales s
where e.id=s.eid(+)
group by e.name))
所有职员,所有商品的销售情况,
包括:职员姓名,商品类别,商品品牌,商品规格,销售数量,销售价值,销售时间,按销售时间从高到低排列
select e.name,type,mark,spec,pqty,pamount,sdate
from tb_emp e,tb_prod p,tb_sales s
where e.id=s.eid and p.id=s.pid
order by sdate desc;
笔记本4月份的销售情况,
包括:商品编号,商品品牌,商品规格,销售数量,销售价值,按销售数量从低到高排列
select p.id,p.mark,p.spec,s.pqty,s.pamount
from tb_prod p,tb_sales s
where p.id=s.pid
and type='笔记本'
and to_char(sdate,'mm')=4
order by s.pqty asc;
李云3月份的销售情况,包括:商品编号,商品品牌,商品规格,销售数量,销售价值
select e.name,p.id,p.mark,p.spec,s.pqty,s.pamount
from tb_emp e,tb_prod p,tb_sales s
where e.id=s.eid and p.id=s.pid
and e.name='李云'
and to_char(sdate,'mm')=3;
长虹29英寸纯平艺术电视机的销售情况,包括:销售数量,销售价值,销售时间
select pamount 销售价值,pqty 销售数量,sdate 销售时间
from tb_prod p,tb_sales s
where p.id=s.pid
and mark='长虹'
and spec='29英寸纯平艺术';
长沙男职员4月份的销售情况,包括:职员姓名,商品类别,商品品牌,商品规格,销售数量,销售价值
select e.name,p.type,p.mark,p.spec,s.pqty,s.pamount
from tb_emp e,tb_prod p,tb_sales s
where e.id=s.eid and p.id=s.pid
and sex='男'
and address like '%长沙%'
and to_char(sdate,'mm')=4;