目录
SQL SELECT INTO 语句
SQL SELECT INTO 语句
SQL SELECT INTO 实例
SQL INSERT INTO SELECT 语句
SQL INSERT INTO SELECT 语句
演示数据库
SQL INSERT INTO SELECT 实例
SQL CASE 语句
SQL CASE 语句
演示数据库
SQL CASE 实例
SQL NULL 函数
SQL IFNULL(), ISNULL(), COALESCE(), NVL() 函数
解决方案
SQL Server 存储过程
什么是存储过程
演示数据库
存储过程实例
带参数的存储过程
多参数存储过程
SQL 注释
SQL 注释
单行注释
多行注释
SQL 运算符
SQL 算术运算符
SQL 按位运算符
SQL 比较运算符
SQL 复合运算符
SQL 逻辑运算符
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 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;
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语句将"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';
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遍历条件并在满足第一个条件时返回值:
【实例】
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);
请看下面的 "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代码,因此代码可以反复使用。
因此,如果您有一个反复编写的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 语句的执行。
注:本章中的示例不适用于 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;
运算符 | 描述 |
---|---|
+ | Add |
- | Subtract |
* | Multiply |
/ | Divide |
% | Modulo |
运算符 | 描述 |
---|---|
& | 按位与 |
| | 按位或 |
^ | 按位异或 |
运算符 | 描述 |
---|---|
= | 等于 |
> | 大于 |
< | 小于 |
>= | 大于或等于 |
<= | 小于或等于 |
<> | Not equal to |
运算符 | 描述 |
---|---|
+= | 加等于 |
-= | 减去等于 |
*= | 乘以等于 |
/= | 除以等于 |
%= | 模等于 |
&= | 按位与等于 |
^-= | 按位互斥等于 |
|*= | 按位或等于 |
运算符 | 描述 |
---|---|
ALL | 如果所有子查询值都满足条件则为 TRUE |
AND | 如果由 AND 分隔的所有条件都为 TRUE,则为 TRUE |
ANY | 如果任何子查询值满足条件则为 TRUE |
BETWEEN | 如果操作数在比较范围内,则为 TRUE |
EXISTS | 如果子查询返回一条或多条记录则为 TRUE |
IN | 如果操作数等于表达式列表之一,则为 TRUE |
LIKE | 如果操作数匹配模式则为 TRUE |
NOT | 如果条件不成立则显示一条记录 |
OR | 如果由 OR 分隔的任何条件为 TRUE,则为 TRUE |
SOME | 如果任何子查询值满足条件则为 TRUE |