文档库 最新最全的文档下载
当前位置:文档库 › SQL中EXISTS,NOT EXISTS的用法

SQL中EXISTS,NOT EXISTS的用法

SQL中EXISTS,NOT EXISTS的用法

EXISTS或者NOT EXISTS是把主查询的字段传到后边的查询中作为条件,返回值是TRUE或者FALSE。EXISTS TRUE,那么就是查询条件成立,结果会显示出来。NOT EXISTS TRUE,则为FALSE,查询连接条件不成立。

select * from course where not exists(select * from grade where grade.课程代号=course.课程代号)

这个语句,是查询course表中课程代号在grade中没有出现的数据。

看看grade表,课程编号有K01到K06,而COURSE表,有K01到K07,那么K07在GRADE表是不存在的,那么,是符合条件的。

同样select * from course where exists(select * from grade where grade.课程代号=course.课程代号)

则是查询COURSE的记录条件为编号在GRADE中存在。那么很明显,结果是K01到K06的数据。另外,EXISTS和NOT EXISTS的作用可以用IN或NOT IN实现,但是,效率要高。因为EXISTS 和NOT EXISTS返回的结果是TRUE或者FALSE,那么则在子查询中,遇到第一个符合条件的结果,就会退出查询,而不会进行全表的检索。而NOT IN或者IN,要把子查询中的SELECT 字句全部查询出来才行。

exists的使用(查询选择了所有课程的学生信息)

