数据库知识与 SQL 基本操作

4.1 数据库概述

自计算机诞生之日起,用计算机管理和处理的数据就开始爆炸式成长,进入 21 世纪,云计算和大数据技术的发展,使数据库技术发展成一门专业学科。目前无论是在线学习还是网上购物,无论是联网售票还是游戏进度管理,都离不开数据库技术,可以说没有数据库就没有目前无处不在的计算机应用。

  • 本节学习任务:理解数据库基本概念,了解关系型数据库技术。

4.1.1 数据库基本概念

数据库 DB(Database)是存储在计算机内有组织、可共享的数据集合。如一个有关同学通信信息的同学录、一个包括同学各科成绩的成绩库都是数据库,数据库小可以只有几条记录,大可以包含上亿条记录。数据库中的数据是按一定的数据模型组织、描述和存储的,具有冗余度低、独立性高、易于扩充、修改方便、能够实现数据共享等优点。但就具体在磁盘上的存储而言,一个数据库就是一个或一组存放在磁盘上的数据文件。有些系统中一个数据库就是一个文件或几个文件,有些系统中一个数据库就是一个目录。如 Access 中的数据库就是名为*.mdb 的文件,MySQL 中一个数据库则是对应磁盘上的一个目录,目录中含有一组与数据表同名的文件,用于存放数据表、数据索引等信息。各数据库管理系统中创建数据库的方法各不相同,文件的格式也并不通用。

要理解数据库,必须要理解以下两组容易混淆的概念:

1. 数据、信息与数据处理

  • 数据:人类生活在信息社会中,总是离不开对反映客观世界的各种数据的收集、处理、存储、传播和使用。所谓数据,就是人们通过对客观事物的观察和测量得到的事实,是对客观事件的物理状态的反映,如:圆的直径、班级的人数等就是一些“数据”。
  • 信息:信息则是人们对数据进行加工整理后,为某一特定目的所提供的决策依据。如学校在安排考场时,会根据班级人数进行试场的编排,这时班级人数就是学校编排试场的主要依据,班级人数就是一种“信息”。从某种意义上说,数据与信息在概念上既有区别,又不能截然分开。如果不是很严格,也可以把数据等同于信息。
  • 数据处理:数据处理是对各种类型的数据进行收集、存储、分类、计算、检索和传播的过程。因此,数据处理与信息处理往往指同一概念。

2. 数据库管理系统、数据库系统

  • 数据库管理系统 DBMS(Database Management System):数据库管理系统是位于用户和操作系统之间的一层数据管理软件,它由系统运行控制程序、语言翻译程序和一组公用程序组成。其主要功能包括:数据定义、数据操作、数据库的控制、数据库的维护。中小企业中常用的 Access、FoxPro 就是一种数据库管理系统。同学们今天学习数据库主要就是学习数据库管理系统的基本操作。
  • 数据库系统 DBS(Database System):通常是指带有数据库的计算机系统。广义地讲,它包括数据库、计算机硬件、软件和各类相关人员,也就是一套完整的可以实际工作的应用系统。如某市的高中招生数据库系统可能包含一个几万条记录的考生数据库、一台或几台计算机、一个 Access 数据库管理系统、一套数据库应用软件和几位数据库操作人员。

4.1.2 数据库系统的特征

在数据库技术出现之前,计算机用户使用数据文件来存放数据。比如在 QBASIC 语言中就有专门的数据读写命令。一种常见的数据文件格式是,一个文件包含若干条“记录”,一条“记录”又包含若干个“数据项”。如文件:“张小华,男,18;李婧,女,17;……”。用户通过对数据文件的读写来实现对数据的存取。

  • 这种方式存取数据时,没有专门的数据操作命令,一切数据的读取和写入都要靠程序员编程实现,所以工作效率非常低,技术要求也比较高。随着社会信息量的迅速增长,计算机需要处理的数据量也在不断增加。文件管理方式对数据的存取依赖于专门的程序,不同程序间很难共享数据文件。如程序员小王由于工作需要编了一个同学通信录程序,他会自己设计一种文件的格式,比如先是姓名、再性别、最后是年龄,由于这种文件存储格式完全是小王自己规定的,随意性比较大,这样的数据文件很难被另外的程序员使用。通过分析,同学们不难得出文件管理型系统有如下缺点:数据难共享,文件中的数据由特定的用户专用,其他用户很难共享它;数据易冗余,每个用户都拥有自己的数据,导致数据重复存储;数据不独立,数据从属于程序,两者相互依赖,数据独立性不强;数据无结构,各数据文件彼此独立,从整体看无数据结构。

