项目四 公司管理数据库系统的 数据查询

98
项项项 项项项项项项项项 项项项项 项项项项 项项项项项项项项 项项项项项项项项项项项项项项 :、 项项项

Upload: rachel-fitzgerald

Post on 03-Jan-2016

130 views

Category:

Documents


0 download

DESCRIPTION

项目四 公司管理数据库系统的 数据查询. 终极目标:能根据需要灵活、快速地查询公司管理系统数据库的数据. 一、教学目标: 1 、会在一个数据表中实现数据的简单查询 2 、会同时在多个数据表中实现数据的复合查询 3 、会实现分组查询 4 、会对查询结果集排序 5 、会利用库函数进行数据统计 二、工作任务 根据需要灵活快速地查询公司管理数据库系统的数据. 模块 1 公司管理数据库系统的 简单查询. 一、教学目标: 1 、 准确理解 TRANSACT-SQL 查询语句的基本结构 2 、 能根据需要灵活使用查询语句的各子句 二、工作任务 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 项目四 公司管理数据库系统的 数据查询

项目四 公司管理数据库系统的数据查询

终极目标:能根据需要灵活、快速地查询公司管理系统数据库的数据

Page 2: 项目四 公司管理数据库系统的 数据查询

一、教学目标: 1 、会在一个数据表中实现数据的简单查询 2 、会同时在多个数据表中实现数据的复合查询 3 、会实现分组查询 4 、会对查询结果集排序 5 、会利用库函数进行数据统计 二、工作任务 根据需要灵活快速地查询公司管理数据库系统的

数据

Page 3: 项目四 公司管理数据库系统的 数据查询

模块 1 公司管理数据库系统的简单查询

一、教学目标: 1、 准确理解 TRANSACT-SQL 查询语句的基本结构 2、 能根据需要灵活使用查询语句的各子句 二、工作任务 公司对所有招收的雇员的材料都存储在公司管理数据

库系统 COMPANYINFO 的 employee 表中,该表中包含了雇员的姓名、性别、出生年月、雇佣日期、特长和薪水等信息。现编写查询语句,按要求得到相应的结果。

Page 4: 项目四 公司管理数据库系统的 数据查询

SELECT 语句 使用数据库和数据表的主要目的是存储数据,以便

在需要时进行检索、统计或组织输出,通过 T-SQL 的查询可以从表或视图中迅速、方便地检索数据。在众多的 T-SQL 语句中, SELECT 语句是使用频率最高的一个。

查询的最基本方式是使用 SELECT 语句,按照用户给定的条件从 SQL SERVER 数据库中取出数据,并将数据通过一个或多个结果集返回给用户。

Page 5: 项目四 公司管理数据库系统的 数据查询

一、 SELECT 格式 从数据库中检索行,并允许从一个或

多个表中选择一个或多个行或列。 SELECT [ALL| DISTINCT] < 目标表达式 >[,…< 目

标表达式 >] [ INTO < 新表名 >] FROM < 表名或视图名 >[,… < 表名或视图名 > [ WHERE < 条件表达式 > ] [ GROUP BY < 列名 1> [HAVING < 表达式 > ] ] [ ORDER BY < 列名 2> [ ASC | DESC ] ]

Page 6: 项目四 公司管理数据库系统的 数据查询

Select 子句:指定由查询返回的列 。 Into 子句:将检索结果存储到新表或视图中。 From 子句:用于指定引用的列所在的表和视图 。 Where 子句:指定用于限制返回的行的搜索条件。 Group by 子句:指定用来放置输出行的组,并且如果 SEL

ECT 子句 <select list> 中包含聚合函数,则计算每组的汇总值。

having 子句:指定组或聚合的搜索条件。 HAVING 通常与 GROUP BY 子句一起使用。如果不使用 GROUP BY 子句, HAVING 的行为与 WHERE 子句一样。

Order by 子句:指定结果集的排序。

1 、子句的功能

Page 7: 项目四 公司管理数据库系统的 数据查询

2 、 SELECT 语句的执行方式 1 )通过查询设计器辅助生成和执行 select 语

句 2 )查询分析器执行 select 语句

Page 8: 项目四 公司管理数据库系统的 数据查询

二、 SELECT 子句 功能 : 指定由查询返回的列。 格式: SELECT [ALL|DISTINCT][TOP N [ PERCENT ] ] 列名 1[, 列名 2,… 列名 N] FROM 表名或视图名 参数的含义: ALL :指定在结果集中可以显示重复行。 ALL 是默认设置。 DISTINCT :指定在结果集中只能显示唯一行。即表示输出无

