IN&EXISTS与NOT IN&NOT EXISTS 的优化原则小结
下面只是从理论上提出了一些建议,最好的原则是大家在上面的基础上,能够使用执行计划来分析,得出最佳的语句的写法。
1. EXISTS的执行流程select * from t1 where exists ( select null from t2 where y = x )
可以理解为:
代码如下:
for x in ( select * from t1 )
loop
if ( exists ( select null from t2 where y = x.x )
then
OUTPUT THE RECORD
end if
end loop
对于in 和 exists的性能区别:
如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in,反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。
其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了
另外IN时不对NULL进行处理,如:
select 1 from dual where null in (0,1,2,null)
结果为空。
2. NOT IN 与NOT EXISTS:
NOT EXISTS的执行流程
代码如下:
select .....
from rollup R
where not exists ( select 'Found' from title T
where R.source_id = T.Title_ID);
可以理解为:
代码如下:
for x in ( select * from rollup )
loop
if ( not exists ( that query ) ) then
OUTPUT
end if;
end;
注意:NOT EXISTS 与 NOT IN 不能完全互相替换,看具体的需求。如果选择的列可以为空,则不能被替换。
例如下面语句,看他们的区别:
select x,y from t;
x y
------ ------
1 3
3 1
1 2
1 1
3 1
5
select * from t where x not in (select y from t t2 )
no rows
select * from t where not exists (select null from t t2
where t2.y=t.x )
x y
------ ------
5 NULL
所以要具体需求来决定
对于not in 和 not exists的性能区别:
not in 只有当子查询中,select 关键字后的字段有not null约束或者有这种暗示时用not in,另外如果主查询中表大,子查询中的表小但是记录多,则应当使用not in,并使用anti hash join.
如果主查询表中记录少,子查询表中记录多,并有索引,可以使用not exists,另外not in最好也可以用/*+ HASH_AJ */或者外连接+is null
NOT IN 在基于成本的应用中较好
比如:
代码如下:
select .....
from rollup R
where not exists ( select 'Found' from title T
where R.source_id = T.Title_ID);
改成(佳)
select ......
from title T, rollup R
where R.source_id = T.Title_id(+)
and T.Title_id is null;
或者(佳)
sql> select /*+ HASH_AJ */ ...
from rollup R
where ource_id NOT IN ( select ource_id
from title T
where ource_id IS NOT NULL )
注意:上面只是从理论上提出了一些建议,最好的原则是大家在上面的基础上,能够使用执行计划来分析,得出最佳的语句的写法。
'//=============================
exists,not exists总结
1 exists
SELECT * FROM anken_m WHERE EXISTS(
SELECT my_list_temp_m.sales_code
FROM my_list_temp_m
WHERE my_list_temp_m.sales_code=anken_m.sales_code)
说明:
1) 查询在anken_m表和my_list_temp_m表中都存在的sales_code。
2) sales_code是anken_m的主键,my_list_temp_m的外键。
注意:
1) 外层查询表anken_m是查询的对象。
2) 内层查询表my_list_temp_m是条件对象。
3) 内外层的查询表不能相同。
4) 作为关联条件的anken_m表不需要在内层查询FROM后添加。
5) my_list_temp_m.sales_code=anken_m.sales_code条件的左右顺序不影响查询结果。
2 not exists
SELECT * FROM anken_m WHERE NOT EXISTS(
SELECT my_list_temp_m.sales_code
FROM my_list_temp_m
WHERE my_list_temp_m.sales_code=anken_m.sales_code)
说明:
1) 查询在anken_m表中存在,但是在my_list_temp_m表中不存在的sales_code。
2) sales_code是anken_m的主键,my_list_temp_m的外键。
注意:
1) 外层查询表anken_m是查询的对象。
2) 内层查询表my_list_temp_m是条件对象。
3) 内外层的查询表不能相同。
4) 作为关联条件的anken_m表不需要在内层查询FROM后添加。
5) my_list_temp_m.sales_code=anken_m.sales_code条件的左右顺序不影响查询结果。
3 综合运用
UPDATE anken_m
SET(plan_type_code, branch_name, business_type_code)
=(SELECT anken.plan_type_code,anken.branch_name,anken.business_type_code
FROM anken
WHERE anken.sales_code=anken_m.sales_code)
WHERE EXISTS (
SELECT anken.sales_code
FROM anken,my_list_temp_m
WHERE my_list_temp_m.sales_code=anken.sales_code
AND anken.sales_code=anken_m.sales_code
)
说明:
1) 用一个表的记录数据更新另一个表的记录数据。
2) 用一个SQL语句进行批量更新。
2) sales_code是anken,anken_m的主键,my_list_temp_m的外键。
注意:
1) set 语句中的要被更新字段必须跟数据源字段一一对应,另外数据源查询中的条件必须限定一条记录。也就是根据sales_code可以唯一确定anken的一条记录,和anken_m的一条记录,这样才能保证要被更新的记录和数据源记录的主键是相同的。
2) 根据WHERE EXISTS语句可以确定数据源记录的范围,也就是可以用anken表中哪些记录更新anken_m表。所以anken_m不需要在WHERE EXISTS语句中的FROM后添加。

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Avec le développement continu de l’internationalisation, de plus en plus de sites Web et d’applications doivent prendre en charge des fonctions de commutation multilingue. En tant que framework frontal populaire, Vue fournit un plug-in appelé i18n qui peut nous aider à réaliser une commutation multilingue. Cet article présentera les techniques courantes d'utilisation d'i18n pour réaliser une commutation multilingue dans Vue. Étape 1 : Installer le plug-in i18n Tout d'abord, nous devons utiliser npm ou Yarn pour installer le plug-in i18n. Entrez la commande suivante sur la ligne de commande : npminst

