359025439 发表于 2016-11-11 08:06:47

SQL语言与编程

<o:p></o:p>
2 SQL语言与编程
SQL是Structured Query Language(结构化查询语言)的缩写,SQL是关系数据库的标准语言,其功能不是仅限于查询,而是非常全面强大,易学易用,所以几乎现在市面上的所有数据库管理系统都支持SQL语言,使之成为数据库领域中的主流语言.
2.1 SQL语言概述
<st1:chsdate w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899">2.1.1</st1:chsdate> SQL语言的基本概念
1.SQL语言的产生及发展
SQL是由Boyce和Chamberlin于1974提出的,并在IBM公司研制的关系型数据库管理系统上得以实现,它功能丰富,语言简洁,易学易用,赢得了众多的用户,被许多数据库厂商所采用,以后又由各厂商进行了不断的修改,完善.1986年10月,美国国家标准局(American National Standard Institute,简称ANSI)的数据库委员会X3H2批准了SQL作为关系数据库语言的美国标准,且公布了SQL标准文本(SQL-86),1987年,国际标准化组织(International Standard Organization,简称ISO)也采纳了这个标准.此后SQL标准不断得到修改和完善,ANSI又于1989年公布了SQL-89标准,1992年公布了SQL-92标准,1999年公布了SQL-99标准.
2.SQL语言的特点
SQL之所以能成为国际化的关系数据库标准语言,源于它的易用易学和功能强大,概况起来SQL的特点主要包括:
(1) 语言简单易学
SQL语言的语法结构中的关键字接近英语的自然语言,且只使用了几个关键字(如:CREATE,DROP,ALTER,UPDATE,INSERT,DELETE,SELECT)就可实现主要功能的操作,易学,易记,易操作.
(2) 是一种非过程化的语言
使用SQL语言在执行数据操作时,无需了解怎么做,只需告诉系统要做什么,至于怎样完成操作,都由系统自动安排.
(3) 是一种面向集合的语言
SQL语言操作的对象可以是元组的集合,操作的结果也可是元组的集合.
(4) 一种结构,多种使用方式
SQL语言即可作为一种独立的数据库语言来使用,又可嵌入其它高级语言(宿主语言)中作为嵌入式语言来使用.
(5) 综合功能强
SQL语言集数据定义,数据操纵和数据控制于一体,可以独立完成数据库的定义,查询,更新,维护,完整性控制,安全性控制等一系列操作.
2.1.2 SQL的语言分类
是目前使用最广泛的数据库语言.主要用于进行数据库的查询,定义,操纵和控制,是一种功能齐全的关系数据库标准语言.
SQL语言包括四大类:
数据定义语言(Date Definition Language):简称DDL,用于定义,修改,删除数据库表结构,视图,索引等.
数据操纵语言(Date Manegement Language):简称DML,用于对数据库中的数据进行查询和更新操作.
数据控制语言(Date Control Language):简称DCL,用于设置数据库用户的各种操作权限.
事务处理语言:用于保证数据库中数据的完整性.
1. 数据定义语言(DDL)
常用的DDL语句有:
Create Schema:创建模式
Create Table :创建基本表.
Create Index :创建索引.
Create View :创建视图.
Drop Schema:删除模式.
Drop Table :删除基本表.
Drop Index :删除索引.
Drop View :删除视图.
Alter Table :修改表结构.
2. 数据操作语言(DML)
常用的DML语句有:
Insert :插入记录到数据库表或视图.
Delete:删除数据库表或视图的记录.
Update:更改数据库表或视图的数据.
Select:查询数据库表或视图的数据.
3. 数据控制语言(DCL)
常用的DCL语句有:
GRANT:将权限或角色授予用户或其他角色.
REVOKE:撤消用户或数据库角色权限.
4. 数据库事务处理
常用的事务处理语句有:
BEGIN TRANSACTION
COMMIT
ROLLBACK
其中,BEGIN TRANSACTION用于控制事务的开始,COMMIT用于正常提交事务.ROLLBACK用于控制事务的非正常结束,将事务回滚.
2.1.3 SQL支持的数据库模式
SQL支持数据库的三级模式结构,其中,基本表与模式相对应;视图与外模式相对应;存储文件与内模式相对应.如图2-1.
如图所示,一个存储文件对应一个基本表,一个基本表可对应多个视图,一个视图可由多个基本表导出,一个视图可由多个用户访问,一个用户也可访问多个视图,用户也可直接访问多个基本表.
2.1.4 标准SQL语言与数据库产品中的SQL语言
标准SQL语言与实际数据库产品中的SQL语言并不完全一致,即标准SQL语言的某些功能在实际数据库产品中有可能实现不了,而在实际数据库产品中,也可能对标准SQL语言的功能进行了扩充,即在标准SQL语言中不能实现的某些功能,在实际数据库产品中却有可能实现.应在具体使用某个数据库产品时对此问题加以关注,使用时要查看有关产品的技术资料.
2.2 数据定义
SQL的数据定义包括模式定义,基本表定义,视图定义和索引定义.
2.2.1 模式的定义和删除
1. 模式定义
语法格式:CREATE SCHEMA AUTHORIZATION
创建了一个模式,即创建了一个数据库,许多的RDBMS中把创建模式称为创建数据库,如在SQL SERVER 2000中,就是用CREATE DATABASE语句代替CREATE SCHEMA语句.
创建模式后,可进一步创建该模式所包含的数据库对象.如:基本表,视图,索引等.
例 2-1 创建一个Teacher模式.
CREATE SCHEMA Teacher AUTHORIZATION ZYL;
其中Teacher为模式名,ZYL为用户名.若省略模式名,则模式名默认为用户名.
例2-2 在SQL SERVER 2000中创建数据库Teacher.
CREATE DATABASE Teacher;
其中,Teacher为数据库名.
2. 模式删除
语法格式:DROP SCHEMA
其中,选择CASCADE选项,表示在删除模式的同时,将该模式中的所有数据库对象一起删除.选择RESTRICT选项,表示在删除模式的时候,该模式中已经包含了数据库对象(表或视图等),则拒绝执行该删除语句;该模式中未包含任何数据库对象,则允许执行该删除语句.
例2-3 删除例2-1创建的Teacher模式.
DROP SCHEMA Teacher CASCADE;
例2-4 在SQL SERVER 2000中删除例2-2创建的数据库Teacher.
DROP DATABASE Teacher;
2.2.2 创建基本表
语法格式:
CREATE TABLE
(列定义[,...N],
表级完整性约束[,...N]);
说明:
(1) :所要创建的基本表的名称.
(2) 列定义::= [][,...N]
(3) :所定义的列(属性)的名称,一个表中不能有同名的列.
(4) :规定该列数据所属的数据类型,应视该列数据的具体内容和SQL提供的数据类型来定义.
数据类型
说明符
解释
数值型
长整型
INT 或 INTEGER
表示整数值,一般用4个字节存储
短整型
SMALLINT
表示整数值,一般用2个字节存储
定点数值型
DECIMAL(p,)
表示定点数.p指定总的数值位数,包括小数点和小数点后的位数.s表示小数点后的位数.
定点数值型
NUMERIC(p,)
同DECIMAL.
浮点数值型
REAL
取决于机器精度的浮点数.
浮点数值型
DOUBLE PRECISION
取决于机器精度的双精度浮点数.
浮点数值型
FLOAT
表示浮点数,一般精度至少为n位数字.
字符串