如何理解多个exists sql(查询选修了全部课程的学生姓名) 查询选修了全部课程的学生姓名 student、sc、course 三张表查询如下: 注:exists是用来判断是否存在的,当exists(查询)中的查询存在结果时则返回真,否则返回假。not exists则相反。 exists做为where 条件时,是先对where 前的主查询询进行查询,然后用主查询的结果一个一个的代入exists的查询进行判断,如果为真则输出当前这一条主查询的结果,否则不输出。 解一: select sname from student where not exists (select * from course wher e not exists (select * from sc where cno = https://www.wendangku.net/doc/6a6723254.html,o and sno=student.s no)) 上面这个列子,先查询出student表的结果,然后将结果代入到student.sno然后再查询出c表中的结果,再一条一条的代入,感觉有点像for的嵌套循环,第一轮外循环中,满足内部的not exists条件的course表中的结果集被保留,然后再判断外部的not exists,这次判断是根据内部Course表中被保留的结果集的情况,如果结果集为空,则输出当前这一条S表的结果集;然后再进行第二轮大的循环,即取出student表的第二条结果代入运算。 以上的sql还可以这样理解,最内部的 select * from sc where cno = https://www.wendangku.net/doc/6a6723254.html,o and sno=student.sno是查询出所有已经选择过课程的学生及相应课程,select * fro m course where not exists 则是所有没有被选择的课程,在这个基础上的select s name from student where not exists 则是选取所有没有未选择课程的学生,即选择了所有课程的学员名称。 解二:

EXISTS解释

我们要了解一下SQL语句的执行过程。 SELECT 字段 FROM 表名 WHERE 条件表达式 那它们是按什么顺序执行呢?分析器会先看语句的第一个词,当它发现第一个词是SELECT关键字的时候,它会跳到FROM关键字,然后通过FROM关键字找到表名并把表装入内存。接着是找WHERE关键字,如果找不到则返回到SELECT找字段解析,如果找到WHERE,则分析其中的条件,完成后再回到SELECT分析字段。最后形成一张我们要的虚表。 其它的先不说了,只说WHERE。 WHERE关键字后面的是条件表达式。如果学过C语言等编程语言就会知道,条件表达式计算完成后,会有一个返回值,即非0或0,非0即为真(true),0即为假(false)。同理WHERE后面的条件也有一个返回值,真或假,来确定接下来执不执行SELECT。 例: SELECT * FROM STUDENT WHERE SNO = '1'; 分析器先找到关键字SELECT,然后跳到FROM关键

字将STUDENT表导入内存,并通过指针p1找到第一条记录,接着找到WHERE关键字计算它的条件表达式,如果为真那么把这条记录装到一个虚表当中,p1再指向下一条记录。如果为假那么p1直接指向下一条记录,而不进行其它操作。一直检索完整个表,关把虚表返回给用户。 再说EXISTS谓词,EXISTS谓词也是条件表达式的一部分。当然它也有一个返回值(true或false)。 例: SELECT Sname FROM Student WHERE EXISTS (SELECT * FROM SC WHERE SC.Sno = Student.Sno AND https://www.wendangku.net/doc/6a6723254.html,o = '1'); 这是一个SQL语句的嵌套使用,但和上面说的SQL语句的执行过程也是相同的。嵌套的意思也就是说当分析主SQL语句(外面的那个SELECT,我们权且先这么叫它)到WHERE关键字的时候,又进入了另一个SQL语句中。那么也就是说,分析器先找到表Student并装入内存,一个指针(例如p1)指向Student表中的第一条记录。然后进入WHERE里分析里面的SQL语句,再把SC表装入内存,另一个指针(例如p2)指向SC表中的第一条记录,分析WHERE

List 基本用法总结

C#泛型列表List基本用法总结 朱先忠 示例代码如下: namespace SampleListT { class Program { static void Main(string[] args) { //using System.Collections.Generic; 命名空间中的List //using System.Collections;命名空间中的ArrayList //都实现了列表集合,一个是泛形集合,一个是非泛型的 //下面我们将Person对象加到集合中 Person p1 = new Person( "aladdin" , 20 ); Person p2 = new Person("zhao", 10); Person p3 = new Person("jacky", 40); //如果不制定list的容器大小,默认是0,只要有元素加入是,会自动扩展到4,如果第5个元素加 入时,就变成了8,第9个加入,就成16 //可以看出,总是成倍的增长,扩展时要重新开辟内存,这样会影响效率,如果事先知道元素个 数,或者可能个数,最好给个尽量大的权衡值 //我们加入3个元素,设容器大小为4.注:设为4不是指只能放4个元素,如果超出,一样也会成倍扩展,这样做只是为了尽量扩展带来的开销 List list = new List(4); list.Add(p1); list.Add(p2); list.Add(p3);

//本方法是清除多于的没有用的内存空间,例:如果开辟大小为100,而我们只用了4个,其余 的放着,是不是很浪费 //本方法调用时会检查元素个数是不是占到了容器大小的90%以上,如果是,则不进行回收. list.TrimExcess(); //ArrayList方法与List<>用法一样,不同的是,它是对象集合,参数是Object这样会有装箱拆 箱的可能,尽量用List<> //本处不再做演示 // 1 初始化集合器 // C#3.0开始,提供了初始化功能,但是并没有反应到IL代码中,在IL中,一样也是把个转 化成ADD方法来调用 List l2 = new List() { 1 ,2 ,3 ,4 ,5 }; // 2 添加元素AddRange() 本方法可以一次性添加一批对象 List lists = new List(10); //参数是一个必须可能跌代的对象,也可是数组 list.AddRange( new Person[] { new Person( "aladdin" ,20) , new Person("zhao",6)}); //构造传入批量参数,与AddRange效果一样 List mylist = new List(new Person[] { new Person( "aladdin" ,20) , new Person("zhao",6)}); // 3 插入元素 // 使用Insert()方法,可以在指定位置插入元素 // 例我们在1位置插入则最后变成了aladdin jacky zhao..插入意思就是,这个位我占了,以前 占这位的和他之后的,通通往后移一位 mylist.Insert( 1 , new Person( "jacky" , 88 ));

Oracle SQL NOT EXISTS用法

Oracle SQL NOT EXISTS用法 (1)查询所有未选修“19980201”号课程的学生姓名和班号。 SELECT Sname,classno FROM Student WHERE NOT EXISTS (SELECT * FROM SC WHERE Sno=Student.Sno AND schoolno ='19980201') 运行结果如图所示。 (2)查询选修了全部课程的学生姓名和班号。 分析:本例可转为查询没有一门课程不选的学生姓名和班号,代码如下: SELECT Sname,classno FROM Student WHERE NOT EXISTS (SELECT * FROM Sc WHERE NOT EXISTS (SELECT * FROM school WHERE NOT EXISTS (SELECT * FROM Course WHERE Cno=https://www.wendangku.net/doc/6a6723254.html,o AND school.Schoolno=sc.Schoolno AND sc.Sno=Student.Sno))); 运行结果如图所示。 NOT EXISTS用法(1)NOT EXISTS用法(2) (3)查询至少选修了学生19980001选修的全部课程的学生编号和姓名。 分析:本题的查询要求可做如下解释,查询这样的学生,凡是19980001选修的课,他都选修了;换句话说,若有一个学号为x的学生,对所有课程y,只要学号为19980001的学生选修了课程y,则x也选修了y;那么就将他的学号选出来。 SELECT DISTINCT sno FROM SC SCX WHERE NOT EXISTS (SELECT * FROM SC SCY WHERE SCY .Sno='19980002' AND NOT EXISTS (SELECT * FROM SC SCZ WHERE SCZ .Sno= SCX .Sno AND SCZ.Schoolno=SCY.Schoolno)); 运行结果如图所示。 NOT EXISTS用法(3)

SQL中exist与in的区别

SQL中exist与in的区别 in 是一个集合运算符. a in {a,c,d,s,d....} P105例子 这个运算中,前面是一个元素,后面是一个集合,集合中的元素类型是和前面的元素一样的. 而exists是一个存在判断,如果后面的查询中有结果,则exists为真,否则为假. in 运算用在语句中,它后面带的select 一定是选一个字段,而不是select *. 比如说你要判断某班是否存在一个名为"小明"的学生,你可以用in 运算: "小明" in (select sname from student) 这样(select sname from student) 返回的是一个全班姓名的集合,in用于判断"小明"是否为此集合中的一个数据; 同时,你也可以用exists语句: exists (select * from student where sname="小明") select * from 表A where exists(select * from 表B where 表B.id=表A.id) 这句相当于 select * from 表A where id in (select id from 表B) 对于表A的每一条数据,都执行select * from 表B where 表B.id=表A.id的存在性判断,如果表B中存在表A当前行相同的id,则exists为真,该行显示,否则不显示 区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询 IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。

with用法

介詞with用法詳解 是一個十分有用的介詞,其用法也比較複雜,以下用法值得注意: 1. 表示方式、手段或工具等時(=以,用),注意不要受漢語意思的影響而用錯搭配,如「用英語」習慣上用in English,而不是with English。 2. 與某些抽像名詞連用時,其作用相當於一個副詞。如: with care=carefully 認真地 with kindness=kindly 親切地 with joy=joyfully 高興地 with anger=angrily 生氣地 with sorrow=sorrowfully 悲傷地 with ease=easily 容易地 with delight=delightedly 高興地 with great fluency =very fluently 很流利地 3. 表示條件時,根據情況可與虛擬語氣連用。如: With more money I would be able to buy it. 要是錢多一點,我就買得起了。 With better equipment, we could have finished the job even sooner. 要是設備好些,我們完成這項工作還要快些。 4. 比較with和as:兩者均可表示「隨著」,但前者是介詞,後接名詞或代詞;後者是連詞,用於引導一個句子。比較: He will improve as he grows older. 隨著年齡的增長,他會進步的。

People’s ideas change with the change of the times. 時代變了,人們的觀念也會變化。 5. 復合結構「with+賓語+賓語補足語」是一個很有用的結構,它在句中主要用作狀語,表示伴隨、原因、時間、條件、方式等;其中的賓語補足語可以是名詞、形容詞、副詞、現在分詞、過去分詞、不定式、介詞短語等。如: (1) with+賓語+形容詞 He often sleeps with the windows open. 他常開著窗睡覺。 Don’t speak with your mouth full. 不要滿嘴巴食物說話。 (2) with+賓語+ 副詞 He stood before his teacher with his head down. 他低著頭站在老師面前。 He was lying on the bed with all his clothes on. 他和衣躺在床上。 (3) with +賓語+ 介詞短語 She said good-bye with tears in her eyes. 她含著眼淚說了聲再見。 The man was asleep with his head on his arms. 這個人頭枕著胳膊睡著了。 (4) with+賓語+現在分詞 He fell asleep with the lamp burning. 他沒熄燈就睡著了。 I won’t be able to go on holiday with my mother being ill. 因為媽媽有病, 我無 法去度假。 (5) with +賓語+ 過去分詞 He sat there with his eyes closed. 他閉目坐在那兒。 All the afternoon he worked with the door locked. 整個下午他都鎖著門在房裡

oracle中的exists 和not exists 用法

oracle中的exists 和not exists 用法 有两个简单例子,以说明“exists”和“in”的效率问题 Java代码 1) select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ; T1数据量小而T2数据量非常大时,T1<>T2 时,2) 的查询效率高。 class=java style="DISPLAY: none" name="code"1) select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ; T1数据量小而T2数据量非常大时,T1<>T2 时,2) 的查询效率高。 exists 用法: 请注意1)句中的有颜色字体的部分,理解其含义; 其中 Java代码 “select 1 from T2 where T1.a=T2.a” class=java style="DISPLAY: none" name="code"“select 1 from T2 where T1.a=T2.a”相当于一个关联表查询,相当于

Java代码 “select 1 from T1,T2 where T1.a=T2.a” class=java style="DISPLAY: non e" name="code"“select 1 from T1,T2 where T1.a=T2.a” 但是,如果你当当执行1)句括号里的语句,是会报语法错误的,这也是使用exists需要注意的地方。 “exists(xxx)”就表示括号里的语句能不能查出记录,它要查的记录是否存在。 因此“select 1”这里的“1”其实是无关紧要的,换成“*”也没问题,它只在乎括号里的数据能不能查找出来,是否存在这样的记录,如果存在,这1)句的where 条件成立。 in 的用法: 继续引用上面的例子 Java代码 select * from T1 where T1.a in (select T2.a from T2) ” class=java style="DISPLAY: none" name="code"select * from T1 where T1.a in (select T2.a from T2) ” 这里的“in”后面括号里的语句搜索出来的字段的内容一定要相对应,一般来说,T1和T2这两个表的a字段表达的意义应该是一样的,否则这样查没什么意义。 打个比方:T1,T2表都有一个字段,表示工单号,但是T1表示工单号的字段名叫“ticketid”,T2则为“id”,但是其表达的意义是一样的,而且数据格式也是一样的。这时,用2)的写法就可以这样: Java代码 “select * from T1 where T1.ticketid in (select T2.id from T2) ” Select name from employee where name not in (select name from student); Select name from employee where not exists (select name from student); class=java style="DISPLA Y: none" name="code"“select * from T1 where T1.ticketid in (select T2.id from T2) ”

