概述

当涉及到SQL数据查询时,“where”、"having"和"on"这三个关键词都是必不可少的组成部分。它们分别用于筛选行、筛选分组和连接表格进行联接查询。虽然它们的作用不同,但是它们的使用方式和语法很相似。

"where"关键词用于在查询中筛选行,它可以根据指定的条件选择满足条件的记录。"where"通常出现在"SELECT"语句之后,"FROM"语句之前。

"having"关键词用于在分组查询中筛选行,它可以根据指定的条件筛选出满足条件的分组。"having"通常出现在"GROUP BY"语句之后。

"on"关键词用于连接表格进行联接查询,它通常出现在"JOIN"语句之后,并用于指定连接两个表格时的关联条件。

这三个关键词都是SQL查询语句中非常重要的组成部分,掌握它们的用法和语法,可以帮助我们更快速、更准确地查询和筛选数据,提高查询效率和数据处理能力。

语法

好的,接下来我将介绍这三个关键词在SQL语句中的语法和用法。

  1. "where"语法:

"where"通常出现在"FROM"语句之后。其基本语法格式如下:

SELECT column1, column2, ...
FROM table_name
WHERE condition;

其中,"column1, column2, …"表示需要查询的列名,"table_name"表示需要查询的表名,"condition"表示筛选条件。

"condition"可以是一个或多个表达式,用于指定筛选条件。例如:

SELECT * FROM customers WHERE country = 'China';

这条SQL语句会从名为"customers"的表中选择符合"country = ‘China’"条件的记录。

  1. "having"语法:

"having"通常出现在"GROUP BY"语句之后。其基本语法格式如下:

SELECT column1, column2, ...
FROM table_name
GROUP BY column1, column2, ...
HAVING condition;

其中,"column1, column2, …"表示需要查询的列名,"table_name"表示需要查询的表名,"condition"表示筛选条件。

"condition"通常是一个或多个聚合函数,例如SUM、AVG、COUNT、MAX和MIN等,用于指定筛选分组的条件。例如:

SELECT country, COUNT(*) as count FROM customers GROUP BY country HAVING count > 5;

这条SQL语句会从名为"customers"的表中按照"country"字段进行分组,并计算每个分组的记录数。然后,只有当记录数大于5时,才会返回该分组的结果。

  1. "on"语法:

"on"关键词通常出现在"JOIN"语句之后,用于指定连接两个表格时的关联条件。其基本语法格式如下:

SELECT column1, column2, ...
FROM table1
JOIN table2
ON condition;

其中,"column1, column2, …"表示需要查询的列名,"table1"和"table2"表示需要连接的两个表格,"condition"表示连接条件。

“condition"通常是一个比较表达式,例如"table1.column = table2.column”,用于指定连接两个表格的关联条件。例如:

SELECT orders.order_id, customers.customer_name
FROM orders
INNER JOIN customers
ON orders.customer_id = customers.customer_id;

这条SQL语句使用"INNER JOIN"将"orders"表和"customers"表连接起来,并使用"on"关键词指定了连接两个表格的条件,即"orders.customer_id = customers.customer_id"。这条语句返回了所有符合条件的"orders"和"customers"表的记录。

“where"和"on”

  1. 功能区别:

"where"关键词用于查询时筛选行,它是在查询之后再进行筛选的,因此它的作用对象是查询结果集中的行,可以对任何列进行过滤,包括主表和连接表中的列。在使用"where"关键词时,过滤条件是在表格中进行计算,如果过滤条件不满足,则不会返回记录。

"on"关键词用于连接表格时指定关联条件,它是在连接之后再进行筛选的,因此它的作用对象是连接的表格,只能对连接表格中的列进行过滤。在使用"on"关键词时,过滤条件是在连接表格中进行计算,即使过滤条件不满足,也会返回连接表格中的所有记录。

  1. 性能区别:

由于"where"关键词是在查询结果集中进行筛选,因此它的查询效率相对较低,尤其是在处理大量数据时,可能会导致查询速度变慢。

而"on"关键词是在连接表格时指定关联条件,可以减少查询结果集的大小,从而提高查询效率。在处理大量数据时,使用"on"关键词可以减少查询时间和减轻系统负担。

总的来说,"where"和"on"这两个关键词在功能和性能上有一些区别,需要根据实际情况选择合适的关键词进行使用。如果需要对查询结果集中的任何列进行过滤,应使用"where"关键词;如果需要连接表格并指定关联条件,应使用"on"关键词。同时,为了提高查询效率,应根据具体情况选择合适的关键词。

"ON" 子句是用于连接操作的,它指定了连接两个表格时的关联条件,而 "WHERE" 子句是用于过滤操作的,它指定了对表格中的数据进行过滤的条件。
"ON" 子句是在连接操作时执行的,它决定了连接后的表格,而 "WHERE" 子句是在连接操作之后对表格中的数据进行过滤的。

写一条完整的sql语句,包含select,from,join,on,where,group by,order by,having,distinct,with。并说明他们在底层的执行顺序是怎么样的,解释其原因

执行顺序

WITH T1 AS (
  SELECT column1, column2, ...
  FROM table1
  WHERE condition1
), T2 AS (
  SELECT column1, column2, ...
  FROM table2
  WHERE condition2
)
SELECT DISTINCT column1, column2, ...
FROM T1
INNER JOIN T2
ON T1.column = T2.column
WHERE condition3
GROUP BY column1, column2, ...
HAVING condition4
ORDER BY column1, column2, ...;

这条SQL语句的执行顺序如下:

  1. WITH子句:首先执行WITH子句,生成临时表T1和T2。
  2. JOIN子句:然后执行JOIN子句,将T1和T2表格根据"ON"子句中指定的条件进行连接,得到连接表格。
  3. WHERE子句:接着执行WHERE子句,根据"WHERE"子句中指定的条件对连接表格进行过滤,得到符合条件的记录。
  4. GROUP BY子句:然后执行GROUP BY子句,按照指定的列对记录进行分组。
  5. HAVING子句:接着执行HAVING子句,根据指定的聚合函数和条件对分组进行过滤,得到符合条件的分组。
  6. SELECT子句:然后执行SELECT子句,选择需要查询的列并对结果进行去重操作。
  7. ORDER BY子句:最后执行ORDER BY子句,按照指定的列对结果进行排序。

这个执行顺序的原因是因为,在SQL语句执行时,每个子句的执行顺序是固定的。执行顺序的基本原则是,先执行FROM子句,然后执行WHERE子句,然后执行GROUP BY子句,然后执行HAVING子句,然后执行SELECT子句,最后执行ORDER BY子句。在执行过程中,如果有子查询或者连接操作,会先执行子查询或连接操作,然后再执行后续的子句。因此,在上述SQL语句中,先执行WITH子句生成临时表,然后执行JOIN、WHERE、GROUP BY、HAVING、SELECT和ORDER BY子句,按照上述执行顺序依次进行。

对比

关键词 作用 用法 使用场景
where 用于筛选行 出现在SELECT ,,FROM语句之后 在查询中根据指定的条件选择符合条件的记录
having 用于筛选分组 出现在GROUP BY语句之后 在分组查询中根据指定的条件筛选出符合条件的分组
on 用于连接表格进行联接查询 出现在JOIN语句之后 在联接查询中指定连接两个表格时的关联条件

可以看出,这三个关键词都是用于SQL查询中的筛选和联接操作,但是它们的使用场景和对象略有不同。

"where"关键词主要用于查找符合某些条件的行,常用于单表查询中。

"having"关键词主要用于筛选符合某些条件的分组,在分组查询中非常有用。

"on"关键词则主要用于连接表格进行联接查询,将两个或多个表格中的数据进行关联,从而得到更完整、更丰富的数据结果。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