定长字符串
CHAR(n)
按固定长度n存储字符串,若实际字符串长度小于n,则后面填充空格,若实际字符串长度大于n,则报错.
变长字符串
VERCHAR(n)
按实际字符串长度存储,若实际字符串长度小于n,后面不填充空格,若实际字符串长度大于n,则报错.
位串型
位串
BIT(n)
表示长度为n的二进制位串
变长位串
BIT VARYING(n)
表示长度为n的变长二进制位串
日期时间型
日期型
DATE
表示日期值年,月,日.表示形式为YYYY-MM-DD.
时间型
TIME
表示时间值时,分,秒.格式为HH:MM:SS.
(1) 列完整性约束:定义该列上数据必须满足的条件.一般有:
NULL 允许为空值(默认值)
NOT NULL 不允许为空值
PRIMARY KEY 主键约束
FOREIGN KEY 外键约束
UNIQUE 唯一性约束
CHECK 检查约束
DEFAULT 默认值
(2) :定义在列或组合列上的完整性约束.
例2-5 创建"教工登记表"
CREATE TABLE 教工登记表
(教师编号 CHAR(6) PRIMARY KEY, /*定义为列级主键约束*/
姓名 CHAR(8) NOT NULL, /*姓名列不能取空值*/
性别 CHAR(2) NOT NULL, /*性别列不能取空值*/
年龄 SMALLINT,
婚否 BIT,
职称 CHAR(6),
基本工资 DECIMAL(7,2),
部门 CHAR(10));
系统执行以上语句后,数据库中就建立了一个名为"教工登记表"的空表,只有表结构而无记录(元组).系统将该表的定义及有关约束条件存放在数据字典中.
注意:
(1)定义每列时,要用逗号隔开每列.
(2)该例将"婚否"定义为BIT类型,则只能输入1或0,代表TRUE和FALSE.
例2-6 创建"教工工资表"
CREATE TABLE 教工工资表
(工资编号 INT,
姓名 CHAR(8) NOT NULL,
基本工资 DECIMAL(7,2),
岗位补贴 DECIMAL(7,2),
奖金 DECIMAL(7,2),
扣除 DECIMAL(7,2),
实发工资DECIMAL(7,2));
例2-7 创建"学生干部登记表"
CREATE TABLE 学生干部登记表
(学号 CHAR(8),
姓名 CHAR(8),
性别 CHAR(2),
年龄 SMALLINT,
班级 CHAR(12),
任职 CHAR(10),
教师编号 CHAR(6));
2.2.3 修改表结构
修改表结构,指的是对已定义的表增加新的列(属性)或删除多余的列(属性).
语法格式:
ALTER TABLE
]



