SELECT重点

单表查询

(1)选择表中的若干列

查询指定列
SELECT Sno,Sname
FROM Student;

在这里插入图片描述

查询经过计算的值

  • SELECT 子句的目标表达式可以为
  • 算术表达式
  • 字符串常量
  • 函数
  • 列别名

算数表达式
查全体学生的i姓名及其出生年份,

SELECT Sname,2021-Sage
FROM Student

字符串常量及函数
查询全体学生的姓名、出生年份和所有系,要求用小写字母表示所有系名,这里假定目前年份是2004年

SELECT Sname,'YEAR OF BIRTH',2021-Sage,LOWER(Sdept)
FROM Student;

选择表中的若干元组

关键词DISTINCT去掉表中重复的行

SELECT Sno FROM SC

去掉表中重复的行

SELECT DISTINCT SNO 
FROM SC

在这里插入图片描述
查询信息系,数学系和计算机科学系学生的姓名和性别

SELECT Sname,Ssex
FROM Student
WHERE Sdept IN('IS','MA','CS')

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

SELECT Sname,Ssex
FROM Student
WHERE Sdept NOT IN ('IS','MA','CS')

查询所有不姓刘的学生姓名。

SELECT Sname
FROM Student
WHERE Sname NOT LIKE '刘%'

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

SELECT Sno,Cno
FROM SC
WHERE Grade IS NULL;

查所有有成绩的学生学号和课程号。

SELECT Sno,Cno
FROM SC
WHERE Grade IS NOT NULL

ORDRY BY

  • 可以按一个或多个属性列排序
  • 升序:ASC
  • 降序:DESC
  • 缺省值为升序

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

SELECT Sno,Grade
FROM SC
WHERE Sno='3'
ORDER BY Grade DESC

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

SELECT *
FROM Student
ORDER BY Sdept,Sage DESC;

聚集函数

查询学生总人数。

SELECT COUNT(*)
FROM Student

** 计算2号课程的学生平均成绩。**

SELECT AVG(Grade)
FROM Student
WHERE Cno='2'

查询,选修2号课程的,学生最高分数

SELECT MAX(Grade)
FROM SC
WHERE Cno='2'

查询,学生201215121,选修课程的,总学分数

SELECT SUM(Credit)
FROM SC,Course
WHERE Sno='201215121' AND SC.Cno=Course.Cno;

GROUP BY子句

GROUP BY子句分组:
细化聚集函数的作用对象

  • 为对查询结果分组,聚集函数将作用于整个查询结果
  • 对查询结果分组后,聚集函数将分别作用于每个组
  • 作用对象是查询的中间结果表
  • 按指定的一列或多列值分组,值相等的为一组

HAVING和WHERE的区别

  • 作用对象不同
  • WHERE子句作用于基表或视图,从中选择满足条件的元组
  • HAVING 短语作用于组,从中选择满足条件的组

求各个课程号及相应的选课人数。

SELECT Cno,COUNT(Sno)
FROM SC
GROUP BY Cno;

查询选修了2门以上课程的学生学号

SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*)>2;

连接查询

连接条件中的各连接字段类型必须是可比的,但名字不必是相同的

等值连接与非等值连接

查询每个学生及其选修课程的情况

SELECT Student.*,SC.*
FROM Student,SC
WHERE Student.Sno=SC.Sno

用自然连接

SELECT  Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM     Student,SC
WHERE  Student.Sno = SC.Sno;

连接JOIN

INNER JOIN

SELECT Sno,SC.Cno,Grade,Course.Cno,Cname,Cpno,Credit
FROM SC INNER JOIN Course ON(SC.Cno=Couse.Cno);

复合条件连接

查询,选修2号课程,且成绩在88分以上的所有学生

SELECT Student.Sno,Sname
FROM Student,SC
WHERE Student.Sno=SC.sno AND
SC.Cno='2' ADN SC.Grade>88

查询每个学生的学号、姓名、选修的课程名及成绩

SELECT Student.Sno,Sname,Cname,Grade
FROM Student,SC,Course
WHERE Student.Sno=SC.sno and SC.cno=Course.cno;

嵌套查询

SELECT Sname
FROM Student
WHERE Sno IN
(SELECT Sno
FROM SC
WHERE Cno='2');
  • 子查询的限制:不能使用ORDER BY子句
  • 层层嵌套方式反映了SQL语言的结构化
  • 有些嵌套查询可以用连接运算代替

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

SELECT Sno,Sname
FROM Student,SC,Course
WHERE Student.Sno=SC.Sno
AND SC.Cno=Course.Cno
AND Course.Cname=='信息系统'

带有比较运算符的子查询

  • 带有比较运算符的子查询是指父查询与子查询用比较运算符进行连接。当用户能确切知道内层返回的是单个值时,可以用>,<,=,>=,<=,<>
  • 与ANY或ALL谓词配合使用

找出每个学生超过他选修课程平均成绩的课程号

SELECT Sno,Cno
FROM SC,X
WHERE Grade >=(SELECT AVG(Grade)
				FROM SC y
				WHERE y.Sno=x.Sno
				);

查询其他系中比计算机科学某一学生年龄小的学生姓名和年龄

SELECT Sname,Sage
FROM Student 
WHERE Sage<ANY(SELECT Sage
				From Student
				WHERE Sdept='CS')
				AND Sdept<>'CS';

方法二:用聚集函数

SELECT Sname,Sage
FROM Student
WHERE Sage<(SELECT MIN(Sage)
			FROM Student
			WHERE Sdept='CS')
			AND Sdept<>'CS'

查询所有选修了1号课程的学生姓名。

SELECT Sname
FROM Student
WHERE EXISTS(SELECT *
				FROM SC
				WHERE Sno=Student.Sno
				AND Cno='1');

用连接运算(推荐使用这种方法)

SELECT Sname
FROM Student,SC
WHERE Student.Sno=Sc.Sno
AND SC.Cno='1';

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

SELECT Sname
FROM Student
WHERE NOT EXISTS(SELECT *
				FROM SC
				WHERE Sno=Student.Sno
				AND Cno='1')
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值