SQL经典常用查询语句
1. 基础查询语句
1.1 查询表中所有数据
在SQL中,查询表中所有数据是最基本的操作之一。通过使用SELECT * FROM table_name;语句,可以获取指定表中的所有记录和列。例如,假设有一个名为employees的表,包含员工的基本信息,执行以下语句:
SELECT * FROM employees;
将返回employees表中的所有数据,包括员工的姓名、职位、工资等所有字段。这种查询方式适用于需要查看表中完整数据的情况,但需要注意,当表中数据量较大时,返回的结果集可能会非常庞大,对性能有一定影响。
1.2 查询指定列数据
在实际应用中,通常只需要查询表中的部分列,而不是所有列。通过指定列名,可以更高效地获取所需数据。例如,如果只想查询employees表中员工的姓名和工资,可以使用以下语句:
SELECT name, salary FROM employees;
这种方式不仅可以减少数据传输量,还能提高查询效率,特别是在处理大型表时。此外,还可以通过AS关键字为列名设置别名,使结果更易于理解。例如:
SELECT name AS employee_name, salary AS employee_salary FROM employees;
这将使查询结果中的列名更具可读性。
1.3 查询满足条件的数据
在SQL中,WHERE子句用于筛选满足特定条件的记录。这是数据查询中非常重要的功能,可以精确地获取所需数据。例如,假设需要查询工资大于5000的员工信息,可以使用以下语句:
SELECT * FROM employees WHERE salary > 5000;
此外,还可以使用多种条件运算符,如=、<、>、<=、>=、<>(不等于)等,以及逻辑运算符AND、OR、NOT来组合复杂的条件。例如,查询工资大于5000且职位为“经理”的员工信息:
SELECT * FROM employees WHERE salary > 5000 AND position = '经理';
这种条件查询方式在实际应用中非常灵活,可以根据具体需求精确地筛选数据。
2. 条件查询语句
2.1 单条件查询
单条件查询是 SQL 查询中最为基础且常见的类型,它通过一个简单的条件筛选数据,能够快速定位到符合特定要求的记录。在实际应用中,单条件查询的使用频率非常高,尤其是在数据筛选和初步分析阶段。
- 基本语法:
SELECT column_name(s) FROM table_name WHERE condition; - 示例:假设有一个
employees表,包含员工的姓名、职位、工资等信息,如果需要查询工资大于 5000 的员工信息,可以使用以下语句:
这条语句会返回所有工资大于 5000 的员工记录,包括他们的姓名、职位、工资等所有字段。SELECT * FROM employees WHERE salary > 5000; - 性能分析:单条件查询的性能主要取决于条件的复杂度以及表的索引情况。如果表中存在针对查询条件的索引(如在
salary字段上有索引),查询效率会显著提高。例如,在一个包含 100 万条记录的employees表中,如果没有索引,查询可能需要扫描整个表,耗时较长;而如果在salary字段上有索引,查询时间可以缩短到毫秒级别。 - 应用场景:单条件查询适用于简单的数据筛选场景,如查询某个特定时间段内的数据、某个特定状态的数据等。例如,查询最近一个月内注册的用户:
SELECT * FROM users WHERE registration_date >= DATE_SUB(CURDATE(), INTERVAL 1 MONTH);
2.2 多条件查询
多条件查询允许通过多个条件组合来筛选数据,能够更精确地定位到符合多个要求的记录。通过逻辑运算符 AND、OR 和 NOT,可以实现复杂的条件组合,满足多样化的数据查询需求。
- 基本语法:
- 使用
AND:SELECT column_name(s) FROM table_name WHERE condition1 AND condition2; - 使用
OR:SELECT column_name(s) FROM table_name WHERE condition1 OR condition2; - 使用
NOT:SELECT column_name(s) FROM table_name WHERE NOT condition;
- 使用
- 示例:
- 查询工资大于 5000 且职位为“经理”的员工信息:
SELECT * FROM employees WHERE salary > 5000 AND position = '经理'; - 查询工资大于 5000 或职位为“经理”的员工信息:
SELECT * FROM employees WHERE salary > 5000 OR position = '经理'; - 查询工资不大于 5000 的员工信息:
SELECT * FROM employees WHERE NOT salary > 5000;
- 查询工资大于 5000 且职位为“经理”的员工信息:
- 性能分析:多条件查询的性能同样取决于条件的复杂度和索引情况。如果多个条件都涉及索引字段,查询效率会更高。例如,在一个包含 100 万条记录的
employees表中,如果salary和position字段都有索引,使用AND条件的查询可以快速定位到符合条件的记录,查询时间通常在毫秒级别。然而,如果条件涉及非索引字段,或者使用了复杂的逻辑运算符(如多个OR),查询性能可能会下降。 - 应用场景:多条件查询适用于需要同时满足多个条件的复杂数据筛选场景。例如,查询某个部门中工资大于 5000 且入职时间在一年内的员工:
SELECT * FROM employees WHERE department = '销售部' AND salary > 5000 AND hire_date >= DATE_SUB(CURDATE(), INTERVAL 1 YEAR);
2.3 模糊查询
模糊查询用于查找符合某种模式的记录,通常通过 LIKE 运算符实现。它允许使用通配符(如 % 和 _)来匹配不确定的字符,能够灵活地筛选出符合条件的记录。
- 基本语法:
SELECT column_name(s) FROM table_name WHERE column_name LIKE pattern; - 通配符:
%:匹配任意数量的字符(包括零个字符)。_:匹配任意单个字符。
- 示例:
- 查询姓名以“张”开头的员工信息:
SELECT * FROM employees WHERE name LIKE '张%'; - 查询姓名为两个字且第二个字为“伟”的员工信息:
SELECT * FROM employees WHERE name LIKE '_伟'; - 查询姓名中包含“明”的员工信息:
SELECT * FROM employees WHERE name LIKE '%明%';
- 查询姓名以“张”开头的员工信息:
- 性能分析:模糊查询的性能通常比精确查询要低,尤其是当使用前导通配符(如
%在模式的开头)时。这是因为数据库需要扫描整个字段来匹配模式,无法有效利用索引。例如,在一个包含 100 万条记录的employees表中,使用LIKE '张%'可以利用索引,查询时间较快;而使用LIKE '%张'则需要全表扫描,查询时间会显著增加。 - 应用场景:模糊查询适用于需要查找符合某种模式的记录的场景,如搜索功能、数据分类等。例如,查询所有以“科技”结尾的公司名称:
SELECT * FROM companies WHERE company_name LIKE '%科技';
3. 聚合函数查询语句
聚合函数是 SQL 中用于对数据进行统计分析的重要工具,能够对一组值进行计算并返回单个值。以下将从计算总和、最大值和最小值三个常见场景展开介绍。
3.1 计算总和
在数据分析中,计算总和是一种常见的需求,例如计算销售额、工资总额等。SQL 提供了 SUM 函数来实现这一功能。
- 基本语法:
SELECT SUM(column_name) FROM table_name; - 示例:假设有一个
sales表,包含销售订单的金额信息,如果需要计算所有订单的总销售额,可以使用以下语句:
这条语句会返回所有订单金额的总和,并将其命名为SELECT SUM(amount) AS total_sales FROM sales;total_sales。 - 性能分析:
SUM函数的性能主要取决于表的大小和数据的分布情况。在大数据量的情况下,查询可能会相对较慢。但如果表中存在针对amount字段的索引,查询效率会有所提升。例如,在一个包含 100 万条记录的sales表中,使用SUM函数计算总销售额,查询时间通常在秒级别。 - 应用场景:计算总和适用于需要对某一列数据进行累加的场景,如统计公司各部门的工资总额、计算产品库存总量等。例如,计算每个部门的工资总额:
SELECT department, SUM(salary) AS total_salary FROM employees GROUP BY department;
3.2 计算最大值
在实际应用中,经常需要找出某一列中的最大值,例如最高工资、最高销售额等。SQL 提供了 MAX 函数来实现这一功能。
- 基本语法:
SELECT MAX(column_name) FROM table_name; - 示例:假设有一个
employees表,包含员工的工资信息,如果需要查询最高工资,可以使用以下语句:
这条语句会返回员工工资中的最大值,并将其命名为SELECT MAX(salary) AS max_salary FROM employees;max_salary。 - 性能分析:
MAX函数的性能同样取决于表的大小和数据的分布情况。如果表中存在针对查询列的索引,查询效率会更高。例如,在一个包含 100 万条记录的employees表中,如果salary字段上有索引,使用MAX函数查询最高工资,查询时间通常在毫秒级别。 - 应用场景:计算最大值适用于需要找出某一列中最大值的场景,如确定最高销售额、最高评分等。例如,查询每个部门的最高工资:
SELECT department, MAX(salary) AS max_salary FROM employees GROUP BY department;
3.3 计算最小值
与计算最大值类似,计算最小值也是数据分析中的常见需求,例如最低工资、最低价格等。SQL 提供了 MIN 函数来实现这一功能。
- 基本语法:
SELECT MIN(column_name) FROM table_name; - 示例:假设有一个
products表,包含产品的价格信息,如果需要查询最低价格,可以使用以下语句:
这条语句会返回产品价格中的最小值,并将其命名为SELECT MIN(price) AS min_price FROM products;min_price。 - 性能分析:
MIN函数的性能表现与MAX函数类似,主要取决于表的大小和数据的分布情况。如果表中存在针对查询列的索引,查询效率会显著提高。例如,在一个包含 100 万条记录的products表中,如果price字段上有索引,使用MIN函数查询最低价格,查询时间通常在毫秒级别。 - 应用场景:计算最小值适用于需要找出某一列中最小值的场景,如确定最低工资、最低库存量等。例如,查询每个部门的最低工资:
SELECT department, MIN(salary) AS min_salary FROM employees GROUP BY department;
4. 分组查询语句
4.1 按单一字段分组
在 SQL 中,GROUP BY 子句用于将数据按照某个字段进行分组,以便对每个分组进行聚合计算。按单一字段分组是最基本的分组方式,能够帮助我们快速了解数据在某个维度上的分布情况。
- 基本语法:
SELECT column_name, aggregate_function(column_name) FROM table_name GROUP BY column_name; - 示例:假设有一个
employees表,包含员工的部门和工资信息,如果需要计算每个部门的平均工资,可以使用以下语句:
这条语句会将员工按照部门分组,并计算每个部门的平均工资。SELECT department, AVG(salary) AS avg_salary FROM employees GROUP BY department; - 性能分析:按单一字段分组的性能主要取决于表的大小和分组字段的索引情况。如果分组字段上有索引,查询效率会更高。例如,在一个包含 100 万条记录的
employees表中,如果department字段上有索引,使用GROUP BY分组查询,查询时间通常在秒级别。 - 应用场景:按单一字段分组适用于需要对数据进行简单分组统计的场景,如统计每个产品的销售数量、每个客户的订单数量等。例如,统计每个产品的销售数量:
SELECT product_id, COUNT(*) AS sales_count FROM orders GROUP BY product_id;
4.2 按多个字段分组
按多个字段分组可以同时根据多个维度对数据进行分组,能够更细致地分析数据的分布情况。这种方式在实际应用中非常灵活,可以满足复杂的统计需求。
- 基本语法:
SELECT column_name1, column_name2, aggregate_function(column_name) FROM table_name GROUP BY column_name1, column_name2; - 示例:假设有一个
sales表,包含销售订单的日期、产品和金额信息,如果需要计算每个日期和每个产品的总销售额,可以使用以下语句:
这条语句会将销售订单按照日期和产品分组,并计算每个分组的总销售额。SELECT sale_date, product_id, SUM(amount) AS total_sales FROM sales GROUP BY sale_date, product_id; - 性能分析:按多个字段分组的性能同样取决于表的大小和分组字段的索引情况。如果多个分组字段都有索引,查询效率会更高。例如,在一个包含 100 万条记录的
sales表中,如果sale_date和product_id字段都有索引,使用GROUP BY分组查询,查询时间通常在秒级别。 - 应用场景:按多个字段分组适用于需要同时根据多个维度进行数据统计的场景,如统计每个部门每个职位的员工数量、每个地区每个产品的销售额等。例如,统计每个部门每个职位的员工数量:
SELECT department, position, COUNT(*) AS employee_count FROM employees GROUP BY department, position;
4.3 分组后筛选
在分组查询的基础上,使用 HAVING 子句可以对分组后的结果进行筛选,以便进一步过滤数据。HAVING 子句的作用类似于 WHERE 子句,但它用于筛选分组后的聚合结果,而不是单条记录。
- 基本语法:
SELECT column_name, aggregate_function(column_name) FROM table_name GROUP BY column_name HAVING condition; - 示例:假设有一个
employees表,包含员工的部门和工资信息,如果需要查询平均工资大于 5000 的部门,可以使用以下语句:
这条语句会将员工按照部门分组,计算每个部门的平均工资,并筛选出平均工资大于 5000 的部门。SELECT department, AVG(salary) AS avg_salary FROM employees GROUP BY department HAVING AVG(salary) > 5000; - 性能分析:分组后筛选的性能主要取决于分组查询的效率和筛选条件的复杂度。如果分组字段上有索引,查询效率会更高。例如,在一个包含 100 万条记录的
employees表中,如果department字段上有索引,使用GROUP BY和HAVING子句进行筛选,查询时间通常在秒级别。 - 应用场景:分组后筛选适用于需要对分组结果进行进一步筛选的场景,如筛选销售额超过某个阈值的产品、筛选员工数量超过某个阈值的部门等。例如,筛选销售额超过 10000 的产品:
SELECT product_id, SUM(amount) AS total_sales FROM sales GROUP BY product_id HAVING SUM(amount) > 10000;
5. 排序查询语句
5.1 单字段排序
在 SQL 中,ORDER BY 子句用于对查询结果按照指定字段进行排序,这是数据展示和分析中常用的功能之一。单字段排序是最基本的排序方式,能够帮助我们快速了解数据在某个维度上的顺序关系。
- 基本语法:
SELECT column_name(s) FROM table_name ORDER BY column_name [ASC|DESC];ASC表示升序排序(默认值),DESC表示降序排序。
- 示例:假设有一个
employees表,包含员工的姓名和工资信息,如果需要按照工资升序排序,可以使用以下语句:
如果需要按照工资降序排序,可以使用:SELECT name, salary FROM employees ORDER BY salary ASC;SELECT name, salary FROM employees ORDER BY salary DESC; - 性能分析:单字段排序的性能主要取决于表的大小和排序字段的索引情况。如果排序字段上有索引,查询效率会显著提高。例如,在一个包含 100 万条记录的
employees表中,如果salary字段上有索引,使用ORDER BY进行排序,查询时间通常在秒级别。如果没有索引,排序操作可能会相对较慢,尤其是对于大数据量的表。 - 应用场景:单字段排序适用于需要按照某个字段的顺序展示数据的场景,如按照时间顺序展示订单、按照成绩高低展示学生排名等。例如,按照注册时间降序展示用户:
SELECT user_id, registration_date FROM users ORDER BY registration_date DESC;
5.2 多字段排序
多字段排序允许按照多个字段的顺序对查询结果进行排序,这在实际应用中非常灵活,可以满足更复杂的排序需求。
- 基本语法:
SELECT column_name(s) FROM table_name ORDER BY column_name1 [ASC|DESC], column_name2 [ASC|DESC]; - 示例:假设有一个
employees表,包含员工的部门、姓名和工资信息,如果需要先按照部门升序排序,再按照工资降序排序,可以使用以下语句:SELECT department, name, salary FROM employees ORDER BY department ASC, salary DESC; - 性能分析:多字段排序的性能同样取决于表的大小和排序字段的索引情况。如果多个排序字段都有索引,查询效率会更高。例如,在一个包含 100 万条记录的
employees表中,如果department和salary字段都有索引,使用多字段排序,查询时间通常在秒级别。如果没有索引,排序操作可能会相对较慢,尤其是对于大数据量的表。 - 应用场景:多字段排序适用于需要同时按照多个字段的顺序展示数据的场景,如先按照地区排序,再按照销售额排序;或者先按照日期排序,再按照优先级排序。例如,先按照产品类别排序,再按照销售额降序展示销售记录:
SELECT category, product_id, amount FROM sales ORDER BY category ASC, amount DESC;
5.3 排序与分页
在实际应用中,尤其是对于大数据量的表,我们通常需要对排序后的结果进行分页展示,以便用户可以逐页查看数据。SQL 提供了 LIMIT(在 MySQL 中)或 ROWNUM(在 Oracle 中)等机制来实现分页查询。
- 基本语法:
- 在 MySQL 中:
SELECT column_name(s) FROM table_name ORDER BY column_name LIMIT offset, rows; - 在 Oracle 中:
SELECT column_name(s) FROM (SELECT column_name(s), ROWNUM AS rnum FROM table_name WHERE ROWNUM <= end_row) WHERE rnum >= start_row;
- 在 MySQL 中:
- 示例:假设有一个
employees表,包含员工的姓名和工资信息,如果需要按照工资降序排序,并分页展示,每页显示 10 条记录,查询第 2 页的数据,可以使用以下语句(以 MySQL 为例):
这条语句会跳过前 10 条记录,返回第 11 到第 20 条记录。SELECT name, salary FROM employees ORDER BY salary DESC LIMIT 10, 10; - 性能分析:排序与分页的性能主要取决于表的大小、排序字段的索引情况以及分页参数。如果排序字段上有索引,查询效率会显著提高。例如,在一个包含 100 万条记录的
employees表中,如果salary字段上有索引,使用排序与分页查询,查询时间通常在秒级别。如果没有索引,排序和分页操作可能会相对较慢,尤其是对于大数据量的表。 - 应用场景:排序与分页适用于需要对大量数据进行逐页展示的场景,如分页展示商品列表、分页展示用户评论等。例如,分页展示订单记录,每页显示 20 条记录:
SELECT order_id, order_date, amount FROM orders ORDER BY order_date DESC LIMIT 20, 20;
6. 连接查询语句
6.1 内连接查询
内连接查询用于从两个或多个表中返回匹配的记录,只有当连接的表中存在满足条件的记录时,才会出现在结果集中。这是连接查询中最常用的一种方式,能够有效地整合多个表中的相关数据。
- 基本语法:
SELECT column_name(s) FROM table1 INNER JOIN table2 ON table1.column = table2.column; - 示例:假设有一个
employees表和一个departments表,employees表包含员工的基本信息,departments表包含部门的信息。如果需要查询每个员工所属的部门名称,可以使用以下语句:
这条语句会返回所有员工及其对应的部门名称,只有那些在SELECT employees.name, departments.department_name FROM employees INNER JOIN departments ON employees.department_id = departments.department_id;employees表和departments表中department_id匹配的记录才会出现在结果中。 - 性能分析:内连接查询的性能主要取决于连接条件的复杂度和表的大小。如果连接字段上有索引,查询效率会显著提高。例如,在一个包含 100 万条记录的
employees表和一个包含 10 万条记录的departments表中,如果department_id字段上有索引,内连接查询的时间通常在秒级别。如果没有索引,查询可能会相对较慢,尤其是对于大数据量的表。 - 应用场景:内连接查询适用于需要从多个表中提取相关数据的场景,如查询学生的成绩和对应的课程名称、查询订单和对应的客户信息等。例如,查询每个订单的客户名称和订单金额:
SELECT customers.customer_name, orders.order_amount FROM customers INNER JOIN orders ON customers.customer_id = orders.customer_id;
6.2 左外连接查询
左外连接查询用于从左表中返回所有记录,即使右表中没有匹配的记录,也会出现在结果集中。如果右表中没有匹配的记录,结果集中右表的字段将显示为 NULL。这种查询方式在需要保留左表所有数据的情况下非常有用。
- 基本语法:
SELECT column_name(s) FROM table1 LEFT JOIN table2 ON table1.column = table2.column; - 示例:假设有一个
employees表和一个departments表,如果需要查询每个员工及其所属的部门名称,即使某些员工没有分配部门,也可以使用以下语句:
这条语句会返回所有员工的记录,即使某些员工的SELECT employees.name, departments.department_name FROM employees LEFT JOIN departments ON employees.department_id = departments.department_id;department_id在departments表中没有匹配的记录,这些员工的部门名称将显示为NULL。 - 性能分析:左外连接查询的性能同样取决于连接条件的复杂度和表的大小。如果连接字段上有索引,查询效率会更高。例如,在一个包含 100 万条记录的
employees表和一个包含 10 万条记录的departments表中,如果department_id字段上有索引,左外连接查询的时间通常在秒级别。如果没有索引,查询可能会相对较慢,尤其是对于大数据量的表。 - 应用场景:左外连接查询适用于需要保留左表所有数据的场景,如查询所有学生及其对应的课程成绩(即使某些学生没有成绩)、查询所有客户及其对应的订单信息(即使某些客户没有订单)等。例如,查询所有客户及其订单金额:
SELECT customers.customer_name, orders.order_amount FROM customers LEFT JOIN orders ON customers.customer_id = orders.customer_id;
6.3 右外连接查询
右外连接查询与左外连接查询相反,它从右表中返回所有记录,即使左表中没有匹配的记录,也会出现在结果集中。如果左表中没有匹配的记录,结果集中左表的字段将显示为 NULL。这种查询方式在需要保留右表所有数据的情况下非常有用。
- 基本语法:
SELECT column_name(s) FROM table1 RIGHT JOIN table2 ON table1.column = table2.column; - 示例:假设有一个
employees表和一个departments表,如果需要查询每个部门及其所属的员工名称,即使某些部门没有员工,也可以使用以下语句:
这条语句会返回所有部门的记录,即使某些部门的SELECT employees.name, departments.department_name FROM employees RIGHT JOIN departments ON employees.department_id = departments.department_id;department_id在employees表中没有匹配的记录,这些部门的员工名称将显示为NULL。 - 性能分析:右外连接查询的性能同样取决于连接条件的复杂度和表的大小。如果连接字段上有索引,查询效率会更高。例如,在一个包含 100 万条记录的
employees表和一个包含 10 万条记录的departments表中,如果department_id字段上有索引,右外连接查询的时间通常在秒级别。如果没有索引,查询可能会相对较慢,尤其是对于大数据量的表。 - 应用场景:右外连接查询适用于需要保留右表所有数据的场景,如查询所有课程及其对应的学生信息(即使某些课程没有学生)、查询所有产品及其对应的订单信息(即使某些产品没有订单)等。例如,查询所有产品及其订单数量:
SELECT products.product_name, COUNT(orders.order_id) AS order_count FROM products RIGHT JOIN orders ON products.product_id = orders.product_id GROUP BY products.product_id;
7. 子查询语句
子查询是 SQL 查询中一种非常强大的工具,它允许在一个查询语句中嵌套另一个查询语句。子查询可以用于多种场景,包括作为条件筛选数据、作为数据源提供数据,以及实现复杂的关联查询。以下将从子查询作为条件、子查询作为数据源和相关子查询三个子课题展开论述。
7.1 子查询作为条件
子查询作为条件时,通常用于 WHERE 子句或 HAVING 子句中,通过返回一个值或一组值来筛选数据。这种方式可以实现复杂的条件筛选,尤其是当需要基于另一个查询的结果来筛选数据时。
- 基本语法:
- 单值子查询:
SELECT column_name(s) FROM table_name WHERE column_name operator (SELECT column_name FROM table_name WHERE condition); - 多值子查询:
SELECT column_name(s) FROM table_name WHERE column_name IN (SELECT column_name FROM table_name WHERE condition);
- 单值子查询:
- 示例:
- 查询工资高于平均工资的员工信息:
SELECT * FROM employees WHERE salary > (SELECT AVG(salary) FROM employees); - 查询与最高工资员工同部门的员工信息:
SELECT * FROM employees WHERE department_id = (SELECT department_id FROM employees WHERE salary = (SELECT MAX(salary) FROM employees));
- 查询工资高于平均工资的员工信息:
- 性能分析:子查询作为条件的性能主要取决于子查询的复杂度和表的大小。如果子查询返回的结果集较小,且主查询的条件字段上有索引,查询效率会较高。例如,在一个包含 100 万条记录的
employees表中,使用单值子查询查询工资高于平均工资的员工,查询时间通常在秒级别。 - 应用场景:子查询作为条件适用于需要基于另一个查询结果进行筛选的场景,如查询特定条件下的数据、查询与某个特定记录相关的数据等。例如,查询与某个特定客户有相同订单的其他客户:
SELECT * FROM customers WHERE customer_id IN (SELECT customer_id FROM orders WHERE order_id = (SELECT order_id FROM orders WHERE customer_id = 1001));
7.2 子查询作为数据源
子查询作为数据源时,通常用于 FROM 子句中,将子查询的结果作为一个临时表或派生表,供主查询使用。这种方式可以实现复杂的多表查询,尤其是当需要对多个表进行联合查询时。
- 基本语法:
SELECT column_name(s) FROM (SELECT column_name(s) FROM table_name WHERE condition) AS derived_table; - 示例:
- 查询每个部门工资最高的员工信息:
SELECT department_id, name, salary FROM (SELECT department_id, name, salary,ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary DESC) AS rankFROM employees ) AS ranked_employees WHERE rank = 1; - 查询每个部门的平均工资和员工数量:
SELECT department_id, AVG(salary) AS avg_salary, COUNT(*) AS employee_count FROM employees GROUP BY department_id;
- 查询每个部门工资最高的员工信息:
- 性能分析:子查询作为数据源的性能主要取决于子查询的复杂度和主查询的复杂度。如果子查询返回的结果集较小,且主查询的条件字段上有索引,查询效率会较高。例如,在一个包含 100 万条记录的
employees表中,使用子查询查询每个部门工资最高的员工,查询时间通常在秒级别。 - 应用场景:子查询作为数据源适用于需要对多个表进行联合查询的场景,如查询每个部门的统计数据、查询每个产品的销售数据等。例如,查询每个产品的总销售额和订单数量:
SELECT product_id, SUM(amount) AS total_sales, COUNT(*) AS order_count FROM orders GROUP BY product_id;
7.3 相关子查询
相关子查询是指子查询的执行依赖于主查询的结果,即子查询中包含主查询的列或表。这种方式可以实现复杂的关联查询,尤其是当需要基于主查询的每一行结果来动态生成子查询时。
- 基本语法:
SELECT column_name(s) FROM table_name WHERE column_name operator (SELECT column_name FROM table_name WHERE condition); - 示例:
- 查询每个员工的工资与部门平均工资的比较:
SELECT e.name, e.salary, d.avg_salary FROM employees e JOIN (SELECT department_id, AVG(salary) AS avg_salaryFROM employeesGROUP BY department_id ) AS d ON e.department_id = d.department_id; - 查询每个员工的工资是否高于部门平均工资:
SELECT e.name, e.salary, d.avg_salary,CASE WHEN e.salary > d.avg_salary THEN '高于平均工资' ELSE '低于或等于平均工资' END AS salary_comparison FROM employees e JOIN (SELECT department_id, AVG(salary) AS avg_salaryFROM employeesGROUP BY department_id ) AS d ON e.department_id = d.department_id;
- 查询每个员工的工资与部门平均工资的比较:
- 性能分析:相关子查询的性能通常比普通子查询要低,因为子查询需要为每一行主查询的结果动态执行。如果主查询的表较大,且子查询的条件字段上有索引,查询效率会有所提升。例如,在一个包含 100 万条记录的
employees表中,使用相关子查询查询每个员工的工资与部门平均工资的比较,查询时间通常在秒级别。 - 应用场景:相关子查询适用于需要基于主查询的每一行结果动态生成子查询的场景,如查询每个员工的绩效与部门平均绩效的比较、查询每个产品的销售额与类别平均销售额的比较等。例如,查询每个产品的销售额是否高于类别平均销售额:
SELECT o.product_id, o.amount, c.avg_amount,CASE WHEN o.amount > c.avg_amount THEN '高于平均销售额' ELSE '低于或等于平均销售额' END AS amount_comparison FROM orders o JOIN (SELECT product_id, AVG(amount) AS avg_amountFROM ordersGROUP BY product_id ) AS c ON o.product_id = c.product_id;
相关文章:
SQL经典常用查询语句
1. 基础查询语句 1.1 查询表中所有数据 在SQL中,查询表中所有数据是最基本的操作之一。通过使用SELECT * FROM table_name;语句,可以获取指定表中的所有记录和列。例如,假设有一个名为employees的表,包含员工的基本信息…...
超详细:数据库的基本架构
MySQL基础架构 下面这个图是我给出的一个MySQL基础架构图,可以清楚的了解到SQL语句在MySQL的各个模块进行执行过程。 然后MySQL可以分为两个部分,一个是server层,另一个是存储引擎。 server层 Server层涵盖了MySQL的大多数核心服务功能&am…...
AI催化新一轮创业潮与创富潮:深圳在抢跑
作者:尺度商业大掌柜黄利明 2025年春节伊始至今,从DeepSeek R1开源模型持续引发全球围观,到腾讯混元Turbo S模型发布秀出了"秒回"绝活,再到国务院发布《新一代人工智能发展规划(2025-2030)》重磅…...
Docker 深度解析:适合零基础用户的详解
此博客涵盖 Docker 的基本概念和作用、架构和核心组件、与传统虚拟机的对比、安装与基本操作,以及在实际开发和运维中的应用场景。 首先,详细解释了 Docker 的基本概念,包括它的诞生背景、作用及其如何解决传统应用部署中的问题。然后&#…...
SpringBoot生成唯一ID的方式
1.为什么要生成唯一ID? 数据唯一性:每个记录都需要有一个独一无二的标识符来确保数据的唯一性。这可以避免重复的数据行,并有助于准确地查询、更新或删除特定的记录。 数据完整性:通过使用唯一ID,可以保证数据库中的数…...
FastGPT 源码:RRF、Rerank 相关代码
文章目录 FastGPT 源码:RRF、Rerank 相关代码1. RRF (Reciprocal Rank Fusion) 合并实现2. Rerank 二次排序实现3. 重排序的主要特点4. 整个搜索流程5. 这种方式的优势 FastGPT 源码:RRF、Rerank 相关代码 下边介绍 RRF 合并和 Rerank 二次排序的相关实…...
Android视频流畅播放要素
要让 Android 设备流畅播放视频,需根据设备性能(低端、中端、高端)和播放场景(本地播放、在线流媒体)动态调整视频参数。以下是针对不同设备的推荐配置方案: 一、通用推荐配置(平衡兼容性与流畅…...
Python:类型转换和深浅拷贝,可变与不可变对象
int():转换为一个整数,只能转换由纯数字组成的字符串 浮点型强转整型会去掉小数点及后面的数,只保留整数部分 #如果字符串中有数字和正负号以外的字符就会报错 float():整形转换为浮点型会自动添加一位小数 .0 如果字符串中有…...
vcredist_x64 资源文件分享
vcredist_x64 是 Microsoft Visual C Redistributable 的 64 位版本,用于在 64 位 Windows 系统上运行使用 Visual C 开发的应用程序。它包含了运行这些应用程序所需的运行时组件。 vcredist_x64 资源工具网盘下载链接:https://pan.quark.cn/s/ef56f838f…...
Linux:vim快捷键
Linux打开vim默认第一个模式是:命令模式! 命令模式快捷键操作: gg:光标快速定位到最开始 shift g G:光标快速定位到最结尾 n shift g n G:光标快速定位到第n行 shift 6 ^:当前行开始 …...
DeepSeek在MATLAB上的部署与应用
在科技飞速发展的当下,人工智能与编程语言的融合不断拓展着创新边界。DeepSeek作为一款备受瞩目的大语言模型,其在自然语言处理领域展现出强大的能力。而MATLAB,作为科学计算和工程领域广泛应用的专业软件,拥有丰富的工具包和高效…...
NAT 代理服务 内网穿透
🌈 个人主页:Zfox_ 🔥 系列专栏:Linux 目录 一:🔥 NAT 技术背景二:🔥 NAT IP 转换过程三:🔥 NAPT四:🔥 代理服务器🦋 正向…...
高级课第五次作业
首先配置交换机,路由器 LSW1配置 [SW1]vlan batch 10 20 30 40 [SW1]int g0/0/2 [SW1-GigabitEthernet0/0/2]port link-type access [SW1-GigabitEthernet0/0/2]port default vlan 10 [SW1]int g0/0/3 [SW1-GigabitEthernet0/0/3]port link-type access […...
51单片机编程学习笔记——动态数码管显示多个数字
大纲 视觉残留原理生理基础神经传导与处理 应用与视觉暂留相关的现象 频闪融合不好的实现好的效果 延伸 在《51单片机编程学习笔记——动态数码管》一文中,我们看到如何使用动态数码管显示数字。但是基于动态数码管设计的特点,每次只能显示1个数字。这就…...
金蝶ERP星空对接流程
1.金蝶ERP星空OPENAPI地址: 金蝶云星空开放平台 2.下载金蝶云星空的对应SDK包 金蝶云星空开放平台 3.引入SDK流程步骤 引入Kingdee.CDP.WebApi.SDK 右键项目添加引用,在打开的引用管理器中选择浏览页签,点击浏览按钮,找到从官…...
【随手笔记】利尔达NB模组
1.名称 移芯EC6263GPP 参数 指令备注 利尔达上电输出 [2025-03-04 10:24:21.379] I_AT_WAIT:i_len2 [2025-03-04 10:24:21.724] LI_AT_WAIT:i_len16 [2025-03-04 10:24:21.724] [2025-03-04 10:24:21.733] Lierda [2025-03-04 10:24:21.733] [2025-03-04 10:24:21.745] OK移…...
Vue3的核心语法【未完】
Vue3的核心语法 OptionsAPI与CompositionAPI Options API(选项式) 和 Composition API (组合式)是 Vue.js 中用于构建组件的两种不同方式。Options API Options API Options API 是 Vue 2 中的传统模式,并在 Vue 3…...
解决redis lettuce连接池经常出现连接拒绝(Connection refused)问题
一.软件环境 windows10、11系统、springboot2.x、redis 6 7 linux(centos)系统没有出现这问题,如果你是linux系统碰到的,本文也有一定大参考价值。 根本思路就是:tcp/ip连接的保活(keepalive)。 二.问题描述 在spr…...
C#进阶指南
C# 是一种功能强大的编程语言,其高级语法特性为开发者提供了更灵活、高效和简洁的编程方式。以下是一些常见的 C# 高级语法特性: 1. 委托(Delegate) 委托是一种类型安全的函数指针,用于封装方法的引用。它可以将方法作为参数传递,实现回调机制。 定义委托: csharp复制 …...
从DNS到TCP:DNS解析流程和浏览器输入域名访问流程
1 DNS 解析流程 1.1 什么是DNS域名解析 在生活中我们会经常遇到域名,比如说CSDN的域名www.csdn.net,百度的域名www.baidu.com,我们也会碰到IP,现在目前有的是IPV4,IPV6。那这两个有什么区别呢?IP地址是互联网上计算机…...
【MySQL、Oracle、SQLserver、postgresql】查询多条数据合并成一行
四大数据库多行合并为单行:函数详解与对比 一、MySQL**GROUP_CONCAT()** 函数说明:语法结构:参数解释:示例:注意事项: 二、Oracle**LISTAGG()** 函数说明:语法结构:参数解释…...
解锁Egg.js:从Node.js小白到Web开发高手的进阶之路
一、Egg.js 是什么 在当今的 Web 开发领域,Node.js 凭借其事件驱动、非阻塞 I/O 的模型,在构建高性能、可扩展的网络应用方面展现出独特的优势 ,受到了广大开发者的青睐。它让 JavaScript 不仅局限于前端,还能在服务器端大展身手&…...
JavaWeb后端基础(4)
这一篇就开始是做一个项目了,在项目里学习,我主要记录在学习过程中遇到的问题,以及一些知识点 Restful风格 一种软件架构风格 在REST风格的URL中,通过四种请求方式,来操作数据的增删改查。 GET : 查询 …...
软件试用 防破解 防软件调试(C# )
防破解&防软件调试 实现思路 这里采用C#语言为例: 获取网络北京时间:向百度发送 HTTP 请求,从响应头中提取日期时间信息,将其转换为本地时间。记录试用开始时间:首次运行软件时,将获取的百度北京时间作为试用开始时间,并加密存储在本地文件中。检查试用是否过期:每…...
【文献阅读】The Efficiency Spectrum of Large Language Models: An Algorithmic Survey
这篇文章发表于2024年4月 摘要 大语言模型(LLMs)的快速发展推动了多个领域的变革,重塑了通用人工智能的格局。然而,这些模型不断增长的计算和内存需求带来了巨大挑战,阻碍了学术研究和实际应用。为解决这些问题&…...
OpenGL ES -> GLSurfaceView纹理贴图
贴图 XML文件 <?xml version"1.0" encoding"utf-8"?> <com.example.myapplication.MyGLSurfaceViewxmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height…...
FastGPT 源码:基于 LLM 实现 Rerank (含Prompt)
文章目录 基于 LLM 实现 Rerank函数定义预期输出实现说明使用建议完整 Prompt 基于 LLM 实现 Rerank 下边通过设计 Prompt 让 LLM 实现重排序的功能。 函数定义 class LLMReranker:def __init__(self, llm_client):self.llm llm_clientdef rerank(self, query: str, docume…...
DE2115实现4位全加器和3-8译码器(FPGA)
一、配置环境 1、Quartus 18.1安装教程 软件:Quartus版本:Quartus 18.1语言:英文大小:5.78G安装环境:Win11/Win10/Win8/Win7硬件要求:CPU2.0GHz 内存4G(或更高) 下载通道①百度网盘丨64位下载…...
大语言模型(LLM)如何赋能时间序列分析?
引言 近年来,大语言模型(LLM)在文本生成、推理和跨模态任务中展现了惊人能力。与此同时,时间序列分析作为工业、金融、物联网等领域的核心技术,长期依赖传统统计模型(如ARIMA)或深度学习模型&a…...
【AI大模型】DeepSeek + Kimi 高效制作PPT实战详解
目录 一、前言 二、传统 PPT 制作问题 2.1 传统方式制作 PPT 2.2 AI 大模型辅助制作 PPT 2.3 适用场景对比分析 2.4 最佳实践与推荐 三、DeepSeek Kimi 高效制作PPT操作实践 3.1 Kimi 简介 3.2 DeepSeek Kimi 制作PPT优势 3.2.1 DeepSeek 优势 3.2.2 Kimi 制作PPT优…...
