哪个司机会开所有类型的车?这便是一个关系除法问题。

##创建表 表drivers有两个字段,司机的名字和司机会开的车的id:

CREATE TABLE `drivers` (

`driver_name` char(10) DEFAULT NULL,

`vehicle_id` int(11) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

注意,实际情况下会有更多的列,且driver_name和vehicle_id应该共同作为主键。

在表drivers中插入以下数据:

+-------------+------------+

| driver_name | vehicle_id |

+-------------+------------+

| yan | 1 |

| wei | 1 |

| li | 1 |

| wei | 2 |

| wei | 3 |

| li | 2 |

+-------------+------------+

表vehicles只有一个字段,即车的id:

CREATE TABLE `vehicles` (

`id` int(11) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

注意,实际情况下会有更多的列,且id应该作为主键。

在表vehicles中插入以下数据:

+----+

| id |

+----+

| 1 |

| 2 |

| 3 |

+----+

##方法1

SELECT DISTINCT D1.driver_name

FROM drivers AS D1

WHERE NOT EXISTS

(SELECT * FROM vehicles AS V1

WHERE NOT EXISTS

(

SELECT * FROM drivers AS D2

WHERE D1.driver_name = D2.driver_name

AND D2.vehicle_id = V1.id

)

);

运行结果是:

+-------------+

| driver_name |

+-------------+

| wei |

+-------------+

**解释:**个人觉得这个很拗口,自己也云里雾里的。我们要找的是哪个司机会开所有的车,这也意味着,如果某个司机不会开某辆车,则这个司机不会出现在结果中。

SELECT * FROM vehicles AS V1

WHERE EXISTS

(

SELECT * FROM drivers AS D2

WHERE D1.driver_name = D2.driver_name

AND D2.vehicle_id = V1.id

)

上面的代码,认为是D1中的某个司机会开V1中的某辆车。而

SELECT * FROM vehicles AS V1

WHERE NOT EXISTS

(

SELECT * FROM drivers AS D2

WHERE D1.driver_name = D2.driver_name

AND D2.vehicle_id = V1.id

)

就可以看成是D1中的某个司机不会开V1中的某辆车。

既然这个司机不会开某辆车,那么这个司机也就不应该出现在结果中,所以使用:

SELECT DISTINCT D1.driver_name

FROM drivers AS D1

WHERE NOT EXISTS

注意,若没有DISTINCT,运行结果将是:

+-------------+

| driver_name |

+-------------+

| wei |

| wei |

| wei |

+-------------+

##方法2 这个方法比较容易理解,由于共有3辆车,所以看哪些司机会开3辆车即可:

SELECT D1.driver_name

FROM drivers AS D1, vehicles AS V1

WHERE D1.vehicle_id = V1.id

GROUP BY D1.driver_name

HAVING COUNT(D1.vehicle_id) = (SELECT COUNT(*) FROM vehicles);

运行结果是:

+-------------+

| driver_name |

+-------------+

| wei |

+-------------+

下面一步步分解:

mysql> SELECT D1.driver_name

FROM drivers AS D1, vehicles AS V1

WHERE D1.vehicle_id = V1.id;

+-------------+

| driver_name |

+-------------+

| yan |

| wei |

| li |

| wei |

| wei |

| li |

+-------------+

6 rows in set

加上GROUP后:

mysql> SELECT D1.driver_name, COUNT(*)

FROM drivers AS D1, vehicles AS V1

WHERE D1.vehicle_id = V1.id

GROUP BY D1.driver_name;

+-------------+----------+

| driver_name | COUNT(*) |

+-------------+----------+

| li | 2 |

| wei | 3 |

| yan | 1 |

+-------------+----------+

3 rows in set

使用HAVING,过滤GROUP后的结果:

mysql> SELECT D1.driver_name, COUNT(*)

FROM drivers AS D1, vehicles AS V1

WHERE D1.vehicle_id = V1.id

GROUP BY D1.driver_name

HAVING COUNT(D1.vehicle_id) = (SELECT COUNT(*) FROM vehicles);

+-------------+----------+

| driver_name | COUNT(*) |

+-------------+----------+

| wei | 3 |

+-------------+----------+

1 row in set

Joe Celko 《SQL编程风格》

mysql被除数为0不报错_MySQL:关系除法相关推荐

  1. mysql被除数为0不报错_SQLServer中进行sql除法运算结果为小数时显示0的解决方案...

    SELECT field1/field2 FROM TB; 当 field1的数值 > field2的数值时,除法得出的结果是<1的,即0.xxxxxx 这个时候在DB2的环境下SELEC ...

  2. mysql主从不同步不报错_MySQL主从不同步解决

    1.由于binlog日志带多删除了几个后发现MySQL主从不同步 mysql> show slave status\G; Slave_IO_Running: No Slave_SQL_Runni ...

  3. mysql建库语句on报错_mysql运维必备知识点(转载至其他作者)

    (1)基础笔试命令考察 1.开启MySQL服务 /etc/init.d/mysqld start service mysqld start systemctl start mysqld 2.检测端口是 ...

  4. mysql重装第四步报错_Mysql 8.x 安装

    第一步:百度Mysql 第二步:点击DOWNLOADS 第三步:进入DOWNLOADS页面之后,将页面往下拉并找到以下图示,点击进入. 第四步:点击MySQL Community Server 第五步 ...

  5. mysql load报错_mysql:执行LOAD DATA LOCAL 报错

    mysql:执行LOAD DATA LOCAL 报错. 我使用navicat for mysql 连接 mysql服务器执行local 可以正常执行 . show VARIABLES like  '% ...

  6. mysql的count报错_Mysql报错注入原理分析count、rand、groupby

    0x00 疑问 一直在用mysql数据库报错注入方法,但为何会报错? 百度谷歌知乎了一番,发现大家都是把官网的结论发一下截图,然后执行sql语句证明一下结论,但是没有人去深入研究为什么rand不能和o ...

  7. mysql的count报错_Mysql报错注入原理分析(count()、rand()、group by)

    报错需要count(*),rand().group by,三者缺一不可 前提:当行数大于等于3行时才会报错. 原链接:https://www.cnblogs.com/xdans/p/5412468.h ...

  8. mysql源码安装报错_mysql 的二进制和源码包 安装的报错总结

    MySQL报错总结 报错原因:/application/mysql-5.6.44/tmp不存在 解决方法:mkdir /application/mysql-5.6.44/tmp 报错原因: /appl ...

  9. mysql查找语句报错_MYSQL报错注入-WEB资讯专栏-DMOZ中文网站分类目录-免费收录各类优秀网站的中文网站目录....

    目录 审计思路报错语句报错函数查询表floor报错函数讲解报错原理语句xpath语法报错函数讲解语句整数溢出报错exppowcot列名重复报错name_constjoin using几何函数报错不存在 ...

最新文章

  1. java对象交互_Java 2 对象交互
  2. python字符类型的一些方法
  3. webpack+react多页面开发架构
  4. mysql存储引擎中INNODB和MyISAM的区别
  5. 警惕开源代码库中的安全隐患
  6. 不同管理岗层级的团队影响力_高影响力团队的最高要求
  7. AcWing 888. 求组合数 IV(高精度求组合数问题)
  8. vc2005 seh新认识
  9. 树莓派python蓝牙_怎样通过蓝牙仅使用Android手机为树莓派配置Wi-Fi网络
  10. PAIP.利用SyncML协议来同步备份手机短信联系人.txt
  11. 以分布式融合技术为突破口,易鲸捷奏响国产数据库“冲锋号”
  12. substance Pt 工业基础配色及金属配色ID材质
  13. 洛谷P1179 [NOIP2010 普及组] 数字统计题解
  14. 微信小程序云存储(文件上传到云端)
  15. php用do while实现斐波那契数列,php实现斐波那契数列
  16. scroller基础知识点
  17. windows无法自动修复此计算机 鼠标,win10出现你的账户已被停用。开机按F8进不去。自动修复鼠标和键盘都用...
  18. shell脚本——学习笔记(包含应用案例)
  19. 大恒相机开发实践(1)——实时采图
  20. 限制网页只能在微信浏览器打开

热门文章

  1. PostgreSQL数据库安装Version10.5
  2. Windows下安装配置ant
  3. SpringCloud微服务注册调用入门-路由网关
  4. frame跨页传值/AJAX出错解决方案 + 知识补充:浏览器同源政策
  5. 哈希表(HashTable),哈希冲突的避免、解决
  6. 主板定制 如何定制主板这些流程要知道
  7. 《OpenStack云计算实战手册(第2版)》——1.4 安装OpenStack身份认证服务
  8. 齐博cms任意登陆漏洞
  9. AAA验证和ciscorescue v4.2 验证服务器的搭建(telnet方式和级别的设置)
  10. 在ASP.NET中使用Session常见问题集锦