MySQL查询某个字段的几百个值,是否存在于表中,并列出不存在表中的值(不用再过滤)
基础版(只能查询单个产品)
采用exist来查询
-- 假设产品代码字段为 product_code(根据实际字段名修改)
SELECT
product_code AS 产品代码,
CASE
WHEN EXISTS (SELECT 1 FROM product WHERE product_code = '指定产品代码')
THEN '存在'
ELSE '不存在'
END AS 存在状态
FROM dual; -- 单次查询单个产品代码
使用临时表(推荐)
WITH codes_to_check (code) AS (
-- 在此处列出要检查的所有产品代码
SELECT 'A001' FROM dual UNION ALL
SELECT 'B002' FROM dual UNION ALL
SELECT 'C003' FROM dual
)
SELECT
c.code AS 待查代码,
CASE
WHEN p.product_code IS NOT NULL THEN '存在'
ELSE '不存在'
END AS 存在状态,
COALESCE(p.name, 'N/A') AS 产品名称,
COALESCE(p.status, 'N/A') AS 上架状态
FROM codes_to_check c
LEFT JOIN product p ON c.code = p.product_code;
或
WITH codes_to_check (code) AS (
-- 在此处列出要检查的所有产品代码
SELECT 'A001' FROM dual UNION ALL
SELECT 'B002' FROM dual UNION ALL
SELECT 'C003' FROM dual UNION ALL
SELECT 'D004' FROM dual
)
SELECT
c.code AS 不存在产品代码
FROM codes_to_check c
LEFT JOIN product p ON c.code = p.product_code
WHERE p.product_code IS NULL; -- 过滤出不存在于产品表中的代码
扩展版(用in条件)
此方案也是用了临时表的形式
-- 假设产品代码字段为 product_code
SELECT
code AS 不存在产品代码
FROM (
-- 列出所有需要检查的产品代码
SELECT 'A001' AS code UNION ALL
SELECT 'B002' AS code UNION ALL
SELECT 'C003' AS code UNION ALL
SELECT 'D004' AS code
) AS codes_to_check
WHERE code NOT IN (
SELECT product_code FROM product
);
总结
- 查询产品代码是否在表中,主要是为了直接筛选出来,不用再进行对比。
- 使用临时表, 创建临时表用with(案例使用的是此)或者create temporary table
- 创建临时表的基本语法
CREATE TEMPORARY TABLE temp_table_name (
column1 datatype [constraints],
column2 datatype [constraints],
...
) [COMMENT '表注释'];
- 临时表案例
CREATE TEMPORARY TABLE temp_products (
id INT AUTO_INCREMENT PRIMARY KEY COMMENT '临时产品ID',
product_code VARCHAR(50) NOT NULL COMMENT '产品代码',
name VARCHAR(100) NOT NULL COMMENT '产品名称',
status TINYINT DEFAULT 0 COMMENT '状态:0=下架,1=上架',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'
) COMMENT='临时产品表';