重复的所有记录。 TOP N [PERCENT] :指定只从查询结果集中输出前 N 行。

如果还指定了 PERCENT ,则只从结果集中输出前百分之 N 行。

Page 9: 项目四 公司管理数据库系统的 数据查询

1 、查询所有的列 SELECT 子句中,在选择列表处

使用通配符“ *”, 表示选择指定的表或视图中所有的列。服务器会按用户创建表格时声明列的顺序来显示所有的列 .

语法 : SELECT * FROM 表名

Page 10: 项目四 公司管理数据库系统的 数据查询

【例 1 】从公司管理数据库 COMPANYINFO 中的客户表 (customer) 中检索所有的客户的公司名称、联系人姓名、联系方式、地址和邮编。

USE COMPANYINFO GO SELECT * FROM customer GO

Page 11: 项目四 公司管理数据库系统的 数据查询

2、查询特定的列 【例 2 】 从公司管理数据库 (COMPANYINFO) 中

的客户表 (customer) 中检索所有的客户的公司名称、联系人姓名、地址。

USE COMPANYINFO GO SELECT 公司名称,联系人姓名,地址 FROM customer GO

Page 12: 项目四 公司管理数据库系统的 数据查询

【例 3 】 从公司管理数据库 (COMPANYINFO)中的雇员表( employee)中检索所有的雇员的姓名和特长。

USE COMPANYINFO GO SELECT 姓名,特长 FROM employee GO

Page 13: 项目四 公司管理数据库系统的 数据查询

3 、指定特定列的列名( 1 )采用符合 ANSI规则的标准方法,在列表

达式后面给出列名。 【例 4 】查询每个人的薪水降低 30%信息。 USE COMPANYINFO GO SELECT 姓名 , 薪水 ‘原薪水’ , 薪水 - 薪水 *0.3 '现薪水 ' FROM employee GO

Page 14: 项目四 公司管理数据库系统的 数据查询

( 2 )用“ =” 来连接列表达式 【例 5 】查询每个人的薪水降低 30%信息。 USE COMPANYINFO GO SELECT 姓 名 , ' 原薪 水 '= 薪 水 , ' 现 薪

水 '=薪水 - 薪水 *0.3 FROM employee GO

Page 15: 项目四 公司管理数据库系统的 数据查询

( 3 )用 AS 关键字来连接列表达式和指定的列名 【例 6 】查询每个人的薪水降低 30% 信息。 USE COMPANYINFO GO SELECT 姓名 , 薪水 as ' 原薪水 ' , 薪水 - 薪水 *0.3 as ' 现薪水 ' FROM employee GO

Page 16: 项目四 公司管理数据库系统的 数据查询

4.使用 TOP关键字 SQL Server 2000提供了 TOP关键字,让用户

指定返回前面一定数量的数据。 语法格式: SELECT [TOP n | TOP n PERCENT] 列名

1[, 列名 2,… 列名 n] FROM 表名其中 : TOP n: 表示返回最前面的 n 行, n 表示返回的行数。 TOP n PERCENT: 表示返回的前面的 n% 行。

Page 17: 项目四 公司管理数据库系统的 数据查询

【例 7 】从 northwind 数据库的 customers表中返回前面 10 行数据。

use northwind go select top 10 * from customers go

Page 18: 项目四 公司管理数据库系统的 数据查询

【例 8 】从 northwind 数据库中的 customers表中返回前 10% 的数据。

use northwind go select top 10 percent * from customers go

Page 19: 项目四 公司管理数据库系统的 数据查询

三、 WHERE 字句 使用 WHERE 子句的目的是为了从表格的

数据集中过滤出符合条件的行。 语法格式: SELECT 列名 1 [, 列名 2, … 列名 n] FROM 表名 WHERE 条件

Page 20: 项目四 公司管理数据库系统的 数据查询

常用查询条件 查询条件 运算符号比较 = 、 > 、 < 、 >= 、 <> 、 !

=、 !> 、 !<范围 BETWEEN 、 NOT

BETWEEN

列表 IN 、 NOT IN

字符串匹配 LIKE 、 NOT LIKE

未知道判断 IS NULL 、 IS NOT NULL

组合条件 AND 、 OR

取反 NOT

Page 21: 项目四 公司管理数据库系统的 数据查询

1.使用算术表达式

使用算术表达式作为搜索条件的一般表达形式是:

表达式 算术操作符 表达式 表达式为:常量、变量和列表达式的任意有效组合。

Page 22: 项目四 公司管理数据库系统的 数据查询

【例 9 】 查询 COMPANYINFO 数据库的雇员表( employee )中,特长是计算机的雇员的信息。

