MySQL多表联合查询条件语句顺序

1 摘要

在数据库操作中,多表联合查询是后台开发者常用到的查询语句。这里记录一次本人在MySQL数据库下在进行多表联合查询时因为条件语句顺序放置错误而导致的异常。

2 异常抛出

多表关联时条件语句放置错误抛出的异常

[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'LEFT JOIN `sys_depart` AS d
ON u.depart_id = d.id' at line 9

java 项目日志抛错

### Cause: java.sql.SQLException: sql injection violation, syntax error: syntax error, error in :'	 
		left join sys_depart as',expect LEFT, actual LEFT left : select

3 正误示例测试

3.1 正确的示例

示例代码:

-- 系统用户查询
SELECT 
    u.id,
    u.user_name,
    u.depart_id,
    d.id,
    d.name
FROM `sys_user` u
LEFT JOIN `sys_depart` AS d
ON u.depart_id = d.id
WHERE u.id = 2

查询结果

mysql 查询结果

3.2 错误的示例

示例代码:

-- 系统用户查询
SELECT 
    u.id,
    u.user_name,
    u.depart_id,
    d.id,
    d.name
FROM `sys_user` u
WHERE u.id = 2
LEFT JOIN `sys_depart` AS d
ON u.depart_id = d.id

查询结果:

mysql 查询结果

3.3 结论

MySQL数据库中,在使用表关联的方式(join)进行多表联合查询时,如果有条件语句(where),则条件语句必须放在关联语句的后边

4 问题复现

如果有兴趣复现问题,则可以将以下代码在本地运行,以验证结论

生成测试数据

-- ----------------------------
-- Table structure for sys_depart
-- ----------------------------
DROP TABLE IF EXISTS `sys_depart`;
CREATE TABLE `sys_depart` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '部门名称',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ----------------------------
-- Table structure for sys_user
-- ----------------------------
DROP TABLE IF EXISTS `sys_user`;
CREATE TABLE `sys_user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `user_name` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '用户名',
  `password` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '密码',
  `depart_id` int(11) DEFAULT NULL COMMENT '部门 id',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;


-- 插入系统部门
INSERT INTO `sys_depart`(`name`) VALUES
('人事部门'),
('研发部门'),
('营销部门');

-- 插入系统用户
INSERT INTO `sys_user`(`user_name`, `password`, `depart_id`) VALUES
('小红', '123456', 1),
('小白', '123456', 2),
('小兰', '123456', 3);

数据添加之后,可以进行以上示例代码的运行测试

个人公众号:404Code,分享半个互联网人的技术与思考,感兴趣的可以关注.
404Code

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值