嵌套查询

单值嵌套查询

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

对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

mysql连接与嵌套查询_数据库之嵌套查询与连接查询相关推荐

  1. mysql实验三单表和多表查询_数据库实验三(单表查询)

    实验三: select sno,sname from student;//(1)查询全体学生的学号和姓名 select * from student;//(2)查询全体学生的详细记录 select s ...

  2. mysql数据库cpu使用情况查询_数据库占用cpu较高的查询

    近来看到别人的有关数据库查询cpu占用较高的sql语句(本人sql并不好),所以查询了一下资料,记录一下,便于理解和应用. 首先,将语句贴在这里 SELECT TOP 10 --平均cpu时间 tot ...

  3. mysql select符合查询_数据库select group by 和having语句 多表连接查询 复合查询

    1.SELECT --group by 子句 group by子句按照指定的列column_name对表数据进行分组 group by 后面跟的列也叫分组特性列 使用group by后,能选择的列   ...

  4. MySql实验嵌套查询_数据库实验:SQL嵌套查询

    自测题: 1.查询哪些课程没有人选修列出课程号和课程名: [code]select cno,cname from course where cno not in( select distinct cn ...

  5. mysql 左连接 怎么走索引_数据库索引、左连接、右连接、等值连接

    在MySQL中,主要有四种类型的索引,分别为:B-Tree索引,Hash索引,Fulltext索引(MyISAM 表)和R-Tree索引,本文讲的是B-Tree索引. 一.Mysql索引主要有两种结构 ...

  6. mysql text 查询速度_数据库学习之让索引加快查询速度(四)

    数据库学习之让索引加快查询速度 目录 索引简介 mysql的索引分类 创建索引 添加与删除索引 索引简介 索引在MySQL中也叫做"键",是存储引擎用于快速找到记录的一种数据结构. ...

  7. MYSQL数据库实验三多表查询_数据库之 MySQL --- 数据处理 之多表查询 (三)

    一.多表查询 [1]什么是多表查询? 即,从多个表中获取数据. 注意: 在多表查询是,如果列明在两个表中都有,那么列名前需要加上表名 sql优化:列名前最好加上表名,尤其在多表查询时 SELECT e ...

  8. mysql做十亿条数据查询_数据库优化:mysql数据库单机数十亿数据查询设计

    很久没写文章,是不是想着写点什么东西,分享下我的数据库设计思路,主要是针对单机数十亿及以上数据查询优化技巧. 如果只是简单的查询,没有频繁的写入操作,对查询速度不要求在毫秒级别,就不需要什么大型的数据 ...

  9. MySQL按名字查询所有信息_数据库小记:根据指定名称查询数据库表名及根据指定名称查询数据库所有表中的字段名称(支持mysql/postgre)...

    注意:本篇文章仅适用于mysql和postgre这两种数据库 1.查询数据库中所有表名及对应表的详细信息 select * from INFORMATION_SCHEMA.tables 2.根据指定名 ...

最新文章

  1. 文巾解题 981. 基于时间的键值存储
  2. 约瑟夫环c语言计蒜客链表,约瑟夫环的故事 - osc_3n35hvex的个人空间 - OSCHINA - 中文开源技术交流社区...
  3. IntelliJ IDEA 2020.2.4款 神级超级牛逼插件推荐(自用,真的超级牛逼)
  4. 实验1 词法分析程序设计
  5. Back 键与Home键
  6. (原创)让mongodb的secondary支持读操作
  7. java 查找list中指定字符串出现的次数
  8. JDBC连接数据库:单线程、多线程、批处理插入数据的对比
  9. C# 用委托实现Callback
  10. python oop示例_python 面向对象oop
  11. 智能手机TFT-LCD显示驱动芯片行业现状调研及趋势分析报告
  12. r语言如何计算t分布临界值_R语言使用蒙特卡洛模拟进行正态性检验及可视化
  13. python中关于时间和日期函数的常用计算总结
  14. 算法笔记方法论4 枚举法 详细笔记
  15. 0x000000c5(0X000000C5蓝屏是什么意思)
  16. JavaScript 火焰
  17. js闭包的理解(传递闭包的通俗理解)
  18. 互联网公司刻板印象合集:程序员都秃头,商务个个是人精
  19. python none什么意思_python – 什么是self = None?
  20. 一键连接wifi就靠它,还能查看wifi密码

热门文章

  1. 请问如何查看我的ubuntu是32位的还是64位的
  2. linux 批量更换文件名,Linux下批量修改文件名的方法
  3. js 使用 canvas 绘制地图路线
  4. 描写冬天的唯美诗句,你想知道的都在这里!
  5. Tita OKR 和绩效管理:它们如何协同工作
  6. 2021年科学突破奖:生命科学、基础物理学和数学奖得主揭晓
  7. itu ftp address
  8. 同创伟业王维:行业泡沫期易诞生伟大公司
  9. 1分钟部署单机版kubernetes 1.13.4
  10. An internal error occurred during: compute variable details. java.lang.NullPointerException