由于文件管理方式越来越不适应管理大量数据的需要,于是数据库管理系统便应运而生了。上世纪 60 年代末期,美国 IBM 公司开发了第一个商品化的数据库系统 IMS 系统(Information Management System)。从文件管理到数据库管理,代表了两种完全不同的数据管理技术。今天,数据库管理已成为计算机信息管理的主要方式,只在一些数据量较小的场合中,还有少量文件管理系统支持的数据文件在使用。

  • 与文件系统相比,数据库系统的特征主要有以下几个方面:
    • 数据结构化:在文件系统中,尽管其记录内部已有了某些结构,但记录之间没有联系。而数据库系统则实现了整体数据的结构化,这是数据库的主要特征之一,也是数据库与文件系统的本质区别。
    • 数据的共享性高、冗余度低、易于扩充:数据库系统从整体角度看待和描述数据,数据不再面向某个特定的应用程序,而是面向整个系统,因此,数据可以被多个用户、多个应用程序共享使用。数据共享可以大大减少数据冗余,节约存储空间。数据共享还能够避免数据之间的不相容性与不一致性。
    • 数据独立性高:数据独立性包括数据的物理独立性和逻辑独立性。物理独立性是指用户的应用程序与存储在磁盘上的数据库中的数据是相互独立的。也就是说,数据在磁盘上的数据库中如何存储是由 DBMS 管理的,用户程序不需要了解,应用程序要处理的只是数据的逻辑结构,这样一来当数据的物理存储结构改变时,用户的程序不用改变。逻辑独立性是指用户的应用程序与数据库的逻辑结构是相互独立的,也就是说,数据的逻辑结构改变了,用户程序也可以不改变。
    • 数据由 DBMS 统一管理和控制:数据库的共享是并发的(concurrency)共享,即多个用户可以同时存取数据库中的数据,甚至可以同时存取数据库中的同一个数据。

4.1.3 数据模型

现实世界中的数据在数据库系统中,是通过数据模型来进行抽象表示和处理的。所有的数据库系统均是基于某种数据模型建立的。数据模型是数据库技术的核心,其模型的优劣直接影响数据库的性能。

  • 在数据库技术发展过程中,主要经历了三种模型:层次模型、网状模型和关系模型。其中,层次模型和网状模型统称为非关系模型,用此模型设计的数据库管理系统属于非关系型数据库产品,目前已很少被使用,关系模型构成的数据库,是当前数据库的主流产品。

1. 非关系型数据库系统

  • 非关系型数据库是第一代数据库的总称,其中包括“层次”和“网状”两种类型。这一代数据库系统以记录型为基本数据结构,在不同的记录型之间允许存在联系,其中层次模型在记录型之间只能有单线联系,网状型则允许记录型之间存在两种或多于两种的联系。非关系型数据库系统的结构错综复杂,使用难度较高,自关系型数据库兴起后,它们已经逐渐被关系型数据库所取代了。

2. 关系型数据库系统

  • 20 世纪 70 年代,商品化关系型数据库 RDBS(Relational Database System)开始问世,现在人们使用的数据库系统几乎都是关系型数据库。
  • 关系型数据库采用二维表为基本数据结构,通过公共关键字段实现不同二维表之间的联系。所谓二维表就是只有行与列两个方向的平面表格,二维表形式简单,直观形象,学习与使用均比较方便。关系型数据库允许通过“关系”,直接访问存储在不同表内的数据,其效率远比非关系型数据库高,因而受到用户的普通欢迎。下面同学们通过一个实例,来初步了解关系型数据库中的“关系”。

表 4-1 所示是某班同学的通信录数据表,表 4-2 所示是该班同学的图书借阅数据表,两张表的联系是都有共同的字段“学号”,这样就可以通过这层“关系”,把两张表联系起来,得到表 4-3 所示数据。当然在计算机中只需要存储前 2 张表格即可,第 3 张表格可以由数据库管理系统自动生成。

  • 表 4-1 通信录数据表
学号 姓名 电话 E-mail
20030101 张小婧 1111 a1@abc.com
20030102 李大钢 2222 a2@abc.com
…… …… …… ……
  • 表 4-2 图书借阅数据表
学号 书名 借书日期
20030101 十万个为什么 2005/04/20
20030102 计算机组装与维修 2005/04/22
…… …… ……
  • 表 4-3 读者借书数据表
学号 姓名 电话 E-mail 书名 借书日期
20030101 张小婧 1111 a1@abc.com 十万个为什么 2005/04/20
20030102 李大钢 2222 a2@abc.com 计算机组装与维修 2005/04/22
…… …… …… …… …… ……

每张数据表一般只存储事物某一方面的信息,但不同的表中必须至少包含一项相同的属性,例如两张表中都有的“学号”,这一属性把两张表中的数据有机地关联了起来,构成一张新的关系表。与层次型或网状型数据库相比,关系模型数据结构简单,数据独立性强。

  • 上例中的对应关系可以是一对一,如一位同学借了一本书。当然也可以是一对多或多对多,如一位同学同时借了几本书,就形成了一对多的关系。同学们也可以思考一下生活中还有哪些信息可以通过一对一或一对多的关系联系起来。

4.1.4 常用关系型数据库系统

数据库管理系统经历了 40 多年的发展演变,已经取得了辉煌的成就,发展成了一门内容丰富的学科。目前,市场上占有主要市场份额的数据库系统产品,如 Oracle,SQL Server,MySQL 等均属于关系型数据库。

  • Access 是微软件公司开发的关系型数据库产品,是 Office 办公系列软件包中的一部分,操作简单易学,适用于办公环境对少量数据的管理。
  • SQL Server 最初是由 Microsoft、Sybase 和 Ashton-Tate 三家公司共同开发的,在 Windows NT 推出后,Microsoft 与 Sybase 在 SQL Server 的开发上就分道扬镳,Microsoft 将 SQL Server 移植到 Windows NT 系统上,专注于开发推广 SQL Server 的 Windows NT 版本。
  • MySQL 是一个小型关系型数据库管理系统,具有开放源码方式特点,属于 Oracle 公司(甲骨文公司)所有。MySQL 被广泛地应用在 Internet 上的中小型网站中。由于其体积小、速度快、总体拥有成本低。许多中小型网站选择了 MySQL 作为网站数据库。
  • Oracle 是甲骨文公司的一款大型专业关系数据库管理系统。属于一种大型数据库系统,一般适用于大型企业、政府部门等大批量数据需要处理的单位或部门,它的功能很强大,能够处理大批量的数据,市场占有率高。