重要单词用法

bid/b?d/CET4 TEM4( bidding, bids ) 1. N-COUNT A bid for something or a bid to do something is an attempt to obtain it or do it. 努力尝试[journalism]例: ...Sydney's successful bid for the 2000 Olympic Games. …悉尼对2000年奥林匹克运动会成功的申办。 2. N-COUNT A bid is an offer to pay a particular amount of money for something that is being sold. 出价 例: Hanson made an agreed takeover bid of $351 million. 汉森按约定出价3.51亿美元进行收购。 3. V-T/V-I If you bid for something or bid to do something, you try to obtain it or do it. 力求获得; 努力争取 例: Singapore Airlines is rumoured to be bidding for a management contract to run both airports. 据传,新加坡航空公司正在努力争取这两个机场的管理合约。 4. V-I If you bid for something that is being sold, you offer to pay a particular amount of money for it. 出价 例: She wanted to bid for it. 她想出价买下它。 例: The bank announced its intention to bid. 银行宣布了其投标意向。 blunder/?bl?nd?/CET6 TEM8( blundering, blundered, blunders ) 1. N-COUNT A blunder is a stupid or careless mistake. 愚蠢错误 例: I think he made a tactical blunder by announcing it so far ahead of time. 我认为他如此提早宣布消息是犯了战术上的错误。 2. V-I If you blunder, you make a stupid or careless mistake. 犯愚蠢错误 例: No doubt I had blundered again. 不用说我又犯了个蠢错。 3. V-I If you blunder into a dangerous or difficult situation, you get involved in it by mistake. 误入(危险境地或困境) 例: People wanted to know how they had blundered into war, and how to avoid it in the future. 人们想弄清他们怎么会错误地卷入战争,将来如何才能避免这样的事。 4. V-I If you blunder somewhere, you move there in a clumsy and careless way. 跌跌撞撞地走 例: He had blundered into the table, upsetting the flowers. 他撞上了桌子,打翻了花。 cater/?ke?t?/CET6 TEM4( catering, catered, caters )

