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 值,确保在进行计算时不会出现意外的结果。