常用SQL查询方法与实例

简介: 常用SQL查询方法与实例

fdcb979e8cbb4d8398cdfd5d252d2b47.png


常用SQL查询方法有以下几种:

  1. SELECT:用于从数据库表中检索数据。
  2. WHERE:用于过滤结果集,只返回满足指定条件的记录。
  3. ORDER BY:用于对结果集进行排序。
  4. GROUP BY:用于将结果集按照一个或多个列进行分组。
  5. HAVING:用于过滤分组后的结果集,只返回满足指定条件的分组。
  6. JOIN:用于连接两个或多个表,根据指定的条件返回匹配的记录。
  7. UNION:用于合并两个或多个SELECT语句的结果集。
  8. LIMIT:用于限制返回的结果集数量。
  1. OFFSET:用于指定返回结果集的起始位置。

SELECT查询

用于从数据表中选择数据。

SELECT first_name, last_name  

FROM employees  

WHERE department = 'HR';

INSERT查询

用于向数据表中插入新数据。

INSERT INTO customers (first_name, last_name, email)  

VALUES ('John', 'Doe', 'john.doe@example.com');

UPDATE查询

用于更新数据表中的数据。

UPDATE employees  

SET salary = 5000  

WHERE employee_id = 1;

DELETE查询

用于从数据表中删除数据。

DELETE FROM orders  

WHERE order_id = 1001;

JOIN查询

用于从多个表中检索相关数据。

SELECT customers.first_name, orders.order_date  

FROM customers  

JOIN orders ON customers.customer_id = orders.customer_id  

WHERE order_date >= '2023-01-01';

GROUP BY查询

用于根据一个或多个列对结果集进行分组。


SELECT department, COUNT(*) as number_of_employees  

FROM employees  

GROUP BY department;


HAVING查询

用于对GROUP BY子句的结果进行过滤。


SELECT department, AVG(salary) as average_salary  

FROM employees  

GROUP BY department  

HAVING average_salary > 5000;


选择所有列

SELECT * FROM students;

这将从students表中选择所有记录的所有列。


选择特定列并重命名

SELECT name AS 姓名, age FROM students;

此查询仅选择name和age列,并将name列在结果集中重命名为姓名。


条件查询(等于)

SELECT * FROM students WHERE age = 20;

查询年龄为20岁的学生的所有信息。


条件查询(范围)

SELECT * FROM students WHERE age BETWEEN 20 AND 30;

查询年龄在20到30岁之间的所有学生信息。


模糊查询(LIKE关键字)

SELECT * FROM students WHERE name LIKE '李%';

查找所有名字以“李”开头的学生信息。


使用IN关键字限定多个值

SELECT * FROM students WHERE native IN ('湖南', '四川');

查找来自湖南或四川的学生的所有信息。


连接查询

SELECT s.id, s.name, c.course_name

FROM students AS s

LEFT JOIN courses AS c ON s.course_id = c.id;

连接students和courses表,显示每个学生的ID、姓名及其选修的课程名称。


空值判断

SELECT * FROM students WHERE gender IS NULL;

查找gender字段为空的所有学生记录。


排序查询

SELECT name, age FROM students ORDER BY age DESC;

查询所有学生的名字和年龄,并按年龄降序排列。


分组与聚合查询

SELECT gender, COUNT(*) as total_students

FROM students

GROUP BY gender;


窗口函数

窗口函数是指在SQL查询中对一组相关行进行聚合或运算操作的函数。窗口函数可以在不改变基本表的情况下,为查询结果添加额外的计算列。举个例子,使用SUM()函数与OVER()子句计算销售额的运行总和。

WITH category_revenue AS (
    SELECT category, SUM(revenue) AS total_revenue
    FROM sales
    GROUP BY category
)
SELECT * FROM category_revenue;

公共表表达式(CTEs)

CTE(Common Table Expressions,公共表表达式)是一种在SQL查询中创建临时结果集的方法,可以被多次引用,提高查询的可读性和可维护性。以下是如何使用CTE计算每个产品类别的总收入的示例。

WITH category_revenue AS (
    SELECT category, SUM(revenue) AS total_revenue
    FROM sales
    GROUP BY category
)
SELECT * FROM category_revenue;