USE COMPANYINFO GO SELECT * FROM employee WHERE 特长 =' 计算机 '

Page 23: 项目四 公司管理数据库系统的 数据查询

【例 10 】查询 COMPANYINFO 数据库的雇员表( employee )中,薪水超过 3000 元的雇员的姓名和薪水。

USE COMPANYINFO GO SELECT 姓名,薪水 FROM employee WHERE 薪水 >=3000 GO

Page 24: 项目四 公司管理数据库系统的 数据查询

2.使用逻辑表达式 在 T-SQL里的逻辑表达式共有 3 个。分

别是:1) NOT :非,对表达式的否定。2) AND :与,连接多个条件,所有的条件都

成立时为真。3) OR :或,连接多个条件,只要有一个条件

成立就为真。

Page 25: 项目四 公司管理数据库系统的 数据查询

【例 11 】查询所有在美国加利福尼亚州的出版社。 use pubs go select pub_id as 出版社代号 , pub_name as

出版社名称 ,city as 城市 , state as 州 , country as 国家

from publishers where country='usa‘ and state ='ca' go

Page 26: 项目四 公司管理数据库系统的 数据查询

查询结果如下: 出版社代号 出版社名称 城市 州 国家 ----- ----------- -------------------- ---- ------------------------------ 1389 Algodata Infosystems Berkeley CA USA   (所影响的行数为 1 行)

Page 27: 项目四 公司管理数据库系统的 数据查询

3.使用 BETWEEN关键字 使用 BETWEEN关键字可以更方便地限

制查询数据的范围。 语法格式为: 表达式 [NOT] BETWEEN 表达式 1 A

ND 表达式 2

Page 28: 项目四 公司管理数据库系统的 数据查询

【例 12 】查询 COMPANYINFO 数据库的雇员表( employee)中,薪水在 3000 元至 4000 元的雇员的姓名和薪水。

SELECT 姓名,薪水 FROM employee WHERE 薪水 between 3000 and 4000

Page 29: 项目四 公司管理数据库系统的 数据查询

【例 13 】查询库存量大于 200 和库存量小于 100的产品名、库存量和单价。

SELECT 产品名 ,库存量 ,单价 FROM product WHERE 库存量 not between 200 and 100

Page 30: 项目四 公司管理数据库系统的 数据查询

【例 14 】 查询价格在 15 和 20美元之间的书的书号、种类和价格。

use pubs go select title_id as 书号 ,type as 种类 ,price as 原价 from titles where price between $15 and $20 go

Page 31: 项目四 公司管理数据库系统的 数据查询
Page 32: 项目四 公司管理数据库系统的 数据查询

【例 15 】查询书价大于 20 和书价小于 15 的书的代号、种类和价格。

use pubs go select title_id as 书号 ,type as 种类 , price as 原价 from titles where price < $15 or price > $20 go

Page 33: 项目四 公司管理数据库系统的 数据查询

查询结果如下:书号 种类 原价 ------ ------------ --------------------- BU1111 business 11.9500 BU2075 business 2.9900 MC3021 mod_cook 2.9900 PC1035 popular_comp 22.9500 …… (所影响的行数为 11 行)

Page 34: 项目四 公司管理数据库系统的 数据查询

4.使用 IN关键字 同 BETWEEN关键字一样, IN 的引入也

是为了更方便地限制检索数据的范围,灵活使用 IN关键字,可以用简洁的语句实现结构复杂的查询。

语法格式为: 表达式 [NOT] IN ( 表达式 1 , 表达式 2 [,

… 表达式 n])

Page 35: 项目四 公司管理数据库系统的 数据查询

【例 16 】查询所有居住在 KS 、 CA 、 MI 或 IN州的作家。 use pubs go  select au_id,au_lname,au_fname from authors where state IN ('CA','KS','MI','IN') go 如果不使用 IN关键字,这些语句可以使用下面的语句代替: use pubs go  select au_id,au_lname,au_fname from authors where state='CA ‘ or state='KS‘ or state='MI' or state='IN' go

Page 36: 项目四 公司管理数据库系统的 数据查询

【例 17 】查询所有不在上述 4 个州居住的作家。 use pubs go select au_id,au_lname,au_fname from authors where state not in ('CA', 'KS', 'MI', 'IN') go 与下面的语句等价: use pubs go  select au_id,au_lname,au_fname from authors where state<>'CA ' and state<>'KS' and state<>'MI' and state<>'IN' go

Page 37: 项目四 公司管理数据库系统的 数据查询

5 、通配符的使用

注意:所有通配符都只有在 LIKE 子句中才有意义,否则通配符会被当作普通字符处理。

