SQL 之 [单表查询]


~单表查询的查询仅涉及一个表~

一、 选择表中的若干列

1、查询指定列

[例1] 查询全体学生的学号与姓名。
SELECT Sno,Sname
FROM Student;

[例2] 查询全体学生的姓名、学号、所在系。
SELECT Sname,Sno,Sdept
FROM Student;

2. 查询全部列

选出所有属性列:
在SELECT关键字后面列出所有列名
将<目标列表达式>指定为 *

[例] 查询全体学生的详细记录。
SELECT Sno,Sname,Ssex,Sage,Sdept
FROM Student;

SELECT *
FROM Student;

3.查询经过计算的值

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

[例] 查全体学生的姓名及其出生年份。
SELECT Sname,2015-Sage /假定当年的年份为2016年/
FROM Student;
输出结果:

Sname2015-Sage
李勇1987
刘晨1988
王敏1989
张立1988

使用列别名改变查询结果的列标题:
SELECT Sname NAME,’Year of Birth: ’ BIRTH,
2015-Sage BIRTHYEAR,LOWER(Sdept) DEPARTMENT
FROMStudent:
输出结果:

NAMEBIRTHBIRTHYEARDEPARTMENT
李勇Year of Birth:1987cs
刘晨Year of Birth:1988is
王敏Year of Birth:1989ma
张立Year of Birth:1988is


二、 选择表中的若干元组

1. 消除取值重复的行

如果没有指定DISTINCT关键词,则缺省为ALL
指定DISTINCT关键词,去掉表中重复的行

假如查询选修课程表的学生学号。
SELECT Sno FROM SC;
( 等价于: SELECT ALL Sno FROM SC;)
执行上面的SELECT语句后,结果为:

Sno
200215121
200215121
200215121
200215122
200215122

SELECT DISTINCT Sno
FROM SC;
执行结果:

Sno
200215121
200215122

2.查询满足条件的元组

常用的查询条件

(1)比较大小

[例1] 查询计算机科学系全体学生的名单。
SELECT Sname
FROM Student
WHERE Sdept=‘CS’;

[例2] 查询所有年龄在20岁以下的学生姓名及其年龄。
SELECT Sname,Sage
FROM Student
WHERE Sage < 20;

[例3] 查询考试成绩有不及格的学生的学号。
SELECT DISTINCT Sno
FROM SC
WHERE Grade<60;

(2)确定范围

•谓词: BETWEEN … AND …
NOT BETWEEN … AND …

[例1] 查询年龄在20~23岁(包括20岁和23岁)之间的学生的姓名、系别和年龄
SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage BETWEEN 20 AND 23;

[例2] 查询年龄不在20~23岁之间的学生姓名、系别和年龄
SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage NOT BETWEEN 20 AND 23;

(3)确定集合

谓词:IN <值表>, NOT IN <值表>
可以用来查询属性值属于指定集合的元组.

[例1]查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别。
SELECT Sname,Ssex
FROM Student
WHERE Sdept IN ( ‘IS’,’MA’,’CS’ );

[例2]查询既不是信息系、数学系,也不是计算机科学系的学生的姓名和性别。
SELECT Sname,Ssex
FROM Student
WHERE Sdept NOT IN ( ‘IS’,’MA’,’CS’ );

(4)字符匹配

谓词: [NOT] LIKE ‘<匹配串>’ [ESCAPE ‘ <换码字符>’]
其含义是寻找指定的属性列值与<匹配串 >相匹配的元组.
<匹配串>可以是一个完整的字符串,也可以包含有通配符’%’和’_’

%(百分号)代表任意长度(可以为0)的字符串.
例如a%b, ab ahhb,aabb,都可以相匹配.
_(下横线)代表任意单个字符

A)匹配串为固定字符串

[例1] 查询学号为200215121的学生的详细情况。
SELECT *
FROM Student
WHERE Sno LIKE‘200215121’;

等价于:
SELECT *
FROM Student
WHERE Sno = ‘200215121’;

B) 匹配串为含通配符的字符串

[例2] 查询所有姓刘学生的姓名、学号和性别。
SELECT Sname,Sno,Ssex
FROM Student
WHERE SnameLIKE ‘刘%’;

[例3] 查询姓”欧阳”且全名为三个汉字的学生的姓名。
SELECT Sname
FROM Student
WHERE SnameLIKE ‘欧阳__’;

[例4] 查询名字中第2个字为”阳”字的学生的姓名和学号。
SELECT Sname,Sno
FROM Student
WHERE Sname LIKE ‘__阳%’;

