使用查询语句的查询
[例5] 查询全体学生的姓名、出生年份和所有系,要求用小写字母表示所有系名。

SELECT Sname,'Year of Birth: ',2000-Sage,ISLOWER(Sdept)
FROM Student;


[例5.1] 使用列别名改变查询结果的列标题

SELECT Sname as name,'Year of Birth: ' as BirthYear,2000-Sage,ISLOWER(Sdept) as DEPT
FROM Student;
#记住考试的时候不要加as


二、选择表中的若干元组
消除取值重复的行 —— 使用 distinct

[例6] 查询选修了课程的学生学号。

select distinct Sname
from SC;


有点不理解,对于所有的列都影响?

[例8] 查询所有年龄在20岁以下的学生姓名及其年龄。

select Sname,Sage
from Student
where Sage < 20;
#另外一种写法
where Not Sage >= 20;


[例10] 查询年龄在20~23岁(包括20岁和23岁)之间的学生的姓名、系别和年龄。

select Sname ,Sdept,Sage
from Student
where Sage between 20 and 23;

[例11] 查询年龄不在20~23岁之间的学生姓名、系别和年龄.

select Sname ,Sdept,Sage
from Student
where Sage not between 20 and 23;

[例12]查询信息系(IS)、数学系(MA)和计
算机科学系(CS)学生的姓名和性别。

select Sname,Ssex
from Student
where Sdept in ('IS','MA','CS');

[例13]查询既不是信息系、数学系,也不是计算
机科学系的学生的姓名和性别。

select Sname,Sage
from Student
where Sdept not in ('IS','MA','CS');



  1. 匹配模板为固定字符串
    [例14] 查询学号为95001的学生的详细情况。
SELECT *
FROM Student
where Sno = '95001';
# 或者写成
SELECT *
FROM Student
where Sno like '95001';
  1. 匹配模板为含通配符的字符串

[例15] 查询所有姓刘学生的姓名、学号和性别。

select Sname,Sno,Ssex
from Student
where Sname like '刘%';

[例16] 查询姓"欧阳"且全名为三个汉字的学生的姓名。

selcet Sname
from Student
where Sname like '欧阳_';

[例17] 查询名字中第2个字为"阳"字的学生的姓名和学号。

Select Sname,Sno
from Student
where Sname like '_阳%';

匹配模板为含通配符的字符串(续)

[例18] 查询所有不姓刘的学生姓名。

select Sname
from Student
where Sname not like '刘%';
  1. 使用换码字符将通配符转义为普通字符

[例19] 查询DB_Design课程的课程号和学分。

select Cno,Ccredit
from Course
where Cname like 'DB\_Design' escape '\';

使用换码字符将通配符转义为普通字符(续)

[例20] 查询以"DB_"开头,且倒数第3个字符为 i的课程的详细情况。

select *
from Course
where Cname like 'DB\_%i__' escape '\';


[例21] 某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学生的学号和相应的课程号。

select Sname,Cno
from Student
where grade is null;
#要看具体的表格名
SELECT Sno,CnoFROM SCWHERE Grade IS NULL;

[例22] 查所有有成绩的学生学号和课程号。
(这个时候就要考虑到有的成绩可能是空的啦)

Select Sno,Cno
from SC
where Grade is not null;


[例23] 查询计算机系年龄在20岁以下的学生姓名。

Select Sname
from Student
#where Sage < 20 and Sdept = '计算机';
where Sage < 20 and Sdept = 'CS';

原来上面的题目改写
[例12] 查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别。

select Sname,Sage
from Student
where Sdept in ('IS','MA','CS');
#也可以改成
where Sdept = 'IS' or Sdept = 'MA' or Sdept = 'CS';

[例10] 查询年龄在20~23岁(包括20岁和23岁)之间的学生的姓名、系别和年龄。

select Sname,Sdept,Sage
from Student
where Sage between 20 and 23;
#改写成
where Sage >= 20 and Sage <= 23;