SQL 里的 EXISTS与in、not exists与not in

SQL 里的EXISTS与in、not exists与not in 2011-01-07 10:01:25| 分类:sql | 标签:|字号大中小订阅 系统要求进行SQL优化,对效率比较低的SQL进行优化,使其运行效率更高,其中要求对SQL中的部分in/not in修改为exists/not exists 修改方法如下: in的SQL语句 SELECT id, category_id, htmlfile, title, convert(varchar(20),begintime,112) as pubtime FROM tab_oa_pub WHERE is_check=1 and category_id in (select id from tab_oa_pub_cate where no='1') order by begintime desc 修改为exists的SQL语句 SELECT id, category_id, htmlfile, title, convert(varchar(20),begintime,112) as pubtime FROM tab_oa_pub WHERE is_check=1 and exists (select id from tab_oa_pub_cate where tab_oa_pub.category_id=convert(int,no) and no='1') order by begintime desc 分析一下exists真的就比in的效率高吗? 我们先讨论IN和EXISTS。 select * from t1 where x in ( select y from t2 ) 事实上可以理解为: select * from t1, ( select distinct y from t2 ) t2 where t1.x = t2.y; ——如果你有一定的SQL优化经验,从这句很自然的可以想到t2绝对不能是个大表,因为需要对t2进行全表的“唯一排序”,如果t2很大这个排序的性能是不可忍受的。但是t1可以很大,为什么呢?最通俗的理解就是因为t1.x=t2.y可以走索引。但这并不是一个很好的解释。试想,如果t1.x和t2.y都有索引,我们知道索引是种有序的结构,因此t1和t2之间最佳的方案是走merge join。另外,如果t2.y上有索引,对t2的排序性能也有很大提高。 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 ——这个更容易理解,t1永远是个表扫描!因此t1绝对不能是个大表,而t2可以很大,因为y=x.x可以走t2.y的索引。 综合以上对IN/EXISTS的讨论,我们可以得出一个基本通用的结论:IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。 我们要根据实际的情况做相应的优化,不能绝对的说谁的效率高谁的效率低,所有的事都是

