• [技术干货] SQL Having用法示例小结 --转载
    SQL Having用法HAVING子句用于过滤分组之后的数据。1、如果过滤条件中使用了聚合函数,或行已经被分组,则必须使用HAVING来替换WHERE。否则,报错。2、HAVING 必须声明在 GROUP BY 的后面。123456# 查询各个部门中最高工资大于10000的部门信息SELECT department_id, MAX(salary) max_salaryFROM employeesGROUP BY department_id# 对分组后的数据进行筛选,选出部门中最高工资大于10000的部门HAVING max_salary > 10000;开发中,我们使用HAVING的前提是SQL中使用了GROUP BY。 如果没有使用GROUP BY,使用HAVING,则整个表中的所有记录会被当成一组,然后对这一组记录根据HAVING中的条件进行筛选。123SELECT department_id, MAX(salary) max_salaryFROM employeesHAVING max_salary > 10000;HAVING 不能单独使用,必须要跟 GROUP BY 一起使用。 1、当过滤条件中有聚合函数时,则此过滤条件必须声明在HAVING中。2、当过滤条件中没有聚合函数时,则此过滤条件声明在WHERE中或HAVING中都可以。但是,建议大家声明在WHERE中。 补充:SQL Having用法拿个业务场景说这个案例,比如我们有个表里面可能有批改过的数据,批改过得数据不会随着新批改的数据覆盖,而是逐条插入表中,如果想找出包含最早批改的数据和最新批改数据的话,那么我们就需要用到了havinng 用法,假设最开始的批单号是000,批单号是累加的比如我们有个表 table 表里面有两个字段 订单号(order_no) 和 批单号(endorseq_no)那么写法就是123456select order_nofrom tablegroup by order_nohaving sum(case when endorseq_no = '000' then 1                 else 0 end) >= 1  --这个是判断必须包含最初的批单  and count(*) >= 2    --这个是判断除了最初的批单之外还需要有新批改的批单
  • [技术干货] SQL 中 COUNT 的用法示例详解 --转载
    1. COUNT(*):统计总行数COUNT(*) 是 SQL 中最常用的统计方式之一。它会统计查询结果集中所有行的数量(包括 NULL 值)。语法:1SELECT COUNT(*) FROM 表名;示例: 假设我们有一个 employees 表,包含以下数据:idnameagedepartment1John Doe30Sales2Jane SmithNULLHR3Alice Brown25NULL执行以下查询:1SELECT COUNT(*) FROM employees;结果:3解释: COUNT(*) 会统计所有行,不会忽略 NULL 值,即使某些列有 NULL,它也会计算每一行。因此,结果为 3,表示表中共有 3 行数据。2. COUNT(1):统计总行数COUNT(1) 的作用与 COUNT(*) 类似,也会统计表中所有的行。它是 SQL 优化中的一个小技巧,某些数据库系统(如 MySQL)会对其进行优化处理。语法:1SELECT COUNT(1) FROM 表名;解释: COUNT(1) 和 COUNT(*) 的结果是相同的,都会返回表中所有行的数量。数据库会将 1 替代成一个常量来参与计算,并且不会关心每一列的具体值。优化区别: 在某些数据库系统(如 MySQL)中,COUNT(1) 和 COUNT(*) 在执行计划中的表现可能相同,查询效率基本没有区别。然而,某些旧版的数据库系统在处理 COUNT(*) 时,会去解析整行数据,而 COUNT(1) 可以直接统计行数,因此会有一些微小的性能差异。3. COUNT(列名):统计特定列中非 NULL 值的数量与 COUNT(*) 不同,COUNT(列名) 只会统计指定列中非 NULL 值的数量。如果某列中有 NULL 值,COUNT(列名) 会自动跳过它们。语法:1SELECT COUNT(列名) FROM 表名;示例:1SELECT COUNT(age) FROM employees;结果24. COUNT(DISTINCT 列名):统计某列中不重复的非 NULL 值的数量有时,我们不仅需要统计某列中的非 NULL 值,还需要统计不重复的值。在这种情况下,可以使用 COUNT(DISTINCT 列名) 来完成这个任务。语法:1SELECT COUNT(DISTINCT 列名) FROM 表名;示例: 假设我们有以下表数据:iddepartment1Sales2HR3Sales4IT查询:1SELECT COUNT(DISTINCT department) FROM employees;结果:3解释: 表中有三个不重复的 department 值:Sales, HR, IT。因此,COUNT(DISTINCT department) 返回 3,表示有 3 个不同的部门。5. COUNT() 与 GROUP BY 的结合COUNT() 函数经常和 GROUP BY 子句结合使用,用于统计每个分组的数量。GROUP BY 按照某列对数据进行分组,COUNT() 则对每个分组内的行数进行统计。6. COUNT 与 HAVING 的结合HAVING 子句通常与 GROUP BY 一起使用,用来过滤聚合结果。它可以用来限制返回的分组数量,条件可以基于 COUNT() 等聚合函数的结果。7. COUNT 与 JOIN 的结合在复杂的查询中,COUNT() 函数可以与 JOIN 子句一起使用,统计与另一个表匹配的记录数量。示例:1234SELECT d.department, COUNT(e.id) FROM departments d LEFT JOIN employees e ON d.id = e.department_id GROUP BY d.department;解释: 此查询会返回每个部门中员工的数量,即使某些部门没有员工,也会返回该部门的记录(因为使用了 LEFT JOIN)。使用 COUNT(e.id) 统计每个部门中关联的员工数量。COUNT(*) 和 COUNT(1) 的区别区别:在大多数数据库系统中,COUNT(*) 和 COUNT(1) 的性能几乎相同。COUNT(*) 会统计表中所有行,而不关心列内容,而 COUNT(1) 则是将 1 作为一个固定值用于统计。在某些数据库系统中,COUNT(1) 被认为稍微高效一点,因为它不需要解析所有列,只是使用常量 1 来计数。结论: 现代数据库(如 MySQL)会对 COUNT(*) 和 COUNT(1) 做优化处理,因此二者的性能差异几乎可以忽略。选择哪种方式可以根据个人习惯或项目规范。
  • [技术干货] SQL中的INNER JOIN操作方法 --转载
    一、InnerJoin 的定义和概念在关系数据库中,JOIN操作用于在两个或多个表之间基于某些条件进行连接。INNER JOIN是最常见的JOIN类型之一,它仅返回两个表中匹配的行。了解INNER JOIN的定义和概念对于正确使用和优化SQL查询至关重要。 什么是INNER JOIN?INNER JOIN用于返回两个表中基于指定条件匹配的行。换句话说,只有当连接条件满足时,才会返回行。如果没有匹配的行,则不会在结果集中包含这些行。 INNER JOIN的语法标准SQL语法中,INNER JOIN的基本形式如下:1234SELECT column_name(s)FROM table1INNER JOIN table2ON table1.column_name = table2.column_name;在这个语法中,table1和table2是要连接的两个表,column_name(s)是要选择的列,ON子句指定了连接条件。 INNER JOIN的使用场景INNER JOIN广泛应用于各种场景,包括:数据分析:从多个相关表中检索数据进行分析。数据聚合:结合多个表的数据进行汇总和统计。报告生成:生成基于多表数据的报告。数据验证:验证多个表之间的关系和数据一致性。通过理解INNER JOIN的定义和概念,可以更有效地应用它来解决实际问题。 二、InnerJoin 关联结果的计算方法在实际应用中,INNER JOIN的结果集行数取决于连接表之间的关系类型和匹配条件。为了准确计算INNER JOIN的返回行数,我们需要深入了解以下几种情况: 一对多关系和多对多关系在关系数据库中,一对多关系和多对多关系是两种常见的表关系类型。INNER JOIN在这两种关系中的行为有所不同,但可以通过理解它们的本质来统一计算方法。 一对多关系在一对多关系中,一个表中的每一行可以与另一个表中的多行相关联。INNER JOIN在一对多关系中的行为主要取决于子表中的匹配行数。假设:数据分析:从多个相关表中检索数据进行分析。数据聚合:结合多个表的数据进行汇总和统计。报告生成:生成基于多表数据的报告。数据验证:验证多个表之间的关系和数据一致性。如果表 A 中的每一行在表 B 中平均匹配 k 行(k 可以是 0),那么INNER JOIN返回的总行数为 m * k。 多对多关系在多对多关系中,一个表中的每一行可以与另一个表中的多行相关联,反之亦然。这种关系通常通过一个中间表(交叉表)来实现,该表包含两个表的外键。假设:表 A 具有 m 行。表 B 具有 n 行。中间表 C 具有 p 行,表示表 A 和表 B 之间的关系数量。在这种情况下,INNER JOIN的结果集行数通常等于中间表 C 的行数,即 p 行。 Inner Join 关联结果的计算方法为了更好地理解INNER JOIN的计算方法,下面我们将通过具体示例进行详细讲解。 示例:一对多关系假设我们有两个表:Customers 和 Orders,其中 Customers 表记录了客户信息,Orders 表记录了客户的订单信息。这是一个典型的一对多关系,每个客户可以有多个订单。Customers 表:12345CustomerID | CustomerName-----------+-------------1          | Alice2          | Bob3          | CharlieOrders 表:1234567OrderID | CustomerID | OrderAmount--------+------------+------------1       | 1          | 1002       | 1          | 1503       | 2          | 2004       | 2          | 2505       | 3          | 300在这种场景中,执行INNER JOIN查询:123SELECT Customers.CustomerID, Customers.CustomerName, Orders.OrderID, Orders.OrderAmountFROM CustomersINNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID;返回的结果为:CustomerID | CustomerName | OrderID | OrderAmount-----------+--------------+---------+------------1          | Alice        | 1       | 1001          | Alice        | 2       | 1502          | Bob          | 3       | 2002          | Bob          | 4       | 2503          | Charlie      | 5       | 300示例:多对多关系假设我们有三个表:Students, Courses 和 Enrollments,其中 Students 表记录学生信息,Courses 表记录课程信息,Enrollments 表记录学生与课程的注册关系。Students 表:12345StudentID | StudentName----------+------------1         | Alice2         | Bob3         | CharlieCourses 表:123456CourseID | CourseName---------+-----------1        | Math2        | Science3        | History4        | ArtEnrollments 表:12345678EnrollmentID | StudentID | CourseID-------------+-----------+---------1            | 1         | 12            | 1         | 23            | 2         | 24            | 2         | 35            | 3         | 36            | 3         | 4在这种场景中,执行多对多关系的INNER JOIN查询:1234SELECT Students.StudentID, Students.StudentName, Courses.CourseID, Courses.CourseNameFROM StudentsINNER JOIN Enrollments ON Students.StudentID = Enrollments.StudentIDINNER JOIN Courses ON Enrollments.CourseID = Courses.CourseID;返回的结果为:StudentID | StudentName | CourseID | CourseName----------+-------------+----------+-----------1         | Alice       | 1        | Math1         | Alice       | 2        | Science2         | Bob         | 2        | Science2         | Bob         | 3        | History3         | Charlie     | 3        | History3         | Charlie     | 4        | Art InnerJoin关联结果的总结通过上述示例,我们可以总结出INNER JOIN在不同关系类型中的行为规律:一对多关系:INNER JOIN返回的行数主要取决于“多”方的行数,即子表的行数和匹配关系。最终的结果集行数等于父表中每一行在子表中的平均匹配数与父表行数的乘积。多对多关系:INNER JOIN返回的行数通常等于中间表的行数。中间表记录了两表之间的所有关系,因此结果集行数等于中间表的记录数。 三、InnerJoin与其他Join关联查询结果的异同在关系数据库中,除了INNER JOIN,还有其他类型的JOIN,例如LEFT JOIN、RIGHT JOIN和FULL JOIN。了解它们之间的差异对于选择合适的JOIN类型至关重要。 LEFT JOIN(或LEFT OUTER JOIN)LEFT JOIN返回左表中的所有行,即使右表中没有匹配的行。对于没有匹配的行,右表的列将包含NULL值。示例假设我们有两个表:Customers 和 Orders。123SELECT Customers.CustomerID, Customers.CustomerName, Orders.OrderID, Orders.OrderAmountFROM CustomersLEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID;返回的结果可能包含没有订单的客户:CustomerID | CustomerName | OrderID | OrderAmount-----------+--------------+---------+------------1          | Alice        | 1       | 1001          | Alice        | 2       | 1502          | Bob          | 3       | 2002          | Bob          | 4       | 2503          | Charlie      | 5       | 3004          | David        | NULL    | NULLRIGHT JOIN(或RIGHT OUTER JOIN)RIGHT JOIN返回右表中的所有行,即使左表中没有匹配的行。对于没有匹配的行,左表的列将包含NULL值。示例123SELECT Customers.CustomerID, Customers.CustomerName, Orders.OrderID, Orders.OrderAmountFROM CustomersRIGHT JOIN Orders ON Customers.CustomerID = Orders.CustomerID;返回的结果可能包含没有匹配客户的订单:123456789CustomerID | CustomerName | OrderID | OrderAmount-----------+--------------+---------+------------1          | Alice        | 1       | 1001          | Alice        | 2       | 1502          | Bob          | 3       | 2002          | Bob          | 4       | 2503          | Charlie      | 5       | 300NULL       | NULL         | 6       | 350FULL JOIN(或FULL OUTER JOIN)FULL JOIN返回两个表中的所有行。如果没有匹配的行,则相应表的列将包含NULL值。示例123SELECT Customers.CustomerID, Customers.CustomerName, Orders.OrderID, Orders.OrderAmountFROM CustomersFULL JOIN Orders ON Customers.CustomerID = Orders.CustomerID;返回的结果可能包含所有客户和订单,包括没有匹配的行:123456789CustomerID | CustomerName | OrderID | OrderAmount-----------+--------------+---------+------------1          | Alice        | 1       | 1001          | Alice        | 2       | 1502          | Bob          | 3       | 2002          | Bob          | 4       | 2503          | Charlie      | 5       | 3004          | David        | NULL    | NULLNULL       | NULL         | 6       | 350CROSS JOINCROSS JOIN返回两个表的笛卡尔积,即每个表中的每一行都与另一个表中的每一行进行组合。示例123SELECT Customers.CustomerID, Customers.CustomerName, Orders.OrderID, Orders.OrderAmountFROM CustomersCROSS JOIN Orders;返回的结果为:CustomerID | CustomerName | OrderID | OrderAmount-----------+--------------+---------+------------1          | Alice        | 1       | 1001          | Alice        | 2       | 1501          | Alice        | 3       | 2001          | Alice        | 4       | 2501          | Alice        | 5       | 3002          | Bob          | 1       | 1002          | Bob          | 2       | 1502          | Bob          | 3       | 2002          | Bob          | 4       | 2502          | Bob          | 5       | 3003          | Charlie      | 1       | 1003          | Charlie      | 2       | 1503          | Charlie      | 3       | 2003          | Charlie      | 4       | 2503          | Charlie      | 5       | 300
  • [问题求助] 什么是数据库的锁升级,InnoDB支持锁升级吗?
    什么是数据库的锁升级,InnoDB支持锁升级吗?
  • [问题求助] mysql中如何查看一个sql的执行耗时?
    mysql中如何查看一个sql的执行耗时?
  • [问题求助] mysql用了索引一定会索引失效吗?
    mysql用了索引一定会索引失效吗?
  • [问题求助] 索引的长度太长有影响吗?
    索引的长度太长有影响吗?为什么更推荐前缀索引?
  • [问题求助] 联合索引是越多越好吗?
    联合索引是越多越好吗?我多建几个索引不是更好吗?
  • [问题求助] 为什么MySQL会选错索引,如何解决?
    为什么MySQL会选错索引,如何解决?它是怎么进行索引选择的?
  • [问题求助] 为什么不推荐使用外键,使用外键不是更好吗?
    大学一直强调数据库范式,外键约束,但是实际工作中经常是反范式,不做外键约束。是正常的吗?为什么工作中不建议使用外键约束。
  • [问题求助] 在进行DDL期间会阻塞DML动作吗?
    在进行DDL期间会阻塞DML动作吗?
  • [问题求助] where条件的顺序影响使用索引吗?
    where条件的顺序影响使用索引吗?比如有一个联合索引<a,b>,where a,b或者where b,a有区别吗
  • [问题求助] 数据库字段加密后如何做模糊查询?
    数据库字段加密后如何做模糊查询?
  • [问题求助] 使用存储过程的弊端?
    使用存储过程的弊端?
  • [问题求助] 为什么mysql8.0中取消了查询缓存?
    为什么mysql8.0中取消了查询缓存?