目录
SQL IFNULL(), ISNULL(), COALESCE(), NVL() 函数
SQL SELECT INTO 语句
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语句创建客户的备份副本:
SELECT * INTO CustomersBackup2017
FROM Customers;
以下SQL语句使用IN子句将表复制到另一个数据库中的新表中:
SELECT * INTO CustomersBackup2017 IN 'Backup.mdb'
FROM Customers;
以下SQL语句仅将几列复制到新表中:
SELECT CustomerName, ContactName INTO CustomersBackup2017
FROM Customers;
以下SQL语句仅将 Germany 客户复制到新表中:
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 语句
SQL INSERT INTO SELECT 语句
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;
演示数据库
以下是从 "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 | Postal Code | Country |
---|---|---|---|---|---|---|
1 | Exotic Liquid | Charlotte Cooper | 49 Gilbert St. | Londona | 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 实例
以下SQL语句将"Suppliers"复制到"Customers"中(未填充数据的列将包含 NULL):
【实例】
INSERT INTO Customers (CustomerName, City, Country)
SELECT SupplierName, City, Country FROM Suppliers;
以下SQL语句将"Suppliers"复制到"Customers"中(填写所有列):
【实例】
INSERT INTO Customers (CustomerName, ContactName, Address, City, PostalCode, Country)
SELECT SupplierName, ContactName, Address, City, PostalCode, Country FROM Suppliers;
以下SQL语句仅将德国供应商复制到"Customers"中:
【实例】
INSERT INTO Customers (CustomerName, City, Country)
SELECT SupplierName, City, Country FROM Suppliers
WHERE Country='Germany';
SQL CASE 语句
SQL CASE 语句
CASE语句遍历条件并在满足第一个条件时返回一个值(如IF-THEN-ELSE语句)。因此,一旦条件为真,它将停止读取并返回结果。如果没有条件为 true,则返回 ELSE 子句中的值。
如果没有其他部分,并且没有条件为 true,则返回 NULL。
【CASE 语法】
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
WHEN conditionN THEN resultN
ELSE result
END;
演示数据库
以下是从 "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将按城市对客户进行排序。但是,如果城市为空,则按国家排序:
【实例】
SELECT CustomerName, City, Country
FROM Customers
ORDER BY
(CASE
WHEN City IS NULL THEN Country
ELSE City
END);
SQL NULL 函数
SQL IFNULL(), ISNULL(), COALESCE(), NVL() 函数
请看下面的 "Products" 表:
P_Id | ProductName | UnitPrice | UnitsInStock | UnitsOnOrder |
---|---|---|---|---|
1 | Jarlsberg | 10.45 | 16 | 15 |
2 | Mascarpone | 32.56 | 23 | |
3 | Gorgonzola | 15.67 | 9 | 20 |
假如 "UnitsOnOrder" 是可选的,而且可以包含 NULL 值。
请看下面的 SELECT 语句:
SELECT ProductName, UnitPrice * (UnitsInStock + UnitsOnOrder)
FROM Products;
在上面的实例中,如果有 "UnitsOnOrder" 值是 NULL,那么结果是 NULL。
解决方案
【MySQL】
在 MySQL 中,我们可以使用 IFNULL() 函数,如下所示:
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;
【MS Access】
如果表达式为空值,则 MS Access IsNull() 函数返回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;
SQL Server 存储过程
什么是存储过程
存储过程是一个可以保存的准备好的SQL代码,因此代码可以反复使用。
因此,如果您有一个反复编写的SQL查询,请将其保存为存储过程,然后调用它来执行它。
还可以将参数传递给存储过程,以便存储过程可以根据传递的参数值进行操作。
【存储过程语法】
CREATE PROCEDURE procedure_name
AS
sql_statement
GO;
【执行存储过程】
EXEC procedure_name;
演示数据库
以下是从示例数据库的 "客户(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 |
4 | Around the Horn | Thomas Hardy | 120 Hanover Sq. | London | WA1 1DP | UK |
5 | Berglunds snabbköp | Christina Berglund | Berguvsvägen 8 | Luleå | S-958 22 | Sweden |
存储过程实例
以下SQL语句创建一个名为"SelectAllCustomers"的存储过程,该过程从"Customers"表中选择所有记录:
【实例】
CREATE PROCEDURE SelectAllCustomers
AS
SELECT * FROM Customers
GO;
按如下方式执行上述存储过程:
【实例】
EXEC SelectAllCustomers;
带参数的存储过程
以下SQL语句创建一个存储过程,从"Customers"表中选择特定城市的客户:
【实例】
CREATE PROCEDURE SelectAllCustomers @City nvarchar(30)
AS
SELECT * FROM Customers WHERE City = @City
GO;
按如下方式执行上述存储过程:
【实例】
EXEC SelectAllCustomers @City = 'London';
多参数存储过程
设置多个参数非常简单。只需列出每个参数和用逗号分隔的数据类型,如下所示。
以下SQL语句创建了一个存储过程,用于从"Customers"表中选择来自特定城市且具有特定PostalCode的客户:
【实例】
CREATE PROCEDURE SelectAllCustomers @City nvarchar(30), @PostalCode nvarchar(10)
AS
SELECT * FROM Customers WHERE City = @City AND PostalCode = @PostalCode
GO;
按如下方式执行上述存储过程:
【实例】
EXEC SelectAllCustomers @City = 'London', @PostalCode = 'WA1 1DP';
SQL 注释
SQL 注释
注释用于解释 SQL 语句的各个部分,或阻止 SQL 语句的执行。
注:本章中的示例不适用于 Firefox 和 Microsoft Edge!Microsoft Access 数据库不支持注释。在示例中,Firefox 和 MicrosoftEdge 使用 Microsoft Access 数据库。
单行注释
单行注释以 -- 开头。
从 -- 到行尾之间的任何文本都将被忽略(不会执行)。
以下示例使用单行注释作为说明:
【实例】
--Select all:
SELECT * FROM Customers;
以下示例使用单行注释忽略行尾:
【实例】
SELECT * FROM Customers -- WHERE City='Berlin';
以下示例使用单行注释忽略语句:
【实例】
--SELECT * FROM Customers;
SELECT * FROM Products;
多行注释
多行注释以 /* and end with */.
Any text between /* 开头,以 */ 结尾。
以下示例使用多行注释作为说明:
【实例】
/*Select all the columns
of all the records
in the Customers table:*/
SELECT * FROM Customers;
以下示例使用多行注释忽略许多语句:
【实例】
/*SELECT * FROM Customers;
SELECT * FROM Products;
SELECT * FROM Orders;
SELECT * FROM Categories;*/
SELECT * FROM Suppliers;
若要仅忽略语句的一部分,请使用 /* */
以下示例使用注释忽略部分行:
【实例】
SELECT CustomerName, /*City,*/ Country FROM Customers;
以下示例使用注释忽略语句的一部分:
【实例】
SELECT * FROM Customers WHERE (CustomerName LIKE 'L%'
OR CustomerName LIKE 'R%' /*OR CustomerName LIKE 'S%'
OR CustomerName LIKE 'T%'*/ OR CustomerName LIKE 'W%')
AND Country='USA'
ORDER BY CustomerName;
SQL 运算符
SQL 算术运算符
运算符 | 描述 |
---|---|
+ | Add |
- | Subtract |
* | Multiply |
/ | Divide |
% | Modulo |
SQL 按位运算符
运算符 | 描述 |
---|---|
& | 按位与 |
| | 按位或 |
^ | 按位异或 |
SQL 比较运算符
运算符 | 描述 |
---|---|
= | 等于 |
> | 大于 |
< | 小于 |
>= | 大于或等于 |
<= | 小于或等于 |
<> | Not equal to |
SQL 复合运算符
运算符 | 描述 |
---|---|
+= | 加等于 |
-= | 减去等于 |
*= | 乘以等于 |
/= | 除以等于 |
%= | 模等于 |
&= | 按位与等于 |
^-= | 按位互斥等于 |
|*= | 按位或等于 |
SQL 逻辑运算符
运算符 | 描述 |
---|---|
ALL | 如果所有子查询值都满足条件则为 TRUE |
AND | 如果由 AND 分隔的所有条件都为 TRUE,则为 TRUE |
ANY | 如果任何子查询值满足条件则为 TRUE |
BETWEEN | 如果操作数在比较范围内,则为 TRUE |
EXISTS | 如果子查询返回一条或多条记录则为 TRUE |
IN | 如果操作数等于表达式列表之一,则为 TRUE |
LIKE | 如果操作数匹配模式则为 TRUE |
NOT | 如果条件不成立则显示一条记录 |
OR | 如果由 OR 分隔的任何条件为 TRUE,则为 TRUE |
SOME | 如果任何子查询值满足条件则为 TRUE |