MySQL多关联查询优化方案(经典面试题)

以学生信息表和学生消费卡表为例,先创建数据源:

CREATE TABLE `student_info` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `student_name` VARCHAR(10) DEFAULT NULL,
  `class_no` VARCHAR(10) DEFAULT NULL,
  `student_id` VARCHAR(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8

CREATE TABLE `student_card` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `money` VARCHAR(10) DEFAULT NULL,
  `student_id` VARCHAR(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8

INSERT INTO student_info (student_name,class_no,student_id) 
VALUES
('张三','一班','1001'),
('李四','一班','1002'),
('钱七','二班','2001'),
('王八','二班','2002'),
('王八','一班','1003')

INSERT INTO student_card (money,student_id) 
VALUES
('100','1001'),
('34','1002'),
('98','2001'),
('786','2002'),
('65','1003')

解决方案:


/*通过连接查询的方法,用student_id关联两张表查询。*/
SELECT * FROM student_card a INNER JOIN student_info b ON a.student_id=b.student_id
/*不通过连接查询的方法,用student_id关联两张表查询。*/
SELECT a.student_id,MAX(a.money)money,MAX(a.student_name),MAX(a.class_no) FROM (
SELECT student_id,money,NULL student_name,NULL class_no FROM student_card  
UNION ALL
SELECT student_id,NULL,student_name,class_no FROM student_info
) a GROUP BY a.student_id
发布了101 篇原创文章 · 获赞 92 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/qq_39706570/article/details/104088241