符号 含义%(百分号) 表示从 0~N 个任意字符_(下划线) 表示单个的任意字符[ ] (封闭方括号) 表示方括号里列出的任意一个字符[^] 任意一个没有在方括号里列出的字符

Page 38: 项目四 公司管理数据库系统的 数据查询

【例 18 】列出所有姓“章”的雇员的信息。

查询语句如下: SELECT * FROM employee WHERE 姓名 LIKE ' 章 %'

Page 39: 项目四 公司管理数据库系统的 数据查询

【例 19】查询雇员表( employee)中所有姓名中含有“利”字的雇员。

SELECT 雇员 ID,姓名 FROM employee WHERE 姓名 like '%利%' GO

Page 40: 项目四 公司管理数据库系统的 数据查询

【例 20】查询雇员表( employee)中所有雇员 ID满足前 2 个字符为“ 01” ,第 4 个字符为“ -”的雇员的姓名和出生年月。

SELECT 雇员 ID ,姓名,出生年月 FROM employee WHERE 雇员 id like '01_-%' GO

Page 41: 项目四 公司管理数据库系统的 数据查询

【例 21 】查询所有 au_id满足前 2 个字符为“ 72” ,第 4 个字符为“ -” 的作家的姓名和电话号码。

use pubs go   select au_lname, au_fname, phone, au_id from authors where au_id like '72_-%' go

Page 42: 项目四 公司管理数据库系统的 数据查询

查询结果如下: au_lname au_fname phone au_id -------------------------- -------------------- ------------ ----------- DeFrance Michel219 547-9982 722-51-5454 Stringer Dirk 415 843-2991 724-08-9931 MacFeather Stearns 415 354-7128 724-80-9391   (所影响的行数为 3 行)

Page 43: 项目四 公司管理数据库系统的 数据查询

【例 22 】查询所有 au_id 的第一个字符为 5-9 、第二个字符为 1-4 的作家的姓名和电话号码。

use pubs go   select au_lname,au_fname, phone, au_id from authors where au_id like '[5-9][1-4]%' go

Page 44: 项目四 公司管理数据库系统的 数据查询

五、 from 子句 在每一条要从表或视图中检索数据的 S

ELCET 语句中,都需要使用 FROM 子句。用 FROM 子句可以:

列出选择列表和 WHERE 子句中所引用的列所在的表和视图。可用 AS 子句为表和视图的名称指定别名。

Page 45: 项目四 公司管理数据库系统的 数据查询

FROM 子句可以指定: 一个或多个表或视图。 例: SELECT * FROM Shippers

两个表或视图之间的联接: SELECT Cst.CustomerID, Cst.CompanyName,

Cst.ContactName, Ord.ShippedDate, Ord.Freight FROM Northwind.dbo.Orders AS Ord JOIN Northwind.dbo.Customers AS Cst ON

(Cst.CustomerID = Ord.CustomerID)

Page 46: 项目四 公司管理数据库系统的 数据查询

六、 ORDER BY 子句 SELECT 语句获得的数据一般是没有排序的。为

了方便阅读和使用,最好对查询的结果进行一次排序。 SQL 语言中,用于排序的是 ORDER BY 子句。

语法格式为: ORDER BY 表达式 1 [ ASC | DESC] [, 表达式 2[ ASC | DESC][,…n]]

Page 47: 项目四 公司管理数据库系统的 数据查询

【例 24 】在公司管理数据库( COMPANYINFO )中的订单表 (p_order) 中,查询产品 ID ,数量和订货日期,并按的订货日期降序给产品排序。

USE COMPANYINFO GO SELECT 产品 ID ,数量,订货日期 FROM p_order ORDER BY 订货日期 desc GO

Page 48: 项目四 公司管理数据库系统的 数据查询

【例 25 】查询 pubs 数据库中的表 stores 中商店的名字,并按商店名的降序给商店排序。

use pubs go   select stor_name from stores order by stor_name desc go

Page 49: 项目四 公司管理数据库系统的 数据查询

【例 26 】查询 titles 中各类书的销售利润和书号,并按照各种书的销售利润降序排列。

use pubs go   select title_id,'profit'=price*ytd_sales from titles order by profit desc go

Page 50: 项目四 公司管理数据库系统的 数据查询

查询结果如下: title_id profit -------- --------------------- PC1035 201501.0000 TC4203 180397.2000 PC8888 81900.0000 BU1032 81859.0500 BU7832 81859.0500 PS3333 81399.2800 …… (所影响的行数为 18 行)

Page 51: 项目四 公司管理数据库系统的 数据查询