;
说明:
(1)ADD[列完整性约束]:为指定的表添加新的列,并可在新添加的列上增加列级完整性约束.
(2)MODIFY :修改表中指定列的数据类型,当该列有约束定义时,不能修改.
(3)DROP :删除表中指定的列.
(4)ADD CONSTRAINT:为指定表添加表级完整性约束.
(5)DROP CONSTAINT:删除指定表中的某个指定的表级完整性约束.
例2-8 在"教工登记表"中增加一列"政治面貌".
ALTER TABLE 教工登记表
ADD 政治面貌 CHAR(10);
例2-9 在"教工登记表"中修改"政治面貌"列的数据类型.
ALTER TABLE 教工登记表
MODIFY 政治面貌 VARCHAR(8);
例2-10 在"教工登记表"中删除"政治面貌" 一列.
ALTER TABLE 教工登记表
DROP 政治面貌;
例2-11 在"教工登记表"中的姓名列增加一个表级唯一性约束WYYS1.
ALTER TABLE 教工登记表
ADD CONSTRAINT WYYS1 UNIQUE (姓名);
例2-12 在"教工登记表"中删除上例中建立的一个表级主键约束WYYS1.
ALTER TABLE 教工登记表
DROP CONSTRAINT WYYS1;
2.2.4 删除基本表
即将指定的表从数据库中删除,删除表后,所有属于表的数据,索引,视图和触发器也将被自动删除,视图的定义仍被保留在数据字典中,但已无法使用.
语法格式:
DROP TABLE
例2-13 删除"教工工资表".
DROP TABLE 教工工资表;
2.2.5 创建索引
创建索引可提高查询速度,可在经常要进行检索的列上建立索引,但并非索引越多越好,因为索引自身也要占用一定的资源.索引可创建在一列或多列的组合上.
语法格式:
CREATE INDEX ON 表名(列名[,…N])
说明:
(1)UNIQUE:表示建立唯一性索引,即索引列不允许有重复值.
(2)CLUSTER:表示建立的是聚簇索引,否则建立的是非聚簇索引.聚簇索引即指索引项的顺序与表中记录的物理存放顺序一致,一个表中最多可建立一个聚簇索引,可建多个非聚簇索引.
(3)在列名后可用ASC或DESC指定升序或降序,默认为升序(ASC).
(4)如在多列组合上建立索引,则各列名之间用逗号隔开.先按第一指定列排序,然后按第二,依此类推.
例2-14 重新创建"教工工资表"后,为该表创建一个索引,按"基本工资"降序排列.
CREATE INDEX SY1 ON 教工工资表(基本工资 DESC);
例2-15 为"教工登记表"创建一个索引,先按"职称"升序排列,然后按"基本工资"降序排列.
CREATE INDEX SY2 ON 教工登记表(职称,基本工资 DESC);
例2-16 在"教工登记表"的"姓名"列上按升序创建一个唯一性的聚簇索引.
CREATE UNIQUE CLUSTED INDEX SY3 ON 教工登记表(姓名);
2.2.6 删除索引
索引不再需要时,应及时将其删除,可释放空间,减少维护的开销.
语法格式:
DROP INDEX
例2-17 将"教工工资表"中"基本工资"列上建立的索引删除.
DROP INDEX 教工工资表.SY1;
例2-18 将"教工登记表"中"姓名"列上建立的唯一性的聚簇索引删除.
DROP INDEX 教工登记表.SY3;
索引删除后,有关索引的描述也将会从数据字典中删除.
2.3 数据更新
数据更新是指对基本表中数据进行更改,包括向基本表中插入数据,修改基本表中原有数据,删除基本表中的某些数据.
2.3.1 表中插入数据
在已存在的表中插入数据,一般有两种方法,一种是一次插入一个元组(一条记录),另一种是一次插入多个元组(一批记录).
1.插入一个元组
执行一次命令只能完成一个元组的插入.
语法格式:
INSERT [()]
VALUES();
说明:
(1)():要插入值的列的列名序列,各列名之间用逗号隔开,该项为可选项,若省略该项,则表示插入数据到所有列.
(2)():是要插入到表中的数据值,各数据值之间用逗号隔开,各值对应于(列名表)中的各列.
例2-19 在"教工登记表"中插入一条记录.
INSERT INTO 教工登记表
VALUES('JSJ001','江河','男',30,1,'讲师',880,'计算机系');
例2-20 在"教工登记表"中插入一条记录,该记录只包含部分数据.
INSERT INTO 教工登记表 (编号,姓名,性别,部门)
VALUES('JSJ002','张大伟','男','计算机系');
注意:
(1) 没有指定属性列时,必须为每个列赋值,顺序必须与表的各列的顺序一致.
(2) 字符串类型的值要用单引号括起来.
(3) 部分列赋值时,对于允许为空的属性列,如果没有赋予具体值,系统将自动添加NULL(空值).
(4) 不允许为空的列必须赋值,否则出错.
以上两条命令执行后,"教工登记表 "中存在两条记录如下:
教师编号 姓名 性别 年龄 婚否 职称 基本工资 部门
JSJ001 江河 男 30 1 讲师 880 计算机系
JSJ002 张大伟 男 NULL NULL NULL NULL 计算机系

