SQL 系列教程(四)

目录

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 逻辑运算符


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

你可能感兴趣的:(SQL系列教程,SQL,教程,资料,笔记)