Uso detallado de EXISTS en la instrucción SQL
prefacio
En el desarrollo de negocios, se encontrarán necesidades similares.
Requisito 1: ACTUALIZAR registros en la tabla TEST_TB01; condiciones satisfactorias: estos registros no están en TEST_TB02.
Requisito 2: ACTUALIZAR los registros en la tabla TEST_TB01; condiciones satisfactorias: estos registros están en TEST_TB02.
El uso de EXISTS en la instrucción SQL puede resolver este tipo de demanda de manera más concisa.
1. Crea una tabla
1. Cree una declaración de tabla en la base de datos MySQL
CREATE TABLE TEST_TB01
(
sensor_id BIGINT,
part_id BIGINT,
flag VARCHAR(64)
)
COMMENT '数据表一';
CREATE TABLE TEST_TB02
(
sensor_id BIGINT,
part_id BIGINT,
flag VARCHAR(64)
)
COMMENT '数据表二';
CREATE TABLE TEST_TB03
(
sensor_id BIGINT,
part_id BIGINT,
flag VARCHAR(64)
)
COMMENT '数据表三';
2. Cree una declaración de tabla en la base de datos ORACLE
CREATE TABLE TEST_TB01
(
sensor_id NUMBER(16),
part_id NUMBER(16),
flag VARCHAR(64)
);
CREATE TABLE TEST_TB02
(
sensor_id NUMBER(16),
part_id NUMBER(16),
flag VARCHAR(64)
);
2. Use EXISTS en la instrucción SELECT
Utilice EXISTS en la instrucción SQL de SELECT.
Insertar datos en TEST_TB01:
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2101,8811,'厦门');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2102,8812,'泉州');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2103,8813,'福州');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2104,8814,'漳州');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2105,8815,'杭州');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2106,8816,'上海');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2107,8817,'北京');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2108,8818,'深圳');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2109,8819,'中国');
Insertar datos en TEST_TB02:
INSERT INTO TEST_TB02 (sensor_id,part_id,flag) VALUES(2101,8811,'厦门');
INSERT INTO TEST_TB02 (sensor_id,part_id,flag) VALUES(2102,8812,'泉州');
INSERT INTO TEST_TB02 (sensor_id,part_id,flag) VALUES(2103,8813,'福州');
INSERT INTO TEST_TB02 (sensor_id,part_id,flag) VALUES(2104,8814,'漳州');
INSERT INTO TEST_TB02 (sensor_id,part_id,flag) VALUES(2109,8819,'中国');
Insertar datos en TEST_TB03:
INSERT INTO TEST_TB03 (sensor_id,part_id,flag) VALUES(2106,8816,'上海');
INSERT INTO TEST_TB03 (sensor_id,part_id,flag) VALUES(2107,8817,'北京');
INSERT INTO TEST_TB03 (sensor_id,part_id,flag) VALUES(2109,8819,'中国');
Ver datos TEST_TB01:
Ver datos TEST_TB02:
Ver datos TEST_TB03:
1. Usa EXISTE en SQL
Requisito: consulta los registros existentes en TEST_TB02 desde TEST_TB01, y la condición de asociación es que los sensor_ids de las dos tablas sean iguales.
Sentencias SQL:
SELECT
aa.sensor_id,aa.part_id,aa.flag
FROM
TEST_TB01 aa
WHERE EXISTS
(SELECT 1 FROM
TEST_TB02 bb
WHERE aa.sensor_id = bb.sensor_id);
Resultados de la:
2. Usando NO EXISTE en SQL
Requisito: consultar registros que no existen en TEST_TB02 desde TEST_TB01, y la condición de asociación es que los sensor_ids de las dos tablas sean iguales.
Sentencias SQL:
SELECT
aa.sensor_id,aa.part_id,aa.flag
FROM
TEST_TB01 aa
WHERE NOT EXISTS
(SELECT 1 FROM
TEST_TB02 bb
WHERE aa.sensor_id = bb.sensor_id);
Resultados de la:
3. Usar múltiples NO EXISTEN en SQL
Requisito: registros de consulta de TEST_TB01 que no existen en TEST_TB02 y TEST_TB03, y la condición de asociación es que los sensor_ids de las tablas sean iguales.
Sentencias SQL:
SELECT
aa.sensor_id,aa.part_id,aa.flag
FROM
TEST_TB01 aa
WHERE NOT EXISTS
(SELECT 1 FROM
TEST_TB02 bb
WHERE aa.sensor_id = bb.sensor_id)
AND NOT EXISTS
(SELECT 1 FROM
TEST_TB03 cc
WHERE aa.sensor_id = cc.sensor_id);
Resultados de la:
4. Usar múltiples EXISTENCIAS en SQL
Requisito: consulta desde TEST_TB01 los registros que existen tanto en TEST_TB02 como en TEST_TB03, y la condición de asociación es que el sensor_id de la tabla sea igual.
Sentencias SQL:
SELECT
aa.sensor_id,aa.part_id,aa.flag
FROM
TEST_TB01 aa
WHERE EXISTS
(SELECT 1 FROM
TEST_TB02 bb
WHERE aa.sensor_id = bb.sensor_id)
AND EXISTS
(SELECT 1 FROM
TEST_TB03 cc
WHERE aa.sensor_id = cc.sensor_id);
Resultados de la:
5. Uso de NOT EXISTS y EXISTS en SQL
Requisito: consulta desde TEST_TB01 los registros que existen en TEST_TB02 pero no existen en TEST_TB03, y la condición de asociación es que los sensor_ids de las tablas sean iguales.
Sentencias SQL:
SELECT
aa.sensor_id,aa.part_id,aa.flag
FROM
TEST_TB01 aa
WHERE EXISTS
(SELECT 1 FROM
TEST_TB02 bb
WHERE aa.sensor_id = bb.sensor_id)
AND NOT EXISTS
(SELECT 1 FROM
TEST_TB03 cc
WHERE aa.sensor_id = cc.sensor_id);
Resultados de la:
3. Use EXISTS en la instrucción DELETE
Utilice EXISTS y NOT EXISTS en la instrucción SQL de DELETE.
Insertar datos en TEST_TB01:
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2101,8811,'厦门');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2102,8812,'泉州');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2103,8813,'福州');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2104,8814,'漳州');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2105,8815,'杭州');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2106,8816,'上海');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2107,8817,'北京');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2108,8818,'深圳');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2109,8819,'中国');
Insertar datos en TEST_TB02:
INSERT INTO TEST_TB02 (sensor_id,part_id,flag) VALUES(2101,8811,'厦门');
INSERT INTO TEST_TB02 (sensor_id,part_id,flag) VALUES(2102,8812,'泉州');
INSERT INTO TEST_TB02 (sensor_id,part_id,flag) VALUES(2103,8813,'福州');
INSERT INTO TEST_TB02 (sensor_id,part_id,flag) VALUES(2104,8814,'漳州');
INSERT INTO TEST_TB02 (sensor_id,part_id,flag) VALUES(2109,8819,'中国');
1. Usar en MySQL
Requisito: elimine los registros existentes en TEST_TB02 de TEST_TB01, y la condición de asociación es que los sensor_ids de las dos tablas sean iguales.
Nota: este ejemplo utiliza la versión de MySQL: MySQL 5.7.33.
Sentencias SQL:
DELETE FROM
TEST_TB01 aa
WHERE EXISTS
(SELECT 1 FROM
TEST_TB02 bb
WHERE aa.sensor_id = bb.sensor_id);
Resultado de la ejecución:
Conclusión: MySQL no admite la sintaxis de EXISTS y NOT EXISTS en la instrucción SQL de DELETE. (Versión en este ejemplo: MySQL 5.7.33).
Para solucionar este requerimiento:
Sentencia SQL:
DELETE
aa
FROM
TEST_TB01 aa
INNER JOIN TEST_TB02 bb
ON aa.sensor_id = bb.sensor_id;
Aviso:En SQL, DELETE va seguido del alias del nombre de la tabla que se eliminará en el requisito.
Si no utiliza un alias, se informará un error:
2. Uso en Oracle
Requisito: elimine los registros existentes en TEST_TB02 de TEST_TB01, y la condición de asociación es que los sensor_ids de las dos tablas sean iguales.
Sentencias SQL:
DELETE FROM
TEST_TB01 aa
WHERE EXISTS
(SELECT 1 FROM
TEST_TB02 bb
WHERE aa.sensor_id = bb.sensor_id);
Resultados de la:
TEST_TB01 antes de la ejecución:
TEST_TB02 antes de la ejecución:
TEST_TB01 después de la ejecución:
Cuarto, use EXISTS en la instrucción UPDATE
Utilice EXISTS en la instrucción SQL UPDATE.
Insertar datos en TEST_TB01:
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2101,8811,'城市');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2102,8812,'城市');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2103,8813,'城市');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2104,8814,'城市');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2105,8815,'城市');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2106,8816,'城市');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2107,8817,'城市');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2108,8818,'城市');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2109,8819,'城市');
Insertar datos en TEST_TB02:
INSERT INTO TEST_TB02 (sensor_id,part_id,flag) VALUES(2101,8811,'厦门');
INSERT INTO TEST_TB02 (sensor_id,part_id,flag) VALUES(2102,8812,'泉州');
INSERT INTO TEST_TB02 (sensor_id,part_id,flag) VALUES(2103,8813,'福州');
INSERT INTO TEST_TB02 (sensor_id,part_id,flag) VALUES(2104,8814,'漳州');
INSERT INTO TEST_TB02 (sensor_id,part_id,flag) VALUES(2109,8819,'中国');
1. Usar en MySQL
Requisito: Para actualizar registros en TEST_TB01 y existentes en TEST_TB02, la condición de asociación es que los sensor_ids de las dos tablas sean iguales.
Nota: este ejemplo utiliza la versión de MySQL: MySQL 5.7.33.
Sentencias SQL:
UPDATE TEST_TB01 aa
SET (aa.part_id, aa.flag) =
(SELECT bb.part_id, bb.flag
FROM TEST_TB02 bb
WHERE aa.sensor_id = bb.sensor_id)
WHERE EXISTS
(SELECT 1 FROM TEST_TB02 cc
WHERE aa.sensor_id = cc.sensor_id);
Resultados de la ejecución:
Conclusión:MySQL no admite la sintaxis de EXISTS y NOT EXISTS en las instrucciones UPDATE SQL. (Versión en este ejemplo: MySQL 5.7.33).
Para abordar esta necesidad:
Sentencias SQL:
UPDATE TEST_TB01 aa ,TEST_TB02 bb
SET
aa.part_id=bb.part_id,
aa.flag=bb.flag
WHERE aa.sensor_id = bb.sensor_id;
Resultados de la:
TEST_TB01 antes de la ejecución:
TEST_TB02 antes de la ejecución:
TEST_TB01 después de la ejecución:
2. Uso en Oracle
Requisito: Para actualizar registros en TEST_TB01 y existentes en TEST_TB02, la condición de asociación es que los sensor_ids de las dos tablas sean iguales.
Sentencias SQL:
UPDATE TEST_TB01 aa
SET (aa.part_id, aa.flag) =
(SELECT bb.part_id, bb.flag
FROM TEST_TB02 bb
WHERE aa.sensor_id = bb.sensor_id)
WHERE EXISTS
(SELECT 1 FROM TEST_TB02 cc
WHERE aa.sensor_id = cc.sensor_id);
Resultados de la:
TEST_TB01 antes de la ejecución:
TEST_TB02 antes de la ejecución:
TEST_TB01 después de la ejecución: