嵌套查询
单值嵌套查询
值返回结果是一个值的嵌套查询称为单值嵌套查询
对Sales数据库,列出市场部的所有员工的编号
USE Sale
GO
SELECT employee_id FROM employee
WHERE department_id=( SELECT department_id
FROM department
WHERE department_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=’市场部’ OR
department_name=’销售部’
)
IN是属于的意思等价于“=ANY”,即等于子查询中任何一个值。
连接查询
通过连接运算符可以实现多个表查询,连接可以在SELECT语句的WHERE子句中建立
对Sales数据库输出所有员工的销售单,要求给出员工编号,姓名,商品编号,商品名和销售数量。
SELECT
employee.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子句建立如下:
SELECT
a.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 AND
a.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
SELECT
a.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 INTO
sell_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)
SELECT
a.employee_id,a.employee_name,b.goods_id,b.order_num,b.send_date,b.order_id
FROM employee a RIGHT OUTER
JOIN
sell_order b ON a.employee_id=b.employee_id
右外连接用于两个表中,它不限制表sell_order中的行,而限制表employee中的行,也就是说,在右外连接中,表sell_order中不满足条件的行也显示出来。运行语句的输出结果是销售表sell_order中的所有记录,员工表employee中符合和不符合连接条件的记录以NULL替代。
3,使用全外连接
全外连接返回两个表的所有行。不管两个表的行是否满足连接条件,均返回查询结果集,对不满足连接条件的记录,另一个变胖相对应字段用NULL代替。
员工表employee全外连接销售表sell_order
SELECT
a.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行
SELECT
a.department_id,a.department_name,b.employee_id,b.employee_name
FROM department a CROSS JOIN
employee b
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/184215.html原文链接:https://javaforall.cn