[例5] 查询所有不姓刘的学生姓名。
SELECT Sname,Sno,Ssex
FROM Student
WHERE Sname NOT LIKE ‘刘%’;

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

如果用户查询的字符串本身就含有通配符%或_,这是就要使用ESCAPE
<换码子符>短语对通配符进行转义了.
ESCAPE ‘\’ 表示“ \” 为换码字符

[例6] 查询DB_Design课程的课程号和学分。
SELECT Cno,Ccredit
FROM Course
WHERE Cname LIKE ‘DB_Design’ ESCAPE ‘\’;

[例7] 查询以”DB_”开头,且倒数第3个字符为 i的课程的详细情况。
SELECT *
FROM Course
WHERE Cname LIKE ‘DB_%i_ _’ ESCAPE ‘\’;

(5)涉及空值的查询

谓词: IS NULL 或 IS NOT NULL
“IS” 不能用 “=” 代替

[例1] 某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学生的学号和相应的课程号。
SELECT Sno,Cno
FROM SC
WHERE Grade IS NULL

[例2] 查所有有成绩的学生学号和课程号。
SELECT Sno,Cno
FROM SC
WHERE Grade IS NOT NULL;

(6)多重条件查询

逻辑运算符:AND和 OR来联结多个查询条件
• AND的优先级高于OR
• 可以用括号改变优先级
•可用来实现多种其他谓词
• [NOT] IN
• [NOT] BETWEEN … AND …

[例] 查询计算机系年龄在20岁以下的学生姓名。
SELECT Sname
FROM Student
WHERE Sdept= ‘CS’ AND Sage<20;

•改写
[例] 查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别。
SELECT Sname,Ssex
FROM Student
WHERE Sdept IN ( ‘IS’,’MA’,’CS’ )

可改写为:
SELECT Sname,Ssex
FROM Student
WHERE Sdept= ’ IS ’ OR Sdept= ’ MA’ OR Sdept= ’ CS ‘;


三、 ORDER BY子句

•ORDER BY子句
可以按一个或多个属性列排序
升序:ASC;降序:DESC;缺省值为升序
•当排序列含空值时
ASC:排序列为空值的元组最后显示
DESC:排序列为空值的元组最先显示

[例1] 查询选修了3号课程的学生的学号及其成绩,查询结果按分数降序排列。
SELECT Sno,Grade
FROM SC
WHERE Cno= ’ 3 ’
ORDER BY Grade DESC;

[例2] 查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列。
SELECT *
FROM Student
ORDER BY Sdept,Sage DESC;


四、 聚集函数

聚集函数:
•计数
COUNT([ DISTINCT | ALL ] *)
COUNT([ DISTINCT | ALL ] <列名>)
•计算总和
SUM([ DISTINCT | ALL ] <列名>)
• 计算平均值
AVG([ DISTINCT | ALL ] <列名>)
•最大最小值
MAX([ DISTINCT | ALL ] <列名>)
MIN([ DISTINCT | ALL ] <列名>)

使用示例:
[例1] 查询学生总人数。
SELECT COUNT(*)
FROM Student;

[例2] 查询选修了课程的学生人数。
SELECT COUNT(DISTINCT Sno)
FROM SC;

[例3] 计算1号课程的学生平均成绩。
SELECT AVG(Grade)
FROM SC
WHERE Cno= ’ 1 ‘;

[例4] 查询选修1号课程的学生最高分数。
SELECT MAX(Grade)
FROM SC
WHER Cno= ‘1 ’;

五、 GROUP BY子句

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

[示例] 求各个课程号及相应的选课人数。
SELECT Cno,COUNT(Sno)
FROM SC
GROUP BY Cno;
详解:这条语句对查询结果按Cno分组,所有Cno值相同的分为一组,
然后再对Sno进行统计.

查询结果:

CnoCOUNT(Sno)
122
234
344
433
548

如果分组后还要求按照一定的条件对这些组进行筛选,最终只输出满足指定条件的组,
则可以使用HAVING短语指定筛选条件
•HAVING短语与WHERE子句的区别:
•作用对象不同
•WHERE子句作用于基表或视图,从中选择满足条件的元组
•HAVING短语作用于组,从中选择满足条件的组。

使用示例:
- [例] 查询选修了3门以上课程的学生学号。
- SELECT Sno
- FROM SC
GROUP BY Sno
- HAVING COUNT(*) >3;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值