sql嵌套查询和连接查询_sql子查询嵌套规则
嵌套查询
单值嵌套查询
值返回结果是一个值的嵌套查询称为单值嵌套查询
对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
相关文章
- 22年9月推广大使额外奖励规则
- 数据分析sql面试必会6题经典_数据分析师SQL面试必备50题[通俗易懂]
- jsx语法规则
- UI设计师必须知道!移动用户体验设计的准则:20 条主要规则
- R语言Apriori关联规则、kmeans聚类、决策树挖掘研究京东商城网络购物用户行为数据可视化|附代码数据
- FPGA/HDL 开发的 10 条规则
- 【Sentinel】授权规则与规则持久化
- ChatGPT封杀潮,禁入学校,AI顶会特意改规则,LeCun:要不咱把小模型也禁了?
- 【Groovy】集合遍历 ( 调用集合的 any 函数判定集合中是否有指定匹配规则的元素 | 代码示例 )
- Spring Cloud Gateway配置路由规则(二)
- SQL开发知识:Oracle中sql语句(+)符号代表连接的使用介绍
- mysql的SQL_NO_CACHE(在查询时不使用缓存)和sql_cache用法详解数据库
- 360度立体抽奖盒,定制属于你的规则!详解编程语言
- 快速精准掌控MySQL数据库排序规则(mysql数据库排序规则)
- MySQL创建表:SQL语句实现(mysql创建表的sql语句)
- 解决Oracle死锁:SQL来帮忙(oracle死锁sql)
- sql通过Oracle实现批量执行SQL语句(oracle批量执行)
- MySQL查看和打印SQL语句(mysql打印sql语句)
- Linux运行 SQL: 获取自动化数据操作能力(linux执行sql)
- 使用MSSQL导入.SQL文件(mssql.sql文件)
- 连接Oracle数据库,使用SQL进行查询(sql连oracle)
- 优化Oracle耗时SQL,提升数据库性能(oracle耗时sql)
- 如何使用MySQL导出SQL语句?(mysql导出sql语句)
- Oracle表空间管理:精通SQL(oracle表空间sql)
- 和 sql server支持两者:Oracle 和 SQL Server的兼容性(兼容oracle)
- MySQL数据库的SQL语句执行过程(mysql执行sql)
- 简单易懂,直击主题:MySQL回滚SQL(mysql回滚sql)
- MySQL数据库导入SQL文件实现快速搭建(sql文件导入mysql数据库)
- 构建高性能数据库用 SQL 还是 Redis(用sql还是redis)
- 实战Oracle SQL实战之旅学以致用(oracle中sql案例)
- Redis键值命名的规范性解析(redis键值的规则)
- 解决Oracle SQL遭遇锁死的思路(oracle sql锁死)
- 揭秘ORACLE9I 密码规则你需要知道的一切(ORACLE9I密码规则)
- ISAPI-REWRITE伪静态规则写法以及说明