SQL 数据操作技巧:SELECT INTO、INSERT INTO SELECT 和 CASE 语句详解

SELECT INTO、INSERT INTO SELECT 和 CASE 语句详解

SQL SELECT INTO 语句

SELECT INTO 语句将数据从一个表复制到一个新表中。

SELECT INTO 语法

将所有列复制到新表中:

java 复制代码
SELECT *
INTO newtable [IN externaldb]
FROM oldtable
WHERE condition;

只复制一些列到新表中:

java 复制代码
SELECT column1, column2, column3, ...
INTO newtable [IN externaldb]
FROM oldtable
WHERE condition;

新表将按照在旧表中定义的列名和类型创建。您可以使用 AS 子句创建新的列名

SELECT INTO 示例

以下 SQL 语句创建 Customers 的备份副本:

java 复制代码
SELECT * INTO CustomersBackup2017
FROM Customers;

以下 SQL 语句使用 IN 子句将表复制到另一个数据库中的新表中:

java 复制代码
SELECT * INTO CustomersBackup2017 IN 'Backup.mdb'
FROM Customers;

以下 SQL 语句仅复制一些列到新表中:

java 复制代码
SELECT CustomerName, ContactName INTO CustomersBackup2017
FROM Customers;

以下 SQL 语句仅将德国客户复制到新表中:

java 复制代码
SELECT * INTO CustomersGermany
FROM Customers
WHERE Country = 'Germany';

以下 SQL 语句将来自多个表的数据复制到新表中:

java 复制代码
SELECT Customers.CustomerName, Orders.OrderID
INTO CustomersOrderBackup2017
FROM Customers
LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID;

提示: SELECT INTO 还可以用于使用另一个表的架构创建新的空表。只需添加一个导致查询不返回数据的 WHERE 子句:

java 复制代码
SELECT * INTO newtable
FROM oldtable
WHERE 1 = 0;

INSERT INTO SELECT 语句

INSERT INTO SELECT 语句将数据从一个表复制并插入到另一个表中。目标表中的现有记录不受影响。

INSERT INTO SELECT 语法

将一个表中的所有列复制到另一个表中:

java 复制代码
INSERT INTO table2
SELECT * FROM table1
WHERE condition;

仅将一个表中的某些列复制到另一个表中:

java 复制代码
INSERT INTO table2 (column1, column2, column3, ...)
SELECT column1, column2, column3, ...
FROM table1
WHERE condition;

SQL INSERT INTO SELECT 示例

在本示例中,我们将使用著名的 Northwind 示例数据库。

以下是 "Customers" 表的一部分选择:

以及 "Suppliers" 表的一部分选择:

SQL INSERT INTO SELECT 示例

将 "Suppliers" 复制到 "Customers"(未填充数据的列将包含 NULL):

java 复制代码
INSERT INTO Customers (CustomerName, City, Country)
SELECT SupplierName, City, Country FROM Suppliers;

将 "Suppliers" 复制到 "Customers"(填充所有列):

java 复制代码
NSERT INTO Customers (CustomerName, ContactName, Address, City, PostalCode, Country)
SELECT SupplierName, ContactName, Address, City, PostalCode, Country FROM Suppliers;

仅将德国供应商复制到 "Customers":

java 复制代码
INSERT INTO Customers (CustomerName, City, Country)
SELECT SupplierName, City, Country FROM Suppliers
WHERE Country='Germany';

CASE 表达式

SQL CASE 表达式遍历条件并在满足第一个条件时返回一个值(类似于 if-then-else 语句)。因此,一旦条件为真,它将停止阅读并返回结果。如果没有条件为真,它将返回 ELSE 子句中的值。

如果没有 ELSE 部分并且没有条件为真,它将返回 NULL。

java 复制代码
CASE
    WHEN condition1 THEN result1
    WHEN condition2 THEN result2
    WHEN conditionN THEN resultN
    ELSE result
END;

CASE 示例

在下面的示例中,我们使用了 Northwind 示例数据库中的 "OrderDetails" 表的一部分选择:

