国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

MySQL關于exists的一個bug

2024-07-24 12:53:48
字體:
來源:轉載
供稿:網友

今天碰到一個關于exists很奇怪的問題

第一個語句如下:

SELECTcount(1)FROMAPPLY tWHEREEXISTS (SELECTr.APPLY_IDFROMRECORD rWHEREt.APPLY_ID = r.APPLY_ID);

產生的結果是:89584

第二個語句如下:

SELECTcount(1)FROMAPPLY tWHEREEXISTS (SELECTmax(r.FINISH_TIME)FROMRECORD rWHEREt.APPLY_ID = r.APPLY_ID);

產生的結果是:432382

確實相當奇怪,對于exist子句來說,其判斷的是子查詢的值是否存在,也就是說,列名,和對列名求最大值沒什么區別啊。

包括MySQL官方文檔中也提到

Traditionally, an EXISTS subquery starts with SELECT *, but it could begin with SELECT 5 or SELECT column1 or anything at all. MySQL ignores the SELECT list in such a subquery, so it makes no difference.

大意就是MySQL會自動忽略到SELECT的列表。

后來在自己的環境測試了一下,確實是MySQL的一個bug

測試環境:MySQL 5.6.31,5.7.14

mysql> create table t3(id int,t datetime);Query OK, 0 rows affected (0.44 sec)mysql> insert into t3 values(1,'20160812');Query OK, 1 row affected (0.16 sec)mysql> select 1 from dual where exists (select id from t3 where id=2);Empty set (0.15 sec)mysql> select 1 from dual where exists (select max(id) from t3 where id=2);+---+| 1 |+---+| 1 |

很明顯,id等于2的列不存在,但是第二條語句還是當做TRUE來處理了。

也確認了下兩條語句的執行計劃和改寫后的SQL

第一個語句

mysql> EXPLAIN EXTENDED select 1 from dual where exists (select id from t3 where id=2);+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+------------------+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+------------------+| 1 | PRIMARY | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | Impossible WHERE || 2 | SUBQUERY | t3 | NULL | ALL | NULL | NULL | NULL | NULL | 1 | 100.00 | Using where |+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+------------------+2 rows in set, 2 warnings (0.00 sec)mysql> show warnings;+---------+------+-------------------------------------------------------------------+| Level | Code | Message |+---------+------+-------------------------------------------------------------------+| Warning | 1681 | 'EXTENDED' is deprecated and will be removed in a future release. || Note | 1003 | /* select#1 */ select 1 AS `1` from DUAL where 0 |+---------+------+-------------------------------------------------------------------+
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 前郭尔| 界首市| 沙湾县| 正镶白旗| 荔波县| 彭州市| 双鸭山市| 皮山县| 无极县| 荣昌县| 巴里| 北碚区| 金寨县| 江孜县| 衡水市| 山东省| 游戏| 塔城市| 五峰| 鸡泽县| 南召县| 手游| 东平县| 青铜峡市| 沁源县| 团风县| 山东省| 将乐县| 陇西县| 甘洛县| 庆城县| 长沙县| 固始县| 石屏县| 农安县| 雷州市| 福海县| 那坡县| 汤原县| 长汀县| 西乌珠穆沁旗|