求教mysql中if exists 的用法

求教mysql中if exists 的用法,第1张

if exists (select from sysdatabases where name = ’数据库名’) drop database [数据库名] if exists (select from sysdatabases where name = ’数据库名’) drop database [数据库名]iF EXISTS(结果集)是指如果存在结果集(结果集的记录数大于0),就执行。就是说:EXISTS(结果集)是一个条件。是IF (条件)中“条件”的一种。

卤煮你好,

答案写法很好,我看了很久才弄明白,但我认为有漏洞,实际应用的话应该需要完善

我先说我的写法,再解释答案的逻辑

我的:

select stsno, stsname

FROM student st

where exists(

select 1 from SC a join Cource b on aCno=bCno where aSno=stSno and

aCno in(3,5,8) having count()=3

)

或者

select stsno, stsname

FROM student st

where exists(

select 1 from SC where Sno=stSno and

Cno in(3,5,8) having count()=3

)

/通过和上面的比较你可以发现其实Cource其实没有作用,但是第一种写法更加严密,因为可以判断SC中的Cno是不是有效的/

-------分割线--------------------------

再来看看这个答案

SELECT studentsno, studentsname

FROM student

WHERE not exists(select coursecno

from course

where coursecno in (3,5,8) and not exists(select

from sc

where studentsno=scsno and coursecno=sccno));

看起来很复杂,我们先来拆分下

因为SQL 的查询和执行是逐条进行的,主体是从Student表中中选数据,我们假设Student中有小明这个人,如何判断小明是不是该出来呢,只要

select coursecno

from course

where coursecno in (3,5,8) and not exists(select

from sc

where ‘小明’=scsno and coursecno=sccno)

这一大坨不返回结果即可,

这一坨

,select coursecno

from course

where coursecno in (3,5,8) and not exists(select

from sc

where ‘小明’=scsno and coursecno=sccno)

意思就比较明确了(我这儿迷糊了好一阵子)

只要小明同时选修了3,5,8那么这段话就不返回结果,所以最终小明就出现了!

/ps题目有个地方我没太看明白,“3且5且8” 是指的是同时选修3,5,8呢还是同时选修3,5,8且只选修这三个。如果是后者这3个写法还要再加一句exists/

----三段写法全部测试通过,卤煮可以尽情测试~要给分啊!!!!!!!!!!!!

select  from student a where exists ( select 1 from student b where bname='张三'and bcollege=acollege)

应该是:

exists

//存在的意思

在sql里面的含义是:判断行是否存在!

select from format where exists (select from format where formatid=1)

如果存在formatid=1的这条记录,那么返回select from format 所有的记录

如果不存在,那么什么都没有!

望好好学习,天天向上!

in是把外表和内表作hash连接,而exists是对外表作loop循环。

确定给定的值是否与子查询或列表中的值相匹配。in在查询的时候,首先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选。所以相对内表比较小的时候,in的速度较快。

具体sql语句如下:

