SQL 系列教程(四)

本文详细介绍了SQL的SELECTINTO语句用于数据复制,INSERTINTOSELECT用于数据插入,CASE语句处理条件返回值,NULL函数处理NULL值,以及SQLServer存储过程的使用。同时涵盖了SQL运算符,包括算术、按位、比较、复合和逻辑运算符。
摘要由CSDN通过智能技术生成

目录

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" 表中选择的内容:

CustomerIDCustomerNameContactNameAddressCityPostalCodeCountry
1
 
Alfreds FutterkisteMaria AndersObere Str. 57Berlin12209Germany
2Ana Trujillo Emparedados y heladosAna TrujilloAvda. de la Constitución 2222México D.F.05021Mexico
3Antonio Moreno TaqueríaAntonio MorenoMataderos 2312México D.F.05023Mexico

以及从 "Suppliers" 表中选择的内容:

SupplierIDSupplierNameContactNameAddressCityPostal CodeCountry
1Exotic LiquidCharlotte Cooper49 Gilbert St.LondonaEC1 4SDUK
2New Orleans Cajun DelightsShelley BurkeP.O. Box 78934New Orleans70117USA
3Grandma Kelly's HomesteadRegina Murphy707 Oxford Rd.Ann Arbor48104USA

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" 表中选择的内容:

OrderDetailIDOrderIDProductIDQuantity
1102481112
2102484210
310248725
410249149
5102495140

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_IdProductNameUnitPriceUnitsInStockUnitsOnOrder
1Jarlsberg10.451615
2Mascarpone32.5623
3Gorgonzola15.67920

假如 "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)" 表中查询的内容:

CustomerIDCustomerNameContactNameAddressCityPostalCodeCountry
1
 
Alfreds FutterkisteMaria AndersObere Str. 57Berlin12209Germany
2Ana Trujillo Emparedados y heladosAna TrujilloAvda. de la Constitución 2222México D.F.05021Mexico
3Antonio Moreno TaqueríaAntonio MorenoMataderos 2312México D.F.05023Mexico
4
 
Around the HornThomas Hardy120 Hanover Sq.LondonWA1 1DPUK
5Berglunds snabbköpChristina BerglundBerguvsvägen 8LuleåS-958 22Sweden

存储过程实例

以下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
  • 30
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值