选择一条路,就要坚持走下去

发布新日志

  • Linux新手系列之一

    shilinglin 发布于 2007-05-23 11:45:03

     那么Linux是什么呢?Linux是基于PC(其它平台也有的支持)的UNIX兼容系统,在跟UNIX的关系上,它不比任何其它UNIX兼容系统远

       OK,你的第一个问题是:什么是Linux,它和UNIX有什么区别?问这个问题的原因呢,多半是你还在大一的时候一次去实验室,看到高年纪学生在一个特大屏幕的机器上作题,你羡慕的看着他,问:"这是什么计算机啊,这么高级?"而他不无骄傲的说,"这是UNIX"。后来你懂的多了,知道那是SUN工作站,上面运行着Solaris,就是UNIX。现在你又听说Linux也是UNIX,是怎么回事呢?

      short answer:去看书,街上很多Linux的书第一章就是讲他们的历史和亲属关系的。

      long answer: UNIX是一个20还是30年前由几个研究生在实验室里开始后来一个大公司把它商业化了的一个操作系统。一来二去,它成长并且占领了市场。当时它只是运行在只有大学才买得起一两台的昂贵机器上。后来机器多了,公司多了,懂得人也多了,就分家了,而"UNIX"这个名字由于法律关系,谁也不能说自己的操作系统是"UNIX"而只能说是"UNIX兼容"系统了。所以现在"UNIX"系统是不存在的,存在的只是一个遥远的传说。那么现在那些Solaris,AIX,IRIS都是什么呢?那些都是各公司在他们硬件平提上作的商业UNIX,这些系统都遵循一个叫POSIX的古怪标准,对了,这个标准呢,是后来UNIX太多太乱,大家编程接口甚至命令都不一样了所以没办法座下来商量的一个协议。

      那么Linux是什么呢?Linux是基于PC(其它平台也有的支持)的UNIX兼容系统,在跟UNIX的关系上,它不比任何其它UNIX兼容系统远。所以如果你有"Solaris才是正统UNIX,Linux只是兼容"的想法,对不起你错了,起码你得把支持AIX的人打败才行,他们还认为AIX才是正统UNIX呢。所以用Linux你可以学到有关UNIX的知识,这些知识绝大部分在其它商业UNIX上可以用得上。当然,其核心思想绝对是相同的。那么在三年前只有你的读博士的辅导员才有机会在实验室那台宝贝SUN上学的知识,你现在在PC机上就可以实践了,这难道不是很妙的一件事情么? 

     第二个问题:我想装一个Linux,最新的是哪个版本,我听说过xxxlinux,yyylinux,还有国内某个公司鼎力推出的zzzlinux,到底哪个更好呢?

      首先你需要明白,Linux不是windows,它不是一个由一家商业公司维护的软件,只有一个包装。Linux是可以任意包装自由配置的东西。任何一个人,一家公司都可以按照自己的想法,比如加一点功能,加中文支持,作一个Linux出来。这些Linux虽然核心部分都一样,但是他们所带的各种软件,缺省的配置都不一样。区别是用一种Linux 发布 (不同的Linux我们叫做不同的发布)也许硬件很好配置,各种软件也好安装,用另外一种也许速度快,再一种也许支持中文比较好。总之没有白吃的午餐,在windows下想当然的东西在linux下也许需要你熬夜才能得到。所以从一开始选择distribution就必须非常小心,否则因为自己刚好随某个杂志得到一个Linux发布就以为所有的都一样就开始安装,等硬盘数据毁了,或者网络哭天跄地也配不出来的时候,就晚了。不是开玩笑,我知道windows下安装驱动程序就是鼠标点几下,可是在Linux下,为了驱动一个网卡,折腾一夜是不希奇的--当然,我觉得这是值得的。

      所以,面对那么多Linux distribution,你应当选择哪个呢?

      比较著名的Linux distribution有:

      RedHat:最新版本6.2, 7.0beta。由于RedHat公司已经上市,获得了很多商业的支持,所以它在硬件软件兼容性上很好。实际上它已经是Linux的工业标准。想象一下如果你是一个比如Oracle这样厂商的老板,你需要为Linux开发一个版本,而不同的Linux dist需要单独开发维护,为成本考虑你自然会只认准一个Linux。

      Slackware(7.1)。很早就有的Linux,有很多老的忠实用户,但现在越来越不行了。

      SuSe Linux,德国人做的,在欧洲很流行,有一些驱动上的优势。

      另外还有Debian,CorelLinux等dist,不一一介绍了。

      还有你会看到国内媒体上吹捧的各种“中文Linux”,他们的优势主要是有中文处理。但是如前一篇文章提到的,想用中文,用windows 2000最好。实际上我觉得一个老7字班的前辈跟我说的一句话很好:“(对我们来说)在计算机上看到中文本身就是一件很古怪的事情”。如果你是抱着学习计算机的目的而来,那么你不可能避免阅读英文文档。即使是microsoft的文档,有关编程的文档,最新的也全是英文。当然,要上BBS,看中文网页等,用英文的dist一样能做到。

      作为我个人(个人观点,你不必相信我),我只用RedHat,因为我需要它作为一个操作系统能让我更快的掌握并且学习我想学习的知识,而不是跟愚蠢的网卡,声卡作斗争。尽管这些斗争对于学习Linux来说也是很有益的,但是对于一个新手来说,如果连系统都安装不上,无法配置,又怎么谈如何学习呢?

      Again,this is only my own opnion, and I could be wrong。

      在这个系列里,我会围绕RedHat 6.2来讲。

      

  • 学会在Linux下对硬盘分区

    shilinglin 发布于 2007-05-23 12:04:12

      第一点也是最重要的一点,要知道当前安装LILO的版本,因为LILO2.21及早期版本对硬盘大小有限制,如果安装LILO到1023磁道以外即8G的空间以外,LILO就无法启动。 但一些BIOS较老的机器,LINUX仍然无法突破1024磁道的限制,因此这些BIOS无法认出大于1024的硬盘空间。

      1. 还需要考虑的问题有:
      2. 是否限制用户可使用的磁盘空间大小?
      3. 在系统中需要安装哪些软件?
      4. 交换分区需要多大?
      5. 系统是否有多个硬盘?

      下面,我们按系统工作性质的不同对分区的划分提出了一些建议。当然,根据实际情况,在满足系统工作需求的前提下,下面的分区大小也可以灵活的变动。

      一. 基本工作站的分区方案

      假设系统的硬盘大小是10G。

        /boot 20M
        Swap 128M
        /root 9.85G

      建立一个20M的/boot分区是为了避免将系统内核文件放到1024磁道以外,如果将/boot做为root分区的一个子目录,内核文件就会安装在root分区的任何地方,因为硬盘的大小超过了8G,所以在启动时就有可能出现问题。建议将交换分区的大小设置为内存的两倍,在这里我们假设系统的内存为64M。最后我们将硬盘的剩余空间全部分给了root分区。

      二. Red Hat Linux 6.2 及其早期版本上的基本服务器硬盘分区方案

      这里的服务器我们假设只提供几种通用的服务,如WWW服务及FTP服务等几种服务,通过telnet登录的用户数很少。假设其硬盘大小为25G。

        /boot 20M
        Swap 128M
        / 10G
        /home 13G
        /var 2G
     在硬盘的最前面创建20M大小的/boot分区,原因同上。交换分区的大小也是128M,因为内存的大小为64M。

      / ,即root分区设为10G这么大是因为其中有一个/usr目录,这个目录可能会占用很多硬盘空间,特别是在安装了X Server,运行图形界面的应用程序的时候。

      /home分区是硬盘中最大的分区,这似乎与我们假设系统用户数不多有些矛盾。实际上在/home目录下确实没有几个用户目录,但在Red Hat6.2及更早的版本中,Apache服务器和wu-ftpd FTP服务器被放在了/home/httpd及/home/ftp目录中。所以这个分区这么大也是有原因的。

      最后,/var目录独自占用了一个分区,因为系统的所有日志都写到了/var/log目录下,这将会占用很大的硬盘空间。如果系统日志记录得非常详细,整个目录很快会被写满,导致系统工作呆滞。当然,可以通过系统日志后台守护程序syslogd来修改日志配置,避免发生这种情况。

      三. Red Hat 7及以上版本的基本服务器分区方案

      这种情况同前一个方案的情况相同,不同的是LINUX版本为Red Hat 7.0及其以上版本。

      /boot 20M
      Swap 128M
      / 10G
      /var 15G

      与RedHat6不同,在RedHat7中HTTP服务和FTP服务的目录现在位于 /var/www/ 和/var/ftp/,因此/var分区有15G之大也就不难理解了。
      四. 多用户服务器分区方案

      在这种服务器系统中,同时有多个用户通过telnet, ssh, rlogin或其方式在远程访问系统。系统中有三个35G的硬盘驱动器,总共有105G的磁盘空间 。系统中用到了RAID 5技术做数据冗余。这种情况下,管理员必须为每个用户分配磁盘空间。对RedHat 6.2及更早的版本,分区如下:

      Disk 1:
        /boot 20M
        / 4G
        /var 3GB
        /home 27.98G
      Disk 2:
        swap 20MB
        / 4GB
        /var 3GB
        /home 27.98GB
      Disk 3:
        swap 20MB
        / 4GB
        /var 3GB
        /home 27.98GB

      这样分区的原因:首先,Disk1上的20M /boot分区不属于任何RAID阵列,否则如果你将/boot放至RAID阵列中,以后就不能系统内核升级了。

      为了方便管理,在其它两个硬盘中建立了20M的交换分区。这种服务器一般配有1G以上的内存,因此交换分区的大小不成问题。如果增大交换分区,就会减少RAID分区空间,所以20M是足够的。RAID分区的分组如下:

      1-A, 2-A, and 3-A 一起组成一个8G的 RAID 5 驱动器,做为/根目录打开。
      1-B, 2-B, and 3-B 组成 6GB的 RAID 5 驱动器,做为 /var目录。
      1-C, 2-C, and 3-C 组成 55.96GB RAID 5 驱动器, 做为 /home.目录。

      这种分配方案总共有55.96G的空间分配给所有用户及Apache和FTP服务,在/var下用6G空间用做记录日志、邮件,这么大的空间是足够的。

      如果安装Red Hat7或以上版本,应给/var分区更大的空间,因为它同时还存放着WEB和FTP服务的两个目录。
  • linux 安装过程全功略

    shilinglin 发布于 2007-05-23 11:57:16

    安装LINUX其实和安装WIN98一样容易,不相信,咱走着瞧。

      (一)安装前准备  

      1、由于初次安装RedHat,为了避免与WIN98冲突,我特地找个闲置的640M的硬盘,并把它设置为从盘,打算把RedHalt安装到该硬盘上。进入WIN98后,系统自动识别为D盘。(如何在同一硬盘上安装LINUX与WIN98,请参阅主页上中文HOW文档)

      (二)开始安装Linux:

       开机进入COMS设置,把引导顺序改为CDROM、A、C。把RedHat6.0光盘放入光驱,系统自动进入安装状态。初次安装,还是执行默认值为妙,由于各自硬件不同,我谈谈我的几个主要步骤吧。 

        1、为Linux添加一个分区,用Tab选择Add钮,按回车,屏幕上将出现一个题为“Edit New Partition”的对话框。首先我们在Mount Point项中,输入这个分区(hdb)所对应的系统目录/(根目录);接着在Size(Megs)项中,输入分区的大小600(单位兆);在Type这一项中用光标上、下键选择适当的分区类型,我们选中Linux的文件分区Linux native;最后按OK确认。这样我们就成功地建立起一个为Linux所用的分区了。如果你的硬盘空间允许,你完全可以再建立一个或几个分区给Linux使用。接着用同样的方法给Linux增加一个交换分区,不同的仅是Mount Point项让它空着,在Type项目中选择Linux Swap。输入分区大小(如64),注意,交换分区的大小不能低于物理内存的实际大小。为Linux分好了区,按OK将分区信息写入硬盘。接着就是进行格式化了,执行默认值吧,  

        2、定制安装Linux软件了,硬盘空间有限,使用默认值算了,哦,我需要KDE,我加上KDE项!好了,现在可以安装了。

        3、设置显示器。我的显示器可不是名牌的,,找个替代吧,我选Viewsonic 14ES,显示器才能上到真彩 否则是丑陋的256色(告诉你,这是我多次配置XWindows才得到的答案喔)。

        5、设置显示卡。到显卡列表找吧,找呀找,终于找到了我的SIS6326,要不然就有点麻烦了。

        6、设置系统管理员密码,密码至少六个以上,它不会出现如WIN下的***,千万不要乱打呀,没有正确的密码可进不了Linux系统的哦。  

        7、系统提示制作启动盘,我可要用它启动我的RedHalt的啊,插入软盘后YES。

        8、安装LILO(Linux多操作系统启动管理器)。我想我大多数的时间还是用Win98吧,选SKIP跳过这一步。用Linux时插入启动盘啦。 

  • Linux新手系列之二

    shilinglin 发布于 2007-05-23 12:06:29

     你从来只用过Windows,从来没接触过UNIX,只知道把一个文件拽来拽去,只知道硬盘就是C:\ D:\ E:\却从来没有研究过分区表,也许会用VC编个程序,很习惯它的集成环境....

      有一天,不管什么原因了,也许是看报纸上那些把内存和硬盘都分不清楚的记者的吹嘘,或者是老板要求你用它作个项目,或者是同学们都有了你没有觉得很土,或者你听说找工作有这个的经验就有更大希望....不管怎样,你想在自己的机器上安装一个Linux。OK,这个文章就是给你写的,因为从现在开始,你会有成堆的问题你会觉得从前在windows那里得来的有关计算机的经验好像完全用不上。你会觉得"Linux怎么这样麻烦"。你会有种从来没有开过汽车但是得把汽车拆开修理一样觉得无处下手。OK,这个文章就是为你写的。

      为什么要学Linux。其实你不必学习Linux,如果你就是想使用计算机让它使你的工作,比如打字,排版,统计数据等更有效率,Linux不行。Windows,或者我推荐windows 2000是你最好的选择,它对中文的支持很好,非常稳定,上面有无数应用程序,而且如果你自己承担风险,还可以使用盗版,免费。Linux将会给你造成很多麻烦,安装时会造成系统数据丢失,无法驱动网卡/声卡/显示卡/显示器,无法配置中文,图形界面速度慢,等等。从前在windows上很容易做到的比如修改显示频率或者安装新的网卡驱动在Linux下都变得好像要你自己重新上一次大一计算机原理课那么讨厌。呵呵,那Linux有什么好处呢?你会问。其实Linux没什么好处,从使用角度,它唯一的好处是它是我们自己的,而windows再好,是Microsoft的。“又能怎么样?”你也许又问。区别是,Linux可以让你来研究它,通过使用Linux你可以获得更深一步对计算机的了解……而不只是一个全自动的盒子。计算机是一个很神奇的东西,你也许对那些写出windows的程序员很崇拜(我是的),或者对那些能发明更好的算法更安全的操作系统的hacker(对不起,远程攻击系统的不是hacker)很崇拜,那么你应当知道,坐在一个windows的机器前面整天就会用鼠标拖拽也许能给你一个很好的打字员的薪水,但是永远无法让你进入真正计算机的世界--成为一个自由思想的Hacker,或者说,你只能永远是个windows的用户 …… 也没什么不好,很多领导还不会计算机呢 -- 而不可能有机会自己写一个windows。

      一个不太妙的结果是,当世界上充满了windows的奴隶时,我们就得花更大的价钱从Microsoft那里获得这样的技术,某些社会里,我们管这个叫做剥削。

      讲这么多,无非是说,萝卜不能两头切,至少现在是这样。要想什么别人都给你做好,系统安装一路回车,硬件配置点两下鼠标,对不起,请用windows 2000。如果你准备好了这一切,那么接着看吧。   
  • SQL查询语句精华使用简要

    leaf840404 发布于 2007-03-29 15:40:19

     

    一、 简单查询
      简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的表或视图、以及搜索条件等。
      例如,下面的语句查询testtable表中姓名为"张三"的nickname字段和email字段。

       SELECT nickname,email
      FROM testtable
      WHERE name='张三'

      (一) 选择列表

      选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变量和全局变量)等构成。

      1、选择所有列

      例如,下面语句显示testtable表中所有列的数据:

       SELECT *
      FROM testtable

      2、选择部分列并指定它们的显示次序

      查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。
      例如:

       SELECT nickname,email
      FROM testtable

      3、更改列标题

      在选择列表中,可重新指定列标题。定义格式为:
      列标题=列名
      列名 列标题
      如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列标题:

       SELECT 昵称=nickname,电子邮件=email
      FROM testtable

      4、删除重复行

      SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。

      5、限制返回的行数

      使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是表示一百分数,指定返回的行数等于总行数的百分之几。
      例如:

       SELECT TOP 2 *
      FROM testtable
      SELECT TOP 20 PERCENT *
      FROM testtable

      (二)FROM子句

      FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图,它们之间用逗号分隔。
      在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应使用下面语句格式加以限定:

        SELECT username,citytable.cityid
      FROM usertable,citytable
      WHERE usertable.cityid=citytable.cityid

      在FROM子句中可用以下两种格式为表或视图指定别名:
      表名 as 别名
      表名 别名

      (二) FROM子句

      FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图,它们之间用逗号分隔。
      在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应使用下面语句格式加以限定:

       SELECT username,citytable.cityid
      FROM usertable,citytable
      WHERE usertable.cityid=citytable.cityid

      在FROM子句中可用以下两种格式为表或视图指定别名:
      表名 as 别名
      表名 别名
      例如上面语句可用表的别名格式表示为:

       SELECT username,b.cityid
      FROM usertable a,citytable b
      WHERE a.cityid=b.cityid

      SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。

      例如:

        SELECT a.au_fname+a.au_lname
      FROM authors a,titleauthor ta
      (SELECT title_id,title
      FROM titles
      WHERE ytd_sales>10000
      ) AS t
      WHERE a.au_id=ta.au_id
      AND ta.title_id=t.title_id

      此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。

    (三) 使用WHERE子句设置查询条件

      WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据:

       SELECT *
      FROM usertable
      WHERE age>20

      WHERE子句可包括各种条件运算符:
      比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!<
      范围运算符(表达式值是否在指定的范围):BETWEEN...AND...
      NOT BETWEEN...AND...
      列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2......)
      NOT IN (项1,项2......)
      模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE
      空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL
      逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR

      1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30
      2、列表运算符例:country IN ('Germany','China')
      3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、varchar、text、ntext、datetime和smalldatetime等类型查询。
      可使用以下通配字符:
      百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。
      下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。
      方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。
      例如:
      限制以Publishing结尾,使用LIKE '%Publishing'
      限制以A开头:LIKE '[A]%'
      限制以A开头外:LIKE '[^A]%'

      4、空值判断符例WHERE age IS NULL

      5、逻辑运算符:优先级为NOT、AND、OR

      (四)查询结果排序

      使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为:
      ORDER BY {column_name [ASC|DESC]} [,...n]
      其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排
      序。
      例如:

        SELECT *
      FROM usertable
      ORDER BY age desc,userid ASC

      另外,可以根据表达式进行排序。

      二、 联合查询

      UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联合查询。UNION的语法格式为:

        select_statement
      UNION [ALL] selectstatement
      [UNION [ALL] selectstatement][...n]

      其中selectstatement为待联合的SELECT查询语句。

      ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一行。

      联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。

      在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类型,系统将低精度的数据类型转换为高精度的数据类型。

      在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如:

      查询1 UNION (查询2 UNION 查询3)

      三、连接查询

      通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志。

      在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行查询。

      连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。

      SQL-92标准所定义的FROM子句的连接语法格式为:

       FROM join_table join_type join_table
      [ON (join_condition)]

      其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一个表操作的连接又称做自连接。

      join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN)和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的数据行。

      交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。

      连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑运算符等构成。

      无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接连接。例如:

       SELECT p1.pub_id,p2.pub_id,p1.pr_info
      FROM pub_info AS p1 INNER JOIN pub_info AS p2
      ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info)

      (一)内连接
      内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分三种:
      1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列。
      2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些运算符包括>、>=、<=、<、!>、!<和<>。
      3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。
      例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社:

       SELECT *
      FROM authors AS a INNER JOIN publishers AS p
      ON a.city=p.city
      又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state):
      SELECT a.*,p.pub_id,p.pub_name,p.country
      FROM authors AS a INNER JOIN publishers AS p
      ON a.city=p.city

      (二)外连接
      内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。如下面使用左外连接将论坛内容和作者信息连接起来:

       SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b
      ON a.username=b.username

      下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市:

        SELECT a.*,b.*
      FROM city as a FULL OUTER JOIN user as b
      ON a.username=b.username

      (三)交叉连接
      交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等于6*8=48行。
       SELECT type,pub_name
      FROM titles CROSS JOIN publishers
      ORDER BY type

我的栏目

数据统计

  • 访问量: 2140
  • 日志数: 6
  • 建立时间: 2007-04-14
  • 更新时间: 2007-06-01

RSS订阅

Open Toolbar