with用法

with结构是许多英语复合结构中最常用的一种。学好它对学好复合宾语结构、不定式复合结构、动名词复合结构和独立主格结构均能起很重要的作用。本文就此的构成、特点及用法等作一较全面阐述,以帮助同学们掌握这一重要的语法知识。 一、with结构的构成 它是由介词with或without+复合结构构成,复合结构作介词with或without的复合宾语,复合宾语中第一部分宾语由名词或代词充当,第二部分补足语由形容词、副词、介词短语、动词不定式或分词充当,分词可以是现在分词,也可以是过去分词。With结构构成方式如下: 1. with或without-名词/代词+形容词; 2. with或without-名词/代词+副词; 3. with或without-名词/代词+介词短语; 4. with或without-名词/代词+动词不定式; 5. with或without-名词/代词+分词。 下面分别举例: 1、She came into the room,with her nose red because of cold.(with+名词+形容词,作伴随状语) 2、With the meal over ,we all went home.(with+名词+副词,作时间状语) 3、The master was walking up and down with the ruler under his arm。(with+名词+介词短语,作伴随状语。)The teacher entered the classroom with a book in his hand. 4、He lay in the dark empty house,with not a man ,woman or child to say he was kind to me.(with+名词+不定式,作伴随状语)He could not finish it without me to help him.(without+代词+不定式,作条件状语) 5、She fell asleep with the light burning.(with+名词+现在分词,作伴随状语) 6、Without anything left in the cupboard,she went out to get something to eat.(without+代词+过去分词,作为原因状语) 二、with结构的用法 在句子中with结构多数充当状语,表示行为方式,伴随情况、时间、原因或条件(详见上述例句)。