[例24] 查询选修了3号课程的学生的学号及其成绩,查询结果按分数降序排列。

Select Sno ,Grade
from SC
where Cno = 3
#order by Grade dec;
order by Grade desc;

[例25] 查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列。

select *
From SC
order by Sdept asc,Sage desc;

[例26] 查询学生总人数。

select count(*)
from Student;

[例27] 查询选修了课程的学生人数。

#select count(*)
select count(distinct Sno)
from SC;

[例28] 计算1号课程的学生平均成绩。

select AVG(Grade)
from SC
where Cno = 1;

[例29] 查询选修1号课程的学生最高分数。

select MAX(Grade)
from SC
where Cno = 1;

[例30] 求各个课程号及相应的选课人数。

select Cno,COUNT(Cno)
from SC
group by Cno;

[例31] 查询选修了3门以上课程的学生学号。

select Sno
from SC
#group by Cno
#having COUNT(Cno) > 3;
#后面的不对,如果是按照课程计数的话,计算的就不是学生选择多少门课,而是某门课程有多少人
#学生选了几节课,他的学号就会出现几次
group by Sno
having count(*);
#按照学号分组,数一数每个学号出现的次数是多少

[例32] 查询有3门以上课程是90分以上的
学生的学号及(90分以上的)课程数

select Sno,count(Cno)
from SC
#where Grade > 90
#group by Sno
#having count(*);
where Grade >= 90
group by Sno
having count(*) >= 3;

[例32] 查询每个学生及其选修课程的情况

select Student.*,SC.*
from Student,SC
where Student.Sno = SC.Sno;
#最后一定要加上等值连接的条件,不然很容易写成笛卡尔连接,但是哪个是没有意义的。
#由于上面的这种方法选择了全部的列,所以会出问题

[例33] 对[例32]用自然连接完成。

 SELECT  Student.Sno,Sname,Ssex,Sage,                    Sdept,Cno,GradeFROM     Student,SCWHERE  Student.Sno = SC.Sno;


[例34] 查询每一门课的间接先修课(即先修课的先修课)
(自联结需要取别名)

select a.Cno ,b.Cpno
from Course a,Course b
where a.Cpno = b.Cno;


[例 33] 查询每个学生及其选修课程的情况包括没有选修课程的学生----用外连接操作

select Student.*,SC.*
from Student,SC
where Student.Sno = SC.Sno;
//但是这样没有选课的同学咋办?


WHERE子句中含多个连接条件时,称为复合条件连接

[例35]查询选修2号课程且成绩在90分以上的所有学生的
学号、姓名

#select Sno,Sname
#from Student
#where Cno = 2 and Crade >= 90;
#我完全错了,这本来是两个表复合查询
select Student.Sno,Student.Sname
from Student,SC
where Student.Sno = SC.Sno and Cno = 2 and Crade >= 90;

[例36] 查询每个学生的学号、姓名、选修的课程名及成绩。

select Student.Sno,Student.Sname,Cname,Grade
from Student,SC,Course
where Student.Sno = SC.Sno and SC.Cno = Course.Cno;



简单的理解为,先挑选出一张子表,然后再从子表中挑出自己想要的数据。

一般嵌套查询用于多表查询。



[例37] 查询与“刘晨”在同一个系学习的学生。
此查询要求可以分步来完成

#采用嵌套查询
select *
from Student
where Sdept
in (select Sdept from Student where Sname = '刘晨');
#采用自联结查询
select a.Sname,a.Sno,a.Sdept
from Student a,Student b
where b.Sname = '刘晨' and a.Sdept = b.Sdept;


[例38]查询选修了课程名为“信息系统”的学生学号和姓名

#使用嵌套查询
select Sno,Sname
from Student
where Sno in
(select Sno
from SC
where Cno in
(select Cno
from Course
where Cname = '信息系统'));
#使用连接查询
select Sno,Sname
from Student,SC,Course
where Student.Sno = SC.Sno and SC.Cno = Course.Cno
and Course.Cname = '信息系统';


