mysql的EXISTS使用

使用格式如下:

select * from a where exists ( 任何子查詢 )

代碼根據顏色分成兩段,前面的是主查詢,後面紅色的是子查詢,先主後子,主查詢裏面的屬性可以放到子查詢使用。

使用含義:

該子查詢如果“有數據結果”, 查詢只要返回了結果行數,則該exists()的結果爲“true”

該子查詢如果“沒有數據結果”,查詢沒有返回結果行數,則該exists()的結果爲“false”

這裏說一下什麼叫有數據結果

1.有數據結果

(1)查詢全部的數據:SELECT * FROM student

(2)查詢全部的數據條數:SELECT COUNT(1) FROM student

(3)查詢一個不存在的數據,顯示數量:SELECT COUNT(1) FROM student WHERE id=888;

2.沒有數據結果

查詢不存在的數據記錄:SELECT * FROM student WHERE id=888;

如上,只要返回的有數據結果,exists()的結果爲“true”,否則就是false。

使用demo演示一下where exists的用法

(1)建表語句如下

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL COMMENT '名字',
  `age` int(11) DEFAULT NULL COMMENT '年齡',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;

-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES ('1', 'zhangsan', '18');
INSERT INTO `student` VALUES ('2', 'lisi', '19');
INSERT INTO `student` VALUES ('3', 'wangwu', '20');

(2) 建表結果如下

student表

前提:id=1存在記錄,id=111不存在記錄。

(3)這三種都是返回全部記錄,因爲where exists子查詢存在數據結果,所以返回true

SELECT * FROM student st WHERE EXISTS (SELECT * FROM student);
SELECT * FROM student st WHERE EXISTS (SELECT 1 FROM student);
SELECT * FROM student st WHERE EXISTS (SELECT COUNT(1) FROM student);

結果一二三:

(4)這兩種,上面的那個不返回數據,下面的這個返回全部數據

SELECT * FROM student st WHERE EXISTS (SELECT 1 FROM student dd where dd.id=111);
SELECT * FROM student st WHERE EXISTS (SELECT COUNT(1) FROM student dd where dd.id=111);

結果一不返回數據:

結果二返回數據:

(5)以下四種

SELECT * FROM student st WHERE EXISTS (SELECT 1 FROM student dd where dd.id=1);
SELECT * FROM student st WHERE EXISTS (SELECT 1 FROM student dd where dd.id=111);
SELECT * FROM student st WHERE EXISTS (SELECT 1 FROM student dd where st.id=1);
SELECT * FROM student st WHERE EXISTS (SELECT 1 FROM student dd where st.id=111);

結果一:

結果二:

結果三:

結果四:

總結:(1)整體查詢分爲主子,前面是主查詢,where exists後面是子查詢,先主後子。

EXPLAIN SELECT * FROM student st WHERE EXISTS (SELECT 1 FROM student dd where dd.id=1);

           (2)子查詢,有結果exists返回爲true,無結果exists返回false。exists子查詢返回true,主查詢就正常返回全部內容,exists子查詢返回false,主查詢的內容就全部不返回。

           (3)子查詢count(1)一直有結果。即使count(1)返回0,也是有結果返回,所以where exists使用count(1)一直返回true.

           (4)exists子查詢使用select 1,有返回結果,子查詢就返回true,沒有返回結果,子查詢就返回false。

           (5)針對子查詢使用select *,select 1,select count(1)都行,子查詢返回的結果內容不重要,只要有結果就返回true,無結果返回false。

           (6)子查詢可以使用主查詢的字段。如下:

第一個語句沒有使用主查詢的字段,只需要正常判斷WHERE EXISTS是否有結果返回就好了。

SELECT * FROM student st WHERE EXISTS (SELECT 1 FROM student dd where dd.id=1);

第二個語句st.id=1使用的是主查詢的st表字段,將會限制主查詢的內容。

SELECT * FROM student st WHERE EXISTS (SELECT 1 FROM student dd where st.id=1);

這個語句等同於

SELECT * FROM student st where st.id=1;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章