`

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
是由BoyceChamberlin1974提出的,并在IBM公司研制的关系型数据库管理系统上得以实现,它功能丰富,语言简洁,易学易用,赢得了众多的用户,被许多数据库厂商所采用,以后又由各厂商进行了不断的修改,完善.198610,美国国家标准局(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,[s])
表示定点数.p指定总的数值位数,包括小数点和小数点后的位数.s表示小数点后的位数.
定点数值型
NUMERIC(p,[s])
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类型,则只能输入10,代表TRUEFALSE.
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
[ADD[
列完整性约束]]
[DROP ]
[MODIFY ]
[ADD CONSTRAINT]
[DROP CONSTAINT];
说明:
(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 [UNIQUE][CLUSTER] INDEX ON
表名(列名[,…N])
说明:
(1)UNIQUE:
表示建立唯一性索引,即索引列不允许有重复值.
(2)CLUSTER:
表示建立的是聚簇索引,否则建立的是非聚簇索引.聚簇索引即指索引项的顺序与表中记录的物理存放顺序一致,一个表中最多可建立一个聚簇索引,可建多个非聚簇索引.
(3)
在列名后可用ASCDESC指定升序或降序,默认为升序(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 [INTO] [()]
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 [INTO] [()]
〈子查询〉;
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 [ALL|DISTINCT]
FROM
[WHERE ]
[GROUP BY ]
[HAVING ]
[ORDER BY ]
说明:
(1)ALL| DISTINCT:
DISTINCT,则每组重复元组只输出一条元组;ALL,则所有重复元组全部输出.默认为ALL.
(2)FROM :
指定要查询的基本表或视图,可以是多个表或视图.
(3)WHERE :
指定查询要满足的条件.
(4)GROUP BY :
指定根据列名表进行分类汇总查询.
(5)ORDER BY :
指定将查询结果按中指定的列进行升序(ASC)或降序(DESC)排列.〈列名表〉中可指定多个列,各列名之间用逗号隔开.先按第一指定列排序,然后按第二,依此类推.
2.4.2
简单查询
最基本的SELECT语句格式为:
SELECT [ALL|DISTINCT]
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 [ALL|DISTINCT]
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.
使用[NOT] BETWEEN关键字表示查询条件
使用BETWEEN关键字指定在某个范围内查询,NOT BETWEEN则正好相反.
2-36 查询"教工登记表"中基本工资在500800之间的记录.
SELECT *
FROM
教工登记表
WHERE
基本工资 BETWEEN 500 AND 800;
则查询结果为:
教师编号 姓名 性别 年龄 婚否 职称 基本工资 部门
JGX003
王芝环 女 25 0 助教 500.00 经管系
JSJ002
张大伟 男 25 0 助教 660.00 计算机系

2-37 查询"教工登记表"中基本工资不在500800之间的记录.
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)的元组,字符串中可使用通配符.
语法格式:
[NOT] LIKE '' [ESCAPE'']
通配符:%:表示任意多个字符.
_:
表示单个任意字符.
[ESCAPE'']:
指当要查询的字符串本身就含有通配符"%""_",要使用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.
使用[NOT] NULL关键字进行查询
使用NULLNOT NULL关键字用于查询某一字段值为空或不空的记录.
2-42 假设在"教工登记表"中插入一条记录:
JCB001
汪洋 男 27 1 NULL 500 基础部
再查询"教工登记表"中职称列不为空的记录

评论

相关推荐

Global site tag (gtag.js) - Google Analytics