关系型数据库还在不断发展之中,这些产品的特征反映了当前数据库产业界的最高水平和发展趋势。数据库发展趋势主要表现为仍以关系型数据库为主流产品、产品形成系列化、支持各种互联网应用及向智能化集成化方向扩展等。

  • 随着互联网 web2.0 网站的兴起,传统的关系数据库在应付 web2.0 网站,特别是超大规模和高并发的社交网站类型的 web2.0 纯动态网站已经显得力不从心,暴露了很多难以克服的问题,目前所谓的 NoSQL 非关系型的数据库则由于其本身的特点开始得到了比较迅速的发展,有兴趣的同学可以上网查询相关资料,而本课则继续讨论目前占主流技术的关系型数据库技术。

思考与习题

一、单项选择题

  1. 有关数据库的特点,以下叙述错误的是

    • A. 可以供各种用户共享
    • B. 冗余度小
    • C. 较高的数据独立性
    • D. 数据由应用程序自己控制
  2. 数据库类型是按照 来划分的。

    • A. 文件形式
    • B. 数据模型
    • C. 记录形式
    • D. 数据存取方法
  3. 下列关于数据库说法错误的是

    • A. 关系型数据库采用二维表为基本数据结构
    • B. RDBS 是非关系型数据库
    • C. 数据库中的数据是按一定的数据模型组织的
    • D. 非关系型数据库系统以记录型为基本数据结构
  4. 在以下数据库管理系统中,开放源代码的是

    • A. Access
    • B. SQL Server
    • C. MySQL
    • D. Oracle

二、填空题

  1. 数据库管理系统 DBMS 是位于用户与操作系统之间的一层数据管理软件。
  2. 数据库管理系统主要功能包括数据定义、数据操作、数据库的控制、数据库的维护。
  3. 数据库与文件系统的本质区别是数据结构化
  4. 数据库技术的核心是数据模型
  5. 在数据库技术中,主要的数据模型有:层次模型、网状模型和关系模型
  6. 用二维表的形式来表示实体间联系的数据模型叫做关系模型
  7. 关系型数据库采用二维表为基本数据结构,通过公共关键字段实现不同二维表之间的联系。

三、判断题(正确的打“√”,错误的打“×”)

  1. 数据库系统是位于用户和操作系统之间的一层数据软件,它由系统运行控制程序、语言翻译程序和一组公用程序组成。
  2. 上世纪 60 年代末期,美国 Microsoft 公司开发了第一个商品化的数据库系统 IMS 系统(Information Management System)。
  3. 在数据库技术发展过程中,主要经历了三种模型:层次模型、网状模型和关系模型。
  4. MySQL 是一个小型关系型数据库管理系统,具有开放源码方式特点,属于 Oracle 公司所有。

4.2 数据库表基本概念

虽然当前数据库管理中创建数据库的方法各不相同,但设计数据库的基本思想是相同的,数据库的总体设计就是首先确定数据库所要完成的任务,需要从数据库中得到什么样的信息,再确定数据库中应包含哪些数据表,每个表中包含哪些字段,最后确定每个字段的数据类型和字段长度等。数据表在数据管理中有着举足轻重的地位,正确认识和理解数据库中数据表的概念,对于理解和掌握 SQL 语句有着极大的帮助。

  • 本节学习任务:理解表的属性、了解字段的属性。

4.2.1 数据表概念