L'interface de sortie fait référence à l'interface de sortie et l'interface d'entrée fait référence à l'interface d'entrée. L'interface de sortie représente généralement l'interface de sortie de ligne de source audio, qui est utilisée pour connecter des charges, telles que des haut-parleurs, des écouteurs, etc., tandis que l'interface d'entrée représente généralement l'interface d'entrée de ligne de source audio, qui est utilisée pour connecter des lecteurs de CD, des appareils mobiles. téléphones, lecteurs MP3, ordinateurs, etc.

Comment utiliser la fonction File.Exists en C# pour déterminer si un fichier existe. Dans les opérations sur les fichiers C#, déterminer si un fichier existe est une exigence fonctionnelle de base. La fonction File.Exists est une méthode en C# utilisée pour déterminer si un fichier existe. Cet article explique comment utiliser la fonction File.Exists en C# pour déterminer si un fichier existe et fournit des exemples de code spécifiques. Référencer l'espace de noms Avant de commencer à écrire du code, vous devez d'abord référencer l'espace de noms System.IO, qui

La différence entre Mysqlon, in, as et Where Réponse : Où les conditions de requête, utilisez-les pour les connexions internes et externes, comme alias, pour demander si une certaine valeur crée 2 tables dans une certaine condition : étudiant, scoresétudiant : score :whereSELECT*FROMstudentWHEREs_sex=' Male'Par exemple : onSELECT*FROMstudentLEFTJOINscoreonstudent.s_id=score.s_id ; combinaison de on etwhere : SELECT*FROMstudentLEFTJOINs ;

Certains utilisateurs ont signalé qu'après l'installation du correctif de mise à jour KB5035853 de mars Win11 de Microsoft, un écran bleu d'erreur de mort s'est produit, avec "ThreadStuckinDeviceDriver" affiché sur la page système. Il est entendu que cette erreur peut être causée par des problèmes de matériel ou de pilote. Voici cinq correctifs qui, espérons-le, résoudront rapidement le problème d’écran bleu de votre ordinateur. Méthode 1 : Exécutez la vérification des fichiers système. Exécutez la commande [sfc/scannow] dans l'invite de commande, qui peut être utilisée pour détecter et réparer les problèmes d'intégrité des fichiers système. Le but de cette commande est d'analyser et de réparer tous les fichiers système manquants ou endommagés, contribuant ainsi à garantir la stabilité du système et son fonctionnement normal. Méthode 2 : 1. Téléchargez et ouvrez « Outil de réparation d'écran bleu »

Dans le développement actuel, la prise en charge multilingue des sites Web ou des applications est devenue une fonctionnalité nécessaire. En tant que framework JavaScript populaire, Vue prend également en charge plusieurs langages. Cet article présentera le schéma et les détails d'implémentation du traitement multilingue dans Vue. Sélection de solutions Il existe de nombreuses solutions de support multilingue, y compris, mais sans s'y limiter, les suivantes : 1.1. Implémentation frontale intégrée de fonctions multilingues sur le front-end, prise en charge via le plug-in vue-i18n. L'introduction du module linguistique correspondant en tant que composant indépendant peut afficher différents

Linux est un système d'exploitation puissant doté de nombreuses commandes et astuces utiles pour vous aider à l'utiliser plus efficacement. 1. Vérifiez la valeur de contrôle du fichier Pendant le processus de copie ou de transmission du fichier, le fichier peut être endommagé ou modifié. Dans ce cas, la valeur de contrôle peut être utilisée pour la vérification. Habituellement, nous devons utiliser certains programmes d'interface fournis par d'autres équipes dans notre travail. Chaque fois que les résultats d'exécution de ces programmes ne sont pas ceux attendus, nous comparerons les valeurs de contrôle md5 des deux parties pour confirmer la cohérence des données. Il existe de nombreuses façons de générer la valeur de contrôle d'un fichier. Les méthodes couramment utilisées incluent la vérification md5sum, la vérification crc, la vérification de somme, etc. Les commandes sont : md5sumfile_namecksumfile_namesum fichier de paramètres d'algorithme

Utilisation de EXISTS dans MYSQL, avec des exemples de code Dans la base de données MYSQL, EXISTS est un opérateur très utile, utilisé pour déterminer si une sous-requête renvoie au moins une ligne de données. Il est généralement utilisé avec une clause WHERE pour filtrer les données qui répondent aux conditions basées sur les résultats d'une sous-requête. Lorsque vous utilisez EXISTS, vous devez faire attention aux points suivants : La condition EXISTS ne se soucie pas des données spécifiques renvoyées par la sous-requête, mais uniquement de savoir si des données sont renvoyées. La condition EXISTS peut être utilisée en combinaison avec d’autres conditions.