EXISTS的用法

EXISTS 指定一个子查询,检测行的存在。 语法 EXISTS subquery 参数 subquery 是一个受限的SELECT 语句(不允许有COMPUTE 子句和INTO 关键字)。有关更多信息,请参见SELECT 中有关子查询的讨论。 结果类型 Boolean 结果值 如果子查询包含行,则返回TRUE。 示例 A. 在子查询中使用NULL 仍然返回结果集 这个例子在子查询中指定NULL,并返回结果集,通过使用EXISTS 仍取值为TRUE。 USE Northwind GO SELECT CategoryName FROM Categories WHERE EXISTS (SELECT NULL) ORDER BY CategoryName ASC GO B. 比较使用EXISTS 和IN 的查询 这个例子比较了两个语义类似的查询。第一个查询使用EXISTS 而第二个查询使用IN。注意两个查询返回相同的信息。 USE pubs GO SELECT DISTINCT pub_name FROM publishers WHERE EXISTS (SELECT * FROM titles WHERE pub_id = publishers.pub_id AND type = 'business')

GO -- Or, using the IN clause: USE pubs GO SELECT distinct pub_name FROM publishers WHERE pub_id IN (SELECT pub_id FROM titles WHERE type = 'business') GO 下面是任一查询的结果集: pub_name ---------------------------------------- Algodata Infosystems New Moon Books (2 row(s) affected) C.比较使用EXISTS 和= ANY 的查询 本示例显示查找与出版商住在同一城市中的作者的两种查询方法:第一种方法使用= ANY,第二种方法使用EXISTS。注意这两种方法返回相同的信息。 USE pubs GO SELECT au_lname, au_fname FROM authors WHERE exists (SELECT * FROM publishers WHERE authors.city = publishers.city) GO -- Or, using = ANY USE pubs GO SELECT au_lname, au_fname FROM authors WHERE city = ANY

数据库SQL经典语句(包含几乎所有的经典操作语言)

1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用) 法一:select * into b from a where 1<>1 法二:select top 0 * into b from a 2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用) insert into b(a, b, c) select d,e,f from b; 3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用) insert into b(a, b, c) se lect d,e,f from b in …具体数据库? where 条件 例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where.. 4、说明:子查询(表名1:a 表名2:b) select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3) 5、说明:显示文章、提交人和最后回复时间 select a.title,https://www.wendangku.net/doc/6a6723254.html,ername,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b 6、说明:外连接查询(表名1:a 表名2:b) select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c 7、说明:在线视图查询(表名1:a ) select * from (SELECT a,b,c FROM a) T where t.a > 1; 8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括 select * from table1 where time between time1 and time2 select a,b,c, from table1 where a not between 数值1 and 数值2 9、说明:in 的使用方法 select * from table1 where a [not] in (…值1?,?值2?,?值4?,?值6?) 10、说明:两张关联表,删除主表中已经在副表中没有的信息 delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 ) 11、说明:四表联查问题: select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d wher e ..... 12、说明:日程安排提前五分钟提醒 sql: select * from 日程安排where datediff('minute',f开始时间,getdate())>5

