欢迎来到千学网!
您现在的位置:首页 > 实用文 > 其他范文

索引对查询条件顺序的影响数据库教程

时间:2022-06-02 01:30:57 其他范文 收藏本文 下载本文

下面小编给大家带来索引对查询条件顺序的影响数据库教程,本文共7篇,希望能帮助到大家!

索引对查询条件顺序的影响数据库教程

篇1:索引对查询条件顺序的影响数据库教程

索引|条件

原帖地址:

community.csdn.net/expert/FAQ/FAQ_Manage.asp?id=0&Topicid=3390663

环境:Sql Server +sp4

问题:

select datediff(day,'0910','20040920') --这句可以执行

--而下面这句不能执行(有时也可以执行)

--sub_para为varchar(8),错误信息是:从字符串转换为 datetime 时发生语法错误,

select * from T_SUB

where item_local_code='03004'

and datediff(day,sub_para,getdate)=29

and (sub_del_flag1)

--而且不能执行的时候,这个语句不会返回任何记录集

select * from t_sub

where item_local_code='03004'

and isDate(sub_para)=0

-------------------------------------------------------------------------

--原因,表中创建的索引影响了条件的执行顺序

--导致先执行了 datediff(day,sub_para,getdate())

--下面的测试说明了这个问题

--测试表及数据

create table tb(

item_local_code char(5),

sub_del_flag int,

sub_para varchar(10),

constraint PK_t primary key(sub_para,item_local_code)

)

insert tb select '03004',1,'-1-1'

union all select '03005',1,'2003a1-1'

go

--查询语句

select * from (

select * from tb

where item_local_code='03004'

and sub_del_flag0

and isdate(sub_para)=1

) A where datediff(day,sub_para,getdate())>29

go

--删除测试

drop table tb

/*--测试结果

item_local_code sub_del_flag sub_para

--------------- ------------ ----------

03004          1           2003-1-1

服务器: 消息 241,级别 16,状态 1,行 3

从字符串转换为 datetime 时发生语法错误,

--*/

篇2:查询重复记录数据库教程

重复|重复记录

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_qry]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)

drop procedure [dbo].[p_qry]

GO

/*--查询重复记录的通用存储过程

可以查询出表中那些数据是重复的,这里的重复,是指除主键外重复的记录

如果表中有主键,请指定主键.

如果表中有标识字段,而且标识字段无重复,请在调用时,将主键指定为标识字段

如果标识字段重复,不能用此存储过程

-- 2004.4--*/

create proc p_qry

@tbname sysname, --要查询的表名

@keyfdname sysname=null --表中的主键,如果未指定,则表中无主键

as

declare @nokey bit,@fd varchar(8000),@tj varchar(8000)

set nocount on

if isnull(@keyfdname,'')=''

begin

select @keyfdname=cast(newid() as char(36)),@nokey=1

exec('alter table ['+@tbname+'] add ['+@keyfdname+'] decimal(38,0) identity(1,1)')

end

select @fd='',@tj=''

select @fd=@fd+',['+name+']'

,@tj=@tj+'['+name+']=a.['+name+'] and '

from syscolumns

where object_name(id)=@tbname and name@keyfdname

set @fd=substring(@fd,2,8000)

