热点推荐:ASP.Net | ADO.Net | VB.Net | Web服务器 | Access | MSSQL | MySQL | Oracle | .Net控件 | Win 9x | Win 2000 | Win 2003 | DOS | Unix | 注册表 | 应用其它 | 安装调试 | 基本操作 | 使用技巧 | 系统优化 |故障处理 | 个性风格 | 病毒安全 | 专杀工具
您现在的位置: 中华IT技术网 >> 数据库 >> MSSQL >> 正文
全文
Select 应用和技巧
作者:1024k    文章来源:本站原创    更新时间:2007-9-12
SQL的万用字符及子查询,文章精彩万分,不容错过!
 
【范例数据表 】
 
 资料表──「Accounts」
 ID(自动编号) Username(字符串) LimitHours(数字) Password(字符串)   1     陈小明        5        12345   2     张小黑        8        123abc   3     王大文        6        WTaiMan   4     李小珍        9        LeeFamily   5     陈大文        4        CTaiMan
 资料表──「Fares」
 ID2(自动编号) Username(字符串)  MonthlyFee(数字)   5     陈小明        25   6     张小黑        40   7     王大文        30   8     李小珍        45   9     陈大文        20
 
【范例语法 】

 1a. 在数据表Accounts,选取所有字段,条件是Username必须以「X 大文」的格式。
标准语法:Select * from 数据表名称 where 字段 like '_字符串'实例语法:Select * from Accounts where Username like '_大文'语法解说:「like」表示要指定要使用有万用字符的字符串。     「_」底线表示有一个可更动的字。资料传回:Accounts数据表中ID为3及5的纪录都被传回。
 
 1b. 在表Accounts,选取ID及Username字段,条件是Username必须含有「小」字。
标准语法:Select 字段1,字段2,… from 表名 where 字段 like '%字符串%'实例语法:Select ID,Username from Accounts where Username like '%小%'语法解说:「%」是表示多个可更动的字,而「_」只能代表一个。资料传回:Accounts数据表中,ID为1、2及4的纪录的ID及Username字段。
接着下来,笔者将会解说有关两个数据表的初级合并指令,包括 SubQuery 及 Union。先解释 SubQuery ,它的目的是在Where字句中,再使用一个Select。
 
2a. 使用子查询,选取Fares数据表的MonthlyFee,而他在Accounts资料表的LimitHours是5。
标法语法:Select 数据表1字段1 from 数据表1 where 数据表1字段2 in      ( Select 数据表2字段1 from 数据表2 where 数据表2字段2=数字)分  析:两个数据表中只有Username是共通的,因此要拿Username作条件。实例语法:Select MonthlyFee from Fares where Username in     ( Select Username from Accounts where LimitHours=5)
语法解说:在括号内的Select指令会被先执行,注意,在括号内的SQL指令只可传回一个[字段]。在得到括号内的Select指令结果后,SQL会拿着这个结果作为第一个查询的条件。最后得出纪录。
     「in」是指若果在括号内的SQL有多于一个传回纪录,将会逐笔纪录去执行主SQL。
资料传回:在Fares中ID为1的纪录的MonthlyFee字段,即25。因为括号内的SQL结果为「陈小明」,再用「Username='陈小明'」这个条件去查询Fares数据表,得出结果为25。

2b. 使用子查询,已知在Accounts中的Password为123abc,试找出Fares数据表内的ID2是什么。ID2要用 numeric 作为别名。
标准语法:Select 数据表1字段1 as 字段别名 from 数据表1 where 数据表1字段2 in ( Select 数据表2字段1 from 数据表2 where 数据表2字段2=数字)
分  析:两个数据表中只有Username是共通的,因此要拿Username作条件。
实例语法:Select ID as numeric from Fares where Username in ( Select Username from Accounts where Password='123abc' )
语法解说:只是增加了As的运用,详细的As语法可看上一篇文章。资料传回:Fares的ID字段为6的数据。

现在要讨论有关Union。Union的使用条件为必须两个数据表含有相同的数据数目(范例中两个数据表都是样有5笔数据),而两个数据表中至少必须有一个字段,包括字段名称及每笔数据的内容,跟另一个数据表是完全相同的。(范例中的Username字段,两个数据表的内容及名称都是相同的)在符合这两个条件底下才可以使用Union,否则会出错。Union可以把两个数据表在传回值上结合起来,字段数目的公式如下所示:
数据表1字段数目+数据表2字段数目-1
这是由于两列相同的用作合并,只剩下一列。