以下 SQL 遍历条件并在满足第一个条件时返回一个值:

java 复制代码
SELECT OrderID, Quantity,
CASE
    WHEN Quantity > 30 THEN 'The quantity is greater than 30'
    WHEN Quantity = 30 THEN 'The quantity is 30'
    ELSE 'The quantity is under 30'
END AS QuantityText
FROM OrderDetails;

以下 SQL 将按 City 对客户进行排序。但是,如果 City 为 NULL,则按 Country 进行排序:

java 复制代码
SELECT CustomerName, City, Country
FROM Customers
ORDER BY
(CASE
    WHEN City IS NULL THEN Country
    ELSE City
END);

NULL 函数

在 SQL 中,处理可能包含 NULL 值的情况是很常见的。在这里,我们将探讨一些处理 NULL 值的 SQL 函数,包括 IFNULL()、ISNULL()、COALESCE() 和 NVL()。

MySQL 的 IFNULL() 函数允许您在表达式为 NULL 时返回替代值:

java 复制代码
SELECT ProductName, UnitPrice * (UnitsInStock + IFNULL(UnitsOnOrder, 0))
FROM Products;

或者我们可以使用 COALESCE() 函数,如下所示:

java 复制代码
SELECT ProductName, UnitPrice * (UnitsInStock + COALESCE(UnitsOnOrder, 0))
FROM Products;

SQL Server 的 ISNULL() 函数允许您在表达式为 NULL 时返回替代值:

java 复制代码
SELECT ProductName, UnitPrice * (UnitsInStock + ISNULL(UnitsOnOrder, 0))
FROM Products;

或者我们可以使用 COALESCE() 函数,如下所示:

java 复制代码
SELECT ProductName, UnitPrice * (UnitsInStock + COALESCE(UnitsOnOrder, 0))
FROM Products;

MS Access 的 IsNull() 函数在表达式为 NULL 值时返回 TRUE(-1),否则返回 FALSE(0):

java 复制代码
SELECT ProductName, UnitPrice * (UnitsInStock + IIF(IsNull(UnitsOnOrder), 0, UnitsOnOrder))
FROM Products;

Oracle 的 NVL() 函数实现相同的结果:

java 复制代码
SELECT ProductName, UnitPrice * (UnitsInStock + NVL(UnitsOnOrder, 0))
FROM Products;

或者我们可以使用 COALESCE() 函数,如下所示:

java 复制代码
SELECT ProductName, UnitPrice * (UnitsInStock + COALESCE(UnitsOnOrder, 0))
FROM Products;
相关推荐
wno7043 小时前
postgresSQL压缩版安装与基本命令
数据库·postgresql
聚美智数5 小时前
智能结构化识别-图片结构解析-图像结构化解析-照片结构化解析
android·java·数据库
瀚高PG实验室5 小时前
瀚高数据库常用系统表查询入门指南(附常用SQL)
数据库·sql·postgresql·瀚高数据库
ben9518chen6 小时前
mysql数据库基本操作
数据库·mysql
2603_965148116 小时前
电商选品调研:通过关键词搜索API获取市场热销商品,结合商品详情API分析竞品卖点与定价
开发语言·数据库·人工智能·python·信息可视化
土豆.exe6 小时前
nf_tables 的 verdict 被读了两次:一个十年未闭合的位域错配
java·数据库·网络安全·缓存
缓慢更新6 小时前
表单引擎的存储建模:宽表与文档库的取舍
运维·服务器·网络·数据库·低代码·oracle·适配器模式
Web3&Basketball8 小时前
实测Gemini4Argon:ERQA 87%登顶长程任务榜
数据库·python·大模型·多模态·gemini·长上下文·推理优化
xiaogai_gai8 小时前
金蝶收料通知单查询策略实战教程:从源系统拉取到中间层落地的完整路径
java·前端·数据库
注塑机数据采集联网9 小时前
注塑机数据采集网关对接MES系统数字化技术方案
大数据·网络·数据库·物联网·数据挖掘·数据分析