求教mysql中if exists 的用法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求教mysql中if exists 的用法相关的知识,希望对你有一定的参考价值。

if exists (select * from sys.databases where name = 'new_database_name')
use new_database_name

IF EXISTS(结果集)是指如果存在结果集(结果集的记录数大于0)就执行。

参考技术A drop table if exists 表名;
drop database if exists 数据库名;

MySQL exists 原理/用法

执行过程

IN的执行过程如下:
  1.首先运行子查询,获取子结果集
  2.主查询再去结果集里去找符合要求的字段列表,.符合要求的输出,反之则不输出。

Exists执行顺序如下: 
  1.首先执行一次外部查询 
  2.对于外部查询中的每一行分别执行一次子查询,而且每次执行子查询时都会引用外部查询中当前行的值。 
  3.使用子查询的结果来确定外部查询的结果集。(如果外部查询返回100行,SQL   就将执行101次查询,一次执行外部查询,然后为外部查询返回的每一行执行一次子查询。但实际上,SQL的查询 优化器有可能会找到一种更好的方法来执行相关子查询,而不需要实际执行101次查询。)

exists

查询时,一般情况下,子查询会分成两种情况:     
1.子查询与外表的字段有关系时
select 字段1 , 字段2 from 表1 where exists (select 字段1 , 字段2 from 表2 where 表2.字段2 = 表1.字段2)
这时候,此SQL语句相当于一个关联查询。
它先执行表1的查询,然后把表1中的每一条记录放到表2的条件中去查询,如果存在,则显示此条记录。

2.子查询与外表的字段没有任何关联
Select 字段1 , 字段2 from 表1 where exists ( select * from 表2 where 表2.字段 = ‘ 条件‘)
只要子查询的结果大于等于1行,就会查询出外部主表中的所有记录,如果子查询中没有查询到记录(结果为空),则外部主表的结果也为空;
当子查询与主表不存在关联关系时,简单认为只要exists为一个条件判断,如果为true,就输出所有记录。如果为false则不输出任何的记录。

适用场景

IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。

表A(大表),表B(小表):
select * from A where cc in (select cc from B)效率高,用到了A表上cc列的索引;

表A(小表),表B(大表):
select * from A where exists (select cc from B where B.cc=A.cc) 效率高,用到了B表上cc列的索引。


[select * from A where cc in (select cc from B);]适用于A是大表,B是小表;如果B是小表,会很快查询出B的结果集,然后代入外部查询。当A是大表时,可以使用A.cc字段的索引,查询效率也会比较高;
[select * from A where exists (select cc from B where B.cc=A.cc)]适用于A是小表,B是大表。先查询出A的一条记录,然后去B中做关联查询,如果有关联结果,则把A的该行记录加入结果集,如果没有关联结果,则丢弃A的该行记录;然后如此循环,继续查询和处理A的下一行记录。可以使用B.cc字段的索引,查询效率也会比较高;

https://programskills.blog.csdn.net/article/details/122565972 题目

SQL 语句查询Exists原理_一个人的博客-CSDN博客_exist原理 很好!!

Mysql之IN 和 Exists 用法 - 叼烟斗的纤夫 - 博客园
SQL中EXISTS的用法_JobShow裁员加班实况-微信小程序-CSDN博客

以上是关于求教mysql中if exists 的用法的主要内容,如果未能解决你的问题,请参考以下文章

求教SQL语句substring的用法

求教 document.getElementById 的用法

求教c语言中fgets的用法

求教c语言中switch 语句的详细用法

jquery中使用el表达式的问题,求教

求教:C语言中__int64 的详细作用,用法