【例 27 】查询 titles 中各类书的书号、价格、年销售量和销售利润,并用年销售量和书价进行升序排列。

use pubs go   select title_id,price,ytd_sales,'profit'=price*ytd_

sales from titles order by ytd_sales,price go

Page 52: 项目四 公司管理数据库系统的 数据查询
Page 53: 项目四 公司管理数据库系统的 数据查询

七 GROUP BY 子句 在大多数情况下,使用统计函数返回的

是所有行数据的统计结果。如果需要按某一列数据的值进行分类,在分类的基础上再进行查询,就要使用 GROUP BY 子句了。

Page 54: 项目四 公司管理数据库系统的 数据查询

常用统计函数 为了有效的决心数据集分类汇总、求平均等统

计, SQL Server2000提供了一系列统计函数。

Page 55: 项目四 公司管理数据库系统的 数据查询

【例 28 】计算订单表 (p_order) 中所有产品的已订购总额:

USE COMPANYINFO GO SELECT sum( 数量 ) FROM p_order

Page 56: 项目四 公司管理数据库系统的 数据查询

【例 29】 对订单表 (p_order) 中按产品 ID ,查询每件产品的订购总和

USE COMPAMYINFO SELECT 产品 ID , sum( 数量 ) as 总数量 FROM p_order GROUP BY 产品 ID

Page 57: 项目四 公司管理数据库系统的 数据查询

1.简单分组 【例 30】订单表 (p_order) 按产品 ID 的种类

分类,求出各种类型产品的价格总和、平均价格以及各类产品的数量。

USE COMPAMYINFO GO SELECT 产品 ID, sum( 单价 ) ' 价格总和 , avg

( 单价 ) ' 平均单价 ', count(*) FROM p_order GROUP BY 产品 ID GO

Page 58: 项目四 公司管理数据库系统的 数据查询

2 、使用 GROUP BY 分组多行 GROUP BY 子句用来为结果集中的每一行产生

聚合值。如果聚合函数没有使用 GROUP BY 子句,则只为 SELECT 语句报告一个聚合值。

当 SELECT 语句中包含 GROUP BY 关键字时,对可以在选择列表中指定的项有一些限制。在该选择列表中所允许的项目是:

分组列。 为分组列中的每个值只返回一个值的表达式,例如

将列名作为其中一个参数的聚合函数。这些函数称为矢量聚合。

Page 59: 项目四 公司管理数据库系统的 数据查询

八、使用 HAVING筛选结果 指定组或聚合的搜索条件。 HAVING 通常与

GROUP BY 子句一起使用。如果不使用 GROUP BY 子句, HAVING 的行为与 WHERE 子句一样。

语法: [HAVING <search_condition>] 参数 <search_condition> : 指定组或聚合应满足

的搜索条件。当 HAVING 与 GROUP BY ALL 一起使用时, HAVING 子句替代 ALL 。

在 HAVING 子句中不能使用 text 、 image 和 ntext 数据类型。

Page 60: 项目四 公司管理数据库系统的 数据查询

【例 31 】查询所有价格超过 10 元的产品的种类和平均价格。

USE COMPANYINFO GO SELECT 类别 ID , avg( 单价 ) ' 平均价格 ' FROM Product WHERE 单价 >10 GROUP By 类别 ID GO

Page 61: 项目四 公司管理数据库系统的 数据查询

【例 32 】在所有价格超过 10美元的书中,查询所有平均价格超过 18美元的书的种类和平均价格。

use pubs go   select type , avg(price) 'avg_price' from titles where price>10 group by type having avg(price)>$18 go

Page 62: 项目四 公司管理数据库系统的 数据查询

查询的结果是: Type avg_price ------------ --------------------- mod_cook 19.9900 popular_comp 21.4750   (所影响的行数为 2 行) WHERE 子句在求平均值之前从表中选择所需

要的行, HAVING 子句在进行统计计算后产生的结果中选择所需要的行。

Page 63: 项目四 公司管理数据库系统的 数据查询

九、 COMPUTE 子句 COMPUTE 子句可以用于 SELECT 语句既

查看明细行,又查看汇总行。可以计算分组的汇总值,也可以计算整个结果集的汇总值。

