各种查询sql介绍

  1. 关联查询(JOIN)

关联查询用于从多个表中检索数据。它基于两个或多个表之间的共同字段(通常是主键和外键)来组合数据。

内连接(INNER JOIN):

sql

SELECT a.name, b.order_date

FROM customers a

INNER JOIN orders b ON a.customer_id = b.customer_id;

这个查询会返回所有在orders表中有对应订单的客户名称和订单日期。

左连接(LEFT JOIN):

sql

SELECT a.name, b.order_date

FROM customers a

LEFT JOIN orders b ON a.customer_id = b.customer_id;

这个查询会返回所有客户的名称,即使他们没有订单。对于没有订单的客户,order_date字段将为NULL。

**右连接(RIGHT JOIN)和全连接(FULL JOIN)**也是常见的关联类型,但使用较少。

  1. 子查询(Subquery)

子查询是嵌套在另一个查询中的查询。它们可以用于在WHERE、FROM或SELECT子句中。

在WHERE子句中使用子查询:

sql

SELECT name

FROM customers

WHERE customer_id IN (SELECT customer_id FROM orders WHERE order_date > '2023-01-01');

这个查询会返回在2023年1月1日之后有订单的所有客户的名称。

在SELECT子句中使用子查询:

sql

SELECT name, (SELECT COUNT(*) FROM orders WHERE orders.customer_id = customers.customer_id) AS order_count

FROM customers;

这个查询会返回每个客户的名称和他们的订单数量。

  1. 聚合查询(Aggregate Queries)

聚合查询使用聚合函数(如SUM、AVG、COUNT、MAX、MIN)来计算数据的统计信息。

sql

SELECT department, COUNT(*) AS employee_count, AVG(salary) AS average_salary

FROM employees

GROUP BY department;

这个查询会返回每个部门的员工数量和平均工资。

  1. HAVING子句

HAVING子句用于过滤聚合查询的结果。它类似于WHERE子句,但用于聚合函数的结果。

sql

SELECT department, AVG(salary) AS average_salary

FROM employees

GROUP BY department

HAVING AVG(salary) > 50000;

这个查询会返回平均工资超过50000的部门。

  1. 多表聚合查询

有时,你可能需要对多个表进行聚合查询,这通常涉及关联查询和聚合函数的组合。

sql

SELECT a.product_id, a.product_name, SUM(b.quantity) AS total_quantity_sold

FROM products a

JOIN sales b ON a.product_id = b.product_id

GROUP BY a.product_id, a.product_name;

这个查询会返回每个产品的ID、名称和总销售量。

  1. 窗口函数(Window Functions)

窗口函数允许你在查询的结果集中执行计算,这些计算类似于聚合函数,但它们是针对结果集的每一行进行的,并且保留行的详细信息。

sql

SELECT employee_id, salary,

AVG(salary) OVER (PARTITION BY department_id) AS avg_department_salary,

RANK() OVER (ORDER BY salary DESC) AS salary_rank

FROM employees;

这个查询会返回每个员工的ID、薪水、他们所在部门的平均薪水和在整个公司中的薪水排名。

  1. 递归查询(Recursive Queries)

递归查询用于处理层次结构数据,如组织结构图、分类目录等。在SQL中,这通常通过公用表表达式(CTE)来实现。

sql

WITH RECURSIVE EmployeeHierarchy AS (

SELECT employee_id, name, manager_id

FROM employees

WHERE manager_id IS NULL

UNION ALL

SELECT e.employee_id, e.name, e.manager_id

FROM employees e

INNER JOIN EmployeeHierarchy eh ON e.manager_id = eh.employee_id

)

SELECT * FROM EmployeeHierarchy;

这个查询会返回整个公司的员工层次结构,从顶层管理者开始,一直到每个

相关推荐
Csvn3 小时前
📊 SQL 入门 Day 12: 窗口函数基础
后端·sql
安_5 小时前
MySQL SQL 调优完整指南
数据库·sql·mysql
Lethehong10 小时前
【金仓数据库征文】AI 直连国产数据库——KES MCP Server 自然语言查库与 SQL 调优实战
数据库·人工智能·sql·金仓数据库征文
阿里云大数据AI技术18 小时前
EMR Serverless Spark AI Function 的双维降本实践
人工智能·sql·spark
jnrjian1 天前
psql 执行多个 sql 文件
数据库·sql
long3161 天前
PostgreSQL 学习资料大全:从入门到精通
java·数据库·sql·postgresql
阳光九叶草LXGZXJ1 天前
达梦数据库-报错-11-cmd 13 validate error
linux·运维·数据库·sql·学习
染指11101 天前
72.高级RAG-sql检索器
python·sql·mysql·llama·llamaindex·高级rag
long3161 天前
PostgreSQL 学习资料 · 入门 / 练习 / 精通 / 扩展
java·数据结构·数据库·spring boot·sql·postgresql·数据库开发
阳光九叶草LXGZXJ1 天前
达梦数据库-报错-12-[-7184]:对象定义[XXX]被修改,版本检查失败
linux·运维·服务器·数据库·sql·学习