MySQL

SQL执行顺序

SQL 查询的执行顺序可以分为逻辑执行顺序和物理执行顺序:

**逻辑执行顺序:**
1. `FROM`:指定要查询的表,可以包括一个或多个表。
2. `WHERE`:筛选要包括在结果中的行,根据条件来过滤数据。
3. `GROUP BY`:按指定的列对数据进行分组,通常与聚合函数一起使用。
4. `HAVING`:用于筛选分组后的数据。
5. `SELECT`:选择要返回的列,可以包括聚合函数。
6. `ORDER BY`:指定结果的排序顺序。
7. `LIMIT`:限制结果集的大小,通常用于分页。

**物理执行顺序:**
虽然逻辑执行顺序提供了 SQL 查询的逻辑结构,但数据库系统可能以不同的方式来优化查询的物理执行。优化器通常会根据查询的复杂性和数据库表的索引等因素来决定最佳执行计划。这可以包括表的连接方式、索引使用、数据的存取方式等。

SQL 查询的优化过程通常包括以下步骤:
1. 解析 SQL 查询语句,构建查询解析树。
2. 查询重写:根据表的统计信息和索引信息,优化器可能会重写查询,以获得更好的执行计划。
3. 选择访问路径:选择如何访问表和索引,以最小化 I/O 操作。
4. 计划生成:生成用于执行查询的计划,通常以操作的方式表示。
5. 执行计划:根据生成的计划,执行查询操作,获取结果。

总之,SQL 查询的执行顺序包括逻辑执行顺序和物理执行顺序。逻辑执行顺序定义了查询的逻辑结构,而物理执行顺序由数据库系统的优化器根据查询和数据库表的特定情况来决定。物理执行顺序的目标是以最有效的方式检索和处理数据。

<set>

句尾需要加逗号

<update>
    update table
     <set>
          <if test="userBaseId != null">
                  user_base_id = #{userBaseId,jdbcType=VARCHAR},
          </if>
          <if test="driverId != null">
                  driver_id = #{driverId,jdbcType=VARCHAR},
          </if>         
        </set>
        where   id = #{id,jdbcType=VARCHAR}
</update>

通用sql

定义通用查询SQL,查询时使用通用SQL,方便后期维护

<sql id="Base_Column_List">
        id,user_base_id,driver_id,
        cert_type,cert_status,mobile,
        name,id_number,create_by,
        create_date,modify_by,modify_date
</sql>

<select >
   select
    <include refid="Base_Column_List" />
        from 
     where  id = #{id,jdbcType=VARCHAR}
</select>
<if>

日期类型判断不能用“”

<if test="createDate != null">
group by

`GROUP BY` 是 SQL 中用于对数据进行分组的关键子句。它通常与聚合函数(如 `SUM`、`COUNT`、`AVG`、`MAX`、`MIN` 等)一起使用,以便在每个分组上执行聚合操作。以下是理解 `GROUP BY` 的要点:

1. **分组数据:** `GROUP BY` 子句根据指定的列或表达式将数据分成不同的组。这意味着具有相同值的行将被分为同一组。

2. **聚合操作:** 一旦数据被分组,您可以在每个组上执行聚合操作,例如计算总和、计数、平均值等。这允许您查找有关每个组的统计信息。

3. **用法示例:** 以下是一个示例,演示如何使用 `GROUP BY`:

SELECT department, AVG(salary) FROM employees GROUP BY department;

在这个示例中,`employees` 表中的数据按部门进行分组,并计算每个部门的平均工资。

4. **HAVING 子句:** `HAVING` 子句通常与 `GROUP BY` 一起使用,用于过滤分组后的结果。它允许您筛选出特定分组的结果,而不是筛选原始数据。例如:

SELECT department, AVG(salary) FROM employees GROUP BY department HAVING AVG(salary) > 50000;

在这个示例中,仅返回平均工资超过 50000 的部门。

