为了账号安全,请及时绑定邮箱和手机立即绑定

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

SQL SELECT INTO 语句

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

SELECT INTO 语法

将所有列复制到新表中:


SELECT *

INTO newtable [IN externaldb]

FROM oldtable

WHERE condition;

只复制一些列到新表中:


SELECT column1, column2, column3, ...

INTO newtable [IN externaldb]

FROM oldtable

WHERE condition;

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

SQL SELECT INTO 示例

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


SELECT * INTO CustomersBackup2017

FROM Customers;

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


SELECT * INTO CustomersBackup2017 IN  'Backup.mdb'

FROM Customers;

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


SELECT CustomerName, ContactName INTO CustomersBackup2017

FROM Customers;

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


SELECT * INTO CustomersGermany

FROM Customers

WHERE Country = 'Germany';

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


SELECT Customers.CustomerName, Orders.OrderID

INTO CustomersOrderBackup2017

FROM Customers

LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID;

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


SELECT * INTO newtable

FROM oldtable

WHERE  1 = 0;

SQL INSERT INTO SELECT 语句

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

INSERT INTO SELECT 语法

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


INSERT INTO table2

SELECT * FROM table1

WHERE condition;

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


INSERT INTO table2 (column1, column2, column3, ...)

SELECT column1, column2, column3, ...

FROM table1

WHERE condition;

SQL INSERT INTO SELECT 示例

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

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

|CustomerID|CustomerName|ContactName|Address|City|PostalCode|Country|

|-|-|-|-|-|-|-|

|1|Alfreds Futterkiste|Maria Anders|Obere Str. 57|Berlin|12209|Germany|

|2|Ana Trujillo Emparedados y helados|Ana Trujillo|Avda. de la Constitución 2222|México D.F.|05021|Mexico|

|3|Antonio Moreno Taquería|Antonio Moreno|Mataderos 2312|México D.F.|05023|Mexico|

以及 “Suppliers” 表的一部分选择:

|SupplierID|SupplierName|ContactName|Address|City|PostalCode|Country|

|-|-|-|-|-|-|-|

|1|Exotic Liquid|Charlotte Cooper|49 Gilbert St.|London|EC1 4SD|UK|

|2|New Orleans Cajun Delights|Shelley Burke|P.O. Box 78934|New Orleans|70117|USA|

|3|Grandma Kelly’s Homestead|Regina Murphy|707 Oxford Rd.|Ann Arbor|48104|USA|

SQL INSERT INTO SELECT 示例

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


INSERT INTO Customers (CustomerName, City, Country)

SELECT SupplierName, City, Country FROM Suppliers;

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


INSERT INTO Customers (CustomerName, ContactName, Address, City, PostalCode, Country)

SELECT SupplierName, ContactName, Address, City, PostalCode, Country FROM Suppliers;

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


INSERT INTO Customers (CustomerName, City, Country)

SELECT SupplierName, City, Country FROM Suppliers

WHERE Country='Germany';

SQL CASE 表达式

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

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

CASE 语法


CASE

WHEN condition1 THEN result1

WHEN condition2 THEN result2

WHEN conditionN THEN resultN

ELSE result

END;

SQL CASE 示例

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

|OrderDetailID|OrderID|ProductID|Quantity|

|-|-|-|-|

|1|10248|11|12|

|2|10248|42|10|

|3|10248|72|5|

|4|10249|14|9|

|5|10249|51|40|

SQL CASE 示例

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


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 进行排序:


SELECT CustomerName, City, Country

FROM Customers

ORDER BY

(CASE

WHEN City IS  NULL  THEN Country

ELSE City

END);

SQL NULL 函数

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

MySQL

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


SELECT ProductName, UnitPrice * (UnitsInStock + IFNULL(UnitsOnOrder, 0))

FROM Products;

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


SELECT ProductName, UnitPrice * (UnitsInStock + COALESCE(UnitsOnOrder, 0))

FROM Products;

SQL Server

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


SELECT ProductName, UnitPrice * (UnitsInStock + ISNULL(UnitsOnOrder, 0))

FROM Products;

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


SELECT ProductName, UnitPrice * (UnitsInStock + COALESCE(UnitsOnOrder, 0))

FROM Products;

MS Access

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


SELECT ProductName, UnitPrice * (UnitsInStock + IIF(IsNull(UnitsOnOrder), 0, UnitsOnOrder))

FROM Products;

Oracle

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


SELECT ProductName, UnitPrice * (UnitsInStock + NVL(UnitsOnOrder, 0))

FROM Products;

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


SELECT ProductName, UnitPrice * (UnitsInStock + COALESCE(UnitsOnOrder, 0))

FROM Products;

这些函数允许您以一种灵活的方式处理 NULL 值,确保在进行计算时不会出现意外的结果。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消