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
查询结果
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
查询结果:
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,分享半个互联网人的技术与思考,感兴趣的可以关注.