存储过程是一段预先编写好的 SQL 代码,可以保存在数据库中以供反复使用。它允许将一系列 SQL 语句组合成一个逻辑单元,并为其分配一个名称,以便在需要时调用执行。存储过程可以接受参数,使其更加灵活和通用。
创建存储过程的语法如下:
CREATE?PROCEDURE?存储过程名称
AS
SQL语句
GO;
执行存储过程的语法如下:
EXEC?存储过程名称;
以下是 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 |
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" 表中选择特定城市和特定邮政编码的客户:
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 语句的解释,或者在调试和维护过程中临时禁用某些语句。注释不会被数据库执行。
单行注释以?--
?开头,后面的文本将被注释掉。
--?这是单行注释
SELECT?*?FROM?Customers;
在单行注释中,--
?后面的文本会被忽略。
SELECT?*?FROM?Customers?--?WHERE?City='Berlin';
在这个例子中,--
?后面的文本和语句末尾的内容都被忽略。
多行注释以?/*
?开头,以?*/
?结尾,之间的所有文本都被注释掉。
/*?这是
多行注释?*/
SELECT?*?FROM?Customers;
在多行注释中,/*
?和?*/
?之间的文本都被忽略。
/*?SELECT?*?FROM?Customers;
SELECT?*?FROM?Products;
SELECT?*?FROM?Orders;
SELECT?*?FROM?Categories;?*/
SELECT?*?FROM?Suppliers;
在这个例子中,/*
?和?*/
?之间的所有语句都被注释掉。
要仅忽略语句的一部分,可以在适当位置使用?/* */
?注释。
SELECT?CustomerName,?/*City,*/?Country?FROM?Customers;
在这个例子中,/*
?和?*/
?之间的?City
?列会被注释掉,而其他部分保持不变。
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;
在这个例子中,/*
?和?*/
?之间的部分条件被注释掉,但其他条件保持不变。
加法 (+
):?用于将两个值相加。
SELECT?column1?+?column2?AS?SumResult?FROM?tableName;
减法 (-
):?用于从第一个值中减去第二个值。
SELECT?column1?-?column2?AS?Difference?FROM?tableName;
乘法 (*
):?用于将两个值相乘。
SELECT?column1?*?column2?AS?Product?FROM?tableName;
除法 (/
):?用于将第一个值除以第二个值。
SELECT?column1?/?column2?AS?Quotient?FROM?tableName;
取模 (%
):?返回除法的余数。
SELECT?column1?%?column2?AS?Modulus?FROM?tableName;
按位与 (&
):?对二进制数进行按位与运算。
SELECT?column1?&?column2?AS?BitwiseAND?FROM?tableName;
按位或 (|
):?对二进制数进行按位或运算。
SELECT?column1?|?column2?AS?BitwiseOR?FROM?tableName;
按位异或 (^
):?对二进制数进行按位异或运算。
SELECT?column1?^?column2?AS?BitwiseXOR?FROM?tableName;
等于 (=
):?判断两个值是否相等。
SELECT?column1?FROM?tableName?WHERE?column1?=?column2;
大于 (>
):?判断一个值是否大于另一个值。
SELECT?column1?FROM?tableName?WHERE?column1?>?column2;
小于 (<
):?判断一个值是否小于另一个值。
SELECT?column1?FROM?tableName?WHERE?column1?<?column2;
大于等于 (>=
):?判断一个值是否大于或等于另一个值。
SELECT?column1?FROM?tableName?WHERE?column1?>=?column2;
小于等于 (<=
):?判断一个值是否小于或等于另一个值。
SELECT?column1?FROM?tableName?WHERE?column1?<=?column2;
不等于 (****<>
**?或?!=
):** 判断两个值是否不相等。
SELECT?column1?FROM?tableName?WHERE?column1?<>?column2;
复合运算符是一组用于执行多个操作的运算符。
加等于 (+=
):?将右侧的值添加到左侧的值,并将结果分配给左侧的值。
UPDATE?tableName?SET?column1?+=?10?WHERE?condition;
减等于 (-=
):?从左侧的值中减去右侧的值,并将结果分配给左侧的值。
UPDATE?tableName?SET?column1?-=?5?WHERE?condition;
乘等于 (*=
):?将左侧的值乘以右侧的值,并将结果分配给左侧的值。
UPDATE?tableName?SET?column1?*=?2?WHERE?condition;
除等于 (/=
):?将左侧的值除以右侧的值,并将结果分配给左侧的值。
UPDATE?tableName?SET?column1?/=?3?WHERE?condition;
取模等于 (%=
):?将左侧的值除以右侧的值并取余数,结果分配给左侧的值。
UPDATE?tableName?SET?column1?%=?4?WHERE?condition;
逻辑运算符用于连接和改变条件语句的逻辑关系。
AND:?如果由?AND
?分隔的所有条件都为?TRUE
,则为?TRUE
。
SELECT?*?FROM?tableName?WHERE?condition1?AND?condition2;
OR:?如果由?OR
?分隔的任何条件都为?TRUE
,则为?TRUE
。
SELECT?*?FROM?tableName?WHERE?condition1?OR?condition2;
NOT:?如果条件不为?TRUE
,则显示记录。
SELECT?*?FROM?tableName?WHERE?NOT?condition;
以上?AND
、OR
?和?NOT
?可以结合使用,以满足更复杂的查询需求。