1 SELECT 2     3 FROM 4     `user` 5 WHERE 6     `user`id IN ( 7         SELECT 8             `order`user_id 9         FROM10             `order`

exist是指定一个子查询,检测行的存在。遍历循环外表,然后看外表中的记录有没有和内表的数据一样的。匹配上就将结果放入结果集中。

具体sql语句如下:

1 SELECT 2     `user` 3 FROM 4     `user` 5 WHERE 6     EXISTS ( 7         SELECT 8             `order`user_id 9         FROM10             `order`11         WHERE12             `user`id = `order`user_id

WHERE EXISTS(SELECT TID FROM TEACHER T WHERE TID = STID)

等同于WHERE STID IN(SELECT TID FROM TEACHER)

但exists的效率要高很多 你原来那句相当于没有任何关联关系 所以相当于

SELECT SNAME FROM STUDENT S 不懂hi我

两者都能实现表功能查询,主要区别如下:

1、适用表的类型不同。

in是子查询为驱动表,外面的表为被驱动表,故适用于子查询结果集小而外面的表结果集大的情况。

exists是外面的表位驱动表,子查询里面的表为被驱动表,故适用于外面的表结果集小而子查询结果集大的情况。

2、子查询关联不同。

exists一般都是关联子查询。对于关联子查询,必须先执行外层查询,接着对所有通过过滤条件的记录,执行内层查询。外层查询和内层查询相互依赖,因为外层查询会把数据传递给内层查询。

in则一般都是非关联子查询,非关联子查询则必须先完成内层查询之后,外层查询才能介入。

3、执行次数不同。

IN 语句:只执行一次,确定给定的值是否与子查询或列表中的值相匹配。in在查询的时候,首先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选。所以相对内表比较小的时候,in的速度较快。

EXISTS语句:执行次数根据表的长度而定。指定一个子查询,检测行的存在。遍历循环外表,然后看外表中的记录有没有和内表的数据一样的。匹配上就将结果放入结果集中。

参考资料来源:百度百科--In *** 作符

参考资料来源:百度百科--Exists

1exist,notexist一般都是与子查询一起使用In可以与子查询一起使用,也可以直接in(a,b)\x0d\\x0d\2exist会针对子查询的表使用索引notexist会对主子查询都会使用索引in与子查询一起使用的时候,只能针对主查询使用索引notin则不会使用任何索引注意,一直以来认为exists比in效率高的说法是不准确的。\x0d\in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。\x0d\如果查询的两个表大小相当,那么用in和exists差别不大。\x0d\如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in:\x0d\例如:表A(小表),表B(大表)1:selectfromAwhereccin(selectccfromB)\x0d\效率低,用到了A表上cc列的索引;selectfromAwhereexists(selectccfromBwherecc=Acc)\x0d\效率高,用到了B表上cc列的索引。\x0d\相反的2:selectfromBwhereccin(selectccfromA)\x0d\效率高,用到了B表上cc列的索引;selectfromBwhereexists(selectccfromAwherecc=Bcc)\x0d\效率低,用到了A表上cc列的索引。\x0d\notin和notexists如果查询语句使用了notin那么内外表都进行全表扫描,没有用到索引;而notextsts的子查询依然能用到表上的索引。所以无论那个表大,用notexists都比notin要快。\x0d\3exist与in都可以实现一个目的二者都可以用来过滤数据\x0d\示例:\x0d\\x0d\selectcount(1)fromt1;--160W\x0d\selectcount(1)fromt2;--90W\x0d\\x0d\SELECTcount(1)\x0d\FROMt1a\x0d\WHEREEXISTS(SELECTaccountid\x0d\FROMt2b\x0d\WHEREakeyid=bkeyidANDaideaid=bideaid);--主大子小,不适合使用exist,因为exist只会利用子表t2的复合索引keyid+ideaid,而子表内容要小与主表,主表由于无法使用索引,查询效率低下\x0d\\x0d\selectcount(1)fromt1awhereaccountidin(SELECTaccountid\x0d\FROMt2b\x0d\WHEREakeyid=bkeyidANDaideaid=bideaid);--主大子小,适合用in,因为in只会使用主表t1里面的复合主键keyid-ideaid,在主表大于子表的情况下,会很好的利用主表的索引\x0d\\x0d\--后二条sql的执行结果都是一样的说明exist与in在用法上可以达到一个目的,不同的地方是\x0d\--1性能的考虑此时就按子表大主表小用exist,子表小主表大用in的原则就可以\x0d\--2写法的不同,exist的where条件是:"whereexist(whereaid=bid)"\x0d\--in的where条件是:"whereidin(selectidwhereaid=bid)"\x0d\\x0d\4exist的原理:\x0d\exists做为where条件时,是先对where前的主查询询进行查询,然后用主查询的结果一个一个的代入exists的查询进行判断,如果为真则输出当前这一条主查询的结果,否则不输出\x0d\比如\x0d\如下:\x0d\表A\x0d\IDNAME\x0d\1A1\x0d\2A2\x0d\3A3\x0d\\x0d\表B\x0d\IDAIDNAME\x0d\11B1\x0d\22B2\x0d\32B3\x0d\\x0d\表A和表B是一对多的关系AID-->BAID\x0d\\x0d\SELECTID,NAMEFROMAWHEREEXISTS(SELECTFROMBWHEREAID=BAID)\x0d\执行结果为\x0d\1A1\x0d\2A2\x0d\原因可以按照如下分析\x0d\SELECTID,NAMEFROMAWHEREEXISTS(SELECTFROMBWHEREBAID=1)\x0d\-->SELECTFROMBWHEREBAID=1有值返回真所以有数据\x0d\\x0d\SELECTID,NAMEFROMAWHEREEXISTS(SELECTFROMBWHEREBAID=2)\x0d\-->SELECTFROMBWHEREBAID=2有值返回真所以有数据\x0d\\x0d\SELECTID,NAMEFROMAWHEREEXISTS(SELECTFROMBWHEREBAID=3)\x0d\-->SELECTFROMBWHEREBAID=3无值返回真所以没有数据\x0d\\x0d\NOTEXISTS就是反过来\x0d\SELECTID,NAMEFROMAWHERENOTEXIST(SELECTFROMBWHEREAID=BAID)\x0d\执行结果为\x0d\3A3\x0d\5in与=的区别\x0d\selectnamefromstudentwherenamein('zhang','wang','li','zhao');\x0d\与\x0d\selectnamefromstudentwherename='zhang'orname='li'orname='wang'orname='zhao'\x0d\的结果是相同的。\x0d\in的字段也可以与其它字段建复合索引\x0d\比如\x0d\T1包含下面key,accountd,groupid\x0d\\x0d\SELECT\x0d\FROMT1a\x0d\WHEREagroupid=2001\x0d\ANDaaccountid=1001\x0d\ANDakeyIN('abc','def','ala');\x0d\\x0d\--上面的sql可以将accountid,key建成复合索引

以上就是关于求教mysql中if exists 的用法全部的内容,包括:求教mysql中if exists 的用法、数据库语言关于not exist的用法、数据库中select语句的存在量词exists怎么使用等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/10194893.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存