数据库之嵌套查询与连接查询 数据库嵌套查询

嵌套查询与连接查询

嵌套查询

单值嵌套查询

值返回结果是一个值的嵌套查询称为单值嵌套查询

对Sales数据库,列出市场部的所有员工的编号

USE Sale
GO
SELECT employee_id FROM employee
WHERE department_id=(
SELECT department_id
FROM department
WHEREdepartment_name='市场部'
)

语句的执行过程分两个过程,首先在部门表(department)中找出“市场部”的编号(例如为D002)然后再在员工表中找出部门号等于D002的记录,列出这些记录的员工编号。

多值嵌套查询

子查询的返回结果是一列值的嵌套查询称为多值嵌套查询。若某个查询的返回值不止一个,则必须指明在WHERE子句中应怎样使用这些返回值。通常使用条件运算ANY(或SOME),ALL和IN

1,ANY运算符的用法

对Sales数据库,列出D001号部门中工资比D002号部门的员工最低工资高的员工编号和工资。

ANY 用法: <字段><比较符>ANY(<子查询>)

用法说明:满足子查询中任意一个值的记录

SELECT employee_id,wages FROM employee
WHERE department_id='D001' AND wages>ANY
(
SELECT wages
FROM employee
WHERE department_id='D002'
)

2,ALL运算符的用法

ALL用法: <字段><比较符>ALL(<子查询>)

用法说明:满足子查询中所有值的记录

对Sales数据库,列出部门编号为D001的员工,这些员工的工资比部门为D002的员工的最高工资还要高的员工的编号和工资

SELECT employee_id,wages FROM employee
WHERE department_id='D001' AND wages>ALL
(
SELECT wages
FROM employee
WHERE department_id='D002'
)

3,IN运算符的用法

IN用法:<字段>IN< 结果集合>或者<字段>IN(<子查询>)

用法说明:字段内容是结果集合或者子查询中的内容

对Sales数据库,列出部门为市场部或销售部的所有员工的编号

SELECT employee_id FROM employee
WHERE department_id IN
(
SELECT department_id FROM department
WHERE department_name='市场部' ORdepartment_name='销售部'
)

IN是属于的意思等价于“=ANY”,即等于子查询中任何一个值。

连接查询

通过连接运算符可以实现多个表查询,连接可以在SELECT语句的WHERE子句中建立

对Sales数据库输出所有员工的销售单,要求给出员工编号,姓名,商品编号,商品名和销售数量。

SELECTemployee.employee_id,employee.employee_name,goods.goods_id,goods.goods_name,sell_order.order_num
FROM employee,sell_order,goods
WHERE employee.employee_id=sell_order.employee_id and
sell_order.goods_id=goods.goods_id

以上语句中,由于员工编号,商品编号等字段名在两个表出现,为防止二义性,在使用时在其字段前加上表明以示区别(如果字段名唯一,可以不加表名),但表明一般输入时比较麻烦,所以在语句中,可在FROM子句中给相关表定义别名,以利于在查询其他部分中是使用。

连接也可以在FROM子句中建立,而且在FROM子句中指出连接时有助于将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。FROM子句建立连接的语法格式如下:

FROM join_table [join_type] JOIN join_table ON join_condition

各选项含义如下:

join_table:指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一个表的链接又称为自连接。

join_type:指出连接类型,可分为3类:内连接,外连接和交叉连接

内连接:使用比较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行,根据所使用的比较方式不同,内连接又可以分为等值连接,不等值连接,自然连接3种

外连接:分为左外连接,右外连接和全外连接3种,与内连接不同的是,外连接不只列出与连接条件相匹配的行,而是列出左表(左外连接时),右表(右外连接时)或两个表(全外连接时)中所有符合搜索的数据行。

交叉连接没有WHERE子句,他返回外连接表中所有数据行的笛卡尔积,其结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。

ON join_condition:指出连接条件,它由被连接表中的列和比较运算符,逻辑运算符等构成

上例用FROM子句建立如下:

SELECTa.employee_id,a.employee_name,c.goods_id,c.goods_name,b.order_num
FROM employee a INNER JOIN
sell_order b ON a.employee_id=b.employee_id INNER JOIN
goods c ON b.goods_id=c.goods_id

内连接

1,等值连接

在连接条件中使用等号运算符比较被连接列的值,按对应列的共同值讲一个表中的记录与另一个表中记录相连接,包括其中的重复列。

Sales数据库中部门表department和员工表employee的等值连接

SELECT *
FROM department INNER JOIN
employee ON employee.department_id=department.department_id

2,不等值连接

在连接条件中使用除等于运算符以外的其他比较运算符比较背连接的列的列值。这些运算符包括>,>=,<=,<,!>,!<和<>

