当前位置:首页 > 问答 > 正文

SQL Server里边insert和select怎么搭配用,感觉有点绕但其实挺实用的技巧分享

关于SQL Server里INSERT和SELECT的搭配使用,你说感觉绕,这个感觉非常正常,因为一开始学SQL,我们最熟悉的可能是这两种独立的操作:一种是INSERT,就是老老实实地一条一条手动填数据插入表里;另一种是SELECT,就是从表里把数据查出来看看,你会觉得,一个“写”,一个“读”,它俩好像是两条平行线,不怎么相交。

但事实上,把INSERT和SELECT结合起来,是SQL中最实用、最能体现“自动化”思想的技巧之一,它核心解决的就是一个问题:如何把“查询出来的结果”直接变成“要插入的数据”,省去手动拼写的麻烦。 说白了,就是让数据库自己查数据,然后自己把数据存到另一个地方。

最基础、也是最常用的搭配形式就是:INSERT INTO ... SELECT ...,这个结构你把它拆开看就明白了。

SQL Server里边insert和select怎么搭配用,感觉有点绕但其实挺实用的技巧分享

  • INSERT INTO 表A: 这部分是目标,你想把数据插到哪个表里。
  • SELECT ... FROM 表B: 这部分是来源,你从哪里把数据查出来。

它俩用空格一连,意思就是:把从表B查询出来的结果集,原封不动地(或者经过一些处理)插入到表A中,这里有个关键点,就是SELECT语句查询出来的列的数量、顺序和数据类型,必须和表A中要插入的列一一对应。

举个例子,你就全明白了,比如网上商城系统里(这个例子在很多教程里都有,比如黑马程序员的MySQL教程里就强调过这种用法),有一个叫orders的订单表,里面记录了所有订单,现在快到年底了,老板想要一个“2023年度订单汇总表”,专门用来做分析,这个新表就叫orders_2023_summary吧。

如果没有INSERT ... SELECT,你会怎么做?你可能先写一个SELECT语句把2023年的订单查出来,然后看着查询结果,再写一大堆INSERT语句,一条一条地往里敲数据,且不说效率极低,还特别容易出错。

SQL Server里边insert和select怎么搭配用,感觉有点绕但其实挺实用的技巧分享

用上INSERT ... SELECT,一行代码就搞定了:

INSERT INTO orders_2023_summary (order_id, customer_id, total_amount, order_date)
SELECT order_id, customer_id, total_amount, order_date
FROM orders
WHERE YEAR(order_date) = 2023;

你看,这一句SQL干了所有事。SELECT部分负责从庞大的orders表里精准筛选出2023年的数据,INSERT INTO部分则负责接收这些数据并存入新表,整个过程是自动化的,高效且准确。

除了这种最基本的“复制粘贴”式用法,SELECT部分还可以玩出很多花样,这才是它真正“实用”的地方。

SQL Server里边insert和select怎么搭配用,感觉有点绕但其实挺实用的技巧分享

插入时直接给某些列赋固定值。 还是上面那个例子,假设你在orders_2023_summary表里多加了一个summary_type列,用来标记这个汇总数据的类型,你想让所有插入进来的数据,这个列的值都是“年度汇总”,你不需要修改原始订单表,直接在SELECT语句里写死这个值就行:

INSERT INTO orders_2023_summary (order_id, customer_id, total_amount, order_date, summary_type)
SELECT order_id, customer_id, total_amount, order_date, '年度汇总' -- 这里直接是一个固定值
FROM orders
WHERE YEAR(order_date) = 2023;

插入前对数据进行计算或处理。 公司决定给2023年的所有订单一个95折的优惠,并把这个优惠后的金额作为“分析用金额”存入汇总表,你可以在SELECT查询时直接进行数学运算:

INSERT INTO orders_2023_summary (order_id, customer_id, original_amount, analyzed_amount, order_date)
SELECT order_id, customer_id, total_amount, total_amount * 0.95, order_date -- 对金额列进行计算
FROM orders
WHERE YEAR(order_date) = 2023;

从多个表关联查询后插入。 这是最强大的地方,比如orders表里只有客户ID,但汇总表里想直接存客户的名字,这时你就需要用SELECT ... FROM orders JOIN customers ...这样的关联查询,把数据拼凑完整,然后再插入。

INSERT INTO orders_2023_summary (order_id, customer_name, total_amount, order_date)
SELECT o.order_id, c.customer_name, o.total_amount, o.order_date
FROM orders o
INNER JOIN customers c ON o.customer_id = c.customer_id -- 关联客户表,获取客户名
WHERE YEAR(o.order_date) = 2023;

说到这里,你可能还会想到一个类似的语句叫SELECT ... INTO ...,这个语句更“狠”,它等于CREATE TABLE + INSERT ... SELECT,意思是:新建一个表(表结构根据SELECT的结果自动创建),然后把查询结果插进去,这个适合快速创建临时备份或者中间表,但缺点是表结构(如索引、约束)无法精细控制。

INSERTSELECT搭配的核心思想就是“让查询结果为插入服务”,它把数据的生产和数据的存储两个步骤无缝连接了起来,只要你脑子里能清晰地构建出“你想要插入的数据到底长什么样”,并且这个样子能通过一个SELECT语句查询出来,那你就可以用这个技巧,多练习几次,你就会发现它不仅不绕,反而是解放双手、提高效率的神器。