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怎么使用等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)