对Sales数据库,列出销售G00001产品的员工中,销售数量大于编号为E001的员工销售该类产品销售数量的那些员工的编号和销售数量。

SELECT a.employee_id,a.order_num
FROM sell_order a INNER JOIN
sell_order b ON a.order_num>b.order_num ANDa.goods_id=b.goods_id
WHERE (b.goods_id='G00001') AND (b.employee_id='E001')

在语句中,将sell_order看作a和b两个独立的表,b表中选出的编号为E001员工销售G00001产品的记录,a.order_num>b.order_num反映的是不等值联接。

3,自然连接

在连接条件中使用等于(=)运算符比较被连接列的列值,它使用选择列表方式来指出查询结果集合中所包括的列,并删除连接表中的重复列。

Sales数据库中部门表department和员工表employee的自然连接

SELECT a.department_name,b.*
FROM department a INNER JOIN
employee b ON b.department_id=a.department_id

外连接

1,使用左外连接

左外连接通过左向外连接引用左表的所用行

员工表左外连接销售表sell_order

SELECTa.employee_id,a.employee_name,b.goods_id,b.order_num,b.send_date
FROM employee a LEFT OUTER JOIN
sell_order b ON a.employee_id=b.employee_id

左外连接用于两个表中,它限制表sell_order中的行,而不限制表employee中的行,也就是说,在左外连接中,表employee中不满足条件的行也显示出来。在返回结果中,所有不符合连接条件的数据行中的列值均为NULL。

2,使用右外连接

右外连接通过右向外连接引用右表的所有行

员工表employee右外连接销售表sell_order

为了说明方便,现在sell_order表中插入一条销售信息。

INSERT INTOsell_order(order_id,goods_id,employee_id,customer_id,transporter_id,order_num,discount,order_date,send_date,arrival_date,cost)
VALUES('S00006','G00005','','C0006','T002',21,0.5,GETDATE(),GETDATE(),GETDATE(),100)
SELECTa.employee_id,a.employee_name,b.goods_id,b.order_num,b.send_date,b.order_id
数据库之嵌套查询与连接查询 数据库嵌套查询
FROM employee a RIGHT OUTERJOIN
sell_order b ON a.employee_id=b.employee_id

右外连接用于两个表中,它不限制表sell_order中的行,而限制表employee中的行,也就是说,在右外连接中,表sell_order中不满足条件的行也显示出来。运行语句的输出结果是销售表sell_order中的所有记录,员工表employee中符合和不符合连接条件的记录以NULL替代。

3,使用全外连接

全外连接返回两个表的所有行。不管两个表的行是否满足连接条件,均返回查询结果集,对不满足连接条件的记录,另一个变胖相对应字段用NULL代替。

员工表employee全外连接销售表sell_order

SELECTa.employee_id,a.employee_name,b.goods_id,b.order_num,b.send_date,b.order_id
FROM employee a FULL OUTER JOIN
sell_order b ON a.employee_id=b.employee_id

交叉连接

交叉连接不带WHERE子句,他返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。例如部门表department中有4个部门,而员工表employee中有7名员工,则下列交叉连接检索到的记录数将等于4*7=28行

SELECTa.department_id,a.department_name,b.employee_id,b.employee_name
FROM department a CROSS JOIN
employee b

  

爱华网本文地址 » http://www.413yy.cn/a/25101017/338155.html

更多阅读

宋朝“妇人之见”成就了包拯之“状元”:作文与治国之

优秀作文观与优秀人才观陈继英在我国,人们对包拯的大名妇孺皆知,然而,包拯如何得中状元,却少有人知,“妇人”如何论作文与治国之才更少有人知,关于优秀作文与优秀人才观的“妇人之见”更无人提过。最近中央电视台四套每晚播出的《大宋

家中供佛之佛像的摆放与禁忌 武士刀家中摆放的禁忌

guolongqun 家中供佛之佛像的摆放与禁忌一般住居皆设有神案组,当然世俗的供佛行为用于保障生命财产安全,佛祖的圣像请回家供奉早晚拜拜,可以保平安,但是,各位应该知道佛像请回家以后的后遗症有多少,又应该如何安放才可保平安呢?1.佛像请回

置顶 巫妖王之怒:剥皮与制皮赚钱心得

巫妖王之怒:剥皮与制皮挣钱心得2010-08-1101:28背景:我是去年11月初入住台服的.开wlk的时候我65级.之后大概用了3个星期到了80级。随后开始了漫长的剥皮制皮赚G道路.我在那里是白手起家.从12月初到现在.只是哄骗这二个商业技能(首要

声明:《数据库之嵌套查询与连接查询 数据库嵌套查询》为网友叫我发光者分享!如侵犯到您的合法权益请联系我们删除