例:假设一个学生只可能在一个系学习,并且必须属于一个系,则在[例37]可以用 = 代替IN :

select *
from Student
where Sdept
= select Sdept from Student where Sname = '刘晨';



[例39] 查询其他系中比信息系任意一个(其中某一个)学生年龄小的学生姓名和年龄

select Sname,Sage
from Student
where Sage < all(select Sage from Student where Sdept = 'IS';

我做错的原因:其中某一个应该使用 any
<>和!= 都有不等于的意思


[例39’]:用集函数实现[例39]

select Sname,Sage
from Student
where Sage < ( select MAX(Sage) from Student where Sdept = 'IS') and Sdept <> 'IS';

[例40] 查询其他系中比信息系所有学生年龄都小的学生姓名及年龄。

#使用谓词
select Sname,Sage
from Student
where Sage < ANY(select Sage from Student where Sdept = 'IS') and Sdept <> 'IS';
#使用集函数
select Sname,Sage
from Student
where Sage < (select MAX(Sage) from Student where Sdept = 'IS') and Sdept <> 'IS';



[例41] 查询所有选修了1号课程的学生姓名。
用嵌套查询

Select Sname
from Student
where Sno in
(Select Sno
from SC
where Cno = 1);

原来子查询可以使用父亲查询里面的表格名。

[例42] 查询没有选修1号课程的学生姓名。

select Sname
from Student
where not EXists
(select *
from SC
where Sno = Student.Sno and Cno = 1);


例:[例37]查询与“刘晨”在同一个系学习的学生。可以用带EXISTS谓词的子查询替换:

select *
from Student
where exists
(select *
from Student
where Sname = '刘晨';

还是需要像起自连接一样给不同的表格起别名。


[例43] 查询选修了全部课程的学生姓名。

首先把所有的课程挑出来,否定一次,然后再否定一次。

这下面的不太会,脑子不够用了



[例45] 查询计算机科学系的学生及年龄不大于19岁的学生。

#使用集合查询
select *
from Student
where Sage <= 19
union
Select *
from Student
where Sdept = 'CS';
#普通查询SELECT  DISTINCT  *#SELECT *FROM StudentWHERE Sdept= 'CS'  OR  Sage<=19;

[例46] 查询选修了课程1或者选修了课程2的学生。

#使用联合查询
select Sno
from SC
where Cno = '1'
union
select Sno
from SC
where Cno = '2';
#普通查询
#select SnoSELECT  DISTINCT  Sno
from SC
where Cno = '2' or Cno = '1';

[例47] 设数据库中有一教师表Teacher(Tno, Tname,…)。查询学校中所有师生的姓名。

select Sname
from Student
union
select Tname
from Teacher;


这里的其他方式指的是同义转换
[例48] 查询计算机科学系的学生与年龄不大于19岁的学生的交集

本例实际上就是查询计算机科学系中年龄不大于19岁的学生

select *
from Student
where Sdept = 'CS' AND Sage <= 19;

[例49] 查询选修课程1的学生集合与选修课程2的学生集合的交集
本例实际上是查询既选修了课程1又选修了课程2的学生

select Sno
from SC
where Cno = '1' and Cno = '2';
这个条件肯定不对
所以需要查两次,第一次找到所有选择了选修课程2的学生的学号,再从里面挑选选修了选修课一的学生的学号。
##########################################z

2022-1-3数据库概念与原理期末复习提纲(二)相关推荐

  1. 计算机网络原理期末复习提纲,《计算机网络原理》考试复习提纲.doc

    <计算机网络原理>考试复习提纲 <计算机网络原理>考试大纲 第一章计算机网络体系结构 1.计算机网络的构成:资源子网和通信子网. 2.通信子网基本结构:点到点通道和广播通道,它 ...

  2. 数据库系统原理期末复习

    数据库系统原理期末复习 这是本人整理的数据库系统原理的复习资料,按照四个课程目标所划的知识点进行复习,时间充裕的同学可对照文末各章复习知识点查漏补缺. 一.课程目标1:数据库基础知识应用 20分 数据 ...

  3. 大数据技术原理与应用 第三版 林子雨 期末复习(二) Hadoop HDFS HBase

    大数据技术原理与应用 第三版 林子雨 期末复习(二) Hadoop HDFS HBase Hadoop生态系统 HDFS HDFS结构 块 Name Node与Second Name Node与Dat ...

  4. 计算机组成与原理期末,计算机组成与原理期末复习补充

    计算机组成与原理期末复习补充 (10页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.90 积分 2.1.3 虚拟存储器(virtual memory ...

  5. 编译原理期末复习重点

    文章目录 编译原理期末复习纲要 一.选判填 二.简答题 二.大题 编译原理期末复习纲要 仅供自己观看 一.选判填 单选:5*1=5' 判断:5*1'=5' 填空:5*2'=10' 合计:20' 二.简 ...

  6. SCNU网工通信原理期末复习

    通信原理期末复习 ID3902009 纯手敲好累啊-,敲完感觉自己期末考试又行了hihi 其实我的MD转PDF版本会更加好看一点 我的PDF版本在这,点击跳转 离散信息的平均信息量 H = ∑ i = ...

  7. 计算机网络期末复习提纲(全知识点总结)

    计算机网络期末复习提纲全知识点总结 第一章 概述 1.基本概念 - 链路,结点,协议和服务,实体和对等实体,各层PDU - C/S模式,B/S模式,P2P模式 - LAN,WAN,MAN,PAN的划分 ...

  8. 光纤通信技术期末复习提纲

    文章目录 光纤通信技术期末复习提纲 一,第一章:绪论 1.光纤通信基本概念 2.光纤通信的主要特点 (1)优点 (2)缺点 3.光纤通信的三个低损耗窗口 二.第二章:光纤光缆技术 1.光纤的结构 2. ...

  9. 数据挖掘期末复习提纲(2021.7.3)

    数据挖掘期末复习提纲 什么是数据挖掘 Opinion1: 数据中的知识发现(KDD) Opinion2: 是知识发现过程的一个基本步骤: 数据清理>数据集成>数据选择>数据变换> ...

最新文章

  1. 专访施巍松:边缘计算早期提出者之一
  2. Qt Designer 编辑Tab顺序
  3. 汇编语言--数据传送指令
  4. 15-奇怪的Js文件引用问题
  5. Leaflet中使用Leaflet.Polyline.SnakeAnim插件实现水流模拟效果
  6. xen虚拟机管理工具xm与virsh用法
  7. Flink的UDF写法整理
  8. [Java基础]字符流中的编码解码问题
  9. Java加密与解密的艺术~MD算法实现
  10. oracle分组后伪列,Oracle伪列和伪表和分组函数(row_number,Rank)
  11. EIM正在迎来自己的春天
  12. pytorch 之 imagefloder的用法
  13. 金牌访谈栏目《架构师说》重磅上线!
  14. Discuz 2.0 英文版 源码分析 一
  15. Windows开发之——局域网内搭建论坛
  16. Android实现NCM转MP3格式
  17. 云计算存在哪些安全问题
  18. 云计算技术实际上就是计算机网络的,浅析计算机网络的云计算技术.doc
  19. sql语句左连接时的ON AND用法
  20. 2021Android高级面试题总结:字节跳动Android岗经典面试真题,面经解析

热门文章

  1. 360加固保的dex脱壳方法
  2. 八边形 八角图形 Python Turtle绘制
  3. 关于Ubuntu下Komodo如何运行
  4. 51单片机DS18B20温度传感器详解
  5. 狂奔的蔚来:上市背后的必然与隐忧
  6. Machine Leaning
  7. WGS1984与ITRF框架
  8. 服务器硬盘数据冗余,磁盘存储冗余是什么意思?
  9. 北京清真寺基督教堂游
  10. element ui富文本编辑器的使用(quill-editor)