SQL数据查询——单表查询(一)

一、select(from)子句的基本使用

1.查询指定列

SELECT 列表达式1[,列表达式2,…]
FROM 表名;

#例:查询全体学生的姓名、学号、所在院系
SELECT Sname,Sno,Sdept
FROM Student;

2.查询全部列

SELECT *
FROM 表名;

#例:查询全体学生的详细记录
SELECT *
FROM Student;

3.查询经过计算的值

SELECT 列表达式1[,列表达式2,…]
FROM 表名;

【注意】列表达式可以是算术表达式、字符串常量、函数等

#例:查询全体学生的姓名、出生年份以及所在院系,要求用小写字母表示系名
SELECT Sname,'Year of Birth:',2020-Sage,LOWER(Sdept)
FROM Student;  --Student(Sno,Sname,Sage,Ssex,Sdept)

#此时后三列均没有名称,若要给列指定标题,则用下面的方法
SELECT Sname AS NAME,
	   'Year of Birth:' AS BIRTH,
	   2020-Sage AS BIRTHDAY,
	   LOWER(Sdept) AS DEPARTMENT
FROM Student;

4.如何去除取值重复行

SELECT DISTINCT 列表达式
FROM 表名;

#例:查询所有选修过课的学生学号
SELECT DISTINCT Sno
FROM SC; --SC(Sno,Cno,Score)

二、where子句的基本使用

SELECT 列表达式
FROM 表名
WHERE 条件表达式;
查询满足条件的元组,查询条件有大小比较、范围确定、集合确定、字符匹配、空值、多重条件。

1.比较大小

谓词:=, >, <, >=, <=, !=, <>, !>, !<, NOT

#例:查找所有年龄在20岁以下的学生姓名及其年龄
SELECT Sname,Sage
FROM Student
WHERE Sage<20; --或者 WHERE NOT Sage>=20;

2.确定范围

谓词:BETWEEN AND, NOT BETWEEN AND

#例:查询年龄在20至23岁之间的学生姓名、系别和年龄
SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage BETWEEN 20 AND 23;

3.确定集合

谓词:IN, NOT IN

#例:查询信息系(IS)、数学系(MA)和计算机科学系(CS)以外院系的学生姓名和学号
SELECT Sname,Sno
FROM Student
WHERE Sdept NOT IN('IS','MA','CS');

4.字符匹配

谓词:LIKE, NOT LIKE
形式:[NOT] LIKE ‘匹配串’ [ESCAPE ‘换码字符’]

【注意】匹配串可以是一个完整的字符串,也可以含有通配符:
%:代表任意长度(也可以为0)的字符串
_:代表任意单个字符
[]:指定范围或集合中的任何单个字符
[^]:不属于指定范围或集合中的任何单个字符
#例:查找名字中第二字为"磊"字的学生姓名和学号
SELECT Sname,Sno
FROM Student
WHERE Sname LIKE '_磊%';  --_表示姓氏任意,%表示第二字之后的名字任意
#例:查找以"DB_"开头且倒数第二个字符为i的课程的详细情况
SELECT *
FROM Course --Course(Cno,Cname,...)
WHERE Cname LIKE 'DB\_%i_' ESCAPE '\';
#这里的匹配串第一个_前面有换码字符\,因此被转义为普通的_字符,而第二个_前面没有换码字符\,因此仍作为通配符使用
#例:查找非"丁""马"姓氏开头的学生信息
SELECT *
FROM Student
WHERE Sname LIKE '[^丁马]%';

5.判断空值

谓词:IS NULL, IS NOT NULL
【注意】IS不能有等号代替

#例:查询所有有成绩记录的学生学号和课程号
SELECT Sno,Cno
FROM SC
WHERE Score IS NOT NULL;

6.多重条件连接词

谓词:AND, OR

#例:查询年龄在20岁以下且为CS系的学生姓名
SELECT Sname
FROM Student
WHERE Sdept='CS' AND Sage<20;

三、order by子句的基本使用

SELECT 列表达式
FROM 表名
WHERE 条件表达式
ORDER BY 排序字段表达式 ASC(升序)/DESC(降序)

