案情回顾:
就是在 concat 函数中,使用一个汇聚函数的子查询的结果作为了一个参数,SQL 就报错了,不能正常运行。
select MIN(t.birthday) as birthday FROM test_tab t;
-- 结果:
-- 2021-01-21 09:03:51
select CONCAT('最小年龄人的生日时间:', MIN(t.birthday)) as birthday FROM test_tab t;
-- 结果:
-- 最小年龄人的生日时间:2021-01-21 09:03:51
select CONCAT('最小年龄人的生日时间:', (select MIN(t.birthday) FROM test_tab t) as birthday from dual;
-- 结果:
-- You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'from dual' at line 2
小思:
没有关注过,函数中是否能够使用一个子查询的结果作为参数。
子查询结果的使用,常常是在 in 、exists 等子句,或者聚合函数的结果直接作为 select 的子列。
-- 语句正确,exists 子句
SELECT
xjl.id,
xjl.executor_address,
xjl.alarm_status
FROM
xxl_job_log xjl
WHERE
EXISTS (
SELECT
xjg.id
FROM
xxl_job_group xjg
WHERE
xjg.id = xjl.job_group
);
-- 语句正确,in 子句
SELECT
xjl.id,
xjl.executor_address,
xjl.alarm_status
FROM
xxl_job_log xjl
WHERE
xjl.job_group IN (
SELECT
xjg.id
FROM
xxl_job_group xjg
);
-- 语句错误,like 中无法使用
SELECT
xjl.id,
xjl.executor_address,
xjl.alarm_status
FROM
xxl_job_log xjl
WHERE
xjl.executor_address LIKE (
SELECT
CONCAT(xjg.id, '%')
FROM
xxl_job_group xjg
) AS a
);
-- 语句错误,like 中无法使用
SELECT
xjl.id,
xjl.executor_address,
xjl.alarm_status
FROM
xxl_job_log xjl
WHERE
(
SELECT
xjl.executor_address LIKE CONCAT(xjg.id, '%')
FROM
xxl_job_group xjg
) AS a
);
-- 语句正确,将相应的条件添加到 select 列上,然后将该列作为 where 子句的过滤条件
SELECT
*
FROM
(
SELECT
xjl.id,
xjl.executor_address,
xjl.alarm_status,
xjl.executor_address LIKE CONCAT(xjg.id, '%') AS like_
FROM
xxl_job_log xjl,
xxl_job_group xjg
) a
WHERE
like_;
-- 子查询结果作为一个 from 的 table 集合
SELECT
date
FROM
(SELECT now() AS date FROM DUAL) a;
-- 结果:
-- 2021-01-30 09:12:46
-- 函数中使用函数
SELECT
date
FROM
(
SELECT
min(now()) AS date
FROM
DUAL
) a;
-- 结果:
-- 2021-01-30 09:12:46
小结:
函数中不可存在 select 子句,此时可以将函数挪移到 select 子句中。