若要再插入下列记录:
JGX001 王冠 男 32 1 讲师 800 经管系
JGX002 刘柳 女 38 1 副教授 1000 经管系
JCB002 张扬 女 28 0 讲师 800 基础部
JGX003 王芝环 女 24 0 助教 500 经管系
则执行下列一组命令:
INSERT INTO 教工登记表
VALUES('JGX001','王冠','男',32,1,'讲师',800,'经管系');
INSERT INTO 教工登记表
VALUES('JGX002','刘柳','女',38,1,'副教授',1000,'经管系');
INSERT INTO 教工登记表
VALUES('JCB002','张扬','女',28,0,'讲师',800,'基础部');
INSERT INTO 教工登记表
VALUES('JGX003','王芝环','女',24,0,'助教',500,'经管系');
此时,教工登记表中有如下记录:
教师编号 姓名 性别 年龄 婚否 职称 基本工资 部门
JCB002 张扬 女 28 0 讲师 800 基础部
JGX001 王冠 男 32 1 讲师 800 经管系
JGX002 刘柳 女 38 1 副教授 1000 经管系
JGX003 王芝环 女 24 0 助教 500 经管系
JSJ001 江河 男 30 1 讲师 880 计算机系
JSJ002 张大伟 男 NULL NULL NULL NULL 计算机系
2.插入一组元组
可通过使用查询语句,将查询结果作为插入值,实现一组元组的插入.
语法格式:
INSERT [()]
〈子查询〉;
例2-21 建立一个"教工查询表",在表中插入一批记录,这些记录取之于"教工登记表".
CREATE TABLE 教工查询表
(编号 CHAR(6) NOT NULL,
姓名 CHAR(8) NOT NULL,
性别 CHAR(2) NOT NULL,
职称 CHAR(6),
部门 CHAR(10) );
建立"教工查询表"后,再执行插入命令:
INSERT 教工查询表
SELECT 教师编号,姓名,性别,职称,部门
FROM 教工登记表;
命令执行后,"教工查询表"中存在下列记录,即同时插入了六条记录.
编号 姓名 性别 职称 部门
JCB002 张扬 女 讲师 基础部
JGX001 王冠 男 讲师 经管系
JGX002 刘柳 女 副教授 经管系
JGX003 王芝环 女 助教 经管系
JSJ001 江河 男 讲师 计算机系
JSJ002 张大伟 男 NULL 计算机系