#例:查询全体学生情况,查询结果按所在系升序排列,对同一系学生按年龄降序排列
SELECT *
FROM Student
ORDER BY Sdept, Sage DESC;  --若不表明升降序默认为升序

四、top子句的基本使用

TOP用来限制查询结果
形式:TOP 数值表达式 [PERCENT][WITH TIES]

数值表达式:表示结果的行数或百分比数
PERCENT:指定百分比
WITH TIES:必须与ORDER BY子句配合使用,WITH TIES可以将ORDER BY排序前n行的数据以及与第n行排序列值具有相同值的行一并列出
#例:查询学生表中前40%学生的学号、姓名、性别和所在系(按学号升序排列)
SELECT TOP 40 PERCENT Sno,Sname,Ssex,Sdept
FROM Student
ORDER BY Sno;

#例:查询选课表中成绩居前5位的选课信息
SELECT TOP (5) WITH TIES *  --前5位可能有重复的成绩,需把与前五位成绩相同的信息都列出
FROM SC
ORDER BY Score DESC;

五、集函数的基本使用

集函数主要包括:

COUNT([DISTINCT/ALL] *)			统计元组个数
COUNT([DISTINCT/ALL] 列名)		统计一列中值的个数
SUM([DISTINCT/ALL] 列名)		计算一列值的总和(该列数据类型必须为数值型)
AVG([DISTINCT/ALL] 列名)		计算一列值的平均值(该列数据类型必须为数值型)
MIN([DISTINCT/ALL] 列名)		求一列值中的最大值
MAX([DISTINCT/ALL] 列名)		求一列值中的最小值

1.统计个数

COUNT([DISTINCT/ALL] 列名) 统计一列中值的个数

#例:查询选修了课程的学生人数
SELECT COUNT(DISTINCT Sno)  --学生可以选多门课,每选修一门都有一条相应的记录,避免重复计算学生人数,需要DISTINCT
FROM SC

2.计算平均值

AVG([DISTINCT/ALL] 列名) 计算一列值的平均值(该列数据类型必须为数值型)

#例:计算2号课程的平均成绩
SELECT AVG(Score)
FROM SC
WHERE Cno='2';

3.计算最小/大值

MIN([DISTINCT/ALL] 列名) 求一列值中的最大值
MAX([DISTINCT/ALL] 列名) 求一列值中的最小值

#例:查询选修1号课程的学生最高分数以及最低分数
SELECT MAX(Score),MIN(Score)
FROM SC
WHERE Cno='1';

六、group by(having)子句的基本使用

SELECT 列表达式
FROM 表名
WHERE 条件表达式
GROUP BY 分组字段表达式
ORDER BY 排序字段表达式 ASC/DESC

【注】对查询结果分组的目的是为了细化集函数的作用对象,若未对查询结果分组,集函数将作用于整个查询结果,即整个查询只有一个函数值;否则,集函数将作用于每一组,即每一组都有一个函数值。

1.group by用法

#例:查询各个课程号与相应的选课人数
SELECT Cno,COUNT(Sno)
FROM SC
GROUP BY Cno;  --对SC按Cno的取值进行分组,相同Cno的元组为一组,分别对每一组COUNT以求得该组学生人数

2.group by having用法

【注意】
①有GROUP BY子句才能使用HAVING子句
②有GROUP BY子句时,SELECT子句中只能出现GROUP BY子句中的分组列名与集函数
③SQL SERVER中Text、nText和Image数据类型的字段不可作为GROUP BY子句的分组依据
#例:查询不及格门数达到2门以上的学生学号
SELECT Sno
FROM SC
WHERE Score<60  --选择所有成绩不及格的元组
GROUP BY Sno  --对SC按Sno进行分组,相同Sno的元组为一组
HAVING COUNT(Cno)>2;  --分别对每一组COUNT以求得该学生不及格门数,大于2的组才会被选出来

【重点】WHERE子句与HAVING短语的区别
根本区别:作用对象不同
①WHERE子句作用于基本表或视图,从中选择满足条件的元组
②HAVING短语作用于,从中选择满足条件的组

发布了20 篇原创文章 · 获赞 16 · 访问量 1283

猜你喜欢

转载自blog.csdn.net/SAMSARS/article/details/105385870