Excel 2010 SQL完全应用
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.2 SQL基础概念

本节从SQL语言的概念出发,阐述什么是表?表的组成部分有哪些?引导读者掌握最基础的数据库概念,了解关系数据库的相关原理,为学习SQL语言进一步打下基础。

疑难6 如何从表中获取多列和多行

如图1-28所示,左边是客户为双星旅游的订单表,现在需要提取产品码为FG25以及订单数量大于25的ERP号、产品码、订单数量等记录,如图1-28中右边结果所示。在这个订单表中,符合条件的记录却分散在左边表中的不同行和不同列中,如何把这些记录收集在一起?

■ 图1-28 提取所需要的数据

解决方案

通过SQL语句中的SELECT语句可提取所需要的数据。

操作方法

※ 使用SQL语句获取行和列数据 ※

步骤1 通过OLE DB方法找到外部数据源,保留“选择表格”对话框中的默认选择,单击“确定”按钮,激活“导入数据”对话框,再单击“属性”按钮,在弹出的“连接属性”对话框中勾选“打开文件时刷新数据”复选框,然后单击“定义”选项卡,清空“命令文本”框中原有的内容。

步骤2 在“命令文本”框中输入以下SQL连接语句:

SELECT ERP号,产品码,订单数量
FROM [订单表$A1:F25]
WHERE  产品码="FG25" AND 订单数量>25

如图1-29所示,单击“确定”按钮返回“导入数据”对话框,指定返回的查询数据位置为现有工作表的“$H$7”,然后单击“确定”按钮,即可提取所需的数据。

■ 图1-29 相关的SQL查询语句

知识扩展

※ 什么是关系数据库中的表 ※

在本例中,[订单表$A1:F25]实际上就相当于一个表,只不过它是存在于订单表的A1:F25区域中。在关系数据库中,所有的数据都存储在表中,表是拥有列和行的一个二维结构。在计算机术语中,列叫做字段,行叫做记录。

在日常生活中,我们会看到很多用表格表示的示例,例如,公交汽车时间调度表、报纸上列出的股票值等。表格是以非常紧凑的形式表现多种信息的一种好方法。关系数据库中的表与日常生活中见到的表格非常类似。

关系数据库中所有的信息都保存在表中。没有其他类型的容器可以保存这些信息,也就是说,没有其他的数据结构可以用来保存信息,即使是最复杂的信息,也是保存在表中的。

总之,在关系数据库中,所有的数据都存储在表中。表包含行和列两维,它甚至可以保存复杂的信息。所有的操作都始于表且止于表,所有的数据都显示在表中。

※ 一行在表中表示什么信息 ※

表中的每一行都表示一个对象、事件或关系,在此统称为对象。

一个表中的所有行都表示相同类型的对象。如果一所学校有100名老师,可以把他们相关的所有信息保存在单个表中。如果还想保存学校中1000名学生的信息,需要使用另一个单独的表来保存它们。

关系数据库中的表有可能包含几百或几千行,有些表甚至包含了100万行。理论上,一个表可以包含的行的数量是没有限制的,但是在Excel中,根据版本不同而有所限制。在关系数据库中,一个表的行被认为是没有特定顺序的,因此,它们是一个无序的组。这一点和大部分人所熟悉的表有所不同。在公交汽车时刻表中,行有一个明确的逻辑顺序,它们并不是按照一个随机的顺序杂乱无章地放在一起的。

对于一行,可以归纳为:一行包含了一个对象、事件或关系的数据;一个表中的所有行包含了类似对象、事件或关系的数据;一个表可以包含几百行或几千行;表的行是没有特定顺序的。

※ 一列在表中表示什么信息 ※

一列包含一种特定类型的信息。列不能够或者说不应该针对一行包含一种类型的信息,而对另一行包含另一种类型的信息。每列通常包含单独一类信息。

每列都有一个名字(即列名)和一个数据类型。常见的数据类型包含:文本、数值、日期,这也意味着有3种常见的数据类型的列:包含文本的列、数值的列以及包含日期的列。

一些列中可以允许使用Null(空值),即未知数值。如果一个列不允许为Null,那么表中每一行的这个列都必须有数据,同时意味着该字段是必需的。当一个列允许为Null时,该字段是可选的。

每个列在表中都有一个位置。也就是说,这些列是有序的组。这与行形成了对比,行不必有固定的顺序。

