MySQL嵌套查询总结
来源:互联网 发布:linux内核编译 编辑:程序博客网 时间:2024/05/29 12:28
(一).在SQL语言中一个select-from-where语句称为一个查询块,将一个查询块嵌套在另一个查询块的where中或having中,称之为嵌套查询。
(二)创建三张数据表
CREATE TABLE `person` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(25) DEFAULT NULL, `sex` varchar(45) DEFAULT NULL, `address` varchar(45) DEFAULT NULL, `number` varchar(100) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;INSERT INTO `person` VALUES ('1', '凯耐', '男', '长沙', '123');INSERT INTO `person` VALUES ('2', '科比', '男', '北京', '234');INSERT INTO `person` VALUES ('3', '小丽', '女', '武汉', '345');INSERT INTO `person` VALUES ('4', '小五 ', '男', '深圳', '456');INSERT INTO `person` VALUES ('5', '张毅峰', '男', '南京', '567');INSERT INTO `person` VALUES ('6', '贺知章', '男', '上海', '789');INSERT INTO `person` VALUES ('7', '张一山', '男', '北京', '987');INSERT INTO `person` VALUES ('8', '赵丽颖', '女', '上海', '876');INSERT INTO `person` VALUES ('9', '天佑', '男', '', null);CREATE TABLE `phone` ( `id` int(11) NOT NULL AUTO_INCREMENT, `person_id` int(11) DEFAULT NULL, `phone_name` varchar(45) DEFAULT NULL, PRIMARY KEY (`id`), KEY `person_id` (`person_id`), CONSTRAINT `phone_ibfk_1` FOREIGN KEY (`person_id`) REFERENCES `person` (`id`)) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=utf8;INSERT INTO `phone` VALUES ('12', '1', '苹果手机');INSERT INTO `phone` VALUES ('13', '2', '魅族手机');INSERT INTO `phone` VALUES ('14', '3', '华为手机');INSERT INTO `phone` VALUES ('15', '1', '三星手机');INSERT INTO `phone` VALUES ('16', '4', '魅族手机');INSERT INTO `phone` VALUES ('17', '5', '中兴手机');INSERT INTO `phone` VALUES ('18', '6', 'htc');INSERT INTO `phone` VALUES ('19', '4', '苹果手机');INSERT INTO `phone` VALUES ('20', '3', '三星手机');INSERT INTO `phone` VALUES ('21', '7', '洛基亚');INSERT INTO `phone` VALUES ('22', '8', '小米4');INSERT INTO `phone` VALUES ('23', '4', '魅族手机');CREATE TABLE `phone_info` ( `info_id` int(11) NOT NULL AUTO_INCREMENT, `phone_id` int(11) DEFAULT NULL, `phone_price` float DEFAULT NULL, `phone_color` varchar(255) DEFAULT NULL, PRIMARY KEY (`info_id`), KEY `phone_id` (`phone_id`), CONSTRAINT `phone_info_ibfk_1` FOREIGN KEY (`phone_id`) REFERENCES `phone` (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1008 DEFAULT CHARSET=utf8;INSERT INTO `phone_info` VALUES ('1001', '12', '4999', '黑色');INSERT INTO `phone_info` VALUES ('1002', '13', '5288', '土豪金');INSERT INTO `phone_info` VALUES ('1003', '14', '3588', '银色');INSERT INTO `phone_info` VALUES ('1004', '15', '6288', '金色');INSERT INTO `phone_info` VALUES ('1005', '16', '2998', '黑色');INSERT INTO `phone_info` VALUES ('1006', '17', '1999', '银色');INSERT INTO `phone_info` VALUES ('1007', '18', '4999', '红色');
(三)演示
1,三张表的数据
mysql> select*from person;+----+--------+-----+---------+--------+| id | name | sex | address | number |+----+--------+-----+---------+--------+| 1 | 凯耐 | 男 | 长沙 | 123 || 2 | 科比 | 男 | 北京 | 234 || 3 | 小丽 | 女 | 武汉 | 345 || 4 | 小五 | 男 | 深圳 | 456 || 5 | 张毅峰 | 男 | 南京 | 567 || 6 | 贺知章 | 男 | 上海 | 789 || 7 | 张一山 | 男 | 北京 | 987 || 8 | 赵丽颖 | 女 | 上海 | 876 || 9 | 天佑 | 男 | | NULL |+----+--------+-----+---------+--------+9 rows in setmysql> select*from phone;+----+-----------+------------+| id | person_id | phone_name |+----+-----------+------------+| 12 | 1 | 苹果手机 || 13 | 2 | 魅族手机 || 14 | 3 | 华为手机 || 15 | 1 | 三星手机 || 16 | 4 | 魅族手机 || 17 | 5 | 中兴手机 || 18 | 6 | htc || 19 | 4 | 苹果手机 || 20 | 3 | 三星手机 || 21 | 7 | 洛基亚 || 22 | 8 | 小米4 || 23 | 4 | 魅族手机 |+----+-----------+------------+12 rows in setmysql> select*from phone_info;+---------+----------+-------------+-------------+| info_id | phone_id | phone_price | phone_color |+---------+----------+-------------+-------------+| 1001 | 12 | 4999 | 黑色 || 1002 | 13 | 5288 | 土豪金 || 1003 | 14 | 3588 | 银色 || 1004 | 15 | 6288 | 金色 || 1005 | 16 | 2998 | 黑色 || 1006 | 17 | 1999 | 银色 || 1007 | 18 | 4999 | 红色 |+---------+----------+-------------+-------------+7 rows in set
2.带有IN谓词的子查询
在嵌套查询中,子查询结果往往是一个集合,所以我们需要使用IN关键字。
mysql> select*from person ,phone where person.id=phone.person_id;+----+--------+-----+---------+--------+----+-----------+------------+| id | name | sex | address | number | id | person_id | phone_name |+----+--------+-----+---------+--------+----+-----------+------------+| 1 | 凯耐 | 男 | 长沙 | 123 | 12 | 1 | 苹果手机 || 1 | 凯耐 | 男 | 长沙 | 123 | 15 | 1 | 三星手机 || 2 | 科比 | 男 | 北京 | 234 | 13 | 2 | 魅族手机 || 3 | 小丽 | 女 | 武汉 | 345 | 14 | 3 | 华为手机 || 3 | 小丽 | 女 | 武汉 | 345 | 20 | 3 | 三星手机 || 4 | 小五 | 男 | 深圳 | 456 | 16 | 4 | 魅族手机 || 4 | 小五 | 男 | 深圳 | 456 | 19 | 4 | 苹果手机 || 4 | 小五 | 男 | 深圳 | 456 | 23 | 4 | 魅族手机 || 5 | 张毅峰 | 男 | 南京 | 567 | 17 | 5 | 中兴手机 || 6 | 贺知章 | 男 | 上海 | 789 | 18 | 6 | htc || 7 | 张一山 | 男 | 北京 | 987 | 21 | 7 | 洛基亚 || 8 | 赵丽颖 | 女 | 上海 | 876 | 22 | 8 | 小米4 |+----+--------+-----+---------+--------+----+-----------+------------+mysql> select*from person where id IN(select person_id from phone where phone_name='魅族手机');+----+-------+-----+---------+--------+| id | name | sex | address | number |+----+-------+-----+---------+--------+| 2 | 科比 | 男 | 北京 | 234 || 4 | 小五 | 男 | 深圳 | 456 |+----+-------+-----+---------+--------+
3.带有比较运算符的子查询(>、<、=、>=、 <= 、!= )
mysql> select*from person where id =(select person_id from phone where id=15);+----+------+-----+---------+--------+| id | name | sex | address | number |+----+------+-----+---------+--------+| 1 | 凯耐 | 男 | 长沙 | 123 |+----+------+-----+---------+--------+1 row in setmysql> select*from person where id >(select person_id from phone where id=15);+----+--------+-----+---------+--------+| id | name | sex | address | number |+----+--------+-----+---------+--------+| 2 | 科比 | 男 | 北京 | 234 || 3 | 小丽 | 女 | 武汉 | 345 || 4 | 小五 | 男 | 深圳 | 456 || 5 | 张毅峰 | 男 | 南京 | 567 || 6 | 贺知章 | 男 | 上海 | 789 || 7 | 张一山 | 男 | 北京 | 987 || 8 | 赵丽颖 | 女 | 上海 | 876 || 9 | 天佑 | 男 | | NULL |+----+--------+-----+---------+--------+8 rows in set
4.带有any、some关键字的子查询
mysql> select*from person ,phone where person.id=phone.person_id;+----+--------+-----+---------+--------+----+-----------+------------+| id | name | sex | address | number | id | person_id | phone_name |+----+--------+-----+---------+--------+----+-----------+------------+| 1 | 凯耐 | 男 | 长沙 | 123 | 12 | 1 | 苹果手机 || 1 | 凯耐 | 男 | 长沙 | 123 | 15 | 1 | 三星手机 || 2 | 科比 | 男 | 北京 | 234 | 13 | 2 | 魅族手机 || 3 | 小丽 | 女 | 武汉 | 345 | 14 | 3 | 华为手机 || 3 | 小丽 | 女 | 武汉 | 345 | 20 | 3 | 三星手机 || 4 | 小五 | 男 | 深圳 | 456 | 16 | 4 | 魅族手机 || 4 | 小五 | 男 | 深圳 | 456 | 19 | 4 | 苹果手机 || 4 | 小五 | 男 | 深圳 | 456 | 23 | 4 | 魅族手机 || 5 | 张毅峰 | 男 | 南京 | 567 | 17 | 5 | 中兴手机 || 6 | 贺知章 | 男 | 上海 | 789 | 18 | 6 | htc || 7 | 张一山 | 男 | 北京 | 987 | 21 | 7 | 洛基亚 || 8 | 赵丽颖 | 女 | 上海 | 876 | 22 | 8 | 小米4 |+----+--------+-----+---------+--------+----+-----------+------------+注:大于子查询中的最小值即可。mysql> select*from person where id>any(select person_id from phone where phone_name='魅族手机');+----+--------+-----+---------+--------+| id | name | sex | address | number |+----+--------+-----+---------+--------+| 3 | 小丽 | 女 | 武汉 | 345 || 4 | 小五 | 男 | 深圳 | 456 || 5 | 张毅峰 | 男 | 南京 | 567 || 6 | 贺知章 | 男 | 上海 | 789 || 7 | 张一山 | 男 | 北京 | 987 || 8 | 赵丽颖 | 女 | 上海 | 876 || 9 | 天佑 | 男 | | NULL |+----+--------+-----+---------+--------+7 rows in setmysql> select*from person where id<any(select person_id from phone where phone_name='魅族手机');+----+------+-----+---------+--------+| id | name | sex | address | number |+----+------+-----+---------+--------+| 1 | 凯耐 | 男 | 长沙 | 123 || 2 | 科比 | 男 | 北京 | 234 || 3 | 小丽 | 女 | 武汉 | 345 |+----+------+-----+---------+--------+
5.使用all谓词的子查询
mysql> select*from person ,phone where person.id=phone.person_id;+----+--------+-----+---------+--------+----+-----------+------------+| id | name | sex | address | number | id | person_id | phone_name |+----+--------+-----+---------+--------+----+-----------+------------+| 1 | 凯耐 | 男 | 长沙 | 123 | 12 | 1 | 苹果手机 || 1 | 凯耐 | 男 | 长沙 | 123 | 15 | 1 | 三星手机 || 2 | 科比 | 男 | 北京 | 234 | 13 | 2 | 魅族手机 || 3 | 小丽 | 女 | 武汉 | 345 | 14 | 3 | 华为手机 || 3 | 小丽 | 女 | 武汉 | 345 | 20 | 3 | 三星手机 || 4 | 小五 | 男 | 深圳 | 456 | 16 | 4 | 魅族手机 || 4 | 小五 | 男 | 深圳 | 456 | 19 | 4 | 苹果手机 || 4 | 小五 | 男 | 深圳 | 456 | 23 | 4 | 魅族手机 || 5 | 张毅峰 | 男 | 南京 | 567 | 17 | 5 | 中兴手机 || 6 | 贺知章 | 男 | 上海 | 789 | 18 | 6 | htc || 7 | 张一山 | 男 | 北京 | 987 | 21 | 7 | 洛基亚 || 8 | 赵丽颖 | 女 | 上海 | 876 | 22 | 8 | 小米4 |+----+--------+-----+---------+--------+----+-----------+------------+注:大于查询结果的最大值mysql> select*from person where id>all(select person_id from phone where phone_name='魅族手机');+----+--------+-----+---------+--------+| id | name | sex | address | number |+----+--------+-----+---------+--------+| 5 | 张毅峰 | 男 | 南京 | 567 || 6 | 贺知章 | 男 | 上海 | 789 || 7 | 张一山 | 男 | 北京 | 987 || 8 | 赵丽颖 | 女 | 上海 | 876 || 9 | 天佑 | 男 | | NULL |+----+--------+-----+---------+--------+mysql> select*from person where id<all(select person_id from phone where phone_name='魅族手机');+----+------+-----+---------+--------+| id | name | sex | address | number |+----+------+-----+---------+--------+| 1 | 凯耐 | 男 | 长沙 | 123 |+----+------+-----+---------+--------+1 row in set
5.exists关键字的子查询
exists的结果为 true,外层查询才执行。如果为false外层查询不执行。
mysql> select*from person ,phone where person.id=phone.person_id;+----+--------+-----+---------+--------+----+-----------+------------+| id | name | sex | address | number | id | person_id | phone_name |+----+--------+-----+---------+--------+----+-----------+------------+| 1 | 凯耐 | 男 | 长沙 | 123 | 12 | 1 | 苹果手机 || 1 | 凯耐 | 男 | 长沙 | 123 | 15 | 1 | 三星手机 || 2 | 科比 | 男 | 北京 | 234 | 13 | 2 | 魅族手机 || 3 | 小丽 | 女 | 武汉 | 345 | 14 | 3 | 华为手机 || 3 | 小丽 | 女 | 武汉 | 345 | 20 | 3 | 三星手机 || 4 | 小五 | 男 | 深圳 | 456 | 16 | 4 | 魅族手机 || 4 | 小五 | 男 | 深圳 | 456 | 19 | 4 | 苹果手机 || 4 | 小五 | 男 | 深圳 | 456 | 23 | 4 | 魅族手机 || 5 | 张毅峰 | 男 | 南京 | 567 | 17 | 5 | 中兴手机 || 6 | 贺知章 | 男 | 上海 | 789 | 18 | 6 | htc || 7 | 张一山 | 男 | 北京 | 987 | 21 | 7 | 洛基亚 || 8 | 赵丽颖 | 女 | 上海 | 876 | 22 | 8 | 小米4 |+----+--------+-----+---------+--------+----+-----------+------------+mysql> select*from person where exists (select person_id from phone where id=12);+----+--------+-----+---------+--------+| id | name | sex | address | number |+----+--------+-----+---------+--------+| 1 | 凯耐 | 男 | 长沙 | 123 || 2 | 科比 | 男 | 北京 | 234 || 3 | 小丽 | 女 | 武汉 | 345 || 4 | 小五 | 男 | 深圳 | 456 || 5 | 张毅峰 | 男 | 南京 | 567 || 6 | 贺知章 | 男 | 上海 | 789 || 7 | 张一山 | 男 | 北京 | 987 || 8 | 赵丽颖 | 女 | 上海 | 876 || 9 | 天佑 | 男 | | NULL |+----+--------+-----+---------+--------+9 rows in set
阅读全文
0 0
- MySQL嵌套查询总结
- MySQL 的嵌套查询
- MySQL嵌套查询
- MySQL的嵌套查询
- mysql嵌套关联查询
- MySQL嵌套查询
- MYSQL嵌套查询
- mysql嵌套语句查询
- mysql 嵌套查询
- MySQL嵌套查询实例
- mysql嵌套查询
- MySQL的嵌套查询
- MySQL的嵌套查询
- Mysql的嵌套查询方法
- mysql中有外键的嵌套查询
- MySQL-子查询(嵌套)
- MySQL 的复合查询或者嵌套查询
- MySQL嵌套查询(子查询)
- 深入浅出JMS(一)--JMS基本概念
- 根据getDate()和setDate(), 封装一个函数afterDate(date,n),得到日期date的n天后的日期
- Java反射的运用
- 多种浏览器出现安全问题 恐导致用户个资外泄
- java获取文件路径问题
- MySQL嵌套查询总结
- Java中的垃圾回收机制以及常见的垃圾回收器
- 消息队列使用的四种场景介绍
- java8 分组
- 将二进制深度图转换成OpenCV的Mat格式
- oracle trigger
- 【css】css文本换行与溢出显示为省略号
- window安装rabbitMq
- Java利用MessageDigest获取字符串或文件MD5详解