oracle中的exists 和not exists 用法详解

有两个简单例子,以说明“exists”和“in”的效率问题 1) select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ; T1数据量小而T2数据量非常大时,T1<>T2 时,2) 的查询效率高。 exists 用法: 请注意1)句中的有颜色字体的部分,理解其含义; 其中“select 1 from T2 where T1.a=T2.a”相当于一个关联表查询,相当于 “select 1 from T1,T2 where T1.a=T2.a” 但是,如果你当当执行1)句括号里的语句,是会报语法错误的,这也是使用exists需要注意的地方。 “exists(xxx)”就表示括号里的语句能不能查出记录,它要查的记录是否存在。 因此“select 1”这里的“1”其实是无关紧要的,换成“*”也没问题,它只在乎括号里的数据能不能查找出来,是否存在这样的记录,如果存在,这1)句的where 条件成立。 in 的用法: 继续引用上面的例子 “2) select * from T1 where T1.a in (select T2.a from T2) ” 这里的“in”后面括号里的语句搜索出来的字段的内容一定要相对应,一般来说,T1和T2这两个表的a字段表达的意义应该是一样的,否则这样查没什么意义。 打个比方:T1,T2表都有一个字段,表示工单号,但是T1表示工单号的字段名叫“ticketid”,T2则为“id”,但是其表达的意义是一样的,而且数据格式也是一样的。这时,用2)的写法就可以这样: “select * from T1 where T1.ticketid in (select T2.id from T2) ” Select name from employee where name not in (select name from student);

SQL判断是否存在表或字段的语句

