1,select * from a where not exists(select 1 from B where a.id = b.id and a.bb='cc')
像这种不存在一般是找id联合但是a.bb不等以cc的,但是为什么不能理解成我要找a.bb=c但是不存在id相等的呢?
因为我试验
select * from a where not exists(select 1 from B where a.id = b.id and a.mid = b.mid and a.bb='cc')
就会出现问题,所以始终没弄明白not exists针对条件是如何的不存在?2,varchar是可变长度我想问下它占据磁盘空间吗?按理说不占据以为varchar容易产生碎片,那我都申请255最大长度不行吗?为什么不能总申请最大呢?谢谢

解决方案 »

  1.   

    1,select * from a where not exists(select 1 from B where a.id = b.id and a.bb='cc')
    像这种不存在一般是找id联合但是a.bb不等以cc的,但是为什么不能理解成我要找a.bb=c但是不存在id相等的呢?
    因为我试验
    select * from a where not exists(select 1 from B where a.id = b.id and a.mid = b.mid and a.bb='cc')
    就会出现问题,所以始终没弄明白not exists针对条件是如何的不存在?
    这句话的意思是子查询中的id,mid,a.bb='cc'的条件在A表中不存在2,varchar是可变长度我想问下它占据磁盘空间吗?按理说不占据以为varchar容易产生碎片,那我都申请255最大长度不行吗?为什么不能总申请最大呢?谢谢 占据磁盘空间的  所以如果知道长度的话 还是设置具体长度比较好
      

  2.   

    第一个sql相当于select * from a where not exists(select 1 from B where a.id = b.id)
    where a.bb<>'cc'
      

  3.   

    我查了下资料,varchar是不占用磁盘空间的,但是不能分配太多的原因是会占据内存空间的
      

  4.   

    VARCHAR会存放至少两个信息,1、信息长度2、信息本身
      

  5.   

    不好意思我说的是mysql
    小F不知道和sql server是否一样呢原文是这样
      四是即使使用Varchar数据类型,也不能够太过于慷慨。这是什么意思呢?如现在用户需要存储一个地址信息。根据评估,只要使用100个字符就可以了。但是有些数据库管理员会认为,反正Varchar数据类型是根据实际的需要来分配长度的。还不如给其大一点的呢。为此他们可能会为这个字段一次性分配200个字符的存储空间。这VARCHAR(100)与VARCHAR(200)真的相同吗?结果是否定的。虽然他们用来存储90个字符的数据,其存储空间相同。但是对于内存的消耗是不同的。对于VARCHAR数据类型来说,硬盘上的存储空间虽然都是根据实际字符长度来分配存储空间的,但是对于内存来说,则不是。其时使用固定大小的内存块来保存值。简单的说,就是使用字符类型中定义的长度,即200个字符空间。显然,这对于排序或者临时表(这些内容都需要通过内存来实现)作业会产生比较大的不利影响。所以如果某些字段会涉及到文件排序或者基于磁盘的临时表时,分配VARCHAR数据类型时仍然不能够太过于慷慨。还是要评估实际需要的长度,然后选择一个最长的字段来设置字符长度。如果为了考虑冗余,可以留10%左右的字符长度。千万不能认为其为根据实际长度来分配存储空间,而随意的分配长度,或者说干脆使用最大的字符长度
      

  6.   

    小F,如果varchar真的声明的大小占据磁盘空间,那碎片会大大减少,而不是我们经常提到的char不会产生随便儿varchar由于频繁变更大小而产生碎片的问题了,是否?
      

  7.   

    使用 EXISTS 和 NOT EXISTS 查找交集与差集
    使用 EXISTS 和 NOT EXISTS 引入的子查询可用于两种集合原理的操作:交集与差集。两个集合的交集包含同时属于两个原集合的所有元素。差集包含只属于两个集合中的第一个集合的元素。city 列中 authors 和 publishers 的交集是作者和出版商共同居住的城市的集合。USE pubs
    SELECT DISTINCT city
    FROM authors
    WHERE EXISTS
       (SELECT *
       FROM publishers
       WHERE authors.city = publishers.city)下面是结果集:city
    --------
    Berkeley(1 row(s) affected)当然,该查询可以写成一个简单的联接。USE pubs
    SELECT DISTINCT authors.city
    FROM authors INNER JOIN publishers
    ON authors.city = publishers.citycity 列中 authors 和 publishers 的差集是作者所居住的、但没有出版商居住的所有城市的集合,也就是除 Berkeley 以外的所有城市。USE pubs
    SELECT DISTINCT city
    FROM authors
    WHERE NOT EXISTS
       (SELECT *
       FROM publishers
       WHERE authors.city = publishers.city)该查询也可以写成:USE pubs
    SELECT DISTINCT city
    FROM authors
    WHERE city NOT IN
       (SELECT city 
       FROM publishers)
      

  8.   

    碎片 : 
    如果一页存储数据 数据行特别大  4.5kB  那么数据页剩余空间很能利用 产生碎片 
    Varchar 类型在 数据行存储的时候  在存储的时候会标示变长字段的列数和各列终止位置