exec('select '+@fd+' from ['+@tbname+'] a

where exists(select 1 from ['+@tbname

+'] where a.['+@keyfdname+'])'“>'+@tj+'['+@keyfdname+']a.['+@keyfdname+'])')

if @nokey=1

exec('alter table ['+@tbname+'] drop column ['+@keyfdname+']')

set nocount off

go

--调用示例

--创建测试数据

create table 表(f1 int,f2 int,f3 int,f4 int,f5 int)

insert into 表

select 1,1,1,1,1

union all select 2,1,1,1,1

union all select 3,2,1,23,1

union all select 4,2,3,1,3

union all select 5,1,1,1,1

go

--调用通用存储过程实现楼主的查询

exec p_qry '表','f1'

--删除测试环境

drop table 表

/*--测试结果

f2         f3         f4         f5

----------- ----------- ----------- -----------

1          1          1          1

1          1          1          1

1          1          1          1

--*/

篇3:组合查询数据库教程

组合查询

用PB进行数据库应用系统开发时,我们经常要对大量的数据进行筛选、查询,得到符合要求的记录,这就需要用到组合条件查询功能,

组合查询数据库教程

。我在作应用系统开发时,就自己编写了一个简单而又实用的组合条件查询模板窗口,只要用到组合条件查询的地方,都可从此窗口继承而来,非常方便。下面是给出其实现方法。

一、建一个外部数据源的dataobject对象,取名为:d_tabular_query ,各列如下:

Name TypeLenthDeccolumn_namestring10 comparestring3 valuestring255 and_orstring3

二、建一窗口w_condition_query_template,Title设置为:“组合条件查询窗口模板”,并加入控件:

控件名  类型   说明dw_query_condition  datawindow  用以输入查询条件                                            Datawindow Object Name 为前所建数据窗口对象 d_tabular_query      cb_add command button 增加一查询条件cb_del command button删除一查询条件cb_ins command button插入一查询条件cb_clear command button清除所有询条件cb_ok command button由查询条件得出结果dw_query datawindow查询结果 Datawindow Object Name 为空,继承后的子窗口再加入。cb_all command button显示所有记录cb_printcommand button  打印查询结果cb_exit command button 退出

三、编写脚本

1、在dw_query_condition的Constractor事件中加入如下脚本:

//-------------------------------------------------------------//

// 功能说明:根据数据窗口dw_query设定可组合项,供组合查询选择

// 注意事项:数据窗口dw_query的对象中text命名须用默认值,

// 即:列名+ _t

// 柯建勋 于4月27日

//-----------------------------------------------------------------------//

long ll_column_count

long ll_i

long ll_row

string ls_column

string ls_column_name

this.settransobject(sqlca)

ll_row = this.insertrow(0)

this.setitem(ll_row,'compare','=')

this.setitem(ll_row,'and_or','and')

ll_column_count = long(dw_query.Describe(”DataWindow.Column.Count“)) //总列数

this.ClearValues(”column_name“)

for ll_i = 1 to ll_column_count

if dw_query.Describe(”#“+string(ll_i)+”.Visible“) = '1' then

ls_column = dw_query.Describe(”#“+string(ll_i)+”.Name“) //列名

ls_column_name = dw_query.Describe(ls_column + ”_t.text“) //列名对应文本

this.SetValue(”column_name“, ll_i , ls_column_name + ”~t“ + ls_column)

end if

next

2、定义dw_query_condition的用户事件ue_Enterkeydown,Event ID选择pbm_dwnProcessEnter。

当我们按下Enter键时,将触发此事件。在ue_Enterkeydown事件中加入如下脚本:

//回车键(Enter)切换列焦点

long ll_column_count

long ll_column

ll_column_count = long(this.Describe(”DataWindow.Column.Count“))

ll_column = this.getcolumn

if ll_column = ll_column_count then

cb_add.triggerevent(clicked!) //增加一行

else

this.setcolumn(ll_column + 1)

end if

3、在cb_add的Clicked事件加入:

long ll_row

ll_row = dw_query_condition.insertrow(0)

dw_query_condition.setitem(ll_row,'compare','=')

dw_query_condition.setitem(ll_row,'and_or','and')

dw_query_condition.SetColumn(1)

4、在cb_del的Clicked事件加入:

long ll_row

ll_row = dw_query_condition.getrow()

dw_query_condition.DeleteRow(ll_row)

5、在cb_ins的Clicked事件加入:

long ll_row

long ll_new_row

ll_row = dw_query_condition.getrow()

ll_new_row = dw_query_condition.InsertRow(ll_row)

dw_query_condition.setitem(ll_new_row,'compare','=')

dw_query_condition.setitem(ll_new_row,'and_or','and')

dw_query_condition.SetColumn(1)

6、在cb_clear的Clicked事件加入:

long ll_row

dw_query_condition.reset()

ll_row = dw_query_condition.insertrow(0)

dw_query_condition.setitem(ll_row,'compare','=')

dw_query_condition.setitem(ll_row,'and_or','and')

7、在cb_ok的Clicked事件加入:

//-----------------------------------------------------------------------//

// 条件组合查询 柯建勋 .04.27

//-----------------------------------------------------------------------//

long ll_rowcount

long ll_row

long ll_j

string ls_filter_condition

string ls_column

string ls_compare

string ls_value

string ls_and_or

string ls_column_type

if dw_query_condition.AcceptText() = -1 then return

ll_rowcount = dw_query_condition.rowcount()

if ll_rowcount <=0 then return

ls_filter_condition = ''

for ll_row = 1 to ll_rowcount

ls_column = dw_query_condition.getitemstring(ll_row, 'column_name')

ls_compare = dw_query_condition.getitemstring(ll_row, 'compare')

ls_value = dw_query_condition.getitemstring(ll_row, 'value')

ls_and_or = dw_query_condition.getitemstring(ll_row, 'and_or')

ls_column_type = dw_query.Describe(ls_column + ”.ColType“) //

ls_column_type = left(ls_column_type, 3)

if ll_row = ll_rowcount then //最后一行(不加and、or)

choose case ls_column_type //根据数据类型设置Filter条件

case 'cha' ,'var' ,'str' // 字符型

ls_filter_condition = ls_filter_condition + &

ls_column + ls_compare + ”'“ + ls_value + ”'“

case 'num','dec','lon','rea','ulo' // 数值型

ls_filter_condition = ls_filter_condition + &

ls_column + ls_compare + ls_value

case 'dat','tim' //日期型

ls_filter_condition = ls_filter_condition + ”string(“ + &

ls_column + ”)“ + ls_compare + ”'“ + ls_value + ”'“

case else

end choose

else

choose case ls_column_type //根据数据类型设置Filter条件

case 'cha','var','str' // 字符型

ls_filter_condition = ls_filter_condition + &

ls_column + ls_compare + ”'“ + ls_value + ”' “ &

+ ls_and_or + ” “

case 'num','dec','lon','rea','ulo' // 数值型

ls_filter_condition = ls_filter_condition + &

ls_column + ls_compare + ls_value + ” “ &

+ ls_and_or + ” “

case 'dat','tim' //日期型

ls_filter_condition = ls_filter_condition + ”string(“ +                                                        &    ls_column + ”)“ + ls_compare+ ”“ +        ls_value+ ”' “ &

+ ls_and_or + ” “

case else

end choose

end if

next

dw_query.setredraw(false)

dw_query.setFilter(ls_filter_condition)

if dw_query.filter() = 1 and dw_query.rowcount() > 0 then

ls_column = dw_query_condition.getitemstring(1, 'column_name')

dw_query.setsort(ls_column + ' A')

dw_query.sort()

dw_query.SetColumn(ls_column)

dw_query.selectrow(0,false)

dw_query.selectrow(1,true)

dw_query.setrow(1)

end if

dw_query.setredraw(true)

8、在dw_query的Constractor事件中加入如下脚本:

this.Object.DataWindow.ReadOnly=”Yes“

this.settransobject(sqlca)

this.retrieve()

if this.rowcount() > 0 then

this.selectrow(0,false)

this.selectrow(1,true)

this.setrow(1)

end if

9、在cb_all的Clicked事件加入:

dw_query.SetFilter('')

dw_query.Filter()

if dw_query.rowcount() > 0 then

dw_query.selectrow(0,false)

dw_query.selectrow(1,true)

dw_query.setrow(1)

end if

dw_query.SetFocus()

10、在cb_print的Clicked事件加入:

if messagebox(”提示信息“,”确认打印?“, question!,Yesno!,1) = 1 then

if PrintSetup () = -1 then

messagebox('出错信息','打印机设置出错!',Exclamation!)

return else dw_query.Print() end if

end if

11、在cb_exit的Clicked事件加入:

close(parent)

篇4:动态分组查询数据库教程

动态|分组

原帖地址:

community.csdn.net/Expert/topic/3428/3428792.xml?temp=.6476251

--示例数据

create table 表(ID int,NUM int)

insert 表 select 1,2

union all select 2,3

union all select 3,2

union all select 4,2

union all select 5,12

union all select 6,2

union all select 7,1

union all select 8,5

union all select 9,1

go

/*--问题说明:

输入分组参数,比如输入 ”3,6“ ,实现按 ID<=3,3<=6,ID>6 分组查询

输入分组参数,比如输入 ”2,5,8" ,实现按 ID<=2,2<=5,5<=8,ID>8 分组查询

--*/

--查询的存储过程

create proc p_qry

@numlist varchar(1000)

as

set nocount on

declare @t table(id int identity,组 varchar(10),a int,b int)

declare @i int,@pnum varchar(10)

select @i=charindex(',',@numlist+',')

,@pnum=left(@numlist,@i-1)

,@numlist=stuff(@numlist,1,@i,'')

,@i=charindex(',',@numlist)

insert @t select 'id<='+@pnum,null,@pnum

while @i>0

begin

insert @t select @pnum+'<='+left(@numlist,@i-1),@pnum,left(@numlist,@i-1)

select @pnum=left(@numlist,@i-1)

,@numlist=stuff(@numlist,1,@i,'')

,@i=charindex(',',@numlist)

end

insert @t select 'id>'+@numlist,@numlist,null

select b.组,num=sum(a.num)

from 表 a,@t b

where case

when b.a is null then case when a.id<=b.b then 1 else 0 end

when b.b is null then case when a.id>b.a then 1 else 0 end

else case when a.id>b.a and a.id<=b.b then 1 else 0 end

end=1

group by b.组

order by min(b.id)

go

--调用存储过程进行查询

exec p_qry '2,5,8'

go

--删除测试

drop table 表

drop proc p_qry

/*--测试结果

组         num

---------- -----------

id<=2     5

2<=5   16

id>8      1

--*/

篇5:分布式查询和分布式事务数据库教程

分布式

Microsoft® SQL Server™ 允许创建与称为链接服务器的 OLE DB 数据源的链接,

分布式查询和分布式事务数据库教程

。在链接到 OLE DB 数据源之后,可以:

从 OLE DB 数据源引用行集,作为 Transact-SQL 语句中的表。

将命令传递给 OLE DB 数据源,并包含结果行集,作为 Transact-SQL 语句中的表。 每个分布式查询都可以引用多个链接的服务器,而且可以对每个链接的服务器分别执行更新或读取操作。单个分布式查询可以对某些链接的服务器执行读取操作,并且对其它链接的服务器执行更新操作。通常情况下,每当某个事务可能更新多个链接服务器中的数据时,Microsoft SQL Server 都要求相应的 OLE DB 提供程序支持分布式事务。因此,链接服务器上所支持的查询类型取决于 OLE DB 提供程序中对事务的支持级别。OLE DB 为事务管理定义了两个可选的接口:

ITransactionLocal 支持 OLE DB 数据源中的本地事务。

ITransactionJoin 允许提供程序联结包含其它资源管理器的分布式事务。

所有支持 ITransactionJoin 的提供程序也都支持 ITransactionLocal。

如果在连接是自动提交模式时执行分布式查询,则应用以下规则:

对于不支持 ItransactionLocal 的提供程序,只允许执行读取操作,

对于支持 ITransactionLocal 的提供程序,允许执行所有更新操作。

主控 SQL Server 会自动调用每个参与更新操作的链接的服务器中的 ITransactionLocal,以启动本地事务,并在语句执行成功时提交或在语句执行失败时回滚。

如果分布式查询是针对分布式分区视图或者是在连接为显式或隐性事务时执行,则应用下列规则:

对于不支持 ITransactionJoin 的提供程序,只允许执行读取操作。不支持任何事务或只支持 ITransactionLocal 的提供程序不能参与更新操作。

如果 SET XACT_ABORT 设置为 ON,则对于支持 ITransactionJoin 的任意提供程序都允许执行所有的更新操作。主控 SQL Server 会自动调用每个参与更新操作的链接服务器中的 ITransactionJoin,以便在分布式事务中登记该服务器。然后当主控服务器表示要提交或回滚事务时,MS DTC 将提交或者回滚。

如果 SET XACT_ABORT 设置为 OFF,则链接服务器还必须支持嵌套事务,才能对其执行更新操作。当会话已经有一个现有事务时,如果提供程序支持调用 ITransactionLocal::StartTransaction,则支持嵌套事务。这使 SQL Server 得以回滚分布式查询中的单个语句,而不是回滚整个事务。

上述规则意味着提供程序的下列限制不支持嵌套事务:仅在 XACT_ABORT 选项设置为 ON 时,分布式事务中才允许更新操作。

篇6:交叉查询的sql数据库教程

sql:

select gwlb, count(case when (year(getdate)-year(rybirthday)) between 20 and 30 then rygh end) as '20-30',

count(case when (year(getdate())-year(rybirthday)) between 30 and 40 then rygh end) as '30-40',

count(case when (year(getdate())-year(rybirthday)) between 40 and 50 then rygh end) as '40-50',

count(case when (year(getdate())-year(rybirthday)) between 50 and 60 then rygh end) as '50-60',

count(case when (year(getdate())-year(rybirthday)) between 60 and 70 then rygh end) as '60-70'

from t_ry

group by gwlb

篇7:SQL查询语句使用简要数据库教程

精华|语句

一、 简单查询

简单的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

用ADO对Excel的数据查询数据库教程

什么是数据仓库数据库教程

自定义链接后端数据库数据库教程

Building a TSQL Loop数据库教程

怎样去宣传数据仓库?数据库教程

oracle里的常用命令数据库教程

Oracle 9i的数据类型数据库教程

加速动态网站之MySQL索引分析和优化数据库

查找bad sql的方法数据库教程

关系型数据库基础之:简单的数据查询

《索引对查询条件顺序的影响数据库教程(精选7篇).doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式

点击下载本文文档