2.3.2 表中修改数据
需要时,表中的数据值可进行修改.修改数据有几种方式,可按指定条件修改一个或多个元组,也可不指定条件从而对表中所有元组进行修改,还可利用子查询的结果进行修改(见3.4.9).
1.按指定条件修改元组
语法格式:
UPDATE
SET =[,=][,…N]
WHERE ;
说明:
列名1,列名2…为要修改的列的列名,表达式1,表达式2…为要赋予的新值.
WHERE:指定对满足条件的记录进行修改.
例2-22 修改"教工登记表"中'张大伟'的记录,年龄为24,婚否为未婚,职称为助教,基本工资为660.
UPDATE 教工登记表
SET 年龄=24,婚否=0,职称='助教',基本工资=660
WHERE 姓名='张大伟';
结果表中的记录为:
教师编号 姓名 性别 年龄 婚否 职称 基本工资 部门
JCB002 张扬 女 28 0 讲师 800 基础部
JGX001 王冠 男 32 1 讲师 800 经管系
JGX002 刘柳 女 38 1 副教授 1000 经管系
JGX003 王芝环 女 24 0 助教 500 经管系
JSJ001 江河 男 30 1 讲师 880 计算机系
JSJ002 张大伟 男 24 0 助教 660 计算机系

例2-23 修改"教工登记表"中的基本工资值,给所有的讲师增加基本工资100元.
UPDATE 教工登记表
SET 基本工资=基本工资+100
WHERE 职称='讲师';
结果表中的记录为:
教师编号 姓名 性别 年龄 婚否 职称 基本工资 部门
JCB002 张扬 女 28 0 讲师 900 基础部
JGX001 王冠 男 32 1 讲师 900 经管系
JGX002 刘柳 女 38 1 副教授 1000 经管系
JGX003 王芝环 女 24 0 助教 500 经管系
JSJ001 江河 男 30 1 讲师 980 计算机系
JSJ002 张大伟 男 24 0 助教 660 计算机系