sql server 判断是否存在数据库,表,列,视图 1 判断数据库是否存在 if exists (select * from sys.databases where name = '数据库名') drop database [数据库名] 2 判断表是否存在 if exists (select * from sysobjects where id = object_id(N'[表名]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [表名] 3 判断存储过程是否存在 if exists (select * from sysobjects where id = object_id(N'[存储过程名]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) drop procedure [存储过程名] 4 判断临时表是否存在 if object_id('tempdb..#临时表名') is not null drop table #临时表名 5 判断视图是否存在 --判断是否存在'MyView52'这个试图 IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = N'MyView52') PRINT '存在' else PRINT '不存在' 6 判断函数是否存在 -- 判断要创建的函数名是否存在 if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[函数名]') and xtype in (N'FN', N'IF', N'TF')) drop function [dbo].[函数名] 7 获取用户创建的对象信息 SELECT [name],[id],crdate FROM sysobjects where xtype='U'

常见字典用法集锦及代码详解(全)_蓝桥玄霜

常见字典用法集锦及代码详解 蓝桥玄霜

常见字典用法集锦及代码详解 前言 凡是上过学校的人都使用过字典,从新华字典、成语词典,到英汉字典以及各种各样数不胜数的专业字典,字典是上学必备的、经常查阅的工具书。有了它们,我们可以很方便的通过查找某个关键字,进而查到这个关键字的种种解释,非常快捷实用。 凡是上过EH 论坛的想学习VBA 里面字典用法的,几乎都看过研究过northwolves 狼版主、oobird 版主的有关字典的精华贴和经典代码。我也是从这里接触到和学习到字典的,在此,对他们表示深深的谢意,同时也对很多把字典用得出神入化的高手们致敬,从他们那里我们也学到了很多,也得到了提高。 字典对象只有 4 个属性和 6 个方法,相对其它的对象要简洁得多,而且容易理解使用方便,功能强大,运行速度非常快,效率极高。深受大家的喜爱。 本文希望通过对一些字典应用的典型实例的代码的详细解释来给初次接触字典和想要进一步了解字典用法的朋友提供一点备查的参考资料,希望大家能喜欢。 给代码注释估计是大家都怕做的,因为往往是出力不讨好的,稍不留神或者自己确实理解得不对,还会贻误他人。所以下面的这些注释如果有不对或者不妥当的地方,请大家跟帖时指正批评,及时改正。 字典的简介 字典(Dictionary )对象是微软Windows 脚本语言中的一个很有用的对象。 附带提一下,有名的正则表达式(RegExp )对象和能方便处理驱动器、文件夹和文件的(FileSystemObject )对象也是微软Windows 脚本语言中的一份子。 字典对象相当于一种联合数组,它是由具有唯一性的关键字(Key)和它的项(Item )联合组成。就好像一本字典书一样,是由很多生字和对它们对应的注解所组成。比如字典的“典”字的解释是这样的: 典”字就是具有唯一性的关键字,后面的解释就是它的项,和“典”字联合组成一对数据。 常用关键字英汉对照: Dictionary 字典 Key 关键字 Item 项,或者译为条目 字典对象的方法有 6 个:Add 方法、Keys 方法、Items 方法、Exists 方法、Remove 方法、RemoveAll 方法。 Add 方法 向Dictionary 对象中添加一个关键字项目对。 object.Add (key, item) 参数 object 2

sql in excel:exists学习以及in、链接

sql in excel:exists学习以及in、链接 数据源:a表: b表:要求:提取b表中公司名称在a表中没有的数据,也就是b表独有的公司的数据。对比两表,黄色数据为结果:sql语句:select 公司,金额from [sheet2$] b where not exists (select 公司from [sheet1$] a where a.公司=b.公司)解释:exists可以按字面意思理解为存在。此题目思路是:1、提取b表和a表中公司名称相同的数据。①:(select 公司from [sheet1$] a where a.公司=b.公司)这个是子查询内层,查询a 表和b表都共有的相同名称的公司。2、用exists判断,如果b表的数据(公司)不存在(not exists)于步骤1子查询中,那么该数据存在,返回true,否则返回false。注释:sql中带有exists的子查询不返回任何数据,只返回true或者false。所以,外层的sql语句:select 公司,金额from [sheet2$] b where not exists 在遍历子查询对比的时候,用exists自动监测b表中的公司名称,是否存在于内层的子查询①当中,如果数据(公司名称)存在,则返回true,否则返回fasle。在exists前面加上not,就是提取b表独有的公司数据。姑且这么理解一下: 返回a表b表两者都有的公司,对应内层子查询(select 公司from [sheet1$] a where a.公司=b.公司)

的数据,如下:select 遍历b表: select 公司,金额from [sheet2$] b where not exists从第一个公司开始对比农业投资集团有限责任公司A not exists 不存在于上面的公司数据中,符合条件。南宁市化工有限责任公司存在于于上面的公司数据中,不符合条件。.......依次检查,得出最后结果。延伸一下:上述exists语句可以用in来代替,sql语句如下: select 公司,金额from [sheet2$] b where 公司not in (select b.公司from [sheet1$] a,[sheet2$] b where a.公司=b.公司) 注释:(select b.公司from [sheet1$] a,[sheet2$] b where a.公司=b.公司)提取a表b表共有的公司名称,作为条件,供not in 进行筛选b表数据。 (以下观点因本人水平有限,仅供参考。如有理解错误,敬请不吝指正。) in和exists很多时候都可以相互转换,in和exists的效率高低,要看两个括号内子查询数据量的多少。以in为栗子,如果(select b.公司from [sheet1$] a,[sheet2$] b where a.公司=b.公司)返回的数据很多,那么效率自然低。此时应该考虑用exists代替。 最后,链接往往也可以用来代替in或者exists,这是比较有效率的。 1、在b表中引用a表中的金额,(两表公司名称相同为条件),

相关文档