5.4 子查询
5.3 连接查询第五章 -- 数据的基本操作
5.1 数据的添加、修改和删除
5.2 简单查询目录
5.1 数据的添加、修改和删除
SQL Server数据厍的新表建好后,
表中并不包含任何记录,要想实现数据的存储,必须向表中添加数据 。
同样要实现表的良好管理,则经常需要修改表中的数据 。 本节主要介绍数据的添加,修改和删除 。
在数据的基本操作中,常用到
Transact-SQL语句,我们应先掌握如表所示的 SQL语句的语法规则 。
5.1.1 数据的添加向表中添加数据可以使用 INSERT语句。
INSERT语句的语法格式如下:
INSERT [INTO] table_name [column_list] VAIUES (data_values )
实例如下,
1.最简单的 INSERT语句
2.省略清单的 INSERT语句
3.省略 VALUES清单的 INSERT语句
4.向学生选课系统各表中添加数据
【 例 5.1】 在结构如图 5.2所示的,专业,
表中添加一行记录:在计算机系部中添加一个电子商务专业,查询代码如下:
USE Student
GO
INSERT专业
(专业代码,专业名称,系部代码 )
VALUES
('0103','电子商务 ','01')
GO
图 5.2,专业,表结构图 5.3.1简单添加数据语句图 5.3.2 企业管理器中查看运行结果
【 例 5.2】 在结构如图 5.4所示的,班级,表中添加 2004级电子商务班,查询代码如下:
USE student
GO
INSERT 班级图 5.4“班级,表结构
VALUES
('20041521','2004 电子商务班 ','0103','01',
'<null>')
GO
图 5.4“班级,表结构图 5.5执行添加数据语句后的结 果
【 例 5.3】 创建,课程,表的一个副本,课程 l”
表,将,课程,表的全部数据添加到,课程 l”
表中 。 代码如下:
USE student
GO
CREATE table 课程 1
(课程号 char(4)not null,课程名 char(20) not
null,学分 smallint null)
GO
INSERT INTO 课程 1
(课程号,课程名,学分 )
SELECT 课程号,课程名,学分
FROM 课程
GO
图 5.6增加多行数据语句执行结果将上述代码在查询分析器中运行,用户可以看到在,课程 l”中增加了 4行数据,如图 5.6所示。
( 1) 向,系部,表中添加以下如图 5.7所示的四条记录,代码如下:
USE Student
GO
INSERT 系部 (系部代码,系部名称,系主任 )
VALUES (‘01’,‘计算机系 ’,‘徐才智 ’ )
GO
INSERT 系部 (系部代码,系部名称,系主任 )
VALUES ('02','经济管理系 ','张博 ')
GO
INSERT 系部 (系部代码,系部名称,系主任 )
VALUES ('03','数学系 ','徐裕光 ')
GO
INSERT 系部 (系部代码,系部名称,系主任 )
VALUES ('04','外语系 ','李溅波 ')
GO
图 5.7 表结构及增加四条记录及执行结果图 5.7 表结构及增加四条记录及执行结果
(2)向,专业,表添加以下如图 5.8所示的七条记录,代码如下:
USE Student
GO
INSERT专业 (专业代码,专业名称,系部代码 )
VALUES ('0101','软件工程 ','01')
GO
INSERT专业 (专业代码,专业名称,系部代码 )
VALUES ('0102','信息管理 ','01')
GO
INSERT专业 (专业代码,专业名称,系部代码 )
VALUES ('0201','经济管理 ','02')
GO
INSERT专业 (专业代码,专业名称,系部代码 )
VALUES ('0202','会计 ','02')
GO
INSERT专业 (专业代码,专业名称,系部代码 )
VALUES ('0203','工商管理 ','02')
GO
INSERT专业 (专业代码,专业名称,系部代码 )
VALUES('0301','经济数学 ','03')
GO
INSERT专业 (专业代码,专业名称,系部代码 )
VALUES ('0401','国际商贸英语 ','04')
GO
图 5.8 表结构及增加七条记录及执行结果图 5.8 表结构及增加七条记录及执行结果
3) 向,班级,表添加以下如图 5.9所示的四条记录,代码如下:
USE student
GO
INSERT 班级 ( 班级代码,班级名称,专业代码,系部代码,备注 )
VALUES ('010101001','01级软件工程 001班 ',
'0101','01','<null>')
GO
INSERT 班级 ( 班级代码,班级名称,专业代码,系部代码,备注 )
VALUES ('010102002','01级信息管理 002班 ',
'0102','01','<null>')
GO
INSERT 班级
( 班级代码,班级名称,专业代码,系部代码,
备注 )
VALUES
('010201001','01级经济管理 001班 ','0201',
'02','<null>')
GO
INSERT 班级
( 班级代码,班级名称,专业代码,系部代码,备注 )
VALUES
('010202001','01 级会计 002 班 ','0202','02',
'<null>')
GO
图 5.9 表结构及增加四条记录及执行结果图 5.9 表结构及增加四条记录及执行结果
( 4) 向,学生,表添加以下如图 5.10所示的四条数据记录,USE student
GO
INSERT 学生 (学号,姓名,性别,出生日期,入学时间,班级代码,系部代码,专业代码 )
VALUES(?010101001001?,? 张斌 ’,? 男 ’,
1970-5-4?,?2001-9-18?,?010101001?,?01?)
GO
INSERT 学生
VALUES(?010102002001?,?周红瑜 ’,?女 ’,
1972-7-8?,?2001-9-18?,?010102002?,?01?)
GO
INSERT 学生
VALUES(?010201001001?,?贾凌云 ’,?男 ’,
1974-9-1?,?2002-9-18?,?010201001?,?02?)
GO
INSERT 学生
VALUES(?010202002001?,?向雪林 ’,?女 ’,
1976-10-1?,?2002-9-18?,?010202002?,?02?)
GO
图 5.10 表结构及增加四条记录及执行结果
( 5) 向,学生,表添加以下如图 5.11所示的四条数据记录,USE student
GO
INSERT课程 (课程号,课程名,学分 )
VALUES (?0001?,?大学语文 ’,?4?)
GO
INSERT课程 VALUES (?0002?,?高等数学 ’,?4?)
GO
INSERT课程 (课程号,课程名,学分 )
VALUES (?0003?,?计算机基础 ’,?4?)
GO
INSERT课程 (课程号,课程名,学分 )
VALUES (?0004?,?数据库概论 ’,?4?)
GO
图 5.11 表结构及增加四条记录及执行结果
5.1.2 数据的修改在数据输入过程中,可能会出现输入错误,或是因为时间变化而需要更新数据 。 这都需要修改数据 。 修改表中的数据可以使用企业管理器,查询设计器的图形界面进行修改,也可以使用查询设计器的,打开表,窗口修改 (参见第四章 )。 这里我们主要介绍 T-SQL的 UPDATE语句实现修改的方法,UPDATE的语法格式如下:
UPDATE table_name
SET
{column_name={expression | DEFAULT | NULL ]}[,… n]
[FROM{<table_source>}[,… n]] [WHERE<search_condition>]
<table_source>::=Table_name[ [AS]table_alias ][ WITH( <table_hint
>[,… n] ) ]
【 例 5.4】 将,教学计划,表中专业代码为
,0101”的,开课学期,的值改为第 2学期,代码如下:
USE student
GO
UPDATE 教学计划
SET开课学期 =2
WHERE 专业代码 =’0101’
GO
【 例 5.5】 将,课程注册,表中所有记录的成绩值改为 (“注册号,-10000415)表达式的值,学分为 3分,代码如下:
USE student
GO
UPDATE课程注册
SET 成绩 =(注册号 -10000415),学分 =3
GO
5.1.3 数据的删除随着系统的运行,表中可能产生一些无用的数据,这些数据不仅占用空间,而且还影响查询的速度,所以应该及时地删除它们 。 删除数据可以使用 DELETE语句和 TRUNCATE TABLE语句 。
1.使用 DELETE语句删除数据从表中删除数据,最常用的是 DELETE
语句 。 DELETE语句的语法格式如下:
DELETE table_name[FROM{ <table_source>}[,… n]]
[WHERE {<search_condition>} ]< table_source>::=
table_name[[AS] table_alias] [,… n]]
【 例 5.6】 删除,课程注册,表中的所有记录 。
代码如下:
USE student
GO
DELETE 课程注册
GO
【 例 5.7】 删除,教师,表中没有姓名的记录 。
代码如下:
USE student
GO
DELETE教师
WHERE 姓名 IS NULL
GO
2.使用 TRUNCATE TABLE清空表格使用 TRUNCATE TABLE语句删除所有记录的语法格式为:
TRUNCATE TABLE table_name
【 例 5.9】 用 TRUNCATE TABLE语句清空,课程注册,表 。 代码如下:
USE student
GO
TRUNCATE TABLE 课程注册
GO
5.2 简单查询数据库存在的意义在于将数据组织在一起,以方便查询 。,查询,的含义就是用来描述从数据库中获取数据和操纵数据的过程 。
SQL语言中最主要,最核心的部份是它的查询功能 。 查询语言用来对已经存在于数据库的数据按照特定的组合,
条件表达式或者一定次序进行检索 。
其基本格式是由 SELECT子句,FROM
子句和 WHERE子句组成的 SQL查询语句:
SELECT<列名表 >
FROM<表或视图名 >
WHERE<查询限定条件 >
5.2.1 完整的 SELECT语句的基本语法格式虽然 SELECT语句的完整语法较复杂,
但是其主要的语法格式可归纳如下:
SELECT select_list
[INTO new_table_name]
FROM table_list
[WHERE search_conditions]
[GROUP BY group_by_expression]
[HAVING search_ conditions]
[ORDER BY order_ expression [ASC|DESC] ]
5.2.2 选择表中的若干列选择表中的全部列或部分列这就是表的投影运算 。 这种运算可以通过 SELECT子句给出的字段列表来实现 。 字段列表中的列可以是表中的列,也可以是表达式列 。 所谓表达式列就是多个列运算后产生的列或者是利用函数计算后所得的列 。
1.输出表中的所有列
2.输出表中部分列
【 例 5.10】 查询,学生,表中全体学生的记录 。
代码如下:
USE student
GO
SELECT *
FROM 学生
GO
USE student
GO
SELECT教师编号,姓名,职称
FROM教师
GO
3,为结果集内的列指定别名 所有列
【 例 5.12】 查询,教师,表中全体教师的姓名及年龄 。 代码如下:
USE Student
GO
SELECT姓名,YEAR(GETDATE())-YEAR(出生日期 ) AS 年龄
FROM教师
GO
图 5.18带有别名的查询
5.2.3 选择表中的若干记录选择表中的若干记录这就是表的选择运算 。 这种运算可以通过增加一些谓词 (例如 WHERE子句 )等来实现 。
1,消除取值重复的行【 例 5.13】 查询选修了课程的学生号 。 查询代码如下:
USE Student
GO
SELECT学号
FROM课程注册
GO
USE Student
GO
SELECT DISTlNCT学号
FROM课程注册
GO
上述代码执行结果如图 5.19所示,选课的学生号有重复,共有 16行记录。下面的代码就去掉了重复学号,仅有 4行记录,
执行结果如图 5.20所示。
2,限制返回行数
【 例 5.14】 查询,课程注册,表中的前 3条记录的信息 。 代码如下:
USE Student
GO
SELECT TOP 3*
FROM课程注册
GO
3,查询满足条件的元组
【 例 5.15】 查询,课程注册,表成绩大于 50
分的记录 。 代码如下:
USE Student
GO
SELECT *
FROM课程注册
WHERE成绩 >=50
GO
5.2.4 对查询的结果排序用户可以使用 ORDER BY子句对查询结果按照一个或多个属性列的升序 (ASC)或降序 (DESC)排列,默认为升序 。 如果不使用 ORDER BY子句,
则结果集按照记录在表中的顺序排列 。 ORDER BY子句的语法格式如下:
ORDER BY { 列名 [ASC|DESC] } [,… n]
【 例 5.22】 查询选修了,0001”号课程的同学的学号,并按成绩的降序排列 。 代码如下:
USE Student
GO
SELECT学号,成绩
FROM课程注册
WHERE课程号 =’0001’
ORDER BY成绩 DESC
GO
5.2.5 对数据进行统计用户经常需要对结果集进行统计,例如求和,平均值,最大值,
最小值,个数等,这些统计可以通过集合函数,COMPUTE子句,GROUP
BY子句来实现 。
1,1,使用集合函数
【 例 5.24】 查询,教师,表中教师总数 。 代码如下:
USE Student
GO
SELECT COUNT(*) AS教师总数
FROM教师
GO
2,对结果进行分组
【 例 5.26】 查询,课程注册,表中课程选课人数 4人以上的各个课程号和相应的选课人数 。 代码如下:
USE Student
GO
SELECT课程号,COUNT(*) AS选课人数图 5.33 分组统计
FROM课程注册
GROUP BY课程号
HAVING COUNT(*)>=4
GO
3,使用 COMPUTE子句
【 例 5.27】 查询所有学生所有成绩的总和 。
代码如下:
SELECT *
FROM 课程注册
ORDER BY 学号
COMPUTE SUM(成绩 )
GO
5.2.6 用查询结果生成新表在实际的应用系统中,用户有时需要将查询结果保存成一个表,这个功能可以通过 SELECT语句中的 INTO子句实现 。 INTO
子句语法格式如
INTO 新表名
【 例 5.29】 创建,课程注册,表的一个副本 。 代码如下:
USE Student
GO
SELECT * INTO课程注册副本
FROM课程注册
GO
SELECT *
FROM 课程注册副本
GO
5.2.7 合并结果集使用 UNION语句可以将多个查询结果集合并为一个结果集,也就是集合的合并操作 。 UNION 子句的语法格式如下:
SELECT语句
{UNION SELECT语句 }[,… n]
【 例 5.31】 查询,课程注册,表中 0102专业的学生学号及课程成绩大于 70分小于 79分的学生学号,且按成绩降序排列记录 。 代码如下:
SELECT *
FROM 课程注册
WHERE 专业代码 ='0102'
UNION
SELECT *
FROM
WHERE 成绩 >=70 And 成绩 <79
ORDER BY 成绩 DESC
GO
5.3 连接查询前面所讲的查询是单表查询 。
若一个查询同时涉及两个或两个以上的表,则称为连接查询 。 连接查询是关系数据库中最主要的查询,
包括等值与非等值查询,自然连接,
自身连接查询,外连接查询和复合条件连接查询等 。
5.3.1 交叉连接查询交叉连接又称非限制连接,也叫广义笛卡尔积。两个表的广义笛卡尔积是两表中记录的交叉乘积,结果集的列为两个表属性列的和,其连接的结果会产生一些没有意义的记录,并且进行该操作非常耗时。因此该运算实际很少使用,仅供对读者理解交叉连接过程之用。
1,交叉连接的连接过程学号 姓名 性别 系部代码 专业代码
010101001001 张斌 男 01 0101
010102002001 周红瑜 女 01 0102
010201001001 贾凌云 男 02 0201
010202002001 向雪林 女 02 0202
专业代码 专业名称 系部代码
0101 软件工程 01
0102 信息管理 01
0201 经济管理 02
0202 会计 02
表 5.2,学生,表表 5.3,专业,表学号 姓名 性别 系部代码专业代码专业代码 *
专业名称系部代码 *
010101
001001
张斌 男 01 0101 0101 软件工程
01
010102
002001
周红瑜 女 01 0102 0101 软件工程
01
010201
001001
贾凌云 男 02 0201 0101 软件工程
01
010202
002001
向雪林 女 02 0202 0101 软件工程
01
010101
001001
张斌 男 01 0101 0102 信息管理
01
010102
002001
周红瑜 女 01 0102 0102 信息管理
01
010201
001001
贾凌云 男 02 0201 0102 信息管理
01
010202
002001
向雪林 女 02 0202 0102 信息管理
01
010101
001001
张斌 男 01 0101 0201 经济管理
02
010102
002001
周红瑜 女 01 0102 0201 经济管理
02
010201
001001
贾凌云 男 02 0201 0201 经济管理
02
010202
002001
向雪林 女 02 0202 0201 经济管理
02
010101
001001
张斌 男 01 0101 0202 会计 02
010102
002001
周红瑜 女 01 0102 0202 会计 02
010201
001001
贾凌云 男 02 0201 0202 会计 02
010202
002001
向雪林 女 02 0202 0202 会计 02
表 5.4 交叉连接的结果表执行连接操作的过程如下:把,学生,表中每一条记录取出(共有 4条记录),与,专业,表中的第一条记录拼接,形成表 5.4的前 4条记录;同样地,再取出,学生,表中每一条记录,与,专业,表中的第二条、第三条、第四条记录分别拼接,从而形成表 5.4的后 12条记录(共形成了 4× 4= 16条记录)。
2,交叉连接的语法格式交叉连接的语法格式:
SELECT 列表列名 FROM 表名 1
CROSS JOIN 表名 2
其中,CROSS JOIN为交叉表连接关键字。
【 例 5.33】 使用上例中的,学生,表,,专业,
表,实现交叉查询 。 代码如下:
USE student
GO
SELECT 学号,姓名,性别,学生,系部代码,学生,专业代码,专业,专业代码,
专业名称,专业,系部代码
FROM 学生 CROSS JOIN 专业
5.3.2 等值与非等值连接查询用来连接两个表的条件称为连接条件或连接谓词,格式为:
[<表名 1>.]<列名 1> <比较运算符 > [<表名 2>.]<列名 2>
【 例 5.34】 用等值连接方法连接,学生,表和
,专业,表,观察通过专业代码连接后的结果与交叉连接的结果有何区别 。 代码如下:
USE student
GO
SELECT 学号,姓名,性别,学生,系部代码,学生,专业代码,
专业,专业代码,专业名称,专业,系部代码
FROM 学生 INNER JOIN 专业 ON 学生,专业代码 =专业,专业代码
5.3.3 自身连接查询连接操作既可在多表之间进行,
也可是一个表与其自己进行连接,
称为表的自身连接 。 使用自身连接时,必须为表指定两个别名,以示区别 。
5.3.4 外连接查询
1,左外连接( LEFT OUTER JOIN)
【 例 5.37】 将,学生,表左外连接,专业,
表 。 代码如下:
USE student
GO
SELECT 学号,姓名,性别,学生,系部代码,学生,
专业代码,专业,专业代码,
专业名称,专业,系部代码
FROM 学生 LEFT OUTER JOIN 专业
ON 学生,专业代码 =专业,专业代码
2,右外连接( RIGHT OUTER JOIN)
【 例 5.38】 将,学生,表右外连接,专业,表 。
代码如下:
USE student
GO
SELECT 学号,姓名,性别,学生,系部代码,学生,专业代码,专业,专业代码,
专业名称,专业,系部代码
FROM 学生 RIGHT OUTER JOIN 专业
ON 学生,专业代码 =专业,专业代码
3,完全外连接( FULL OUTER JOIN)
【 例 5.39】 将,学生,表完全外连接,专业,
表 。 代码如下:
USE student
GO
SELECT 学号,姓名,性别,学生,系部代码,学生,
专业代码,专业,专业代码,
专业名称,专业,系部代码
FROM 学生 FULL OUTER JOIN 专业
ON 学生,专业代码 =专业,专业代码
5.3.5 复合连接条件查询上面各个连接查询中,ON连接条件表达式只有一个条件,允许 ON连接表达式有多个连接条件,称为复合条件连接,或多表连接。
5.4 子查询
5.4.1 带有 IN运算符的子查询
【 例 5.41】 使用,学生,表,,课程,表和
,课程注册,表,查询选修了课程名为,高等数学,或,计算机基础,的学生之学号和姓名 。
代码如下:
USE student
GO
SELECT 学号,姓名
FROM 学生
WHERE 学号 IN
③ (SELECT 学号
FROM 课程注册
② WHERE 课程号 IN
(SELECT 课程号
① FROM 课程
WHERE 课程名 =’高等数学 ’
OR课程名 =’计算机基础 ’
)
)
5.4.2 带有比较运算符的子查询
【 例 5.42】 使用,教师,表,查询与,王钢,同在一个系的教师基本信息 。 代码如下:
USE student
GO
SELECT 教师编号,姓名,性别,学历,职务,职称
FROM 教师
WHERE 系部代码 =
(SELECT 系部代码
FROM 教师
WHERE 姓名 =’王钢 ’
)
5.4.3 带有 ANY或 ALL运算符的子查询
5.4.4 带有 EXISTS运算符的子查询
【 例 5.45】 使用,学生,表和,课程注册,表,
查询选修了全部课程的学生学号及姓名 。 由于
SQL语言中没有描述,全部,的关键字,我们转意为,查询这样的学生,没有一门课程是他不选修的,。 代码如下:
USE student
GO
SELECT 学号,姓名
FROM 学生
WHERE NOT EXISTS
(SELECT *
FROM 课程
WHERE NOT EXISTS
(SELECT *
FROM 课程注册
WHERE 学号 =学生,学号
AND 课程号 =课程,课程号
)
)
练 习 题
1,数据的添加,修改,删除的 SQL命令是什么?
2,简述 SELECT语句的基本语法格式 。
3,SQL Server中提供了哪一些常用的进行数据统计的集合函数?
4,简述 TRUNCATE TABLE 与 DELETE语句的区别 。
5,什么是连接查询?简述交叉连接查询的连接过程及其语法格式。
6,简述外连接查询中有哪几种连接及相应的语法格式。
7,什么是子查询?在 T-SQL语言中存在哪几种基本的子查询方式?
第五章结束!
返回主页