一、创建表与插入数据
create  table  PilotSkills
( pilot  char ( 15 )  not  null,
plane  char ( 15 )  not  null,
primary  key  ( pilot ,  plane ))
insert  into  PilotSkills
values  ( 'Celko' ,  'Piper Cub' ),
          ( 'Higgins' ,  'B-52 Bomber' ),
          ( 'Higgins' ,  'F-14 Fighter' ),
          ( 'Higgins' ,  'Piper Cub' ),
          ( 'Jones' ,  'B-52 Bomber' ),
          ( 'Jones' ,  'F-14 Fighter' ),
          ( 'Smith' ,  'B-1 Bomber' ),
          ( 'Smith' ,  'B-52 Bomber' ),
          ( 'Smith' ,  'F-14 Fighter' ),
          ( 'Wilson' ,  'B-1 Bomber' ),
          ( 'Wilson' ,  'B-52 Bomber' ),
          ( 'Wilson' ,  'F-14 Fighter' ),
          ( 'Wilson' ,  'F-17 Fighter' )
        
create  table  Hangar
( plane  char ( 15 )  primary  key )
insert  into  Hangar
values  ( 'B-1 Bomber' ),
          ( 'B-52 Bomber' ),
          ( 'F-14 Fighter' )
二、查询数据
1、解惑一
select  pilot
   from  PilotSkills  as  p1
  where  not  exists  ( select  *
                      from  Hangar
                     where  not  exists  ( select  *
                                         from  PilotSkills  as  p2
                                        where  ( p1 . pilot  =  p2 . pilot )
                                          and  ( p2 . plane  =  Hangar . plane )))
(1)from PilotSkills as p1语句
选择表PilotSkills的数据,语句中主要选择匹配的是pilot
(2)from Hangar语句
选择表Hangar的数据,语句中主要起作用的是plane
(3)from PilotSkills as p2语句
选择表PilotSkills的数据,语句主要是选择数据与前面的p1和hangar的飞行员和飞机进行匹配
(4)where (p1.pilot = p2.pilot) and (p2.plane = Hangar.plane)语句
将表PilotSkills的数据与前面的p1和hangar的飞行员和飞机进行匹配,按飞行员+现有Hangar表中的飞机进行分配,匹配PilotSkills表中是否存在这样的数据,如果有则select *
(5)select * from Hangar where not exists (... )语句
按飞行员+现有Hangar表中的飞机进行分配,并与PilotSkills表中匹配。如果存在任一数据esists中则返回True,同时又由于not关键字则转换为False,即代表在Hangar表中不选择该飞行员不会驾驶的飞机。如果不存在符合的数据esists中则返回False,同时又由于not关键字则转换为True,即代表在Hangar表中选择到了该飞行员不会驾驶的飞机。
(6)select * from PilotSkills where not exists (... )语句 
如果前面该飞行员在Hangar表中所有飞机都会驾驶,那么exists中则会返回False,又由于关键字not,则变成了True,则代表会选中表PilotSkills中的该名飞行员的这行记录。
如果前面该飞行员在Hangar表中存在某架飞机不会驾驶,那么exists中则会返回True,又由于关键字not,则变成了False,则查询语句的时候,该名飞行员在表PilotSkills中会由于这架不会驾驶的飞机全部都返回False,导致在表PilotSkills中的该名飞行员的所有记录都不会被选到。、
以下是过程:
(1)Higgins与Plane表匹配,然后其中的B-1 Bomber在PilotSkills表中没有找到数据,对于所有的PilotSkills表中的Higgins返回的结果都是一样的。
(2)Wilson与Plane表匹配后,所有的都能找到数据,因此在exists中则不会返回True。
2、解惑二
(1)将PilotSkills表与hangar表的飞机进行匹配,再按pilot飞行员字段分组,只有满足分组内的数量等于hangar表的飞机数则代表该飞行员能否驾驶该飞机表中的所有飞机。
select  pilot
   from  Pilotskills  as  p1 , hangar  as  h1
  where  p1 . plane  =  h1 . plane
  group  by  p1 . pilot
having  COUNT ( p1 . plane )  =  ( select  COUNT (*)  from  Hangar )
3、解惑三
(1)精确匹配
书中的这个语句将leftjoin前的数据与leftjoin后的数据统计的数量来跟Hangar表进行匹配。
select  p1 . pilot
   from  PilotSkills  as  p1
   left  outer  join  Hangar  as  h1
     on  p1 . plane  =  h1 . plane
  group  by  p1 . pilot
having  COUNT ( p1 . plane )  =  ( select  COUNT ( plane )  from  Hangar )
    and  COUNT ( h1 . plane )  =  ( select  COUNT ( plane )  from  Hangar )
(2)模糊匹配
只要飞行员能够驾驶的飞机满足飞机表的飞机即可筛选到。
select  p1 . pilot
   from  PilotSkills  as  p1
   left  outer  join  Hangar  as  h1
     on  p1 . plane  =  h1 . plane
  group  by  p1 . pilot
