sql在子查询是“查询中的查询”。“当你做了很多繁重的SQL查询时,有时你需要使用子查询。用于在记录集(子查询)中搜索记录的一个关键字是使用SQL“in”语句。“in”语句基本上是说“查找在这个子查询中的记录”。虽然它并不总是性能最好的,但您可能需要重写、维护或添加到使用“in”语句的现有子查询。

在Udemy.com上学习如何使用带有类的SQL语言。

一个普通的SQL查询

如果您有一点SQL经验,就会认识到一个“普通”查询。下面是一个标准的select语句:

从users中选择first_name, last_name

上面的语句从SQL表users中选择列“first_name”和“last_name”。上面这句话在所有主要的SQL平台上都是通用的,比如Oracle、SQL Server和MySQL。当您开始创建更复杂的语句时,语言发生了变化。

上面的语句显示了users表中的所有帐户。下面的SQL语句基于“where”子句筛选用户:

select first_name, last_name from users where first_name= ' john '

上面的语句添加了where过滤器,并且只返回用户名为“John”的帐户。注意查询中的小写字母“J”。SQL是不区分大小写的,所以上面的语句将返回任何名字列中有“John”、“John”或“John”的用户。在SQL数据库中,过滤记录集是正常的。您的表可以增长到数百万条记录。将所有这些记录返回到代码中然后进行过滤是错误的。您应该始终在数据库级别过滤记录集,以提高web应用程序的性能。

在Udemy.com上使用SQL类学习SQL编程。

使用SQL“In”语句

在你写“in”语句之前,你应该理解子查询的概念。正如前面的语句,子查询是“查询中的查询”。当你用一个子查询运行一个SQL语句时,系统首先执行这个子查询。子查询返回一个记录集,然后主查询对子查询的记录集运行一条语句。

使用SQL " in "语句的示例如下:

select first_name, last_name from users where first_name= ' john ' and userid in (1,2,3)

上面的语句说:“返回所有名为‘john’且userid列为1、2或3的用户。" in "语句比在where子句中创建or语句容易得多。下面的SQL语句是上述语句的另一种写法:

select first_name, last_name from users where first_name= ' john ' and (userid = 1 or userid = 2 or userid = 3)

显然,“in”语句更有效,也更容易使用。您还可以选择在“in”语句中使用完整的子查询。下面的代码展示了如何在SQL in语句中创建完整的子查询:

select first_name, last_name from users where first_name= ' john ' and userid in (select userid from users where userid = 1 or userid = 2 or userid = 3)

上面三个语句都返回相同的数据集。但是,最后一个语句使用子查询返回id为1、2或3的用户列表。最后一种方法是最低效的创建查询的方法。前两个不对数据库表运行子查询。最后一个首先运行内部select语句,返回id为1、2或3的用户列表,然后运行主查询(外部查询)。这意味着数据库必须执行两个查询,而不是一个查询。如果有太多这种类型的语句,从技术上讲,您可能会降低应用程序的速度。虽然这样的语句可能不会产生明显的差异,但太多这样的语句会使系统变慢,以至于您需要重新编写SQL语句。

注意,子查询返回“userid”列。在使用“in”语句时,这一点很重要。该语句表示“userid在哪里”,这意味着SQL数据库服务器将在子查询中查找所有匹配的用户id。如果在子查询中不返回userid,则SQL语句将返回错误。例如,下面的代码将抛出一个错误,如果你试图在SQL中运行它:

select first_name from users where first_name= ' john ' and userid in (select first_name from users where userid = 1 or userid = 2 or userid = 3)

您还可以在“in”语句中使用SQL字符串。这与userid子查询类似,但它使用的是字符串而不是整数值。下面的代码是一个使用字符串值的" in "语句的示例:

select first_name, last_name from users where first_name= ' john ' and last_name in (' smith ', ' jones ')

在上面的语句中,仅当用户的姓是“Smith”或“Jones”时,才返回名字为“John”的所有记录。

虽然在技术上不是很有效,但是您也可以在子查询中嵌入一个“in”语句。下面的查询返回的记录与上面的语句相同,除了“in”语句在子查询中:

select first_name, last_name from users where first_name= ' john ' and userid in (select user from users where userid in (1,2,3))

虽然“in”语句不是查询数据库的首选方式,但在某些场景中仍然有用。在大多数情况下,您可以重写查询以提高效率。如果您有来自同行甚至数据库管理员的代码评审,您可能会遇到“in”语句的问题。然而,这种类型的语句比拥有几个“或”语句要好,因为它更容易阅读,而且程序员更喜欢它而不是长而难读的语句。即使它太难读了,也不意味着它不值得重新编程。然而,理解如何读和写“in”语句仍然是有益的。

作为初学者,在Udemy.com了解如何使用SQL。

SQL顶级课程

SQL和PostgreSQL:完整的开发人员指南
Stephen主梁
4.7 (1087)
评价最高
完整的SQL训练营2021:从零到英雄
何塞Portilla
4.7 (94420)
畅销书
终极MySQL训练营:从SQL初学者到专家
柯尔特·斯蒂尔,伊恩·斯库诺弗
4.6 (51841)
畅销书
SQL - MySQL数据分析和商业智能
365年职业生涯
4.6 (26299)
畅销书
高级SQL: SQL专家认证预备课程
甲骨文大师培训•全球8万多名学员,代码之星学院
4.3 (1950)
畅销书
完成SQL和数据库训练:从零到精通[2021]
Andrei Neagoie, Mo Binni
4.6 (1220)
SQL初学者:使用MySQL和数据库设计学习SQL
Tim Buchalka's Learn Programming Academy, Jon Avis - SQL讲师
4.5 (8551)
从头开始学习SQL +安全性(pen)测试
拉胡尔谢蒂
4.5 (1512)
畅销书
SQL & PostgreSQL初学者:成为SQL专家
Jon Avis - SQL讲师
4.5 (2999)
畅销书

多个SQL课程

SQL学生也学习

让你的团队。领导行业。

通过Udemy for Business为您的组织订阅在线课程图书馆和数字学习工具。

请求一个演示