3.3.2 使用DISTINCT短语

在表中,经常有一列中反复出现同一数据的情况,如要在查询结果中将重复的数据去掉,每个数据仅仅出现一次,则可以使用DISTINCT短语来实现。

如图3.16所示的“学生选课表.xlsx”,每个学生可以选多门课,因此同一个学号和姓名会出现多次,例如“201806121”和“李勇”这两个数据都出现了三次。同时,一门课可能被多个学生选修,所以同一个课程也会出现多次,例如“信息系统”这个数据被五个同学选修,出现了五次。在查询操作中,如果要将列中重复的数据去掉,则要使用DISTINCT短语。

图3.16 学生选课表

假设要查询“选了课的所有学生的学号和姓名”,即从表中查询“学号”和“姓名”两列。其步骤如下。

步骤1:在“学生选课表.xlsx”工作簿中增加一个新的工作表“查询选课学生”,并选中A1单元格。

步骤2:点击“数据”菜单,在“获取和转换数据”组中选择“现有连接”按钮,在打开的“现有连接”窗口中点击“浏览更多…”按钮,在弹出的“选取数据源”窗口中选取“学生选课表.xlsx”所在的目录,并选择此文件,然后点击“打开”按钮。在弹出的“选择表格”窗口中选择“学生选课表$”后点击“确定”按钮。

步骤3:在弹出的“导入数据”窗口中点击“属性”按钮,在此窗口中选择“定义”选项卡。清空“命令文本”框,键入如下SQL语句后点击“确定”按钮。

SELECT 学号,姓名

FROM [学生选课表$]

查询后的结果如图3.17所示。从结果可以看出,所有选课的学生都出现在结果中。对于选了多门课的学生,在结果中出现了多次。例如“李勇”选了三门课,因此出现了三次。

图3.17 查询选课学生

如果在SQL语句中使用DISTINCT短语,则可以去掉这些重复的数据。选中“查询选课学生”表中的D1单元格,按照上述步骤,在“命令文本”框中输入如下SQL语句:

SELECT DISTINCT 学号,姓名

FROM [学生选课表$]

查询后的结果如图3.18所示。可以看到,在列名前使用DISTINCT短语后,去掉了结果中的重复数据,每个学号和姓名都仅出现一次。

图3.18 去掉重复项的查询

使用同样的方法,可以查询“哪些课程被学生选”。步骤如下。

步骤1:在“学生选课表.xlsx”工作簿中增加一个新的工作表“查询被选课程”,并选中A1单元格。

步骤2:点击“数据”菜单,在“获取和转换数据”组中选择“现有连接”按钮,在打开的“现有连接”窗口中点击“浏览更多…”按钮,在弹出的“选取数据源”窗口中选取“学生选课表.xlsx”所在的目录,并选择此文件,然后点击“打开”按钮。在弹出的“选择表格”窗口中选择“学生选课表$”后点击“确定”按钮。

步骤3:在弹出的“导入数据”窗口中点击“属性”按钮,在此窗口中选择“定义”选项卡。清空“命令文本”框,键入如下SQL语句后点击“确定”按钮。

SELECT DISTINCT 选修课程

FROM [学生选课表$]

查询结果如图3.19所示,可以看到被选的课程只有三门课,重复选课的数据都已经删去了。

图3.19 查询被选课程

小结

在SQL中既可以给表起别名,也可以给列起别名,其方法都是在表名或者列名的后面使用“AS 表别名”或者“AS 列别名”来定义。对于查询数据中包含重复数据的情况,可以在列名前加上“DISTINCT”短语去掉重复数据。但是在使用DISTINCT短语时需要注意,如果去掉的重复项涉及多个列,只需在第一列前加上DISTINCT即可,无需在每列前都加DISTINCT。例如查询“选了课的所有学生的学号和姓名”的例子中,需要去掉重复项的数据包含了学号列和姓名列,但无需在每列前都加上DISTINCT。因此,下面的写法是错误的:

SELECT DISTINCT 学号,DISTINCT 姓名

FROM [学生选课表$]