摘要
第3章SQL基础
学习目的与要求
本章主要介绍PL/SQL中的基础储备知识,数据定义语言(DDL)、数据操纵语言(DML)和数据查询语言(DQL)。通过本章的学习,读者应了解基本表的创建、修改和删除的方法; 熟悉表中数据的插入、修改和删除的方法; 重点掌握对基本表中数据的各种查询方法,为PL/SQL编程奠定良好的基础。
本章主要内容
? SQL概述
? 数据定义
? 数据操纵
? 数据查询
3.1SQL语言
SQL是一种介于关系代数与关系演算之间的结构化查询语言(Structured Query Language),是一个通用的、功能极强的关系数据库语言。SQL不仅具有丰富的查询功能,还具有数据定义和数据控制功能,是集DQL(数据查询语言)、DDL(数据定义语言)、DML(数据操纵语言)、DCL(数据控制语言)于一体的关系数据语言。当前几乎所有的关系数据库管理系统都支持SQL,许多软件厂商还对SQL基本命令集进行了不同程度的修改和扩充。
SQL最早是1974年由Boyce和Chamberlin提出,并作为IBM公司研制的关系数据库管理系统原型System R的一部分付诸实施。它功能丰富,不仅具有数据定义、数据操纵、数据控制功能,还有着强大的查询功能,而且语言简洁,容易学习,易于使用。现在SQL已经成为关系数据库的标准语言,并且发展了4个主要标准,即ANSI(美国国家标准机构)SQL; 对ANSI SQL修改后在1992年采纳的标准,称为SQL?92或SQL2; 后来又出了SQL?99也称SQL3标准。SQL?99从 SQL2扩充而来,并增加了对象关系特征和许多其他的新功能。2003年,推出了SQL?2003。自1986年公布以来,SQL随着数据库技术的发展而不断更新、丰富。
自 SQL 成为国际标准语言以后,各个数据库厂家纷纷推出各自的 SQL 软件或与 SQL的接口软件。这就使大多数数据库均用 SQL 作为共同的数据存取语言和标准接口,使不同数据库系统之间的相互操作有了共同的基础,这个意义是十分重大的。
SQL语言的应用更加广泛,Oracle、Sybase、Informix、Ingres、DB2、SQL Server、Rdb 等大型数据库管理系统都实现了SQL语言; Dbase、Foxpro、Access 等PC机数据库管理系统部分实现了SQL语言; 可以在 HTML(Hypertext Markup Language, 超文本标记语言)中嵌入SQL语句,通过WWW访问数据库; 在 VC、VB、Delphi、PB中也可嵌入 SQL 语句。目前,很多数据库产品都对SQL语句进行再开发与扩展,如Oracle 提供的PL/SQL(Procedure Language and SQL)就是对SQL的一种扩展。 3.1.1SQL的分类
SQL语言的核心内容包括如下数据语言:
(1) 数据定义语言(Data Definition Language,DDL),用于定义数据库的逻辑结构,包括基本表、视图及索引的定义。
(2) 数据操纵语言(Data Manipulation Language,DML),用于对关系模式中的具体数据进行增、删、改等操作。
(3) 数据查询语言(Data Query Language,DQL),用于实现各种不同的数据查询。
(4) 数据控制语言(Data Control Language,DCL),用于数据访问权限的控制。
3.1.2SQL的特点
SQL 语言是一个综合的、通用的、功能极强的、易学易用的语言,所以能够被用户和业界广泛接受,并成为国际标准。其主要特点如下。
1. 综合统一
SQL语言集数据定义语言(DDL)、数据操纵语言(DML)、数据查询语言(DQL)、数据控制语言(DCL)的功能于一体,语言风格统一,可以独立完成数据库生命周期中的全部活动,包括定义关系模式、插入数据、建立数据库、查询、更新、维护、数据库重构、数据库安全性控制等一系列操作要求,这些为数据库应用系统的开发提供了良好的环境。
2. 高度非过程化
SQL语言是非过程化的语言,用户只需提出“做什么”,而不必指明“怎么做”,也不需要了解存取路径的选择,SQL语言就可以将要求交给系统,自动完成全部工作。这不但大大减轻了用户负担,而且有利于提高数据独立性。
3. 面向集合的操作方式
非关系数据模型采用的是面向记录的操作方式,操作对象是一条记录。而SQL语言采用集合操作方式,不仅操作对象、查找结果可以是元组的集合,而且一次插入、删除、更新操作的对象也可以是元组的集合。
4. 以同一种语法结构提供两种使用方式
SQL 语言既是独立的语言,又是嵌入式语言。作为独立的语言,它能够独立地被用于联机交互的使用方式中,用户可以在终端键盘上直接输入SQL命令对数据库进行操作。作为嵌入式语言,SQL语句能够嵌入到高级语言(例如C、COBOL、FORTRAN、C++、Java等)程序中,供程序员设计程序时使用。现在很多数据库应用开发工具,都将SQL语言直接融入到自身的语言中,使用起来更加方便。尽管SQL的使用方式不同,但SQL语言的语法基本上是一致的。这种统一语法结构又提供两种不同使用方式的方法,为用户提供了极大的灵活性与方便性。
5. 语言简洁,易学易用
SQL语言功能极强,但其语言十分简洁,完成数据定义、数据操纵、数据控制的核心功能只用了9个动词: CREATE、DROP、ALTER、SELECT、INSERT、UPDATE、DELETE、GRANT、REVOKE。而且SQL语言语法简单,接近英语口语,因此易学易用。
3.2数据定义语言
通过SQL语言的数据定义功能,可以完成基本表、视图、索引的创建、修改和删除。但SQL不提倡修改视图和索引的定义,如果想修改视图和索引的定义,只能先将它们删除,然后再重建。SQL常用的数据定义语句如表3.1所示。
表3.1SQL的数据定义语句
操 作 对 象操 作 方 式
创建删除修改
表CREATE TABLEDROP TABLEALTER TABLE
视图CREATE VIEWDROP VIEW
索引CREATE INDEXDROP INDEX
视频讲解
3.2.1基本表的定义
表是数据库中最基本的操作对象,是实际存放数据的地方。其他的数据库对象的创建及各种操作都是围绕表进行的,可以将表看作含列和行的表单。
1. 创建基本表的语法格式
SQL语言使用CREATE TABLE语句定义基本表。其一般格式为:
CREATE TABLE <基本表名>
( <列名> <数据类型> [列级完整性约束]
[,<列名> <数据类型> [列级完整性约束] ]
…
[,表级完整性约束]);
说明:
(1) 其中,“< >”中的内容是必选项,“[]”中的内容是可选项。本书以下各章节也遵循这个规定。
(2) <基本表名>规定了所定义的基本表的名字,在一个用户中不允许有两个基本表的名字相同。<列名>规定了该列(属性)的名称。一个表中不能有两列的名字相同。
(3) 表名或列名命名规则: 第一个字符必须是字母,后面可以跟字母、数字、3个特殊符号(_、$、#); 表名或列名中不可以包含空格; 表名和列名不区分大小写,但显示出来都是大写; 保留字不能用作表名或列名。
(4) <数据类型>规定了该列的数据类型。
(5) <列级完整性约束>是指对某一列设置的约束条件。
(6) <表级完整性约束>规定了关系主键、外键和用户自定义完整性约束。
2. 数据类型
由于基本表的每个属性列都有自己的数据类型,所以首先介绍一下SQL所支持的数据类型。各个厂家的SQL所支持的数据类型不接近一致,这里只介绍SQL?99规定的主要数据类型。 1) 数值型
? INTEGER定义数据类型为整数类型,它的精度(总有效位)由执行机构确定。INTEGER可简写成INT。
? SMALLINT定义数据类型为短整数类型,它的精度由执行机构确定。
? NUMERIC(p,s)定义数据类型为数值型,并给定精度p(总的有效位,不包含符号位及小数点)或标度s(十进制小数点右边的位数)。
? FLOAT(p)定义数据类型为浮点数值型,p为指定的精度。
? REAL定义数据类型为浮点数值型,它的精度由执行机构确定。
? DOUBLE PRECISION定义数据类型为双精度浮点类型,它的精度由执行机构确定。
2) 字符类型
? CHAR(n)定义指定长度的字符串,n为字符数的固定长度。
? VARCHAR(n)定义可变长度的字符串,其优选长度为 n,n不可省略。
3) 位串型
? BIT(n)定义数据类型为二进制位串,其长度为n。
? BIT VARYING(n)定义可变长度的二进制位串,其优选长度为n,n不可省略。
4) 时间型
? DATE用于定义日期,包含年、月、日,格式为YYYY?MM?DD。
? TIME用于定义时间,包含时、分、秒,其格式为HH:MM:SS。
5) 布尔型
? BOOLEAN定义布尔类型,其值可以是TRUE(真)、FALSE(假)。
对于数值型数据,可以执行算术运算和比较运算,但对其他类型数据,只可以执行比较运算,不能执行算术运算。我们在这里只介绍了常用的一些数据类型,许多SQL产品还扩充了其他一些数据类型,用户在实际使用中应查阅数据库系统的参考手册。
3. 约束条件
在SQL语言中,约束是一些规则,约束在数据库中不占存储空间。根据约束所完成的功能不同,表达完整性约束的规则有主键约束、外键约束、属性约束几类。
1) 主键约束(PRIMARY KEY)
主键约束体现了实体完整性。要求某一列的值既不能为空,也不能重复。
2) 外键约束(FOREIGN KEY)
外键约束体现了参照完整性。外键的取值或者为空或者参考父表的主键。
3) 属性约束
属性约束体现了用户定义的完整性。属性约束主要某一属性的取值范围。属性约束可分为以下几类: ? 非空约束(NOT NULL)。要求某一属性的值不允许为空值。
? 专享约束(UNIQUE)。要求某一属性的值不允许重复。
? 检查约束(CHECK)。检查约束可以对某一个属性列的值加以。就是给某一列设定条件,只有满足条件的值才允许插入。
基本表的完整性约束可定义为两级: 表级约束和列级约束。表级约束可以约束表中的任意一列或多列,而列级约束只能约束其所在的某一列。
上述5种约束条件均可作为列级完整性约束条件,但非空约束不可以作为表级完整性约束条件,其他4种可以作为表级完整性约束条件。
下面通过具体实例介绍基本表的创建方法。
3?1建立样本数据库中的STUDENT表,要求所有约束条件均为列级完整性约束,且该表满足表3.2中所示的条件。
表3.2STUDENT(学生)表
字段名字 段 类 型是 否 为 空说明字 段 描 述
SNOCHAR(8)NOT NULL主键学生学号
SNAMEVARCHAR2(20)UNIQUE专享约束学生姓名
SEXCHAR(4)NOT NULL非空约束性别
AGEINT年龄大于16岁年龄
DEPTVARCHAR2(15)学生所在的系别名称
SQL语句如下所示:
CREATE TABLE STUDENT
(SNO CHAR(8) PRIMARY KEY,/*主键约束*/
SNAME VARCHAR2(20) UNIQUE , /*专享约束*/
SEX CHAR(4) NOT NULL, /*非空约束*/
AGE INT CHECK(Age>16), /*检查约束*/
DEPT VARCHAR2(15));
3?2建立样本数据库中的COURSE表,要求所有约束条件均为列级完整性约束,且该表满足表3.3中所示的条件。
表3.3COURSE(课程)表
字段名字 段 类 型是 否 为 空说明字 段 描 述
CNOCHAR(8)NOT NULL主键课程编号
CNAMEVARCHAR2(10)课程名称
TNAMEVARCHAR2(10)授课教师名
CPNOCHAR(8)外键(参照课程表中的课程编号)先修课程号
CREDITNUMBER学分
SQL语句如下所示:
CREATE TABLE COURSE
(CNO CHAR(8) PRIMARY KEY, /*主键约束*/
CNAME VARCHAR2(10), TNAME VARCHAR2(10),
CPNO CHAR(8) REFERENCES COURSE(Cno), /*外键约束*/
CREDIT NUMBER);
3?3建立样本数据库中的SC表,要求所有约束条件均为列级完整性约束,且该表满足表3.4中所示的条件。
表3.4SC(选课)表
字段名字 段 类 型是 否 为 空说明字 段 描 述
SNOCHAR(8)NOT NULL外键(参照学生表中的学生编号)学生学号
CNOCHAR(8)NOT NULL外键(参照课程表中的课程编号)课程编号
GRADENUMBER选修成绩
其中,(SNO,CNO)属性组合为主键。
SQL语句如下所示:
CREATE TABLE SC
(SNO CHAR(8),
CNO CHAR(8),
GRADE NUMBER,
PRIMARY KEY(SNO,CNO),
/*主键约束*/
FOREIGN KEY(SNO) REFERENCES STUDENT(SNO),
/*外键约束*/
FOREIGN KEY (CNO) REFERENCES COURSE(CNO) ); /*外键约束*/
视频讲解
3.2.2基本表的修改
随着应用环境和实际需求的变化,经常需要修改基本表的结构,包括修改属性列的数据类型及其精度,增加新的属性列或删除属性列,增加新的约束条件或删除原有的约束条件。SQL语言通过ALTER TABLE命令对基本表的结构进行修改。其一般格式为:
ALTER TABLE <基本表名>
[ADD <新列名> <数据类型> [列级完整性约束]]
[DROP COLUMN <列名>]
[MODIFY <列名> <新的数据类型>]
[ADD CONSTRAINT <完整性约束>]
[DROP CONSTRAINT <完整性约束>];
说明:
(1) ADD: 为一个基本表增加新的属性列,但新的属性列的值必须允许为空(除非有默认值)。
(2) DROP COLUMN: 删除基本表中原有的一列。
(3) MODIFY: 修改基本表中原有属性列的数据类型。
(4) ADD CONSTRAINT和DROP CONSTRAINT: 分别表示添加完整性约束和删除完整性约束。
3?4向STUDENT表中增加一个身高Height属性列,数据类型为INT。 SQL语句如下所示:
ALTER TABLE STUDENT ADD Height INT;
新增加的属性列总是表的最后一列。不论表中是否已经有数据,新增加的列值为空。所以新增加的属性列不能有NOT NULL约束,否则就会产生矛盾。
3?5将 STUDENT 表中的Height属性列的数据类型改为REAL。
SQL语句如下所示:
ALTER TABLE STUDENT MODIFY Height REAL;
修改原有的列定义有可能会破坏已有数据,所以在修改时需要注意: 可以增加列值的宽度及小数点的长度,只有当某列所有行的值为空或整张表是空时,才能减少其列值宽度,或改变其列值的数据类型。
3?6给STUDENT表中Height属性列增加一个CHECK约束,要求学生的身高要超过140cm才行。
SQL语句如下所示:
ALTER TABLE STUDENT ADD CONSTRAINT Chk1 CHECK(Height>140);
Chk1是Height属性列上新增加的CHECK约束的名字。
3?7删除Height属性列上的CHECK约束。
SQL语句如下所示:
ALTER TABLE STUDENT DROP CONSTRAINT Chk1;
3?8删除 STUDENT 表中新增加的Height属性列。
SQL语句如下所示:
ALTER TABLE STUDENT DROP COLUMN Height;
3.2.3基本表的删除
当数据库某个基本表不再使用时,可以使用DROP TABLE语句删除它。其一般格式为:
DROP TABLE <表名> [CASCADE CONSTRAINTS];
删除基本表时要注意以下几点:
(1) 表一旦被删除,则无法恢复。
(2) 如果表中有数据,则表的结构连同数据一起删除。
(3) 在表上的索引、约束条件、触发器以及表上的权限也一起被删除。
(4) 当删除表时,涉及该表的视图、存储过程、函数、包被设置为无效。
(5) 只有表的创建者或者拥有DROP ANY TABLE权限的用户才能删除表。
(6) 如果两张表之间有主外键约束条件,则必须先删除子表,然后再删除主表。
(7) 如果加上CASCADE CONSTRAINTS,在删除基本表的同时,相关的依赖对象也一起被删除。
3?9删除学生选课表SC。
SQL语句如下所示:
DROP TABLE SC;
基本表定义一旦被删除,表中的数据、表上建立的索引和视图都将自动被删除掉。因此执行删除基本表的操作一定要格外小心。删除表时要先删除从表,再删除主表。
3.2.4实践环节: 基本表的操作
某员工?部门数据库中包含雇员信息和部门信息两张基本表。各表的结构如附录A的表A.4和表A.5所示。
雇员信息表: Emp(Empno,Ename,Age,Sal,Deptno),表中属性列依次是雇员编号、雇员姓名、年龄、月薪和部门号。
部门信息表: Dept(Deptno,Dname,Loc), 表中属性列依次是部门号、部门名称和部门地点。
(1) 请根据表的结构,用SQL语句分别创建部门信息表和雇员信息表。
(2) 向雇员表中增加性别属性列,列名为Sex,数据类型为CHAR(4)。
(3) 更改部门表中部门地点Loc的数据类型为VARCHAR2(20)。
3.3数据操纵语言
学生选课系统中的数据表定义完成后,用户需要用DML语句向表中插入数据。如果数据输入有误,则需要修改数据。如果不再需要某些数据,则需要删除数据。数据的插入、修改和删除都属于SQL语言的数据操纵功能。
视频讲解
3.3.1插入数据
当基本表建立以后,就可以使用INSERT语句向表中插入数据了。向基本表中插入数据的语法格式如下:
INSERT INTO <基本表名> [(<列名 1>,<列名 2>,…,<列名 n>)]
VALUES(<列值 1>,<列值 2>,…,<列值 n>)
其中,<基本表名>指定要插入元组的表的名字; <列名 1>,<列名 2>,…,<列名 n>为要添加列值的列名序列; VALUES 后则一一对应要添加列的输入值。
注意:
(1) 向表中插入数据之前,表的结构必须已经创建。
(2) 插入的数据及列名之间用逗号分开。
(3) 在 INSERT 语句中列名是可以选择指定的,如果没有指定列名,则表示这些列按表中或视图中列的顺序和个数。
(4) 插入值的数据类型、个数、前后顺序必须与表中属性列的数据类型、个数、前后顺序匹配。
3?10向学生表中插入一个新的学生记录。
方法一: 省略所有列名
INSERT INTO STUDENT
VALUES ('05880111', '张晓三', '男', 23, '数学系');
方法二: 指出所有列名
INSERT INTO STUDENT(SNO,SNAME,SEX,AGE,DEPT)
VALUES ('05880111', '张晓三', '男', 23, '数学系'); 两种方法的作用是相同的。
3?11向学生表中指定的属性列插入数据。
INSERT INTO STUDENT (SNO,SNAME,SEX)
VALUES ('05880112', '王晓五', '女');
其中,没有插入数据的属性列的值均为空值。
注意: 在向表中插入数据时,所插入的数据应满足定义表时的约束条件。例如,如果再次向STUDENT表中插入学号为“05880112”的学生记录时,系统就会给出错误提示信息,违反了主键约束。如果再插入另一个新的学生“05880113”的学生记录,但不知道此同学的性别,插入的性别属性列的值为空值,此时系统也会给出错误提示信息,违反了定义表时对于“性别”字段的非空约束。
视频讲解
3.3.2修改数据
如果表中的数据出现错误,可以利用UPDATE命令进行修改。UPDATE语句用以修改满足指定条件的元组信息。UPDATE语句一般语法格式为:
UPDATE <基本表名>
SET <列名 1> = <表达式> [,<列名 2> = <表达式>]…
[WHERE <条件>];
其中,UPDATE关键字用于定位修改哪一张表,SET关键字用于定位修改这张表中的哪些属性列,WHERE<条件>用于定位修改这些属性列中的哪些行。UPDATE语句只能修改一个基本表中满足 WHERE<条件>的元组的某些列值,即其后只能有一个基本表名。这里,WHERE<条件>是可选的,如果省略不选,则表示要修改表中所有的元组。
1. 修改某一个元组的值
3?12将java课程的学分改为4学分。
UPDATE COURSE
SET CREDIT=4
WHERE CNAME='java';
2. 修改多个元组的值
3?13将所有男同学的年龄增加2岁。
UPDATE STUDENT
SET AGE=AGE+2
WHERE SEX='男';
3?14将所有课程的学分减 1。
UPDATE COURSE
SET CREDIT=CREDIT-1;
3.3.3删除数据
如果不再需要学生选课系统中的某些数据,此时应该删除这些数据,以释放其所占用的存储空间。DELETE 语句的一般语法格式为:
DELETE FROM <表名> [WHERE <条件>];
DELETE语句的功能是从指定表中删除满足 WHERE<条件>的所有元组。DELETE语句只删除表中的数据,而不能删除表的结构,所以表的定义仍然在数据字典中。如果省略WHERE<条件>,表示删除表中全部的元组信息。
1. 删除某一个元组的值
3?15删除学号为“20180010”的学生记录。
DELETE FROM STUDENT
WHERE SNO='20180010';
2. 删除多个元组的值
3?16删除学号为“20180002”的学生的选课记录。
DELETE FROM SC
WHERE SNO='20180002';
每一个学生可能选修多门课程,所以 DELETE 语句会删除这个学生的多条选课记录。
3?17删除所有学生的选课记录。
DELETE FROM SC;
3.3.4实践环节: 数据的操纵
根据3.2.4节中所创建的两张表――部门信息表Dept(Deptno,Dname,Loc)和雇员信息表Emp(Empno,Ename,Age,Sal,Deptno),用 SQL语句完成下列操作。
(1) 分别向雇员信息表和部门信息表中插入数据,各表中的数据如附录A的图A.4和图A.5所示。
(2) 给部门编号为20的所有员工月薪涨500元。
(3) 删除雇员表中年龄小于18岁的员工信息。
3.4数据查询语言
3.4.1SELECT语句的一般格式
PL/SQL语言中最重要、最核心的操作就是数据查询。关系代数的运算在关系数据库中主要由SQL数据查询来体现。SQL语言提供SELECT语句进行数据库的查询,该语句具有灵活的使用方式和丰富的功能。其基本格式为:
SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式>]…
FROM <表名或视图名>[,<表名或视图名>]…
[WHERE<条件表达式>]
[GROUP BY<列名 1> [HAVING <组条件表达式>]]
[ORDER BY<列名 2> [ASC|DESC]];
其中:
(1) SELECT子句说明要查询的数据。ALL表示筛选出数据库表中满足条件的所有记录,一般情况下省略不写。DISTINCT表示查询结果中无重复记录。
(2) FROM子句说明要查询的数据来源。可以是数据库中的一个或多个表,或者是视图,各项之间用逗号分隔。
(3) WHERE子句指定查询条件。查询条件中会涉及PL/SQL函数和PL/SQL操作符。
(4) GROUP BY子句表示在查询时,可以按照某个或某些字段分组汇总,各分组选项之间用逗号分隔。HAVING子句必须跟随GROUP BY一起使用,表示在分组汇总时,可以根据组条件表达式筛选出满足条件的组记录。
(5) ORDER BY子句表示在显示结果时,按照指定字段进行排序。ASC表示升序,DESC表示降序,默认情况下是ASC。
整个SELECT语句的含义是: 根据WHERE子句的条件表达式,从FROM子句指定的表或视图中找出满足条件的元组,再按照SELECT子句中的目标列表达式,选出元组中的属性值形成结果表。如果有GROUP BY子句,则将结果按<列名1>的值进行分组,该属性列值相等的元组为一个组。通常会在每组中使用聚组函数。如果GROUP BY子句带有HAVING子句,则只有满足指定条件的组才能够输出。如果有ORDER BY子句,则结果表还需要按<列名2>的值的升序或者降序排列。查询子句的顺序是不可以前后调换的。
由于SELECT语句的形式多样,可以完成单表查询、多表连接查询、嵌套查询和集合查询等,想要熟练地掌握和运用SELECT语句,必须要下一番工夫。
下面我们以学生选课样例数据库系统为例,说明SELECT语句的各种用法。
视频讲解
3.4.2单表查询
单表查询是指查询的数据只来自一张表,此时,SELECT语句中的FORM子句只涉及一张表的查询。
1. 选择表中若干列
选择表中的全部列或部分列,这就是投影运算。
1) 查询指定的列
3?18查询全体学生的学号、姓名和年龄。
SELECT SNO,SNAME,AGE
FROM STUDENT;
查询结果如图3.1所示。
3?19查询全部课程的课程名称和授课教师名。
SELECT CNAME,TNAME
FROM COURSE;
查询结果如图3.2所示。
图3.1例3?18的PL/SQL程序运行效果
图3.2例3?19的PL/SQL程序运行效果
2) 查询全部列
3?20查询全部课程的详细记录。
SELECT *
FROM COURSE;
查询结果如图3.3所示。
3) 查询经过计算的值
3?21查询全体学生的姓名、性别及其出生年份。
SELECT SNAME,SEX,2018-AGE
FROM STUDENT;
查询结果如图3.4所示。
图3.3例3?20的PL/SQL程序运行效果
图3.4例3?21的PL/SQL程序运行效果
4) 指定别名来改变查询结果的列标题 从前面的查询结果中,我们可以看到,显示的每一个属性列的标题是列名,有时候列名就是拼音代码,意义不是很清楚,为了解决这个问题,我们可以给属性列提供一个别名。方法就是: 在列名的后面加上一个空格或者“as”,然后写上它的别名。在查询结果显示时就用别名代替列名了。
3?22查询全体学生的姓名、性别及其出生年份。
SELECT SNAME,SEX,2018-AGE 出生年份
FROM STUDENT;
查询结果如图3.5所示。
2. 选择表中若干行
选择表中若干行,这就是选择运算。
1) 消除取值重复的行
3?23查询学生表中的所有院系。
SELECT DEPT
FROM STUDENT;
查询结果如图3.6所示。
图3.5例3?22的PL/SQL程序运行效果
图3.6例3?23的PL/SQL程序运行效果
图3.7例3?23的PL/SQL
程序运行效果
由于多名同学属于同一个院系,所以查询的结果中包含了许多重复的行。如果想去掉重复的行,必须指定DISTINCT关键字。
SELECT DISTINCT dept
FROM STUDENT;
查询结果如图3.7所示。
2) 查询满足条件的元组
查询满足指定条件的元组可以通过WHERE子句来实现。使用WHERE子句时,应该注意以下几点:
(1) 如果该列数据类型为字符型,需要使用单引号把字符串括起来。例如WHERE Cname='java'。单引号内的字符串大小写是有区别的。
(2) 如果该列数据类型为日期型,需要使用单引号把日期括起来。
(3) 如果该列数据类型为数字型,则不必用单引号。例如WHERE Age>20。
(4) WHERE子句中可以使用?