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
原创粉丝点击