关于mysql中的left join查询

83 阅读2分钟

创建数据库

/*
 Navicat Premium Data Transfer

 Source Server         : master-test
 Source Server Type    : MySQL
 Source Server Version : 50741
 Source Host           : localhost:3340
 Source Schema         : test_left

 Target Server Type    : MySQL
 Target Server Version : 50741
 File Encoding         : 65001

 Date: 16/08/2023 17:00:44
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for u1
-- ----------------------------
DROP TABLE IF EXISTS `u1`;
CREATE TABLE `u1` (
  `id` int(11) DEFAULT NULL,
  `name` varchar(20) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of u1
-- ----------------------------
BEGIN;
INSERT INTO `u1` (`id`, `name`) VALUES (1, 'a');
INSERT INTO `u1` (`id`, `name`) VALUES (2, 'b');
INSERT INTO `u1` (`id`, `name`) VALUES (3, 'c');
COMMIT;

-- ----------------------------
-- Table structure for u2
-- ----------------------------
DROP TABLE IF EXISTS `u2`;
CREATE TABLE `u2` (
  `id` int(11) DEFAULT NULL,
  `name` varchar(20) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of u2
-- ----------------------------
BEGIN;
INSERT INTO `u2` (`id`, `name`) VALUES (2, 'bb');
INSERT INTO `u2` (`id`, `name`) VALUES (2, 'cc');
INSERT INTO `u2` (`id`, `name`) VALUES (7, 'yy');
COMMIT;

-- ----------------------------
-- Table structure for u3
-- ----------------------------
DROP TABLE IF EXISTS `u3`;
CREATE TABLE `u3` (
  `id` int(11) DEFAULT NULL,
  `name` varchar(20) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of u3
-- ----------------------------
BEGIN;
INSERT INTO `u3` (`id`, `name`) VALUES (2, 'apple');
INSERT INTO `u3` (`id`, `name`) VALUES (1, 'banana');
INSERT INTO `u3` (`id`, `name`) VALUES (9, 'lizi');
COMMIT;

SET FOREIGN_KEY_CHECKS = 1;

正常查询表的记录

u1:
image.png

u2:
image.png

u3:
image.png

left join on

SELECT a.id,a.`name`,c.id,c.`name` from u1 a LEFT JOIN u3 c on a.id=c.id; 查询的是以左表为基础的全集加上右表中符合条件的数据:

image.png

left join on and

SELECT a.id,a.`name`,c.id,c.`name` from u1 a LEFT JOIN u3 c on a.id=c.id and a.`name`='b'; 查询的是以左表为基础的全集加上右表中符合条件的数据,然后对结果集做了过滤处理,只保留a.name=b条件下的B表数据,其余B表数据不保存,a表全部数据不影响:

image.png

left join on where and

查询的是以左表为基础的全集加上右表中符合条件的数据,在查询的时候对整个结果集进行处理,只查询满足条件的结果集数据,a\b表结果都有影响,都要满足where中的条件。
SELECT a.id,a.`name`,c.id,c.`name` from u1 a LEFT JOIN u3 c on a.id=c.id where a.`name`='b';

image.png