递归查询

递归查询能够帮助分析师遍历层次化数据结构,如组织图或物料清单。假设这里有一个表示员工关系的表,想查找某个经理的所有下属:

WITH RECURSIVE subordinates AS (
    SELECT employee_id, name, manager_id
    FROM employees
    WHERE manager_id = 'manager_id_of_interest'
    UNION ALL
    SELECT e.employee_id, e.name, e.manager_id
    FROM employees e
    JOIN subordinates s ON e.manager_id = s.employee_id
)
SELECT * FROM subordinates;

透视表

透视表将行转换为列,以表格形式汇总数据。比如,有一个包含销售数据的表格,想通过数据透视来显示每个产品在不同月份的总销售额:

SELECT *
FROM (
    SELECT product, month, sales
    FROM sales_data
) AS source_table
PIVOT (
    SUM(sales)
    FOR month IN ('Jan', 'Feb', 'Mar', 'Apr', 'May')
) AS pivot_table;

分析函数

分析函数根据一组记录计算汇总值。例如,可以使用 ROW_NUMBER() 函数为数据集中的每条记录分配唯一的行号。

SELECT customer_id, order_id,
       ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY order_date) AS order_rank
FROM orders;

解透视

解透视是透视操作的反向操作,解透视是将一张表中的列转换为行,而透视是将行转换为列。比如,这里有一个按月汇总销售数据的表格,想取消透视以分析随时间变化的趋势。

SELECT customer_id, 
       AVG(CASE WHEN order_count > 1 THEN order_total ELSE NULL END) AS avg_sales_repeat_customers
FROM (
    SELECT customer_id, COUNT(*) AS order_count, SUM(order_total) AS order_total
    FROM orders
    GROUP BY customer_id
) AS customer_orders;

条件聚合

条件聚合是指根据指定条件应用条件聚合函数。例如,如果想计算老客户订单的平均销售额:

SELECT customer_id, 
       AVG(CASE WHEN order_count > 1 THEN order_total ELSE NULL END) AS avg_sales_repeat_customers
FROM (
    SELECT customer_id, COUNT(*) AS order_count, SUM(order_total) AS order_total
    FROM orders
    GROUP BY customer_id
) AS customer_orders;

日期函数

SQL中的日期函数支持操纵和提取与日期相关的信息。例如,可以使用DATE_TRUNC()函数按月对销售数据进行分组。

SELECT DATE_TRUNC('month', order_date) AS month, SUM(sales_amount) AS total_sales
FROM sales
GROUP BY DATE_TRUNC('month', order_date);

合并语句

合并语句(也称为 UPSERT 或 ON DUPLICATE KEY UPDATE)可让分析师根据与源表的连接结果在目标表中插入、更新或删除记录。比如,要同步两个包含客户数据的表。

MERGE INTO target_table AS t
USING source_table AS s
ON t.customer_id = s.customer_id
WHEN MATCHED THEN
    UPDATE SET t.name = s.name, t.email = s.email
WHEN NOT MATCHED THEN
    INSERT (customer_id, name, email) VALUES (s.customer_id, s.name, s.email);

情况语句

情况语句支持在SQL查询中应用条件逻辑。例如,使用情况语句根据客户的总购买金额对其进行分类。

SELECT customer_id,
       CASE
           WHEN total_purchase_amount >= 1000 THEN 'Platinum'
           WHEN total_purchase_amount >= 500 THEN 'Gold'
           ELSE 'Silver'
       END AS customer_category
FROM (
    SELECT customer_id, SUM(order_total) AS total_purchase_amount
    FROM orders
    GROUP BY customer_id
) AS customer_purchases;

其他代码:


JOIN:查询员工及其所属部门的信息

SELECT e.name, d.department_name FROM employees e JOIN departments d ON e.department_id = d.id;


UNION:查询男性员工和女性员工的信息

SELECT name, gender FROM employees WHERE gender = 'M' UNION SELECT name, gender FROM employees WHERE gender = 'F';


LIMIT:查询年龄最大的前5名员工信息

SELECT * FROM employees ORDER BY age DESC LIMIT 5;