2.修改表中所有元组
语法格式:
UPDATE
SET =[,=][,…N]
例2-24 修改"教工登记表"中的年龄值,给所有教工的年龄值增加1.
UPDATE 教工登记表
SET 年龄=年龄+1;
结果表中的记录为:
教师编号 姓名 性别 年龄 婚否 职称 基本工资 部门
JCB002 张扬 女 29 0 讲师 900 基础部
JGX001 王冠 男 33 1 讲师 900 经管系
JGX002 刘柳 女 39 1 副教授 1000 经管系
JGX003 王芝环 女 25 0 助教 500 经管系
JSJ001 江河 男 31 1 讲师 980 计算机系
JSJ002 张大伟 男 25 0 助教 660 计算机系
2.3.3 表中删除数据
删除表中数据,指的是在表中删除记录,表的结构,约束,索引等并没有被删除.删除数据有几种方式,可按指定条件删除一个或多个元组,也可不指定条件从而对表中所有元组进行删除,还可利用子查询的结果进行删除(见3.4.9).
1.按指定条件删除一个或多个元组
语法格式:
DELETE FROM
WHERE ;
例2-26 删除"教工工资表"中"李力"的记录.
DELETE
FROM 教工工资表
WHERE 姓名='李力';
假设删除前"教工工资表"中有如下记录:
工资号 姓名 基本工资 岗位补贴 奖金 扣除 实发工资
1 江河 980.00 400.00 400.00 250.00 1430.00
2 张大伟 660.00 300.00 250.00 120.00 1090.00
3 王冠 900.00 400.00 300.00 200.00 1300.00
4 刘柳 1000.00 600.00 400.00 260.00 1740.00
5 张扬 900.00 400.00 300.00 180.00 1320.00
6 王芝环 500.00 300.00 150.00 150.00 800.00
7 李力 900.00 600.00 400.00 236.00 1664.00
执行删除后结果表中的记录为:
工资号 姓名 基本工资 岗位补贴 奖金 扣除 实发工资
1 江河 980.00 400.00 400.00 250.00 1430.00
2 张大伟 660.00 300.00 250.00 120.00 1090.00
3 王冠 900.00 400.00 300.00 200.00 1300.00
4 刘柳 1000.00 600.00 400.00 260.00 1740.00
5 张扬 900.00 400.00 300.00 180.00 1320.00
6 王芝环 500.00 300.00 150.00 150.00 800.00
2.删除表中所有元组
语法格式:
DELETE FROM
例2-27 删除"教工查询表"中的所有记录.
DELETE
FROM 教工查询表
结果表为:
编号 姓名 性别 职称 部门
表中所有的元组被删除,但表的属性,约束,索引等仍被保留.
2.4 数据查询
查询是数据库的主要操作,SQL提供的查询语句SELECT,可以灵活方便地完成各种查询.
2.4.1 SELECT语句的格式
语法格式:
SELECT
FROM




