使用格式如下:
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;