SQL语句复制表

本文汇总了多种SQL语句技巧,包括复制表结构与数据、跨库导入、备份与还原数据库、精妙查询及联表查询等。适用于SQL Server等多种数据库环境。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SQL语句复制表  

2009-09-27 19:07:57|  分类: SqlServer数据库 |字号 订阅

SQL语句复制表的方法

如果目的表已经存在:
insert into DATAHR.DBO.GBITEM
select * from DEMO.DBO.GBITEM
如果目的表不存在:
select * into DATAHR.DBO.GBITEM
from DEMO.DBO.GBITEM
跨库导入
select * into [zk_news].[dbo].[News1] from [zk_media].[dbo].[News]


--备份数据库OFSys
BACKUP DATABASE OFSys to disk = 'e:/OFSys'
还原
restore database test from disk = 'c:\test'


精妙SQL语句
精妙SQL语句
说明:复制表(只复制结构,源表名:a 新表名:b)
SQL: select * into b from a where 1<>1
说明:拷贝表(拷贝数据,源表名:a 目标表名:b)

SQL: insert into b(a, b, c) select d,e,f from b;

说明:显示文章、提交人和最后回复时间

SQL: select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b

说明:外连接查询(表名1:a 表名2:b)

SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

说明:日程安排提前五分钟提醒

SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5

说明:两张关联表,删除主表中已经在副表中没有的信息

SQL:

delete from info where not exists ( select * from infobz where info.infid=infobz.infid )

说明:--

SQL:

SELECT A.NUM, A.NAME, B.UPD_DATE, B.PREV_UPD_DATE

FROM TABLE1,

(SELECT X.NUM, X.UPD_DATE, Y.UPD_DATE PREV_UPD_DATE

FROM (SELECT NUM, UPD_DATE, INBOUND_QTY, STOCK_ONHAND

FROM TABLE2

WHERE TO_CHAR(UPD_DATE,'YYYY/MM') = TO_CHAR(SYSDATE, 'YYYY/MM')) X,

(SELECT NUM, UPD_DATE, STOCK_ONHAND

FROM TABLE2

WHERE TO_CHAR(UPD_DATE,'YYYY/MM') =

TO_CHAR(TO_DATE(TO_CHAR(SYSDATE, 'YYYY/MM') &#124;&#124; '/01','YYYY/MM/DD') - 1, 'YYYY/MM') ) Y,

WHERE X.NUM = Y.NUM (+)

AND X.INBOUND_QTY + NVL(Y.STOCK_ONHAND,0) <> X.STOCK_ONHAND ) B

WHERE A.NUM = B.NUM

说明:--

SQL:

select * from studentinfo where not exists(select * from studentwhere studentinfo.id=student.id) and系名称='"&strdepartmentname&"' and专业名称='"&strprofessionname&"' order by 性别,生源地,高考总成绩

说明:

从数据库中去一年的各单位电话费统计(电话费定额贺电化肥清单两个表来源)

SQL:

SELECT a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, 'yyyy') AS telyear,

SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '01', a.factration)) AS JAN,

SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '02', a.factration)) AS FRI,

SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '03', a.factration)) AS MAR,

SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '04', a.factration)) AS APR,

SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '05', a.factration)) AS MAY,

SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '06', a.factration)) AS JUE,

SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '07', a.factration)) AS JUL,

SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '08', a.factration)) AS AGU,

SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '09', a.factration)) AS SEP,

SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '10', a.factration)) AS OCT,

SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '11', a.factration)) AS NOV,

SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '12', a.factration)) AS DEC

FROM (SELECT a.userper, a.tel, a.standfee, b.telfeedate, b.factration

FROM TELFEESTAND a, TELFEE b

WHERE a.tel = b.telfax) a

GROUP BY a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, 'yyyy')

说明:四表联查问题:

SQL: select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....

说明:得到表中最小的未使用的ID号

SQL:

SELECT (CASE WHEN EXISTS(SELECT * FROM Handle b WHERE b.HandleID = 1) THEN MIN(HandleID) + 1 ELSE 1 END) as HandleID

FROM Handle