说明:
(1)ALL| DISTINCT:选DISTINCT,则每组重复元组只输出一条元组;选ALL,则所有重复元组全部输出.默认为ALL.
(2)FROM :指定要查询的基本表或视图,可以是多个表或视图.
(3)WHERE :指定查询要满足的条件.
(4)GROUP BY :指定根据列名表进行分类汇总查询.
(5)ORDER BY :指定将查询结果按中指定的列进行升序(ASC)或降序(DESC)排列.〈列名表〉中可指定多个列,各列名之间用逗号隔开.先按第一指定列排序,然后按第二,依此类推.
2.4.2 简单查询
最基本的SELECT语句格式为:
SELECT
FROM
1.查询表中所有的列
若查询表中所有列,可不必将所有列名列出,而用"*"替代.
例2-28 查询"教工登记表"中的所有信息.
SELECT *
FROM教工登记表;
则查询结果为:
教师编号 姓名 性别 年龄 婚否 职称 基本工资 部门
JCB002 张扬 女 29 0 讲师 900 基础部
JGX001 王冠 男 33 1 讲师 900 经管系
JGX002 刘柳 女 39 1 副教授 1000 经管系
JGX003 王芝环 女 25 0 助教 500 经管系
JSJ001 江河 男 31 1 讲师 980 计算机系
JSJ002 张大伟 男 25 0 助教 660 计算机系
2.查询表中指定列
例2-29 查询"教工登记表"中"姓名","年龄","职称"列的所有信息.
SELECT姓名,年龄,职称
FROM教工登记表;
则查询结果为:
姓名 年龄 职称
张扬 29 讲师
王冠 33 讲师
刘柳 39 副教授
王芝环 25 助教
江河 31 讲师
张大伟 25 助教
3.查询列表中指定常量和计算表达式
例2-30 查询"教工工资表"中各教工的应发工资.
SELECT 姓名,基本工资+岗位补贴+奖金
FROM 教工工资表;
则查询结果为:
姓名
江河 1780.00
张大伟 1210.00
王冠 1600.00
刘柳 2000.00
张扬 1600.00
王芝环 950.00
4.给查询列指定别名
语法格式:列名 AS 别名
例2-31 查询"教工工资表"中各教工的应发工资,将计算查询出来的列用列名"应发工资"显示.
SELECT 姓名,基本工资+岗位补贴+奖金 AS 应发工资
FROM 教工工资表
则查询结果为:
姓名 应发工资
江河 1780.00
张大伟 1210.00
王冠 1600.00
刘柳 2000.00
张扬 1600.00
王芝环 950.00
5.消除查询结果中的重复行
在有些查询结果中,可能会包含一些重复行,使用DISTINCT关键字,可消除查询结果中的重复行,默认为ALL,取所有行.
例2-32 查询"教工登记表"中各部门名称.
若执行下列语句:
SELECT 部门
FROM 教工登记表
则执行结果为:
部门
基础部
经管系
经管系
经管系
计算机系
计算机系
若改为执行下列语句:
SELECT DISTINCT 部门
FROM 教工登记表
则执行结果为:
部门
基础部
计算机系
经管系
第一次执行,使用的是默认值ALL,所以将所有结果都列出;第二次执行,使用了DISTINCT关键字,消除了重复行,相同的部门只取一个.
2.4.3 选择查询
即根据给定的查询条件,查询出满足条件的记录.
语法格式:
SELECT
FROM
WHERE
根据WHERE子句中使用的关键字不同,可进行不同的选择查询.
1.使用关系表达式和逻辑表达式表示查询条件
关系运算符:>(大于),= (大于等于),<= (小于等于),=(等于),(不等于)
逻辑运算符:AND(与),OR(或),NOT(非)
例2-33 查询"教工登记表"中职称为"讲师"的记录.
SELECT *
FROM 教工登记表
WHERE 职称='讲师';
则查询结果为:
教师编号 姓名 性别 年龄 婚否 职称 基本工资 部门
JCB002 张扬 女 29 0 讲师 900.00 基础部
JGX001 王冠 男 33 1 讲师 900.00 经管系
JSJ001 江河 男 31 1 讲师 980.00 计算机系
例2-34 查询"教工工资表"中基本工资大于800的记录.
SELECT *
FROM 教工工资表
WHERE 基本工资>800;
则查询结果为:
工资号 姓名 基本工资 岗位补贴 奖金 扣除 实发工资
1 江河 980.00 400.00 400.00 250.00 1430.00
3 王冠 900.00 400.00 300.00 200.00 1300.00
4 刘柳 1000.00 600.00 400.00 260.00 1740.00
5 张扬 900.00 400.00 300.00 180.00 1320.00
例2-35 查询"教工登记表"中职称为"讲师"且年龄小于30的记录.
SELECT *
FROM 教工登记表
WHERE 职称='讲师' AND 年龄<30;
则查询结果为:
教师编号 姓名 性别 年龄 婚否 职称 基本工资 部门
JCB002 张扬 女 29 0 讲师 900.00 基础部

