10 个 T-SQL 提示和技巧
概述:.NET 和 T-SQL 共享一种明确无误的纽带。从我记事起,我就一直使用 T-SQL 以及 C# 和 Entity Framework Core。然而,在所有这些抽象之下,人们很容易忽视原始SQL的细微差别以及深入理解它的重要性。因此,让我们深入了解一些 RAW SQL :)1. 通用表表达式 (CTE)有没有发现自己迷失在子查询的海洋中?CTE 可以成为救命稻草。它们允许您命名临时结果集,并在主查询中使用它。以下是如何使用它:WITH Sales_CTE AS ( SELECT CustomerID, SUM(OrderTotal) AS TotalSales FROM Ord
.NET 和 T-SQL 共享一种明确无误的纽带。从我记事起,我就一直使用 T-SQL 以及 C# 和 Entity Framework Core。
然而,在所有这些抽象之下,人们很容易忽视原始SQL的细微差别以及深入理解它的重要性。
因此,让我们深入了解一些 RAW SQL ?
有没有发现自己迷失在子查询的海洋中?CTE 可以成为救命稻草。它们允许您命名临时结果集,并在主查询中使用它。以下是如何使用它:
从新的角度看待数据。
窗口函数允许您通过“窗口”查看数据并跨相关行执行计算。考虑计算运行总数或对项目进行排名。
有时,您需要一个临时位置来存储查询中的数据。
表变量和临时表非常适合此目的。它们就像您在重新整理房间时使用的临时储物箱。
如果您的查询速度很慢,索引可能正是您需要的提升。它们就像帮助 SQL Server 更快地查找数据的快捷方式。但请记住,太多会减慢数据更新速度,所以这完全是关于平衡的。
有几种类型的索引,但让我们保持简单,并讨论您可能会使用的两种主要索引:
将聚集索引视为组织数据的主要方式。它实际上按索引的顺序存储行数据。因此,当您在列上创建聚集索引时,SQL Server 会根据该列的值重新排列表中的数据。
下面是一个基本示例:
这些类似于附加指南,可帮助您根据您可能经常查询但不是主要排序机制的其他列查找数据。
与聚集索引不同,非聚集索引维护与实际表数据不同的结构,其中包括索引列和指向包含这些值的行的指针。
以下是您可以创建一个的方法:
好吧,如果没有它们,SQL Server 必须扫描整个表才能找到您要求的数据,这可能会很慢且很痛苦,尤其是对于大型表。使用索引,它可以快速跳转到表的右侧并获取所需的内容。
虽然索引非常适合读取操作,但它们会减慢 INSERT、UPDATE 和 DELETE 等写入操作的速度,因为每次数据更改时都需要更新索引本身。这一切都是为了根据应用程序使用数据的方式找到正确的平衡点。
MERGE 语句是 SQL Server 中的一个强大工具。
它允许您更新现有记录、插入新记录或删除不再需要的记录,所有这些都只需一个命令即可完成。您可以设置如何在两个表之间匹配数据的规则,其余的由 MERGE 负责。
这使得使表保持最新变得更加容易,尤其是在处理大量更改时。
当您从不同位置提取数据或使用用户输入时,有时事情并不完全匹配。这就是TRY_CAST和TRY_CONVERT派上用场的地方。
这两个函数都尝试将值的数据类型更改为另一种类型。如果转换是可能的,那就太好了!它们以新格式返回值。
但是,如果无法完成转换(可能是因为数据的格式意外),则它们将返回 NULL 而不是抛出错误。这非常有用,因为这意味着即使数据出现问题,您的查询也能保持平稳运行。
假设您有一列应该是日期,但有可能有一些非日期值潜入其中。
如果包含不是日期的内容,TRY_CAST 将为该值返回 NULL,而不是因错误而停止查询。YourColumn
与 TRY_CAST 非常相似,但它允许您指定转换的样式。这对于格式可能发生变化的日期和时间特别有用。
这将尝试使用样式“101”(美国样式,mm/dd/yyyy)转换为 DATE。如果转换不起作用,则会收到 NULL 而不是错误。YourColumn
在 SQL 脚本或存储过程中打开就像告诉 SQL Server,“嘿,让我们保持聊天最少。SET NOCOUNT ON
通常,SQL Server 喜欢在每次运行 INSERT、UPDATE、DELETE 或 SELECT 语句时通过说明受影响的行数来提醒您一些提示。此消息乍一看似乎很有帮助,但是当您运行大量语句或处理复杂的过程时,所有这些更新都会减慢速度。
特别是在复杂的程序中或进行大量小操作时,删除这些消息可以稍微加快速度。它可以减少 SQL Server 和应用程序之间的网络流量,这在高容量环境中特别有用。
如果您的应用程序或工具记录了这些消息,则关闭它们可以使您的日志更干净,并更专注于重要的事情。
这是你如何做到的:
只需将此行放在脚本或存储过程的开头即可。这是一个很小的改变,但可以在保持事情顺利进行和专注于重要的事情方面产生很大的影响。
请记住,仅影响有关受影响行的消息;它不会使错误消息或其他重要信息静音,因此您仍然可以了解引擎盖下发生的事情。SET NOCOUNT ON
动态 SQL 允许您动态构建 SQL 语句。这就像能够根据您目前拥有的零件(数据)随心所欲地组装您的乐高套装。
当您执行更改数据的操作时,OUTPUT 子句可以准确地显示所做的更改。
它可以告诉您添加、更新或删除了哪些行,甚至可以显示更新之前和之后的值。
下面是一个基本示例,用于说明如何将其与 INSERT 操作一起使用:
在这种情况下,OUTPUT 子句指示 SQL Server 返回刚刚添加的新记录的 EmployeeID、Name 和 Role。对于 UPDATE 或 DELETE 操作,同样可以使用来查看新值或查看已删除的内容。inserteddeleted
这为您提供了一种强大的方法来审核更改,甚至将这些更改馈送到另一个进程或表中。
考虑一个场景,其中你正在更新员工记录,并希望保留更改日志:
这不仅会更新员工的角色,还会捕获更改并将其记录到表中,显示旧角色、新角色以及角色已更改的员工的 ID。EmployeeRoleChanges
SQL Server 中的游标允许您一次处理一行。
这在某些情况下非常有用,因为您需要对每一行执行复杂的逻辑。但是,游标通常速度较慢,因为它们将一个可能是单个快速操作的过程转换为一长串步骤。
想象一下,你正在分发传单。您可以一次将它们分发给房间里的每个人(基于 SET 的操作),或者您可以走到每个人面前,一次递给他们一张传单(光标)。第一种方法显然要快得多。
另一方面,基于 SET 的操作可以同时处理整个数据集。SQL Server 的设计非常擅长于此。
假设您要更新表中某些行的列。使用光标,您可以编写如下内容(为清楚起见,请简化):
使用基于 SET 的方法,您可以以更简单、更快速的方式获得相同的结果:
在这种情况下,基于 SET 的操作不仅更易于读取和写入,而且速度可能更快。
SQL Server 在处理数据集时可以利用索引、并行处理和其他优化,而不是单独处理每一行。
数据大佬划出的13条重点SQL语句,句句经典!
数据科学中90%的任务,可以借助这13条SQL语句解决。
结构化查询语言 (SQL) 是一种用于管理和操作关系数据库的编程语言。数据分析师和数据科学家广泛使用SQL从大型数据集中发现规律。
SQL 是一种强大的工具,可用于执行各种数据操作任务,包括过滤、排序、分组和聚合数据。在本文中,我将介绍 13 个基本 SQL 语句,借助它们可解决数据科学中90%的任务。这些语句易于理解和实现,可以为使用 SQL 打下坚实的基础。
无论你是刚接触SQL 还是有一定的经验,本文都可以为你提供处理数据的帮助和实用技巧。
SELECT语句用于从数据库中的一个或多个表中检索数据。你应该掌握使用 SELECT 来搭配 WHERE、ORDER BY 和 GROUP BY 等不同函数对数据进行过滤、排序和分组。下面是一个 SELECT 语句的例子:
在此示例中column1,column2、 和column3是你要从中检索数据的列的名称,table_name是包含数据的表的名称。该WHERE子句是可选的,但用于指定查询检索数据所必须满足的条件。
下面是一个示例,它从名为“客户”的表中选择客户年龄大于或等于 18 岁的所有记录:
JOIN 语句用于合并数据库中两个或多个表的数据。你应该掌握使用 JOIN 从多个表中检索数据并根据需要指定连接类型(例如 INNER、LEFT、RIGHT、FULL OUTER)。
以下是 JOIN 语句的几个示例:
内连接
INNER JOIN 仅返回两个表中的列之间存在匹配项的行。这是一个例子:
在此示例中,orders表和customers表使用列customer_id进行连接。结果表将仅包含order_id和两个表中的customer_name列之间存在匹配项的列customer_id。
左连接
LEFT JOIN 返回左表中的所有行和右表中的匹配行。如果右表中没有匹配项,则结果将包含 NULL 值。下面是一个例子:
本例中,customers表为左表,orders表为右表。该customer_id列用于连接表。结果表将包括表中的所有行customers和表中的匹配行orders。如果表中没有匹配项orders,该order_id列将包含 NULL 值。
右连接
RIGHT JOIN 返回右表中的所有行和左表中的匹配行。如果左表中没有匹配项,则结果将包含 NULL 值。这是一个例子:
本例中,orders表为左表,customers表为右表。该customer_id列用于连接表。结果表将包括表中的所有行orders和表中的匹配行customers。如果表中没有匹配项customers,该customer_name列将包含 NULL 值。
外连接
SQL 中的 OUTER JOIN 用于返回一个或两个表中的所有行,包括不匹配的行。OUTER JOIN 有两种类型:LEFT OUTER JOIN 和 RIGHT OUTER JOIN。
下面是一个 LEFT OUTER JOIN 的例子:
本例中,customers表为左表,orders表为右表。该customer_id列用于连接表。结果表将包括表中的所有行customers和表中的匹配行orders。如果表中没有匹配项orders,该order_id列将包含 NULL 值。
下面是 RIGHT OUTER JOIN 的示例:
本例中,orders表为左表,customers表为右表。该customer_id列用于连接表。结果表将包括表中的所有行orders和表中的匹配行customers。如果表中没有匹配项customers,该customer_name列将包含 NULL 值。
值得注意的是,某些数据库可能不支持 RIGHT OUTER JOIN,但您可以通过使用 LEFT OUTER JOIN 并交换表的顺序来获得相同的结果。
WHERE 语句用于根据指定的条件过滤数据。你应该掌握使用 WHERE 来检索满足特定条件的数据。
以下是在 SQL 中使用“where”语句从表中过滤数据的示例:
假设我们有一个名为“employees”的表,其中包含“name”、“department”和“salary”列。我们可以使用“where”语句仅选择在“销售”部门工作且薪水大于 $50,000 的员工:
此查询将返回在“销售”部门工作且薪水大于 $50,000 的所有员工的列表,并在结果中显示他们的姓名、部门和薪水。
GROUP BY 语句用于根据一个或多个列对数据进行分组,聚合函数(例如 COUNT、SUM、AVG)可用于计算分组数据的汇总。你应该掌握使用 GROUP BY 来按类别分析数据。
假设我们有一个名为“employees”的表,其中包含“name”、“department”和“salary”列。我们可以使用 GROUP BY 语句按部门对员工进行分组,并计算每个部门的平均工资:
此查询将返回所有部门的列表和每个部门的平均工资,计算方法是将该部门员工的所有工资总和除以该部门的员工人数。GROUP BY子句用于按部门对员工进行分组,AVG函数用于计算每个部门的平均工资。
在此示例中,我们可以看到销售部门的平均工资为 65,000 美元,市场部的平均工资为 55,000 美元,工程部的平均工资为 80,000 美元。
HAVING语句用于在GROUP BY语句分组后过滤数据。您应该掌握使用HAVING来根据特定条件过滤分组数据。
下面是在 SQL 中使用HAVING子句的示例:
假设有一个名为“orders”的表,其中包含“order_id”、“customer_id”、“product_id”和“quantity”列。目标是找到订购了至少 50 件产品的客户。可以使用GROUP BY子句将订单按客户分组,计算出每个客户订购的每种产品的总数量。然后,可以使用 HAVING 子句来过滤结果,以仅包括订购总量至少为 50 件的客户:
此查询将返回所有客户及其订购产品总数的列表,但仅包括订购总量至少为 50 件的客户。GROUP BY子句用于按客户对订单进行分组,SUM函数用于计算每个客户订购的产品总数量,HAVING子句用于过滤结果只包含订购了总数量的客户至少50个单位。
查询的输出看起来像这样:
在此示例中可以看到,客户 123 总共订购了 60 件产品,客户 456 总共订购了 70 件产品。这两个客户都满足 HAVING 子句中指定的条件,该条件要求总数量至少为 50 个单位。
SQL 中的窗口函数用于对与当前行相关的一组行执行计算。这些函数应用于一个窗口,该窗口是基于指定条件或分区的表中行的子集。以下是 SQL 中窗口函数的一些示例:
- ROW_NUMBER():此函数为分区内的每一行分配一个唯一的序列号。ROW_NUMBER() 函数的语法是:
此查询将返回一个结果集,其中包含一个附加列“row_num”,该列包含根据“column1”的顺序分配给每一行的序号。
- SUM():此函数计算分区内列的总和。SUM() 函数的语法是:
此查询将返回一个结果集,其中包含一个附加列“column3_sum”,该列包含基于“column1”的值的每个分区的“column3”的总和。
- RANK():此函数根据指定列的值为分区内的每一行分配排名。RANK() 函数的语法是:
此查询将返回一个结果集,其中包含一个附加列“rank_num”,该列包含每个分区中每行的排名,基于“column3”的降序。
- AVG():此函数计算分区内列的平均值。AVG() 函数的语法是:
此查询将返回一个结果集,其中包含一个附加列“column3_avg”,该列包含基于“column1”的值的每个分区的“column3”的平均值。
请注意,窗口函数的语法可能因所使用的特定数据库管理系统 (DBMS) 而异。
在 SQL 中,UNION运算符用于将两个或多个 SELECT 语句的结果组合成一个结果集。SELECT语句必须具有相同的列数,并且列必须具有兼容的数据类型。重复的行会自动从结果集中删除。
下面是在 SQL 中使用 UNION 运算符的示例:
假设我们有两个名为“customers”和“employees”的表,都有“name”和“city”列。我们想创建一个包含所有居住在纽约市的人(包括客户和员工)的列表。我们可以使用 UNION 运算符来组合两个 SELECT 语句的结果:
此查询将返回居住在纽约市的所有人的列表,包括客户和员工。第一个 SELECT 语句检索居住在纽约市的所有客户,第二个 SELECT 语句检索居住在纽约市的所有员工。UNION 运算符组合这两个 SELECT 语句的结果并删除任何重复的行。
查询的输出结果如下所示:
在这个例子中,可以看到有四个人住在纽约市,两个来自“customers”表,两个来自“employees”表,UNION 运算符将两个 SELECT 语句的结果组合成一个单个结果集。
CREATE 语句用于创建新的数据库表、视图或其他数据库对象。你应该掌握使用 CREATE 创建新表、视图和其他数据库对象的方法。下面是在 SQL 中使用CREATE 语句的示例:
假设我们要创建一个名为“customers”的新表,其中包含“id”、“name”、“email”和“phone”列。我们可以使用 CREATE 语句来做到这一点:
此查询将创建一个名为“customers”的新表,其中包含四列:“id”、“name”、“email”和“phone”。“id”列被定义为一个整数,并被设置为表的主键。“name”列定义为最大长度为 50 个字符的字符串,“email”和“phone”列也分别定义为最大长度为 100 和 20 个字符的字符串。
执行查询后,我们可以将新行插入“customers”表并从中检索数据:
此查询将在“customers”表中插入一个新行,ID 为 1,姓名为“John Doe”,电子邮件为“ johndoe@example.com ”,电话号码为“555–555–1234” . 第二个查询将从“customers”表中检索所有行,其中包括我们刚刚插入的新行:
在这个例子中,我们使用CREATE语句在数据库中创建了一个新表,并在表中插入了一条新行。
插入 INSERT 语句用于将数据插入数据库表。你应该掌握使用 INSERT 向数据库表中添加新数据。下面是在 SQL 中使用 INSERT 语句的示例:
假设我们有一个名为“students”的表,其中包含“id”、“name”、“major”和“gpa”列。我们想在表中插入一个新行,记录 ID 为 1234、姓名为“John Doe”、主修“计算机科学”且 GPA 为 3.5 的学生。我们可以使用 INSERT 语句来做到这一点:
此查询将向“students”表中插入一个新行,其中包含“id”、“name”、“major”和“gpa”列的指定值。INSERT 语句指定我们要插入的表的名称,后面是我们要插入值的列列表。然后我们使用 VALUES 关键字来指定我们想要插入到每一列中的值,按照列的列出顺序。
执行查询后,“students”表将有一个包含以下值的新行:
在这个例子中,我们使用INSERT语句在 \”学生 \”表中插入了一条新行。
更新 UPDATE语句用于修改数据库表中的现有数据。你应该掌握使用 UPDATE 来更新表中一个或多个列的值。以下是在 SQL 中使用UPDATE语句的示例:
假设我们有一个名为“students”的表,其中包含“id”、“name”、“major”和“gpa”列。我们想更新 ID 为 1234 的学生的专业和 GPA。我们可以使用UPDATE语句来执行此操作:
此查询将更新 ID 为 1234 的“students”表中行的“major”和“gpa”列。UPDATE 语句指定我们要更新的表的名称,然后是 SET 关键字和列表,以及要更新的列值对。然后,我们使用 WHERE 子句指定要更新的行。在本例中,我们想要更新 ID 为 1234 的行,因此我们指定“WHERE id = 1234”。
执行查询后,“students”表将在 ID 为 1234 的行中更新“major”和“gpa”列的值:
在这个例子中,我们使用UPDATE语句更新了 \”students\”表中某一行的 \”专业 \”和 \”gpa \”列。
删除 DELETE 语句用于从数据库表中删除一行或多行。你应该掌握使用DELETE从表中删除数据的方法。下面是在 SQL 中使用DELETE语句的示例:
假设我们有一个名为“students”的表,其中包含“id”、“name”、“major”和“gpa”列。我们想从表中删除 ID 为 1234 的学生。我们可以使用DELETE语句来做到这一点:
从id = 1234的学生中删除;
此查询将从“students”表中删除 ID 为 1234 的行。DELETE语句指定我们要从中删除的表的名称, WHERE 子句用于指定要删除的行。在本例中,我们要删除 ID 为 1234 的行,因此我们指定“WHERE id = 1234”。
执行查询后,“students”表将不再有 ID 为 1234 的行:
在这个例子中,我们使用DELETE语句从\”students\”表中删除了一条记录。
删除DROP 语句用于删除数据库表或其他数据库对象。你应该掌握使用 DROP 从数据库中删除不必要的表或其他对象。DROP 语句的语法因被删除对象的类型而异,一些常见的示例如下所示:
- DROP TABLE:此语句用于删除现有表及其所有数据和索引。DROP TABLE 语句的语法是:
2. DROP INDEX:该语句用于从表中删除现有索引。DROP INDEX 语句的语法是:
3. DROP VIEW:该语句用于删除现有视图。DROP VIEW 语句的语法是:
4. DROP PROCEDURE:该语句用于删除一个现有的存储过程。DROP PROCEDURE 语句的语法是:
请注意,DROP 语句的确切语法可能因所使用的特定数据库管理系统 (DBMS) 而异。此外,在使用 DROP 语句时要小心,因为它会永久删除指定的对象以及所有关联的数据和索引。请确保在使用 DROP 语句之前备份你的数据。
改变 ALTER语句用于修改数据库表或其他数据库对象的结构。你应该掌握使用 ALTER 添加或删除列、更改数据类型或修改表的其他方面。ALTER 语句的语法因被修改对象的类型而异,但一些常见的示例是:
- ALTER TABLE:该语句用于修改现有表的结构,例如添加或删除列、更改数据类型或设置约束。ALTER TABLE 语句的语法是:
2. ALTER INDEX:该语句用于修改现有索引的结构,例如添加或删除列或更改索引类型。ALTER INDEX 语句的语法是:
3. ALTER VIEW:此语句用于修改现有视图的定义,例如更改用于创建它的SELECT 语句。ALTER VIEW 语句的语法是:
请注意,ALTER 语句的确切语法和窗口函数的语法可能因所使用的特定数据库管理系统 (DBMS) 而异。
转载自公众号 Python学研大本营
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。