5. **注意事项:**
   - 列出在 `GROUP BY` 子句中的列是合法的,但在 `SELECT` 中可以使用的列通常受限于分组列和聚合函数。
   - `GROUP BY` 子句通常用于汇总数据,并生成更高层次的报告,而不是详细数据记录。

总之,`GROUP BY` 允许您将数据分组并对每个组执行聚合操作,从而使您能够获取有关数据的汇总信息,并执行有条件的筛选操作。这对于生成报告和分析数据非常有用。

join

select * from A left jion B on A.key = B.key和select * from A 有什么区别

在这个问题中,您提到了两个 SQL 查询:

1. `SELECT * FROM A LEFT JOIN B ON A.key = B.key`
2. `SELECT * FROM A`

这两个查询有以下区别:

1. 查询结果:
   - 第一个查询使用了左连接(LEFT JOIN),它会从表A中选择所有的行,并且如果在表B中存在与表A中的行关联的匹配行,则将这些匹配行也包括在结果中。如果没有匹配行,那么在结果集中会有NULL值。
   - 第二个查询只从表A中选择所有的行,不会考虑与表B的关联,所以结果只包含表A中的数据。

2. 结果集的列数:
   - 第一个查询的结果集可能会包含来自表B的列,因为它是一个联接查询,所以结果集可能会包含来自表A和表B的列。
   - 第二个查询只选择表A中的所有列,不包括与其他表的连接。

总之,这两个查询的主要区别在于它们的结果集和数据选择。第一个查询是一个联接查询,返回表A和表B的匹配数据,而第二个查询仅返回表A的所有数据。

分析SELECT * FROM A LEFT JOIN B ON A.key = B.key where B.key is null返回的数据集

查询 `SELECT * FROM A LEFT JOIN B ON A.key = B.key WHERE B.key IS NULL` 返回的数据集将包括表 A 中的所有行,但仅限于那些在表 B 中没有匹配项的行。这种查询通常用于查找在表 A 中存在但在表 B 中不存在的数据。

具体来说,结果集将包括以下内容:

- 表 A 中的所有列的数据,包括与表 B 中的匹配数据(如果有匹配)。
- 仅当在表 B 中没有匹配的情况下,才会包括来自表 B 的 NULL 值列数据。
- 结果中不会包含任何来自表 B 的非 NULL 值数据。

这个查询的目的是找到表 A 中那些在表 B 中没有匹配项的行。在结果集中,可以通过检查 B.key 是否为 NULL 来确定哪些行没有匹配项。

总结一下,`SELECT * FROM A LEFT JOIN B ON A.key = B.key WHERE B.key IS NULL` 返回了表 A 中那些在表 B 中没有匹配项的行,以及这些行的所有列数据,其中与表 B 的匹配数据列为 NULL。

有哪些练习sql的免费网站

以下是一些免费的网站和资源,您可以在这些网站上练习 SQL 技能:

1. **SQLZoo**(https://sqlzoo.net/):SQLZoo 提供了一个互动的平台,让您可以使用 SQL 在不同的数据库引擎上进行练习,包括 MySQL、PostgreSQL、Oracle 等。

2. **w3schools SQL 练习**(https://www.w3schools.com/sql/exercise.asp):w3schools 提供了 SQL 的在线练习,以及有关 SQL 的学习材料。它是一个广泛使用的学习资源。

3. **Hackerrank SQL 练习**(https://www.hackerrank.com/domains/tutorials/10-days-of-sql):Hackerrank 提供了一系列 SQL 练习,涵盖了不同难度级别,适合初学者到高级用户。

4. **LeetCode SQL 练习**(https://leetcode.com/problemset/database/):LeetCode 是一个以算法和数据结构为主题的网站,但它也提供了大量 SQL 练习题目,适合准备面试的人员。

5. **SQLFiddle**(http://sqlfiddle.com/):SQLFiddle 允许您在线运行和分享 SQL 代码,以及测试不同的 SQL 查询。

6. **Mode Analytics SQL School**(https://mode.com/sql-tutorial/introduction-to-sql):Mode Analytics 提供了一个免费的 SQL 学习资源,包括教程和练习。

7. **Kaggle**(https://www.kaggle.com/):Kaggle 是一个数据科学竞赛平台,它也提供了 SQL 练习和数据集,供用户学习和练习。

8. **Coursera**(https://www.coursera.org/)和 **edX**(https://www.edx.org/):这两个在线学习平台通常提供一些免费 SQL 课程,您可以注册并参加这些课程来学习和练习 SQL。

这些资源涵盖了从基础到高级的 SQL 练习,适合不同级别的学习者。您可以根据自己的需求选择其中一个或多个资源来提高 SQL 技能。

聚合函数

如果聚合函数不分组,其余列显示第一条

count:

在 MySQL 中,`COUNT()` 函数是一个聚合函数,用于计算表中满足指定条件的记录数。你可以在 `COUNT()` 函数中使用 `CASE` 语句来为每个记录指定一个条件,并计算满足该条件的记录数。

以下是一个示例,说明如何在 `COUNT()` 函数中使用条件:

假设你有一个表 `orders`,并且你想要计算订单的总数、已完成订单的数量以及取消的订单数量。你可以使用以下查询:

SELECT 
    COUNT(*) AS total_orders,
    COUNT(CASE WHEN status = 'COMPLETED' THEN 1 ELSE NULL END) AS completed_orders,
    COUNT(CASE WHEN status = 'CANCELLED' THEN 1 ELSE NULL END) AS cancelled_orders
FROM 
    orders;

在这个查询中:

- `COUNT(*) AS total_orders` 计算表中的总记录数。
- `COUNT(CASE WHEN status = 'COMPLETED' THEN 1 ELSE NULL END) AS completed_orders` 计算 `status` 为 'COMPLETED' 的记录数。
- `COUNT(CASE WHEN status = 'CANCELLED' THEN 1 ELSE NULL END) AS cancelled_orders` 计算 `status` 为 'CANCELLED' 的记录数。

注意:在 `COUNT()` 函数中使用 `ELSE NULL` 是为了确保 `CASE` 表达式只返回 `1` 或 `NULL`,这样 `COUNT()` 函数就只会计算非 `NULL` 值,从而实现条件计数。

sum:

是的,在 MySQL 中,`SUM()` 函数是一个聚合函数,用于计算指定列中的数值总和。你可以在 `SUM()` 函数中使用 `CASE` 语句来为每个记录指定一个条件,并计算满足该条件的数值的总和。

以下是一个示例,说明如何在 `SUM()` 函数中使用条件:

假设你有一个表 `sales`,并且你想要计算所有销售金额的总和、已完成订单的销售金额总和以及取消订单的销售金额总和。你可以使用以下查询:

SELECT 
    SUM(amount) AS total_sales,
    SUM(CASE WHEN status = 'COMPLETED' THEN amount ELSE 0 END) AS completed_sales,
    SUM(CASE WHEN status = 'CANCELLED' THEN amount ELSE 0 END) AS cancelled_sales
FROM 
    sales;

在这个查询中:

- `SUM(amount) AS total_sales` 计算 `amount` 列的总和,即所有销售金额的总和。
- `SUM(CASE WHEN status = 'COMPLETED' THEN amount ELSE 0 END) AS completed_sales` 计算 `status` 为 'COMPLETED' 的销售金额的总和。
- `SUM(CASE WHEN status = 'CANCELLED' THEN amount ELSE 0 END) AS cancelled_sales` 计算 `status` 为 'CANCELLED' 的销售金额的总和。

这里的 `CASE` 语句用于为每个记录指定一个条件,如果满足条件,则使用 `amount` 列的值,否则使用 `0`。然后,`SUM()` 函数会计算这些值的总和,从而得到条件下的数值总和。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值