3. 利用 Union 结合两个数据表。
标准语法:Select * from 数据表1 Union All Select * from 数据表2实例语法:Select * from Accounts Union All Select * from Fares语法解说:「Union All」是关系运算子,把两个数据表合并。资料传回:6个字段,包括ID、Username、LimitHours、Password、ID2、MonthlyFee。
 
【前言 】

 上一期,我们开始说到使用两个数据表的观念了,包括简单的子查询及结合数据表,还有搜寻的做法。这期,笔者会继续解说两个资料表的连结,这是更进阶的 Join 。
 
 Join共有六种:Inner Join 、 Left Outer Join 、 Right Outer Join 、 Full Outer Join 、 Cross Join 以及Natural Join 。由于Join过于复杂,因此,笔者只会着重讲解Inner Join 及 Left Outer Join 的语法。 Join 可以说是整个Select语法的精华所在,但是复杂度也相对提高,各位读者要留心看了。先拿回上次的「小白上网公司」的数据库,但这次Fares数据表少了一笔资料。
 【范例数据表 】
 
 资料表──「Accounts」
 ID(自动编号) Username(字符串)  LimitHours(数字)  Password(字符串)    1     陈小明        5        12345    2     张小黑        8        123abc    3     王大文        6        WTaiMan    4     李小珍        9        LeeFamily    5     陈大文        4        CTaiMan
 资料表──「Fares」
 ID2(自动编号) Username(字符串)  MonthlyFee(数字)    5     陈小明        25    6     张小黑        40    7     王大文        30    8     李小珍        45
 
【范例语法 】
 
1a. 从Accounts数据表的Password找出Fares数据表的Monthly Fee。已知Password是「LeeFamily」。
标准语法:Select 资料表1.字段1 from 数据表1,数据表2 where资料表1.字段2=数据表2.字段2 and 条件
实例语法:Select Fares.MonthlyFee from Accounts, Fares where Accounts.Username=Fares.Username and Accounts.Password='LeeFamily'
语法解说:「资料表1.字段1」代表第一个数据表的某个字段,若用 * 代替,     则会传回两个数据表所有的字段。「资料表1.字段2=数据表2.字段2」代表使用Inner Join的方式连接两个数据表,并且只要剩下两个资料表中有相同字段值的数据,这里只有UserName可以使用。由于Fares中删了一笔数据,因此,Accounts中ID为5的数据便被筛走了。再来是要一个条件,这里指定为要符合Accounts的Password为LeeFamily。整个过程是先筛走只有一个数据表有的纪录,再筛走Password不是LeeFamily的纪录,最后用Join到Fares数据表取得MonthlyFee。
资料传回:只有一笔数据,字段MonthlyFee内的数值45。

1b. 已知Fares数据表中的MonthlyFee是30,请找出Accounts的LimitHours数值。
标准语法:Select 资料表1.字段1 from 数据表1,数据表2 where     资料表1.字段2=数据表2.字段2 and 条件实例语法:Select Accounts.LimitHours from Accounts,Fares where     Accounts.Username=Fares.Username and Fares.MonthlyFee=30语法解说:请参考 1a 。资料传回:一笔纪录,LimitHours是6。
接着下来的是Left Outer Join的语法。它的用法是以左边的数据表作根据建立第一个资料集,并透过左边数据表的其中一个字段,逐笔取出右边数据表某字段拥有相同的值的数据成为另一个数据集,最后结合两个数据集。最糟糕的是,不同的数据库系统竟然有不同的语法,真是很烦啊,这里只说一般的语法,Oracle及Sybase需另找语法,但可以参考这里的概念。这里只可以使用Username作串连。
2a. 利用Left Outer Join串连两个数据表。
标准语法:Select * from 数据表1 数据表别名1 Left Outer Join     数据表2 数据表别名2 On 数据表别名1.字段1=数据表别名2.字段2
实例语法:Select * from Accounts A Left Outer Join     Fares B On A.Username=B.UserName
语法解说:「数据表1 数据表别名1」表示这里要为数据表设定另一个名字方便在语法中使用,也可以不设别名。不设别名的话即是默认数据表别名是数据表名称。一般会用A和B。「On」是指要把下列两个字段作连结条件。这里把两个数据表合并,只要其中一个数据表有该笔数据,即使另一个资料表没有,也会作串连。
资料传回:由于比较抽象,这里使用图解说明数据传回。  ID,Username,LimitHours,Password,ID2,Monthl

上一页  [1] [2] [3] [4] [5] 下一页

  • 上一篇文章:
  • 下一篇文章:
  • 相关文章
    最新更新
    编辑推荐
    热门图片
    频道大全
    文章阅读排行
    周排行
    月排行