Oracle数据库数据查询语句示例(包含大部分常用语句)

Oracle数据库数据查询语句示例(包含大部分常用语句)

目标

  • 掌握查询语句的语法格式与查询思想。
  • 熟练掌握单表查询与集合查询。
  • 重点掌握连接查询,理解嵌套查询的执行过程。

本文用到的关系模式

学生表Student(Sno,Sname,Ssex,Snation,Spolitical,Sbirth,Scollege,Smajor,Sclass)
课程表Course (Cno,Cname,Credit,Cproperty,Chour,Cterm)
选课表SC(Sno,Cno,Grade)
教师表Teacher(Tno,Tname,Tsex,Tbirth,Ttitle,Tcollege)
授课表TC(Id,Tno,Cno,Sclass,Semester,TimePlace)

  • “学生”关系Student,由学号(Sno)、姓名(Sname)、性别(Ssex)、民族(Snation)、政治面貌(Spolitical)、出生日期(Sbirth)、学院(Scollege)、专业(Smajor)和班级(Sclass)组成。
  • “课程”关系Course,由课程号(Cno)、课程名(Cname)、学分(Credit)、课程性质(Cproperty)、学时(Chour)和开设学期(Cterm)组成。
  • “选课”关系SC由学号(Sno)、课程号(Cno)、成绩(Grade)组成。
  • “教师”关系teacher,由职工号(Tno)、姓名(Tname),性别(Tsex),出生日期(Tbirth),职称(Ttitle)和所在学院(Tcollege)组成。
  • “授课”关系TC,由课序号(Id),职工号(Tno),课程号(Cno),授课班级(Sclass),授课学期(Semester)和上课时间地点(TimePlace)组成。

供应商表s(sno, sname, city)
零件表p(pno, pname, color, weight)
工程项目表j(jno, jname, city)
供应情况表 spj(sno, pno, jno, qty)

  • 供应商表 s 由供应商代码(sno)、供应商姓名(sname)、供应商所在城市(city)组成;
  • 零件表 p 由零件代码(pno)、零件名(pname)、颜色(color)、重量(weight)组成;
  • 工程项目表 j 由工程项目代码(jno)、工程项目名(jname)、工程项目所在城市(city)组成;
  • 供应情况表 spj 由供应商代码(sno)、零件代码(pno)、工程项目代码(jno)、供应数量组成(qty),表示某供应商供应某种零件给某工程项目的数量为qty。

语句示例

1.在创建的s,p,j和spj表中完成以下查询

(1)查询零件重量在10-20之间(包括10和20)的零件名和颜色
select pname, color, weight 
from p
where weight >= 10 and weight <= 20;
(2)查询所有零件的平均重量
select avg(weight) 
from p;
(3)查询供应商s3供应的零件信息
select * from p
where pno in
      (select pno from spj
       where sno = 's3')
(4)查询各个供应商号及其供应了多少类零件
select sno, count(distinct pno) classes --classes是起的别名,这里是省略的写法
from spj
group by sno;
(5)查询供应了2类以上零件的供应商号
select sno, count(distinct pno) classes 
from spj
group by sno 
having count(distinct pno) > 2;
(6)查询零件名以“螺”字开头的零件信息
select * from p
where pname like '螺%';--因为编码的问题,这里可能查出来空表

新增以下环境变量可以解决这个问题。

  • 变量名 NLS_LANG
  • 变量值 SIMPLIFIED CHINESE_CHINA.ZHS16GBK
(7)查询给每个工程供应零件的供应商的个数
select pno, count(distinct sno) as snum --这里是起别名完整的写法
from spj
group by pno;
(8)查询供应总量在1000—2000之间(包括1000和2000)的零件名称
select pname
from p
where pno in
      (select pno 
       from spj
       group by pno
       having sum(qty) between 1000 and 2000
);

2.在创建的表Student、Course、SC、Teacher、TC表中完成以下查询

(1) 查询课程性质是选修,并且选修人数在60人以上的课程名、课程学时和开设学期
select cname, chour, cterm
from course
where cno in
      (select cno
       from sc
       group by cno having sum(sno) > 60);
(2) 统计每个学院的学生人数
select scollege, count(sno) 
from student
group by scollege;
(3) 查询信息工程学院所有学生已修课程的总学分,要求列出学号、姓名和总学分
  • 包含未选课学生信息:
select student.sno, sname, sum(credit) as SumCredit
from student
left join sc on sc.sno = student.sno
left join course on course.cno = sc.cno
group by student.sno, sname;

使用了外连接,所以可以看到没有选课的学生的信息
在这里插入图片描述

  • 不包含未选课学生信息:
select student.sno, sname, sum(credit) as SumCredit
from student, sc, course
where student.sno = sc.sno and sc.cno = course.cno
group by student.sno, sname;

没有选课的学生被忽略
在这里插入图片描述

(4) 查询吴春燕老师所授课程的选课和成绩信息,要求列出该老师所授课程的课程名,选课的学生姓名和课程成绩
select cname, student.sname, grade
from student, course, sc, tc, teacher
where student.sno = sc.sno and course.cno = sc.cno and tc.cno = sc.cno and tc.tno = teacher.tno and tname = '吴春燕';
(5) 查询同时选修了“中间件技术”和“Java EE技术”两门选修课的学生的姓名
select distinct sname
from student, sc
where student.sno = sc.sno
and sc.sno in
  (select sno from sc, course 
   where sc.cno = course.cno and cname = '中间件技术'
   and sno IN             
     (SELECT sno from sc, course
      where sc.cno = course.cno and cname = 'Java EE技术'
    )
  )
(6) 查询1994年1月1日以前出生的学生的姓名和专业
select sname, smajor
from student 
where sbirth <= to_date('19940101','YYYYMMDD');
(7) 查询选修了5门以上课程的学生学号和姓名
select student.sno, sname
from student, sc
where student.sno = sc.sno 
group by student.sno, sname
having count(cno) > 5;
(8) 查询比本院学生平均年龄小的学生信息,要求列出姓名与年龄
select sname, trunc(months_between(sysdate, sbirth) / 12) as age
from student x
where to_number(to_char(sbirth,'yyyymmdd')) > 
(select avg(to_number(to_char(sbirth,'yyyymmdd')))
                from student y
                where x.scollege = y.scollege                             
               );

(9) 查询一门课也没有带的教师姓名
select tname
from teacher
where not exists
      (select *
       from tc
       where tno = teacher.tno
      );

(10) 查询比所有“计算机科学与技术”专业学生年龄都大的学生
select *
from student
where sbirth < all
      (select sbirth
       from student
       where smajor= '计算机科学与技术'
      );

后记

最近刚学数据库操作,如果有错误或者哪里还有不足,希望大佬可以指出。

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

么么哒小新

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值