语法格式: [COMPUTE {聚合函数名 ( 列名 )} [, …N ]

[BY expression [, … N] ]

Page 64: 项目四 公司管理数据库系统的 数据查询

【例 33 】语句使用简单 COMPUTE 子句生成 titles 表中 price 及 advance 的求和总计:

USE pubs Go SELECT type, price, advance FROM titles ORDER BY type COMPUTE SUM(price), SUM(advance) by type

Page 65: 项目四 公司管理数据库系统的 数据查询

【例 34 】查找雇员表( empoyee)中

各雇员的姓名、出生年月和特长,并产生一个雇员总人数行。

USE COMPANYINFO GO SELECT 姓名,出生年月,特长 FROM employee Order by 特长 COMPUTE count( 雇员 ) by 特长

Page 66: 项目四 公司管理数据库系统的 数据查询

比较 COMPUTE 和 GROUP BY GROUP BY 生成单个结果集。每个组都有一个只

包含分组依据列和显示该组子聚合的聚合函数的行。选择列表只能包含分组依据列和聚合函数。

COMPUTE 生成多个结果集。一类结果集包含每个组的明细行,其中包含选择列表中的表达式。另一类结果集包含组的子聚合,或 SELECT 语句的总聚合。选择列表可包含除分组依据列或聚合函数之外的其它表达式。聚合函数在 COMPUTE 子句中指定,而不是在选择列表中。

Page 67: 项目四 公司管理数据库系统的 数据查询

模块 2 公司管理数据库系统的多表查询

一、教学目标: 终极目标:使用联接查询和嵌套查询的方

法实现公司管理数据库系统的多表查询

Page 68: 项目四 公司管理数据库系统的 数据查询

二、工作任务 公司对于产品订单有关的数据保存在订单表 P-ORDER 和,此

表包含了客户订购产品有关的订单 ID 、产品 ID 、数量、雇员 ID 、客户 ID 和订货日期。在产品表 PRODUCT 中包含了产品 ID 、产品名、类别 ID 、单价、库存量。在顾客表 CUSTOMER 中包含了客户 ID 、公司名称、联系人姓名、联系方式和地址和邮编。现编写查询语句,按下列要求查询得到相应的结果:

1、查询订货公司的名称,联系人姓名、订购产品名称和数量 2、查询订购“苹果汁”的顾客的公司名称和联系方法。 3、查询客户“通恒机械”下的订单订购的产品名和数量。 4、查询产品“苹果汁”所属的类别和说明。

Page 69: 项目四 公司管理数据库系统的 数据查询

一、联接( join) 通过联接,可以根据各个表之间的逻辑关系

从两个或多个表中检索数据。联接表示应如何使用一个表中的数据来选择另一个表中的行。

联接条件通过以下方法定义两个表在查询中的关联方式:

指定每个表中要用于联接的列。典型的联接条件在一个表中指定外键,在另一个表中指定与其关联的键。

指定比较各列的值时要使用的逻辑运算符( = 、<> 等)。

Page 70: 项目四 公司管理数据库系统的 数据查询

联接类型 当联接表时,创建的联接类型影响出现在结果集内

的行。 联接类型: 内联接 外联接 左向外联接 右向外联接 完整外部联接 交叉联接

Page 71: 项目四 公司管理数据库系统的 数据查询

联接语法格式: FROM    < table_source >   < join_type >   JOIN  < table_source > ON   < search_condition >参数: < join_type > ::=

    [ INNER | { { LEFT | RIGHT | FULL } [OUTER] } ]    

Page 72: 项目四 公司管理数据库系统的 数据查询

1 、内连接 内连接也叫自然连接,它是组合两个表的常用方法。自然连接将两个表中的列进行比较,返回每对匹配的行。废弃两个表中不匹配的行。如果未指定联接类型,则这是默认设置。

语法一: SELECT 列 FROM 表 1 [inner] JION 表 2 ON 表 1. 列 = 表 2. 列 语法二: SELECT 列 FROM 表 1, 表 2 WHERE 表 1. 列 = 表 2. 列

Page 73: 项目四 公司管理数据库系统的 数据查询

【例 34 】从 titles 和 titleauthor 表中查询书的书号、书名、作者号和价格。

use  pubs go   select titles.title_id as 书号 , title as 书名 ,

au_id as 作者号 , price as 价格 from titles inner join titleauthor on titles.title_id=titleauthor.title_id

Page 74: 项目四 公司管理数据库系统的 数据查询
Page 75: 项目四 公司管理数据库系统的 数据查询

【例 35 】从 titles 、 authors 和 titleauthor 表中查询书的书号、书名、作者号和作者名。

use  pubs go   select titles.title_id, title, authors.au_id, au_lnam

e from titles join titleauthor on titles.title_id=titleauthor.title_id join authors on authors.au_id=titleauthor.au_id

Page 76: 项目四 公司管理数据库系统的 数据查询
Page 77: 项目四 公司管理数据库系统的 数据查询

任务 1 :查询已订购了产品的公司的公司名称,联系人姓名和所订产品的产品名和数量。 SELECT cu. 公司名称 ,联系人姓名 ,pr.产品名 , pd. 数量 FROM customer as cu INNER JOIN p_order as pd ON cu.客户 ID=pd.客户 ID INNER JOIN product as pr on pr.产品 ID=Pd.产品 ID

Page 78: 项目四 公司管理数据库系统的 数据查询

任务 3 :查询客户名为 ' 通恒机械 ' 的公司所订购产品的产品 ID 和数量。

SELECT 公司名称 , 产品 ID, 数量 FROM customer as A INNER JOIN p_order as B ON A. 客户 ID=B. 客户 ID WHERE A. 公司名称 =' 通恒机械 '

Page 79: 项目四 公司管理数据库系统的 数据查询

• 【例 36 】从 [ 学生信息表 ] 、 [ 教学成绩表 ] 和 [课程信息表 ] 中查询学生的学号、姓名、课程名称和分数

use 教学成绩管理数据库 go select cj. 学号 , 姓名 ,kc. 名称 , 分数 from 教学成绩表 as cj inner join 学生信息表 as xs on cj. 学号 = xs. 学号

inner join 课程信息表 as kc on cj.课程编号 = kc. 编号

Page 80: 项目四 公司管理数据库系统的 数据查询

【例 37 】查询 200301班均分高于 80 分的学生的班级、学号、姓名、均分,结果按均分降序排列 .

use 教学成绩管理数据库 select 班级编号 , a. 学号 , b. 姓名 , avg( 分数 ) 均分 from 教学成绩表 as a join 学生信息表 as b on a. 学号 = b. 学号 join 课程信息表 as c on a.课程编号 = c. 编号 group by 班级编号 , a. 学号 , b. 姓名 having avg( 分数 )>80 and 班级编号 ='200301 ' order by avg( 分数 ) desc

Page 81: 项目四 公司管理数据库系统的 数据查询

2.外连接( Outer join) 在自然连接中,只有在两个表中匹配的行才能在

结果集中出现。而在外连接中可以只限制一个表,而对另外一个表不加限制(即所有的行都出现在结果集中)。

外连接分为左外连接、右外连接和全外连接。左外连接是对连接条件中左边的表不加限制;右外连接是对右边的表不加限制;全外连接对两个表都不加限制,所有两个表中的行都会包括在结果集中。

Page 82: 项目四 公司管理数据库系统的 数据查询

左外连接的语法为: SELECT 列 FROM 表 1 LEFT [OUTER]JOIN 表 2 ON 表 1. 列 1= 表 2. 列 2右外连接的语法为: SELECT select_list FROM 表 1 RIGHT[OUTER]JOIN 表 2 ON 表 1. 列 1= 表 2. 列 2全外连接的语法为: SELECT select_list FROM 表 1 FULL[OUTER] JOIN 表 2 ON 表 1. 列 1= 表 2. 列 2

Page 83: 项目四 公司管理数据库系统的 数据查询

1 )左向外联接 联接两个表,并保留左表中没有匹配项的行。不包括右表中的不匹配行。

