MySql 关联查询时 on条件过滤和where条件过滤的区别

在学习mysql的连接查询时容易忽略的细节,当左连接时就以左表为主,有连接就以由表为主,但是过滤条件为on和where时时常被我们忽略。

首先建两张表并导入数据:

-- ----------------------------
-- Table structure for sys_dept
-- ----------------------------
DROP TABLE IF EXISTS `sys_dept`;
CREATE TABLE `sys_dept`  (
  `dept_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id,自增',
  `dept_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '部门名称',
  PRIMARY KEY (`dept_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of sys_dept
-- ----------------------------
INSERT INTO `sys_dept` VALUES (1, '研发部');
INSERT INTO `sys_dept` VALUES (2, '测试部');
INSERT INTO `sys_dept` VALUES (3, '财务部');
INSERT INTO `sys_dept` VALUES (4, '人事部');

-- ----------------------------
-- Table structure for sys_user
-- ----------------------------
DROP TABLE IF EXISTS `sys_user`;
CREATE TABLE `sys_user`  (
  `user_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id,自增',
  `user_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户名',
  `dept_id` int(11) NULL DEFAULT NULL COMMENT '部门id',
  `is_disable` int(11) NULL DEFAULT NULL COMMENT '是否禁用:1-启用,0-禁用',
  PRIMARY KEY (`user_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of sys_user
-- ----------------------------
INSERT INTO `sys_user` VALUES (1, '张三', 1, 0);
INSERT INTO `sys_user` VALUES (2, '李四', 4, 1);
INSERT INTO `sys_user` VALUES (3, '王五', 1, 1);
INSERT INTO `sys_user` VALUES (4, '赵六', 3, 1);
INSERT INTO `sys_user` VALUES (5, '田七', 2, 1);
INSERT INTO `sys_user` VALUES (6, '刘八', 4, 0);

SET FOREIGN_KEY_CHECKS = 1;

一共两张表,用户表和部门表,用户表中的dept_id和部门表的dept_id关联,下面的对两表进行关联查询,查出用户名和用户对应的部门名称,分别采用 where 和 on 进行条件过滤。

where 过滤

SELECT
	u.user_name,
	d.dept_name 
FROM
	sys_user u
	LEFT JOIN sys_dept d ON u.dept_id = d.dept_id 
WHERE
	u.is_disable = 1

条件在where后加过滤条件输出结果

on 过滤

SELECT
	u.user_name,
	d.dept_name 
FROM
	sys_user u
	LEFT JOIN sys_dept d ON u.dept_id = d.dept_id 
AND
	u.is_disable = 1

在on后加过滤条件输出结果

上述两个查询中都是加了is_disable = 1这个条件,本来左连接要以左表为主,但是where后加了is_disable = 1后过滤掉了左表中的两条数据,而 and 后加is_disable = 1却仍然以坐标为主,并没有过滤掉左表中的数据,这是为什么呢?

mysql在进行关联查询时会生成一个临时表,当过滤条件为on时mysql会不管on后的条件是否为真,都会以左表为主(这里指左连接);而过滤条件为where时,mysql会在临时表生成之后再对临时表进行条件过滤,所以第二条sql中仍然以左表为主,并没有将数据过滤掉。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 如果你需要在 MySQL 中进行关联查询,并且需要去除重复的记录,可以使用 `DISTINCT` 关键字来实现去重。 例如,有两个表 `table1` 和 `table2`,它们之间通过 `id` 字段进行关联,需要查询它们关联后的 `name` 字段,并去重,可以使用以下 SQL 语句: ``` SELECT DISTINCT table1.name FROM table1 INNER JOIN table2 ON table1.id = table2.id; ``` 这个查询返回的结果将会是 `table1` 表中所有不重复的 `name` 字段与 `table2` 表中对应记录的关联结果。 ### 回答2: MySQL关联查询去重是指在执行关联查询,避免返回重复的结果。 常见的解决方法有以下几种: 1. 使用DISTINCT关键字:可以在SELECT语句中使用DISTINCT关键字来去除重复的结果,例如:SELECT DISTINCT column1, column2 FROM table1 INNER JOIN table2 ON table1.column3 = table2.column4; 2. 使用GROUP BY子句:可以根据某一列或几列进行分组,并使用聚合函数(如COUNT、SUM)来获取唯一值,例如:SELECT column1, column2 FROM table1 INNER JOIN table2 ON table1.column3 = table2.column4 GROUP BY column1, column2; 3. 使用子查询:可以在主查询中使用子查询来去除重复的结果,将子查询的结果作为主查询的条件,例如:SELECT column1, column2 FROM table1 INNER JOIN (SELECT DISTINCT column3 FROM table2) AS subquery ON table1.column3 = subquery.column3; 4. 使用EXISTS关键字:可以使用EXISTS关键字来判断某一行是否存在,并根据判断结果来选择是否包含该行,例如:SELECT column1, column2 FROM table1 WHERE EXISTS (SELECT 1 FROM table2 WHERE table1.column3 = table2.column4); 需要注意的是,使用关联查询去重可能会带来一定的性能开销,因此在设计数据库和查询,应尽量避免出现重复数据,通过合理的建表和数据处理来减少不必要的关联查询去重操作。 ### 回答3: MySQL关联查询去重可以通过使用DISTINCT关键字来实现。DISTINCT关键字用于过滤查询结果中的重复记录。 假设我们有两个表,一个是学生表students,包括字段id和name,另一个是成绩表scores,包括字段id和score。我们想要查询学生表和成绩表之间的关联数据,并去除重复记录。 可以使用INNER JOIN关键字进行关联查询,同在查询结果中使用DISTINCT关键字来去重。具体查询语句如下: SELECT DISTINCT students.id, students.name, scores.score FROM students INNER JOIN scores ON students.id = scores.id 以上查询语句会返回去除重复记录的学生表和成绩表的关联数据。在查询结果中,只会包含唯一的学生记录,对应的成绩也会进行去重处理。 总结来说,通过在关联查询语句中使用DISTINCT关键字,可以实现MySQL关联查询的去重操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值