2.使用 BETWEEN关键字表示查询条件
使用BETWEEN关键字指定在某个范围内查询,NOT BETWEEN则正好相反.
例2-36 查询"教工登记表"中基本工资在500至800之间的记录.
SELECT *
FROM 教工登记表
WHERE 基本工资 BETWEEN 500 AND 800;
则查询结果为:
教师编号 姓名 性别 年龄 婚否 职称 基本工资 部门
JGX003 王芝环 女 25 0 助教 500.00 经管系
JSJ002 张大伟 男 25 0 助教 660.00 计算机系

例2-37 查询"教工登记表"中基本工资不在500至800之间的记录.
SELECT *
FROM 教工登记表
WHERE 基本工资 NOT BETWEEN 500 AND 800;
则查询结果为:
教师编号 姓名 性别 年龄 婚否 职称 基本工资 部门
JCB002 张扬 女 29 0 讲师 900.00 基础部
JGX001 王冠 男 33 1 讲师 900.00 经管系
JGX002 刘柳 女 39 1 副教授 1000.00 经管系
JSJ001 江河 男 31 1 讲师 980.00 计算机系
3.使用IN关键字表示查询条件
使用IN关键字可以查询符合列表中任何一个值的的记录.
例2-38 查询"教工登记表"中职称是"讲师","副教授","教授"的记录.
SELECT *
FROM 教工登记表
WHERE 职称 IN('讲师','副教授','教授');
则查询结果为:
教师编号 姓名 性别 年龄 婚否 职称 基本工资 部门
JCB002 张扬 女 29 0 讲师 900.00 基础部
JGX001 王冠 男 33 1 讲师 900.00 经管系
JGX002 刘柳 女 39 1 副教授 1000.00 经管系
JSJ001 江河 男 31 1 讲师 980.00 计算机系
4.使用LIKE关键字进行模糊查询
使用LIKE运算符可完成对字符串的模糊匹配.即查找指定的属性列值与相匹配(LIKE)或不相匹配(NOT LIKE)的元组,字符串中可使用通配符.
语法格式:
LIKE ''
通配符:%:表示任意多个字符.
_:表示单个任意字符.
:指当要查询的字符串本身就含有通配符"%"或"_"时,要使用ESCAPE''来对通配符进行转义.
例2-39 查询"教工登记表"中江姓教工的记录.
SELECT *
FROM 教工登记表
WHERE 姓名 LIKE '江%';
则查询结果为:
教师编号 姓名 性别 年龄 婚否 职称 基本工资 部门
JSJ001 江河 男 31 1 讲师 980.00 计算机系
例2-40查询"教工登记表"中年龄为30几岁教工的记录.
SELECT *
FROM 教工登记表
WHERE 年龄 LIKE '3_';
则查询结果为:
教师编号 姓名 性别 年龄 婚否 职称 基本工资 部门
JGX001 王冠 男 33 1 讲师 900.00 经管系
JGX002 刘柳 女 39 1 副教授1000.00 经管系
JSJ001 江河 男 31 1 讲师 980.00 计算机系
例2-41查询"教工登记表"中非计算机系的教工的记录.
SELECT *
FROM 教工登记表
WHERE 部门 NOT LIKE '计%';
则查询结果为:
教师编号 姓名 性别 年龄 婚否 职称 基本工资 部门
JCB002 张扬 女 29 0 讲师 900.00 基础部
JGX001 王冠 男 33 1 讲师 900.00 经管系
JGX002 刘柳 女 39 1 副教授 1000.00 经管系
JGX003 王芝环 女 25 0 助教 500.00 经管系

5.使用 NULL关键字进行查询
使用NULL和NOT NULL关键字用于查询某一字段值为空或不空的记录.
例2-42 假设在"教工登记表"中插入一条记录:
JCB001 汪洋 男 27 1 NULL 500 基础部
再查询"教工登记表"中职称列不为空的记录
页: [1]
查看完整版本: SQL语言与编程