WHERE NOT HandleID IN (SELECT a.HandleID - 1 FROM Handle


联表查询高级方法

select b.ID,
b.Code,
b.OrderNo,
b.Date,
p.Name as pName,
b.DeliveryDate,
s.Name as sName,--订单类型
s1.Name as s1Name,--承运方式
s2.Name as s2Name,--入库方式
s3.Name as s3Name,--订单状态
s4.Name as s4Name --操作员
from BuyOrder b
left outer join Provide p on b.ProvideID = p.ID --供应商
left outer join Sys_Param s on b.OrderType = s.Code AND s.Category_Code = '102' --订单类型
left outer join Sys_Param s1 on b.Transport = s1.Code and s1.Category_Code='101' --承运方式
left outer join Sys_Param s2 on b.Approach = s2.Code and s2.Category_Code='100'--入库方式
left outer join Sys_Param s3 on b.Status = s3.Code and s3.Category_Code='009' --订单状态
left outer join Sys_Pers_Info s4 on b.BuyPers = s4.ID --操作员
where 1=1


<think>首先,用户的问题是:“我想用户想要通过SQL语句制表A的结构生成一个新的表B。 请问SQL语句制表A结构创建表B” 根据系统级指令,我需要: - 所有行内数学表达式使用$...$格式(但这里可能不涉及数学表达式)。 - 独立公式使用$$...$$格式(同样,可能不适用)。 - LaTeX语法正确(在SQL中可能不直接相关)。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾自然地添加引用标识,例如[^1]。 用户的问题是关于SQL的:制表A的结构创建表B。意思是创建一个新表B,其结构与表A相同,但不制数据。 从提供的引用中,我可以提取相关信息: - 引用[1]提到了MySQL制表结构的方法,比如CREATE TABLE ... LIKE。 - 引用[2]详细说明了SQL制表结构的方法:CREATE TABLE 新表 LIKE 旧表,然后INSERT INTO ... SELECT * FROM ... 来制数据,但用户只想要结构,不制数据。 - 引用[3]提到了Oracle中制表结构的方法:SELECT TOP 0 * INTO 新表名 FROM 原表名。 - 引用[4]是关于JOIN的,似乎不直接相关。 所以,我需要给出SQL语句制表结构。具体取决于数据库系统(如MySQLSQL Server、Oracle等),因为不同系统有不同的语法。 在回答中,我应该: 1. 解释方法。 2. 提供通用或特定数据库SQL语句。 3. 确保回答结构清晰。 4. 最后生成相关问题。 5. 添加引用标识。 回答结构: - 先介绍方法。 - 给出SQL示例。 - 可能解释不同数据库的差异。 - 生成相关问题。 - 添加引用。 引用标识:我需要自然地添加在引用的段落末尾。引用来自提供的[1]到[4],所以我可以在相关部分添加[^1]、[^2]等。 例如: - 在提到MySQL方法时,添加[^1]或[^2]。 - 在提到Oracle方法时,添加[^3]。 用户指定了“表A”和“表B”,所以我应该使用这些名称在SQL语句中。 关键SQL语句: - 对于MySQL:CREATE TABLE B LIKE A; - 对于SQL Server:SELECT * INTO B FROM A WHERE 1=0;(因为WHERE 1=0确保不制数据) - 对于Oracle:CREATE TABLE B AS SELECT * FROM A WHERE 1=0; 或 CREATE TABLE B AS SELECT * FROM A WHERE ROWNUM < 1;(Oracle中SELECT TOP 0不是标准,但可以用WHERE ROWNUM < 1) 在引用[2]中,有CREATE TABLE 新表 LIKE 旧表 用于MySQL,和对于SQL Server 2008的方法。 在引用[3]中,有Oracle的SELECT TOP 0 * INTO 新表名 FROM 原表名,但SELECT TOP是SQL Server的语法,Oracle应该用ROWNUM。 所以,我需要澄清。 在回答中,我应该覆盖主要数据库系统。 最终回答: - 开头解释:制表结构而不制数据。 - 然后给出不同数据库SQL。 - 最后生成相关问题。 生成相关问题:基于主题,如其他制方法、性能考虑等。 使用中文。</think>### 制表结构创建新表的SQL方法 用户想通过SQL语句制表A的结构来创建新表B(即只制表结构,不制数据)。这在数据库管理中很常见,例如当需要创建测试表或备份表结构时。不同数据库系统(如MySQLSQL Server、Oracle)的语法略有差异,下面我将逐步解释并提供标准SQL语句示例。核心思路是:**只制列定义(如字段名、数据类型、约束等),不包含任何数据**。方法基于常见的SQL标准,并参考了相关文档[^1][^2][^3]。 #### 1. **通用方法:使用`CREATE TABLE ... LIKE` 或 `SELECT ... WHERE 1=0`** - **MySQL数据库**: 使用`CREATE TABLE ... LIKE`语句是最直接的方式。它会制表A的所有结构(包括主键、索引等),但不制数据。 SQL语句示例: ```sql CREATE TABLE B LIKE A; -- 创建新表B,结构与A相同 ``` 如果只需要部分字段,可以结合`CREATE TABLE ... SELECT`: ```sql CREATE TABLE B AS SELECT * FROM A WHERE 1=0; -- WHERE 1=0 确保不制数据 ``` 这种方法简单高效,适用于大多数MySQL版本[^1][^2]。 - **SQL Server数据库**: 使用`SELECT INTO`语句,并添加`WHERE 1=0`条件来跳过数据制。 SQL语句示例: ```sql SELECT * INTO B FROM A WHERE 1=0; -- 创建表B,只制结构 ``` 对于SQL Server 2008及以上版本,也可以使用`CREATE TABLE ... AS`(但需注意兼容性)[^2][^3]。 - **Oracle数据库**: 使用`CREATE TABLE ... AS SELECT`语句,配合`WHERE ROWNUM < 1`来避免数据制(Oracle不支持`TOP 0`语法)。 SQL语句示例: ```sql CREATE TABLE B AS SELECT * FROM A WHERE ROWNUM < 1; -- 只制结构 ``` 如果表A有约束或索引,需要手动添加,因为此方法只制字段定义[^3]。 #### 2. **注意事项** - **制约束和索引**:上述方法通常只制基本字段结构。如果需要制主键、外键、索引等高级对象,在MySQL中`CREATE TABLE ... LIKE`会自动包含它们;但在SQL Server或Oracle中,可能需要额外执行`ALTER TABLE`语句来添加约束[^2][^3]。 - **性能考虑**:这些操作是元数据级别的,执行速度快(通常在毫秒级),不影响生产环境。避免在大型表上频繁使用,以免锁表。 - **跨数据库兼容性**:如果使用ORM工具(如Hibernate),可以生成标准DDL语句,但直接SQL更高效。测试前建议在开发环境验证。 - **错误处理**:如果表B已存在,执行会报错。可先添加`DROP TABLE IF EXISTS B;`语句(MySQL支持,其他数据库需调整)。 #### 3. **完整示例(以MySQL为例)** 假设表A有字段`id INT PRIMARY KEY, name VARCHAR(50)`,创建表B的完整SQL脚本: ```sql -- 删除旧表(可选) DROP TABLE IF EXISTS B; -- 制表结构 CREATE TABLE B LIKE A; -- 验证:查询表B结构(无数据) DESCRIBE B; ``` 执行后,表B将拥有与A相同的结构,但数据为空[^1]。 ### 相关问题 1. 如何在制表结构的同时包含索引和约束? 2. SQL制表数据但不制结构的方法是什么? 3. 不同数据库(如PostgreSQLSQLite)中制表结构的语法有何差异? 4. 制大表结构时如何优化性能以避免锁表? [^1]: mysqlsql语句_MySQL制表结构 表数据sql语句总结。在mysql制表有很多种方法,如有create select from或者insert into select from及有选择性的insert into(a,b,c) select a,b,c from这些基本可以完成我们的操作了,下面我来总结一下mysql制表语句。 [^2]: SQL处理表结构的基本方法整理(创建表,关联表,制表)。方法二:(由tianshibao提供) CREATE TABLE 新表 LIKE 旧表 制旧表的数据到新表(假设两个表结构一样) INSERT INTO 新表 SELECT * FROM 旧表 制旧表的数据到新表(假设两个表结构不一样) INSERT INTO 新表(字段1,字段2,.......) SELECT 字段1,字段2,...... FROM 旧表 如果是 SQL SERVER 2008 制表结构,使用如下方法。 [^3]: oracle制表结构的sql语句,数据库制表sql语句 制表结构及数据到新表 s。1.制表结构:只能制表的字段,不能制主键、索引等 select top 0 * into 新表名 from 原表名 2.制整个数据库结构及数据: create datebase Test 创建目标数据库 exec P_CopyDB @Source_DB='aspnet',@Des_DB='test' 把源数据库整个
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值