mysql被除数为0不报错_MySQL:关系除法
哪个司机会开所有类型的车?这便是一个关系除法问题。
##创建表 表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:关系除法相关推荐
- mysql被除数为0不报错_SQLServer中进行sql除法运算结果为小数时显示0的解决方案...
SELECT field1/field2 FROM TB; 当 field1的数值 > field2的数值时,除法得出的结果是<1的,即0.xxxxxx 这个时候在DB2的环境下SELEC ...
- mysql主从不同步不报错_MySQL主从不同步解决
1.由于binlog日志带多删除了几个后发现MySQL主从不同步 mysql> show slave status\G; Slave_IO_Running: No Slave_SQL_Runni ...
- mysql建库语句on报错_mysql运维必备知识点(转载至其他作者)
(1)基础笔试命令考察 1.开启MySQL服务 /etc/init.d/mysqld start service mysqld start systemctl start mysqld 2.检测端口是 ...
- mysql重装第四步报错_Mysql 8.x 安装
第一步:百度Mysql 第二步:点击DOWNLOADS 第三步:进入DOWNLOADS页面之后,将页面往下拉并找到以下图示,点击进入. 第四步:点击MySQL Community Server 第五步 ...
- mysql load报错_mysql:执行LOAD DATA LOCAL 报错
mysql:执行LOAD DATA LOCAL 报错. 我使用navicat for mysql 连接 mysql服务器执行local 可以正常执行 . show VARIABLES like '% ...
- mysql的count报错_Mysql报错注入原理分析count、rand、groupby
0x00 疑问 一直在用mysql数据库报错注入方法,但为何会报错? 百度谷歌知乎了一番,发现大家都是把官网的结论发一下截图,然后执行sql语句证明一下结论,但是没有人去深入研究为什么rand不能和o ...
- mysql的count报错_Mysql报错注入原理分析(count()、rand()、group by)
报错需要count(*),rand().group by,三者缺一不可 前提:当行数大于等于3行时才会报错. 原链接:https://www.cnblogs.com/xdans/p/5412468.h ...
- mysql源码安装报错_mysql 的二进制和源码包 安装的报错总结
MySQL报错总结 报错原因:/application/mysql-5.6.44/tmp不存在 解决方法:mkdir /application/mysql-5.6.44/tmp 报错原因: /appl ...
- mysql查找语句报错_MYSQL报错注入-WEB资讯专栏-DMOZ中文网站分类目录-免费收录各类优秀网站的中文网站目录....
目录 审计思路报错语句报错函数查询表floor报错函数讲解报错原理语句xpath语法报错函数讲解语句整数溢出报错exppowcot列名重复报错name_constjoin using几何函数报错不存在 ...
最新文章
- java对象交互_Java 2 对象交互
- python字符类型的一些方法
- webpack+react多页面开发架构
- mysql存储引擎中INNODB和MyISAM的区别
- 警惕开源代码库中的安全隐患
- 不同管理岗层级的团队影响力_高影响力团队的最高要求
- AcWing 888. 求组合数 IV(高精度求组合数问题)
- vc2005 seh新认识
- 树莓派python蓝牙_怎样通过蓝牙仅使用Android手机为树莓派配置Wi-Fi网络
- PAIP.利用SyncML协议来同步备份手机短信联系人.txt
- 以分布式融合技术为突破口,易鲸捷奏响国产数据库“冲锋号”
- substance Pt 工业基础配色及金属配色ID材质
- 洛谷P1179 [NOIP2010 普及组] 数字统计题解
- 微信小程序云存储(文件上传到云端)
- php用do while实现斐波那契数列,php实现斐波那契数列
- scroller基础知识点
- windows无法自动修复此计算机 鼠标,win10出现你的账户已被停用。开机按F8进不去。自动修复鼠标和键盘都用...
- shell脚本——学习笔记(包含应用案例)
- 大恒相机开发实践(1)——实时采图
- 限制网页只能在微信浏览器打开
热门文章
- PostgreSQL数据库安装Version10.5
- Windows下安装配置ant
- SpringCloud微服务注册调用入门-路由网关
- frame跨页传值/AJAX出错解决方案 + 知识补充:浏览器同源政策
- 哈希表(HashTable),哈希冲突的避免、解决
- 主板定制 如何定制主板这些流程要知道
- 《OpenStack云计算实战手册(第2版)》——1.4 安装OpenStack身份认证服务
- 齐博cms任意登陆漏洞
- AAA验证和ciscorescue v4.2 验证服务器的搭建(telnet方式和级别的设置)
- 在ASP.NET中使用Session常见问题集锦