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

Post on 03-Jan-2016

130 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

TRANSCRIPT

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

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

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

数据

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

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

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

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

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

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

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

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

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

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

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

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

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

1 、子句的功能

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

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

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

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

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

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

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

语法 : SELECT * FROM 表名

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

USE COMPANYINFO GO SELECT * FROM customer GO

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

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

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

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

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

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

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

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

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

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

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

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

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

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

use northwind go select top 10 * from customers go

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

use northwind go select top 10 percent * from customers go

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

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

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

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

BETWEEN

列表 IN 、 NOT IN

字符串匹配 LIKE 、 NOT LIKE

未知道判断 IS NULL 、 IS NOT NULL

组合条件 AND 、 OR

取反 NOT

1.使用算术表达式

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

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

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

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

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

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

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

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

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

成立就为真。

【例 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

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

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

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

ND 表达式 2

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

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

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

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

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

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

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

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

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

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

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

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

… 表达式 n])

【例 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

【例 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

5 、通配符的使用

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

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

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

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

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

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

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

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

【例 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

查询结果如下: 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 行)

【例 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

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

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

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

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)

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

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

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

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

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

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

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

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

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

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

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

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

sales from titles order by ytd_sales,price go

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

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

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

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

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

USE COMPANYINFO GO SELECT sum( 数量 ) FROM p_order

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

【例 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

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

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

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

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

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

[BY expression [, … N] ]

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

【例 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

【例 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

任务 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

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

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

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

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

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

【例 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

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

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

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

左外连接的语法为: 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

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

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

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

【例 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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

WHERE 客户 ID in (SELECT 客户 ID

FROM p_order

WHERE 产品 ID=(SELECT 产品 ID

FROM product

WHERE 产品名 ='鼠标 '

)

)

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

SELECT 类别名,说明FROM category

WHERE 类别 ID=(SELECT 类别 ID

FROM product

WHERE 产品名 ='鼠标 ')

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

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

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

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

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

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

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

top related