数据表是数据库最重要的组成部分之一,是实际存放数据的地方,当建立一个数据库后,接着就要建立数据表。

  • 大部分数据库管理系统中一个数据库包含若干张数据表,例如:在学生成绩管理系统中,就可能要包含学生档案数据表、教师档案数据表、学生成绩数据表等多个数据表。一般把解决某个问题的相关的信息放在一个数据库中,如学生成绩管理系统中,就应该包含学生、教师、成绩等多张数据表,而学校财产、图书信息等不相关的信息就不必放在同一个数据库中。但如果准备开发的是学校综合管理系统,系统中有可能要出现学生借书、学生财产赔偿等信息,就可能要考虑把这些数据表放入同一个数据库。
  • 数据表的设计是数据库设计的一大难点,设计优秀的数据表结构清晰、便于后期数据的查询,相反结构不良的数据表,会对后期的程序开发带来无穷的后患。在数据表的设计过程中应遵循以下的原则:
    • 每张数据表中不应该包含重复的数据。设计数据表时应该保证每条信息只能出现在一个表中,避免各个表中含有相同的信息,否则容易造成数据的冗余和不一致,不利于数据更新。当然,作为表格之间的“纽带”,用来创建关系的字段除外。
    • 每张表中只包含一个主题信息。如表 4-6 所示,学生通信录中只包含学生通信方面的信息,可以根据需要再增加地址、邮编等内容

      ,但不应该把成绩也加入学生通信录数据表,这不但不符合刚才提到的一张表只包含一个主题的要求,而且当该同学有两次考试成绩时,会造成存放两条记录,这两条记录只有成绩不同,其他如学号、姓名都相同,也造成了数据的冗余。

      表 4-4 学生通信录

      学号 姓名 电话
      20030101 张小婧 1111
      20030102 李大钢 2222

      表 4-5 学生成绩表

      学号 姓名 电话
      20030101 张小婧 1111
      20030102 李大钢 2222

      正确的方法应该是学生成绩表中只含学号、成绩两个信息,而学号是两张表联系的纽带,是必须存在的,如表 4-6 和表 4-7 所示。

      表 4-6 学生通信录

      学号 姓名 电话
      20030101 张小婧 1111
      20030102 李大钢 2222

      表 4-7 学生成绩表

      学号 成绩
      20030101 90
      20030102 85
      • 表的设计需要设计者的经验和对具体的清晰认识,需要同学们在实践中多练习。

      4.2.2 字段与记录

      字段和记录是数据表中两个非常重要的概念。表中每一行称为一条记录,用于表示某件物体各方面的属性。如通信录中的每位同学,在二维表中占一行,就是一条记录。图书数据表中,一本书也是一条记录。根据数据库管理系统的不同,一张数据表中可以存放的记录数可达数亿条。

      数据表中的数据项称为字段,字段表示物体某方面的性质,如学号、姓名、出生日期等。在 Access 数据库中规定一张数据表最多可以有 255 个字段。有关记录和字段的举例如图 4-3 所示。

      每个字段至少有 4 个属性:字段名、字段类型、字段长度和小数位数,即从这四个方面去定义字段。

      • 字段名就是字段的名称,一般可以包含英文字母和数字,有些数据库也支持汉字作为字段名。如“name,address,姓名,地址”等都是合法的字段名。
      • 不同的数据库管理系统支持的数据类型有所区别,但数据库管理系统基本上支持字符型、数值型、日期型、逻辑型这 4 种类型。
        • 字符型字段:一般存放字符型数据,如姓名、地址等。需要注意的是对于不参加算术运算的数字,如学号、电话、身份证号码等虽然形式上是数字,但它们只是代表物体的一个编号,不参加算术运算,应该设为字符型字段。
        • 数值型字段:用于存放数值型数据,其中存放的数据一般是用于数值运算的,如工资、成绩、身高等。
        • 日期型字段:用于存放“年-月-日”等日期信息,有些类型的数据库还可以存放时间信息。日期型字段一般用于存放“出生日期”、“入团日期”等信息。
        • 逻辑型字段:用于存放只有两种结果的数据信息,如“是否团员”只有两种结果,要么“是”,要么“否”。
      • 在设计数据表时,最重要的是规划好字段的类型。类型设计不合理,会对以后的数据库运用带来很多麻烦,如对“年龄”信息,应该尽量选择与“出生日期”这种日期型字段计算获得,因为每个人的出生日期都是固定的。如果直接设计了一个数值型“年龄”字段,则明年再来看这张数据表年龄信息就不正确了。
      • 字段的第三、四个属性是字段的长度和小数位数,指字段中允许存放的数据的最大长度和最多小数位数。对于字符型字段只有字段长度这个属性,没有小数位数属性。这两个属性要根据实际数据可能出现的情况,进行合理设计。如中国人的姓名一般只有三个汉字,少数复姓也就四个汉字,所以姓名字段长度可以设计为 4,有些数据库信息系统中规定一个汉字要占二位长度,就设置为 8,姓名字段没必要设计为更长的长度。而对于地址字段,考虑到某些地址可能比较复杂,应该把字段长度设得大一些。对于数值型字段应该考虑字段长度和小数位。如成绩字段,考虑到一般情况下最高分为 100,即 3 位数,而小数位 1 位即可,所以字段长度应该高为 5 位,小数位设为 1 位,注意字段长度中应包括小数点所占的 1 位。现在也有很多数据库中,对数值型字段已经不太提字段长度和小数位了,而是用整形、长整形、单精度、双精度来表示数的范围。

      思考与习题

      一、单项选择题

      1. 在二维表中,每一行称为

        • A. 一条记录
        • B. 一个字段
        • C. 一条信息
        • D. 一个关系
      2. 在二维表中,每一列称为

        • A. 一条记录
        • B. 一个字段
        • C. 一条信息
        • D. 一个关系
      3. 在设计数据表时,“姓名”字段一般应设置为 属性。

        • A. 字符型
        • B. 数值型
        • C. 日期型
        • D. 逻辑型
      4. 以下关于关系型数据库中二维表性质的说法不正确的是

        • A. 二维表中的每一列均有唯一的字段名
        • B. 二维表中的记录数、字段数决定了二维表的结构
        • C. 二维表中的行、列均可以改变
        • D. 二维表中不允许出现完全相同的两行
      5. 在数据库中,下列关于数据表叙述错误的是

        • A. 数据表是实际存放数据的地方
        • B. 每张数据表中应该包含重复的数据
        • C. 每张表只包含一个主题信息
        • D. 设计数据表时,最重要的是规划好字段的类型
      6. 数据库系统中,数据的最小访问单位是

        • A. 记录
        • B. 字段
        • C. 字节
        • D. 表

      二、填空题

      1. 写出以下字段应该选择的字段类型

        • 姓名:字符型
        • 成绩:数值型
        • 身高:数值型
        • 电话号码:字符型
        • 语文成绩:数值型
        • 地址:字符型
        • 出生日期:日期型
        • 是否团员:逻辑型
        • 书名:字符型
        • 图书编号:字符型
        • 工资:数值型
        • 进校时间:日期型
      2. 数据表中字段最常用的有 字符型、数值型、日期型和逻辑型 4 种类型。

      三、判断题(正确的打“√”,错误的打“×”)

      1. 数据库中实际存放数据的地方是表。
      2. 每张数据表中应只包含一个主题。
      3. 数据表中的数据项称为记录,记录表示物体某方面的性质。
      4. 学号、电话、身份证号码等信息一般用数值型字段来表示。

      4.3 SQL 数据定义和数据查询

      SQL 全称是“结构化查询语言(Structured Query Language)”,最早是由美国 IBM 公司的圣约瑟研究实验室为其关系数据库管理系统 SYSTEM R 开发的一种查询语言。SQL 语言结构简洁,功能强大,简单易学,所以自从 IBM 公司 1981 年推出 SQL 语言以来,得到了广泛的应用。如今无论是像 Oracle、SQL server、MYSQL 这些大型的数据库管理系统,还是像 Access 等小型数据库管理系统,都支持 SQL 语言作为数据库操作语言。本节起,学习 SQL 基本语句。

      • 本节学习任务:掌握创建数据表语句 CREATE、查询语句 SELECT。

      4.3.1 结构化查询语言 SQL

      1989 年,美国 ANSI(American National Standards Institute 美国国家标准协会)定义的关系数据库管理系统为 SQL 标准语言,称为 ANSI SQL 89,目前,所有主要的关系数据库管理系统都基本遵守该标准,并在此基础上有所扩展,不同的产品各有差异,使用具体某种数据库管理系统时需要参照系统提供的语法手册。

      • SQL 被各种数据库管理系统广泛地采用,成为数据库管理系统的通用语言,正说明了 SQL 有许多优点。主要表现在以下三点,首先,SQL 为非过程化语言,SQL 是一个非过程化的语言,也就是说它并不需要像 QBASIC 那样编程,SQL 就像跟老朋友聊天似的,你打一条命令,数据库就会显示结果,在 SQL 操作中没有判断语句,没有循环语句。其次,SQL 拥有极少的命令,通过 SQL 操作数据库只需要掌握极少的几条命令即可,包括查询数据的 SELECT 命令、添加数据的 INSERT 命令、修改数据的 UPDATE 命令、删除数据的 DELETE 命令和建库建表的 CREATE 命令。第三,SQL 有极广的应用场合,由于所有主要的关系数据库管理系统都支持 SQL 语言,用户可将使用 SQL 技能从一个数据库管理系统转到另一个。所有用 SQL 编写的语句都是可以移植的。

      完整的 SQL 语言主要包含以下四个部分:

      1. 数据查询语句 SELECT
      2. 数据操纵语句 INSERT,UPDATE,DELETE
      3. 数据定义语句 CREATE,ALTER,DROP
      4. 数据控制语句 COMMIT WORK,ROLLBACK WORK

      4.3.2 创建数据库数据表

      数据库的创建是数据管理的基础,而表是数据库的重要组成部分,数据库及表的创建均由 CREATE 语句完成。

      • 创建数据库格式:CREATE DATABASE 数据库名

        • 例 1:CREATE DATABASE 学生档案
          • 功能:新建一个名为“学生档案”的数据库
          • 注意:不同的数据库管理系统创建数据库的语法格式不尽相同,生成的数据库也不一样,如 Access 中不能用命令生成数据库,MySQL 中一个数据库对应磁盘上的一个目录,目录中含一组与数据表同名的文件,SQL Server 生成的数据库至少包含一个主要数据文件.mdf 和一个事务日志文件.ldf,文件名及相关配置由用户定义。有些数据库管理系统能直接创建中文数据库名,但有些数据库管理系统必须经过相关的字符集设置后才行,建议同学们在平时创建数据库时,尽量用英文数据库名。有些数据库管理系统中数据库创建好了以后,并不能直接使用,还必须用相应的命令来打开该数据库,才能对该数据库进行操作,比如 MySQL 中还必须用 USE 命令来打开数据库。
      • 创建表格式:CREATE TABLE 数据表名 (字段1 字段类型 [NOT NULL] [PRIMARY KEY],字段2 字段类型 [NOT NULL] [PRIMARY KEY],……)

        • 在 ACCESS 中,常见的字段类型如表 4-8 所示,举例为此为准

      表 4-8 常见的数据库字段类型

      数据类型 描述
      Int 4 个字节, 长型整数
      Real 4 个字节单精度浮点值
      Float 8 个字节双精度浮点值
      Char[(n)] 参数省略默认长度为 255,存储的字符串长度不足 n 时,用空格补足,超过 n 自动截断
      Varchar[(n)] Varchar(n)的长度为实际输入的字符串的个数, 参数省略默认长度为 255
      Datetime 日期型,精确到秒
      Bit 该字段只能取 0,1 这两个值中的一个,不能为空,相当于逻辑型
      • 例 2:CREATE TABLE 学生成绩 (姓名 VARCHAR,语文 REAL, 数学 REAL,英语 REAL)
        • 功能:创建一张名为“学生成绩”的数据表,表中“姓名”字段为可变长度的字符型,“语文”、“数学”、“英语”字段均为单精度型。“姓名”字段长度缺省,取默认值 255,实际长度能自动根据“姓名”字段内容调整。
      • 例 3:CREATE TABLE 学生家庭住址 (学号 CHAR(8) PRIMARY KEY,姓名 VARCHAR,家庭住址 VARCHAR)
        • 功能:创建一张名为“学生家庭住址”的数据表,表中“学号”字段为固定 8 个字符长度字符型,且为主键,“姓名”、“家庭住址”字段为可变长度的字符型,字段长度缺省,取默认值 255。
        • 主键的意思是该字段的内容必须是唯一的,即在这张数据表中,学号不可以重复,一般在定义数据表时,应该指定一个字段为主键字段。
      • 例 4:CREATE TABLE 学生档案 (姓名 VARCHAR(8),出生日期 DATETIME,是否团员 BIT NOT NULL)
        • 功能:创建一张名为“学生档案”的数据表,表中“姓名”字段为可变 8 位长度的字符型,“出生日期”字段为日期型,“是否团员”为 BIT 类型,不允许为空。
        • 注意:不同的数据库管理系统,所用的数据类型也不尽相同,数据类型的使用格式也不一样,上述数据类型以 Access 的常用数据类型为例,在实际应用中,需要根据数据库管理系统类型来确定数据类型格式。

      4.3.3 简单查询

      数据库建立完成后,查询数据库中的数据是 SQL 语言中最重要应用,也是功能最丰富、使用最复杂的一条命令,即 SELECT 语句。

      • SELECT 的完整格式

        • SELECT 字段名,……|*
        • [FROM 数据表名称]
        • [WHERE 条件表达式]
        • [GROUP BY 字段名]
        • [HAVING 条件表达式]
        • [ORDER BY 字段名 [ASC|DESC],……]
        • 这里[ ]之间的内容可以省略,当同时使用多个子句时,必须按指定的顺序书写,如 GROUP BY 子句必须写在 WHERE 子句的后面。
      • SELECT 语句的完整格式非常复杂,首先学习一下 SELECT 语句的基本格式。

        • 基本格式:SELECT 字段名 1,字段名 2,…… FROM 数据表名
          • 功能:把数据表中满足条件的记录或记录中的某几个字段信息显示出来。

      假设,存在如表 4-9 所示的数据表,数据表名称为“学生成绩”。

      姓名 语文 数学 英语
      张华 95 100 70
      王强峰 90 80 85
      周青 90 95 85
      • 例 5:SELECT 姓名,语文 FROM 学生成绩
        • 功能:显示“学生成绩”数据表中所有记录的姓名和语文信息
      姓名 语文
      张华 95
      王强峰 90
      周青 90
      • 例 6:SELECT 姓名,语文,数学,英语,语文+数学+英语 AS 总分 FROM 学生成绩
        • 功能:显示“学生成绩”数据表中所有记录的姓名、语文、数学、英语和总分信息
      姓名 语文 数学 英语 总分
      张华 95 100 70 265
      王强峰 90 80 85 255
      周青 90 95 85 270
      • 在这儿使用“表达式 AS 名称”来生成一个临时字段名。由此可见,SELECT 语句有计算功能,可以根据原有字段生成新的字段。在实际的数据表设计中,不建议在数据表中设置总分字段,因为总分信息完全可以由语文、数学、英语三科成绩计算得到,而如果设置了总分字段,那么语文、数学、英语三科成绩一旦修改的话,那么总分字段中的值就不正确了。
      • 例 7:SELECT * FROM 学生成绩
        • 功能:显示“学生成绩”数据表的全部信息

          ,即如表 4-9 所示。这儿可以使用“*”代表所有字段。

          4.3.4 条件查询

          当需要显示部分记录信息时,比如只显示“语文大于 80 分”的记录时,那么就需要加条件,可以通过 WHERE 条件子句来实现条件查询。

          • “条件子句”是指用关系运算符和逻辑运算符组成的表达式
            • 关系运算符有 6 个,分别是:大于为“>”,小于为“<”,等于为“=”,大于等于为“>=”,小于等于为“<=”,不等于为“<>”。可以利用关系运算符进行比较的有数值型、字符型、日期型三种类型的字段,逻辑型数据不能进行比较。
              • 数值型根据数的大小进行比较。
              • 日期型比较是根据日期的远近,近期的比远期的大,如 2005-1-1>1998-12-30。
              • 字符型根据字符的编码进行比较,可以分三种情况:半角字符根据 ASCII 编码进行比较,从小到大顺序分别是 0-9 A-Z a-z;汉字根据国标码进行比较,对于一级汉字来说,就是根据拼音的顺序;半角字符与全角字符比较,全角字符大。
            • 对于字符的比较还有一个“LIKE”运算符,用于字符的匹配比较,与 LIKE 同时使用的还有二个通配符,“*”代表任意个任意字符,“?”代表一个任意字符。LIKE 常用方法有如下:
              • 字段名 LIKE “A*”:用于匹配“A”开头的任意长度的字符串;
              • 字段名 LIKE “A?”:用于匹配“A”开头的后接一个任意字符的字符串;
              • 字段名 LIKE “A”:用于匹配含有“A”的字符串。
              • 注意:在 SQL(ANSI 1989) 标准中,用“%和_”代替“*和?”
            • 逻辑运算符有三种
              • 与 AND:当条件同时成立时,值为“真”;
              • 或 OR:当条件有一个成立时,值为“真”;
              • 非 NOT:当条件成立时值为“假”,当条件不成立时为“真”。

          下面通过一些例题来了解“WHERE 条件子句”的用法。

          • 例 8:SELECT * FROM 学生成绩 WHERE 语文>=85
            • 功能:显示“学生成绩”数据表中语文成绩大于或等于 85 分的记录信息
          • 例 9:SELECT * FROM 学生成绩 WHERE 姓名=“李强”
            • 功能:显示“学生成绩”数据表中姓名为“李强”的记录信息
          • 例 10:SELECT * FROM 学生成绩 WHERE 姓名 LIKE “李*”
            • 功能:显示“学生成绩”数据表中姓“李”的记录信息,也就是显示姓名中第一个字为“李”的记录
          • 例 11:SELECT * FROM 学生成绩 WHERE 姓名 LIKE “李?”
            • 功能:显示“学生成绩”数据表中姓名为两个字,第一个为“李”字,第二个任意的记录信息
          • 例 12:SELECT * FROM 学生成绩 WHERE 姓名 LIKE “*强”
            • 功能:显示“学生成绩”数据表中姓名最后一个字为“强”的记录信息
          • 例 13:SELECT * FROM 学生成绩 WHERE 姓名 LIKE “
            • 功能:显示“学生成绩”数据表中姓名中含有“强”字的记录信息

          以下为有关逻辑字段条件子句的实例,设有如表 4-10“学生档案”数据表。

          姓名 出生日期 是否团员
          张华 1987-12-8 Yes
          李强 1987-8-20 Yes
          张明亮 1988-6-1 No
          王强峰 1988-12-20 Yes
          陈歌 1987-3-8 No
          • 例 14:SELECT * FROM 学生档案 WHERE 是否团员
            • 功能:显示“学生档案”数据表中是团员的记录信息
          姓名 出生日期 是否团员
          张华 1987-12-8 Yes
          李强 1987-8-20 Yes
          王强峰 1988-12-20 Yes
          • :对于逻辑型字段,不能使用“WHERE 是否团员=“是”或 WHERE 是否团员=True”这样的子句,因为逻辑型字段不能使用关系运算符。
          • 例 15:SELECT * FROM 学生档案 WHERE NOT 是否团员
            • 功能:显示“学生档案”数据表中所有不是团员的记录信息
          姓名 出生日期 是否团员
          张明亮 1988-6-1 No
          陈歌 1987-3-8 No

          以下为有关日期型字段条件子句的实例:

          • 例 16:SELECT * FROM 学生档案 WHERE 出生日期=#8/20/1987#
            • 功能:显示“学生档案”数据表中出生日期为 1987 年 8 月 20 日的记录
            • :在 Access 数据库中日期常量要用“#月/日/年#”或“#年-月-日#”这样的格式书写,但不管哪一种写法,必须加上“#”。其他数据库的格式可能不同,有些用双引号。如本例中也可以改成:SELECT * FROM 学生档案 WHERE 出生日期=#1987-8-20#
          • 例 17:SELECT * FROM 学生档案 WHERE 出生日期> #8/20/1987#
            • 功能:显示“学生档案”数据表中出生日期在 1987 年 8 月 20 日以后的记录。
          • 例 18:SELECT * FROM 学生档案 WHERE MONTH(出生日期)=8
            • 功能:显示“学生档案”数据表中出生月份在 8 月的记录。

          在 SQL 中有一些系统函数,可以随时调用,与日期有关的函数主要有五个:

          • YEAR():取日期型数据的年份,必须加参数。 如 YEAR(#8/20/1987#)的值为 1987
          • MONTH():取日期型数据的月份,必须加参数。如 MONTH(#8/20/1987#)的值为 8
          • DAY():取日期型数据的日期值,必须加参数。如 DAY(#8/20/1987#)的值为 20
          • DATE( ):取当前系统日期,不用加参数。如 DATE( )的值为计算机系统的即时日期
          • NOW( ):取当前系统时间,不用加参数。如 NOW( )的值为计算机系统的即时日期与时间,精确到秒。

          在使用这五个与日期有关的函数时,参数可以是日期型字段名也可以是日期型常量或变量。如 YEAR(出生日期)或 YEAR(#8/20/1987#)。

          • 例 19:SELECT 姓名,YEAR(NOW())-YEAR(出生日期) AS 年龄 FROM 学生档案
            • 功能:显示“学生档案”数据表的学生姓名和年龄信息。

          以下为有关条件查询的实例:

          • 例 20:SELECT * FROM 学生成绩 WHERE 语文>60 AND 语文<90
            • 功能:显示“学生成绩”数据表中语文成绩大于 60 分并且小于 90 的记录。
          • 例 21:SELECT * FROM 学生成绩 WHERE 语文>=60 AND 语文<=90
            • 功能:显示“学生成绩”数据表中语文成绩大于等于 60 分并且小于等于 90 分的记录

              **:SELECT * FROM 学生成绩 WHERE 语文>90 AND 数学>90

              • 功能:显示“学生成绩”数据表中语文成绩大于 90 分并且数学成绩大于 90 的记录。
              • 例 23:SELECT * FROM 学生成绩 WHERE 语文>90 OR 数学>90
                • 功能:显示“学生成绩”数据表中语文成绩大于 90 分或者数学成绩大于 90 的记录。

              4.3.5 聚集函数查询

              聚集函数见表 4-11。

              函数名称 函数功能
              COUNT() 统计所选数据的行数
              SUM() 计算数据列的和
              MIN() 计算数据列中的最小值
              MAX() 计算数据列中的最大值
              AVG() 计算数据列的平均值
              • SELECT 语句可以通过聚集,对指定的字段进行统计、计数等运行。主要的聚集函数如表 4-11 所示。聚集函数一般用于 SELECT 语句的字段名处,下面通过实例介绍聚集函数的用法。

              例 24:SELECT COUNT(*) AS 总人数 FROM 学生成绩

              • 功能:显示“学生成绩”数据表中总的记录条数。
              • :COUNT()函数的参数必须是“*”,不能是其它字段名。本条语句的执行结果只有一条记录,显示总人数。

              例 25:SELECT AVG(语文),AVG(数学) FROM 学生成绩

              • 功能:显示“学生成绩”数据表中语文和数学的平均成绩。

              例 26:SELECT AVG(语文),AVG(数学) FROM 学生成绩 WHERE 英语>80

              • 功能:显示“学生成绩”数据表中英语成绩大于 80 分同学的语文和数学平均分。

              例 27:SELECT MAX(语文),MIN(数学) FROM 学生成绩

              • 功能:显示“学生成绩”数据表中语文最高分,数学最低分,显示结果只有一条记录。

              4.3.6 其他查询子句

              1. GROUP BY 子句

              • 格式:GROUP BY 字段名
              • 功能:根据字段名,把相同值的记录组合成单一记录

              在使用 GROUP BY 子句时,SELECT 后面的字段名往往需要使用聚集函数,以得到某一分类的统计信息,下面通过一些实例说明 GROUP BY 子句的用法。设有如表 4-12“年级成绩”数据表。

              姓名 班级 语文
              A1 1班 90
              B2 2班 88
              B3 2班 80
              A2 1班 94
              A3 1班 92
              A4 1班 80
              B1 2班 90
              B4 2班 70

              例 28:SELECT 班级,AVG(语文) FROM 年级成绩 GROUP BY 班级

              • 功能:根据班级,分别统计各班的语文平均成绩,结果如下:
              班级 Expr1001
              1班 89
              2班 82
              • 可以看到,当没有为临时生成的语文平均分字段命名时,系统会自动自成类似“Expr1001”的没有明确含义的字段名,因此更好一点的写法是“SELECT 班级,AVG(语文) AS 语文平均分 FROM 年级成绩 GROUP BY 班级”,结果如下:
              班级 语文平均分
              1班 89
              2班 82
              • :写成“SELECT 班级,AVG(语文) FROM 年级成绩”是错的,当没有使用 GROUP BY 子句时,SELECT 后面的字段名与聚集函数不能同时使用。

              例 29:SELECT 班级,AVG(语文) AS 语文平均分 FROM 年级成绩 WHERE 语文>85 GROUP BY 班级

              • 功能:把“年级成绩”数据表中语文成绩大于 85 分的记录,根据班级分别统计各班的语文平均成绩。
              • 结果是
              班级 语文平均分
              1班 92
              2班 89

              2. HAVING 子句

              • 格式:HAVING 条件表达式
              • 功能:HAVING 子句一般用于筛选 GROUP BY 子句聚集过的数据,即把 GROUP BY 子句中满足 HAVING 条件的记录显示出来。

              例 30:SELECT 班级,AVG(语文) AS 语文平均分 FROM 年级成绩 GROUP BY 班级 HAVING AVG(语文)>85

              • 功能:先根据班级分别统计各班的语文平均分,再把语文平均分大于 85 分的记录显示出来。
              • 结果是
              班级 语文平均分
              1班 89
              • :在 Access 数据库中,只能使用“HAVING AVG(语文)>85”这样的表达式,而在其他有些数据库管理系统中,还可以使用“HAVING 语文平均分>85”,即 HAVING 子句中可以使用别名。

              HAVING 子句和 WHERE 子句虽然在语法上都使用了条件表达式,但在功能上则完全不同。WHERE 子句用于对数据源的控制,也就是只有满 WHERE 条件表达式的记录才会被 SELECT 语句处理,而 HAVING 子句一般与 GROUP BY 子句配合使用,其作用是控制数据的输出,只有满足 HAVING 条件子句的记录才会被显示输出。总结起来就是说,WHERE 子句控制 SELECT 语句的入口关,HAVING 子句控制 SELECT 语句的出口关。

              3. ORDER BY 子句

              • 格式:ORDER BY 字段名 1[ASC|DESC],字段名 2[ASC|DESC],……
              • 功能:把输出结果按字段名进行排序,ASC 表示递增排序,DESC 表示递减排序,默认为递增排序。当有多个字段名时,首先按字段名 1 进行排序,当字段名 1 的值相同时,再按字段名 2 的值进行排序。

              例 31:SELECT * FROM 年级成绩 ORDER BY 语文

              • 功能:按语文成绩的升序显示“年级成绩”数据表的所有记录

              例 32:SELECT * FROM 年级成绩 ORDER BY 班级,语文 DESC

              • 功能:对“年级成绩”数据表按班级递增、语文成绩递减排序

              思考与习题

              一、单项选择题

              1. 下列关于 SQL 说法正确的是

                • A. SQL 是过程化语言
                • B. SQL 只有一种使用环境
                • C. SQL 命令多而功能丰富
                • D. 所有用 SQL 编写的语句都是可以移植的
              2. SQL 中 SELECT 语句的中文含义是

                • A. 建数据表
                • B. 添加数据
                • C. 打印数据
                • D. 查询数据
              3. 如某 SELECT 命令中同时有 FROM、WHERE、ORDER 三个子句,则正确的排列顺序是

                • A. FROM、WHERE、ORDER
                • B. FROM、ORDER、WHERE
                • C. WHERE、ORDER、FROM
                • D. 没有顺序要求,无论哪个子句排在前均可
              4. 执行语句“SELECT 姓名,语文,数学,英文,语文+数学+英语 AS 总分 FROM 学生成绩”后,以下说法正确的是

                • A. 在“学生成绩”数据表中添加一个新的字段“总分”
                • B. 在“学生成绩”数据表中添加一个新的