关于列的信息,如名字、数据类型、位置和是否接受Null值等,这些作为表自身定义的一部分。相反,关于行的信息,可看做是数据的一部分,而并非表定义的一部分。

对于列,可以归纳为以下几点:

1.列包含关于表的每一行的一类数据。

2.每个列都有一个名字。

3.每个列都有一个数据类型,其中最常见的数据类型是:文本、数值及日期。

4.一些列接受Null,而另外一些列则不接受Null,Null是一个未知数。

5.每个列在表中都有一个位置。这与行形成对比,表的列形成了一个有序的组,存在第一列和最后一列的概念。

疑难7 如何通过唯一标识把两个表的数据连接在一起

如图1-30、图1-31所示,其中Student表为各学生的学号(Sno)、姓名(Sname)、性别(Ssex)、所在系(Sdept)等信息,而English表则为各学生的学号(Sno)及期末的英语考试成绩(Grade),两个表之间均有唯一的学号(Sno)标识。如何把各学生的所有信息连接起来放在一个表中?

■ 图1-30 Student表

■ 图1-31 English表

解决方案

通过Sno字段作为唯一标识把两个表的数据连接起来。

操作方法

步骤1 通过OLE DB方法找到外部数据源,保留“选择表格”对话框中对名称的默认选择,单击“确定”按钮,激活“导入数据”对话框,再单击“属性”按钮,在弹出的“连接属性”对话框中勾选“打开文件时刷新数据”复选框,然后单击“定义”选项卡,清空“命令文本”框中原有的内容。

步骤2 在“命令文本”框中输入以下SQL连接语句:

SELECT [Student$].Sno,Sname,Ssex,Sage,Sdept,Grade
FROM [Student$],[English$]
WHERE [Student$].Sno=[English$].Sno

单击“确定”按钮返回“导入数据”对话框,指定返回的查询数据位置为Sheet1表的“$A$1”,然后单击“确定”按钮,即可把Student表及English表相关的记录连接在一起,调整单元格格式,最后的结果如图1-32所示。

■ 图1-32 两表连接在一起的结果

原理分析

※ 如何理解主键标识 ※

本例以Sno字段作为唯一标识把Student表和English表的列字段连接在一起,通过使用主键列来标识这两者之间不重复的关系,将表的距离拉近。那么,如何理解主键标识呢?

大部分表都包含一个主键,它标识了表中的每一行,并给它们起了一个名字。每一行都必须有自己的特性,因此,不允许两行中有相同的主键。例如,一个学生在学校中的唯一标识就是其学号,通过其学号,可以知道该学生在学校里登记的相关信息,不会与其他学生的信息发生冲突。这个唯一主键要求SQL初学者必须牢牢记住,这对于以后规范设计工作表有很大的帮助。

主键是由表的几个列组成的,按照阅读习惯,一般是前面几列。主键可以是一个或一个以上的列。假定只有一个主键,它是由几个列组成的,那么这个主键就是这些列的集合,作为单个单元格来使用,这就是用来标识每一行的主键。

主键就像一个名词,因为它命名了每个行的对象。其他列就像是形容词,因为它们给出了有关这个对象的其他信息。

列的名字可以看做是表定义的一部分,同样,行的名字(是行的主键)可看做是表中数据的一部分。

表的主键列有以下两条规则:

1.主键列不可以包含一个Null。这是有意义的,因为Null是一个未知数值,所以,主键的任意部分为Null将意味着用户不知道对象或者行的特性。在数据库中,一般不建议输入未经确认的相关信息。

2.每一行都必须有一个不同于表中其他行的特性。这就是说,没有两行可以拥有相同的特性,这个相同的特性就是主键的所有列中的相同值。对于表的任意两行,它们必须至少在主键的一个列是不同的。

表的第一列通常是表的主键,如图1-33所示,有时候主键是表中最前面的几列,如图1-34所示。

■ 图1-33 表的第一列通常是主键

■ 图1-34 有时候主键是表中最前面的几列

对于主键,可以归纳成以下几点:

1.大部分表都有主键。

2.通常,主键是由表的第一列或者前面几列组成的。

3.主键指明了行所表示的对象、事件或关系。按照语法,它是一个名词,因为它是行中所有信息的题目。

4.表的其他列陈述了主键。按照语法,它们是形容词或者副词,它们描述了主键所指明的对象,并且给出了有关对象的其他信息。