OFFSET:查询第6到第10名员工的信息

SELECT * FROM employees LIMIT 5 OFFSET 5;

目录
相关文章
|
3月前
|
SQL 监控 关系型数据库
一键开启百倍加速!RDS DuckDB 黑科技让SQL查询速度最高提升200倍
RDS MySQL DuckDB分析实例结合事务处理与实时分析能力,显著提升SQL查询性能,最高可达200倍,兼容MySQL语法,无需额外学习成本。
|
3月前
|
SQL 存储 关系型数据库
MySQL体系结构详解:一条SQL查询的旅程
本文深入解析MySQL内部架构,从SQL查询的执行流程到性能优化技巧,涵盖连接建立、查询处理、执行阶段及存储引擎工作机制,帮助开发者理解MySQL运行原理并提升数据库性能。
|
7月前
|
SQL 数据挖掘 数据库
第三篇:高级 SQL 查询与多表操作
本文深入讲解高级SQL查询技巧,涵盖多表JOIN操作、聚合函数、分组查询、子查询及视图索引等内容。适合已掌握基础SQL的学习者,通过实例解析INNER/LEFT/RIGHT/FULL JOIN用法,以及COUNT/SUM/AVG等聚合函数的应用。同时探讨复杂WHERE条件、子查询嵌套,并介绍视图简化查询与索引优化性能的方法。最后提供实践建议与学习资源,助你提升SQL技能以应对实际数据处理需求。
508 1
|
3月前
|
SQL 监控 关系型数据库
SQL优化技巧:让MySQL查询快人一步
本文深入解析了MySQL查询优化的核心技巧,涵盖索引设计、查询重写、分页优化、批量操作、数据类型优化及性能监控等方面,帮助开发者显著提升数据库性能,解决慢查询问题,适用于高并发与大数据场景。
|
2月前
|
SQL 关系型数据库 MySQL
(SQL)SQL语言中的查询语句整理
查询语句在sql中占了挺大一部分篇幅,因为在数据库中使用查询语句的次数远多于更新与删除命令。而查询语句比起其他语句要更加的复杂,可因为sql是数据库不可或缺的一部分,所以即使不懂,也必须得弄懂,以上。
220 0
|
4月前
|
SQL XML Java
通过MyBatis的XML配置实现灵活的动态SQL查询
总结而言,通过MyBatis的XML配置实现灵活的动态SQL查询,可以让开发者以声明式的方式构建SQL语句,既保证了SQL操作的灵活性,又简化了代码的复杂度。这种方式可以显著提高数据库操作的效率和代码的可维护性。
286 18
|
4月前
|
SQL 人工智能 数据库
【三桥君】如何正确使用SQL查询语句:避免常见错误?
三桥君解析了SQL查询中的常见错误和正确用法。AI产品专家三桥君通过三个典型案例:1)属性重复比较错误,应使用IN而非AND;2)WHERE子句中非法使用聚合函数的错误,应改用HAVING;3)正确的分组查询示例。三桥君还介绍了学生、课程和选课三个关系模式,并分析了SQL查询中的属性比较、聚合函数使用和分组查询等关键概念。最后通过实战练习帮助读者巩固知识,强调掌握这些技巧对提升数据库查询效率的重要性。
150 0
|
7月前
|
SQL 数据采集 关系型数据库
实现MySQL与SQL Server之间数据迁移的有效方法
总的来说,从MySQL到SQL Server的数据迁移是一个涉及到很多步骤的过程,可能会遇到各种问题和挑战。但只要精心规划、仔细执行,这个任务是完全可以完成的。
519 18
|
7月前
|
SQL 关系型数据库 MySQL
凌晨2点报警群炸了:一条sql 执行200秒!搞定之后,我总结了一个慢SQL查询、定位分析解决的完整套路
凌晨2点报警群炸了:一条sql 执行200秒!搞定之后,我总结了一个慢SQL查询、定位分析解决的完整套路
凌晨2点报警群炸了:一条sql 执行200秒!搞定之后,我总结了一个慢SQL查询、定位分析解决的完整套路
|
5月前
|
SQL
SQL中如何删除指定查询出来的数据
SQL中如何删除指定查询出来的数据