【例 38 】 authors 表与 titleauthor 表在各表的 au_id 列上相匹配。无论作品出版或未出版,所有作者均出现在结果集中。

Use pubs go SELECT authors.au_lname AS Last, titleauthor.title_id FROM authors LEFT OUTER JOIN titleauthor ON authors.au_id = titleauthor.au_id

Page 84: 项目四 公司管理数据库系统的 数据查询

2 )右向外联接 包括第二个命名表(“右”表,出现在 JOIN 子句的

最右边)中的所有行。不包括左表中的不匹配行。

【例 39 】在 titles 和 publishers 表之间的右向外联接将包括所有的出版商,甚至包括那些在 titles 表中没有书名的出版商。

SELECT titles.title_id, titles.title, publishers.pub_name FROM titles RIGHT OUTER JOIN publishers ON titles.pub_id = publishers.pub_id

Page 85: 项目四 公司管理数据库系统的 数据查询

3 )完整外部联接 包括所有联接表中的所有行,不论它们是否匹配。【例 40 】查询书的书号、书名 和作者的作者号、

作者名。use  pubs

go

select title_id, title, au_id, au_lname

from titles full join authors

on titles.title_id=authors.au_id

Page 86: 项目四 公司管理数据库系统的 数据查询

【例 41 】返回 titles 表中的书籍标题及对应的出版商。还返回未出版列在 titles 表中的书籍的出版商,以及不是由 publishers 表中所列的出版商出版的所有书籍标题。