having  COUNT ( h1 . plane )  =  ( select  COUNT ( plane )  from  Hangar )

【SQL解惑】谜题21:飞机与飞行员相关推荐

  1. oracle延时盲注如何防止,【原创】WEB安全第四章SQL注入篇21 oracle 延时注入

    WEB安全第四章SQL注入篇21 oracle 延时注入 1.简介 DBMS_LOCK.SLEEP()函数可以让一个过程休眠很多秒,但使用该函数存在许多限制.首先,不能直接将该函数注入子查询中,因为O ...

  2. 最新版 SQL 8.0.21 安装与初次运行全攻略

    最新版 SQL 8.0.21 安装与初次运行全攻略 SQL 8.0.21 从官网下载SQL dmg 文件 电脑端安装 SQL的密码设置问题 SQL 8.0.21 SQL软件两年前曾在旧电脑上安装过一次 ...

  3. 谜题21:我的类是什么?

    下面的程序所要做的事情正是前一个谜题所做的事情,但是它没有假设斜杠符号就是分隔文件名组成部分的符号.相反,该程序使用的是java.io.File.separator,它被指定为一个公共的String域 ...

  4. SQL解惑-有趣的数值累加游戏-orastar

    1.问题描述 Target列的计算方法:以id为顺序累计value,但是只累计相同符号(+ -,0作为负数处理)的,且碰到不同的符号后从0开始累计.请问这个用sql怎么计算? 2.方法一, from ...

  5. 数据分析初学入门——22本SQL学习书籍推荐

    很多数据分析初学者都被推荐学SQL,SQL是最基础且是必备的技能之一,但是不知道该从何学起,很多课程讲了很多知识点,但是初学的朋友没有对这一领域整体框架的认识,不知道该学哪些知识.有哪些知识.实际工作 ...

  6. Java解惑 电子书

    --表达式谜题 Java 谜题 1--表达式谜题 谜题 1:奇数性 下面的方法意图确定它那唯一的参数是否是一个奇数.这个方法能够正确运转 吗? public static boolean isOdd( ...

  7. JAVA解惑你的不可能

    谜题1:奇数性 下面的方法意图确定它那唯一的参数是否是一个奇数.这个方法能够正确运转吗? public static boolean isOdd(int i){ return i % 2 == 1; ...

  8. SQL Server之路必读的N本书(不定期持续更新)(ZZ)

    ID Name ISBN 1 SQL应用重构 9787111263586 2 SQL 必知必会(第3版) 9787115162601 3 SQL Server 2005高级程序设计 978711517 ...

  9. SQL Server之路必读的N本书(不定期持续更新)

    ID Name ISBN 1 SQL应用重构 9787111263586 2 SQL 必知必会(第3版) 9787115162601 3 SQL Server 2005高级程序设计 978711517 ...

  10. 像优秀的SQL程序员一样思考

    像优秀的SQL程序员一样思考 --<SQL编程风格> 本书详细信息请点击:http://www.china-pub.com/209168 数据库作为现代软件应用的核心之一,正在发挥越来越重 ...

最新文章

  1. Linux初学(Linux命令行的使用)
  2. 纯CSS实现下拉菜单及下拉容器等(纯CSS实现导航条及导航下拉容器)
  3. Linux入门——文件管理
  4. 【学术相关】西湖大学教授:都说不唯论文,那我们发表论文是为了什么?
  5. CF666E-Forensic Examination【广义SAM,线段树合并】
  6. JQuery Mobile中特有事件和方法
  7. 图像处理与计算机视觉经典文章
  8. 细说php完美分页类
  9. rrt matlab算法,rrt算法matlab代码
  10. C语言网络编程——基础
  11. stm32开发环境:vs201x+visualGDB+cubemx开发stm32程序
  12. Python requests常用的浏览器头部
  13. php百度蜘蛛劫持,技术教程:php伪造ip访问一个网站,可以伪造百度蜘蛛ip
  14. 解决error while accessing a target resource. resource is perhaps not available or a wrong access was
  15. vim 从嫌弃到依赖(20)——global 命令
  16. autocad.net 设置指定图层为当前图层
  17. 中关村翠湖科技园:高端产业聚集区 (zz.IS2120@BG57IV3.T752270541 .K)
  18. Cocos2D开发的iPhone游戏的教程
  19. Zotero——实现多台电脑上云端同步
  20. java计算机毕业设计学籍管理系统源码+mysql数据库+lw文档+系统+调试部署

热门文章

  1. canvas微信图片生成海报
  2. 顶尖人才!小红书2024届REDstar技术提前批招聘正式启动!
  3. css3 rotate360度自转
  4. open esb 开源_加入Open Jam 2019打造开源独立游戏
  5. ctfshow 网络迷踪-窗外风景
  6. 诚诚富众在校学生投资理财的技巧
  7. matlab 画图 分数线,2010大连中考录取分数线
  8. 一小只支付接口的自动化
  9. jzoj 模拟赛总结(2017.07.15)
  10. 《算法概论》8.3题