SELECT titles.title , publishers.pub_name FROM publishers FULL OUTER JOIN titles ON titles.pub_id = publishers.pub_id ORDER BY publishers.pub_name

Page 87: 项目四 公司管理数据库系统的 数据查询

4 )交叉联接 没有 WHERE 子句的交叉联接将产生联接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。

Page 88: 项目四 公司管理数据库系统的 数据查询

二、用嵌套进行多表查询 在实际应用中,经常要用到多层查询。在 SQ

L 中,将一条 SELECT 语句作为另一条 SELECT 语句的一部分称为嵌套查询。外层的 SELECT 语句被称为外部查询或父查询,内层的 SELECT 语句成为内部查询或子查询。

Page 89: 项目四 公司管理数据库系统的 数据查询

1、 单值嵌套 在该方式下,通过子查询返回一个单一的

数据,该数据可以参加相关表达式的运算。当子查询返回的是单值,可以使用 > , < ,=, <=, >=, !=或 <> 等比较运算符。

Page 90: 项目四 公司管理数据库系统的 数据查询

【例 42 】查询“南天有限公司”的所有订购的订单号和产品ID。第一步:确定“南天有限公司”的客户 IDSELECT 客户 IDFROM COSTOMERWHERE 公司名称 ='南天有限公司 '执行结果:客户 ID3 第二步:查询客户 ID 为“ 3”订购的订单号和产品 idSELECT 订单 ID ,产品 IDFROM P_ORDERWHERE 客户 ID=3

Page 91: 项目四 公司管理数据库系统的 数据查询

SELECT 订单 ID, 产品 ID FROM P_ORDER WHERE 客户 ID= ( SELECT 客户 ID FROM COSTUMER WHERE 公司名称 =‘ 南天有限公司’)

说明:在这种方法下通过子查询取得的数据必须是惟一的,不能返回多值,否则运行将出现错误。

Page 92: 项目四 公司管理数据库系统的 数据查询

多值嵌套查询 子查询的返回结果是一列值的嵌套查询称为多值嵌套查询。使用 [NOT]IN操作符 IN运算符可以测试表达式的值是否与子查询返回集中的某一个相等, NOT IN恰好与其相反。使用 [NOT]EXISTS操作符 EXISTS 表示一个子查询至少返回一行时产生逻辑

真值“ true” ,不返回任何行时产生逻辑假值“ false” 。与 EXISTS 相对应的是 NOT EXISTS 。

Page 93: 项目四 公司管理数据库系统的 数据查询

【例 43 】查询类别 ID 为“ 1” 的所有订购的订单号。

SELECT 订单 IDFROM P_ORDERWHERE 产品 ID IN (SELECT 产品 ID FROM PRODUCT WHERE 类别 ID=1 )

Page 94: 项目四 公司管理数据库系统的 数据查询

任务 2: 查询所有订购了“鼠标”产品的公司的公司名称和联系方式。

SELECT 公司名称 ,联系方式FROM customer

WHERE 客户 ID in (SELECT 客户 ID

FROM p_order

WHERE 产品 ID=(SELECT 产品 ID

FROM product

WHERE 产品名 ='鼠标 '

)

)

Page 95: 项目四 公司管理数据库系统的 数据查询

任务 4 :查询“鼠标”所属的类别名和相应的说明。

SELECT 类别名,说明FROM category

WHERE 类别 ID=(SELECT 类别 ID

FROM product

WHERE 产品名 ='鼠标 ')

Page 96: 项目四 公司管理数据库系统的 数据查询

【例 45 】查询学习杜老师所授课程的学生的学号、姓名、该课程名称及分数。

use 教学成绩管理数据库select 学生信息表 . 学号 , 姓名 , 名称 , 分数from 学生信息表 , 教学成绩表 ,课程信息表where 学生信息表 . 学号 = 教学成绩表 . 学号 and 课程信息表 .课程编号 = 教学成绩表 .课程编号 and 教师编号 = (select 教师编号 from 教师信息表 where 姓名 ='杜老师 ')

Page 97: 项目四 公司管理数据库系统的 数据查询

【例 46】查询 200701班没有学习 900011课程的学生的学号、姓名。

use 教学成绩管理数据库select 学号 , 姓名from 学生信息表where 班级编号 ='200701' and

学号 not in (select 学号 from 教学成绩表 where 课程编号 ='900011')

Page 98: 项目四 公司管理数据库系统的 数据查询

【例 47】查询没有学习任何课程的学生的学号、姓名。

use 教学成绩管理数据库select 学号 , 姓名from 学生信息表Where 学号 not in (select 学号 from 教学成绩表 )