通过使用SQL语句,可以对数据库中的表格进行查询、更新、删除等操作。本文将分享10个高级SQL写法,包括窗口函数、联合查询、交叉查询、递归查询等。...窗口函数窗口函数(Window Function)是一类特殊的函数,它可以在某个数据集上执行聚合操作(如求和、计数、平均值)并返回多行结果,同时还可以访问同一数据集中的其它行。1....UNIONUNION操作将两个查询结果合并成一个结果集,并去除重复项。...ON cte.id = t.parent_id)SELECT * FROM cte;其他高级写法7....在实际应用中,我们可以根据业务需求和数据结构,选择适合的SQL写法来进行查询和处理,以达到更好的效果。
大家在项目开发过程中,数据库几乎是每一个后端开发者必备的技能,并且经常会遇到对于数据表重复数据的处理,一般需要去除重复保留最新的记录。今天这里给大家分享两种种方案,希望对大家日常开发能够提供一些帮助!...使用ROW_NUMBER()函数删除重复项ROW_NUMBER()函数是SQL Server中处理重复数据的强大工具之一,可以通过窗口函数来为每一组重复数据分配行号,然后保留每组数据中最新的一条记录。...-- 查询不是最新的重复记录直接删除WITH CTE AS ( SELECT *, ROW_NUMBER() OVER(PARTITION BY ProductName ORDER...BY OrderDate DESC) AS RowNum FROM Sales)DELETE FROM CTEWHERE RowNum > 1;-- 数据库不操作直接查询每一行不重复的最新记录WITH...删除重复记录:在CTE中删除RowNum大于1的记录,即除了每个分组最新的一条记录外,其余视为重复并删除。直接查询:针对CTE筛选RowNum等于1的记录方案二.
包含 GROUP BY 的子查询不能使用 DISTINCT 关键字。 不能指定 COMPUTE 和 INTO 子句。 只有指定了 TOP 时才能指定 ORDER BY。...join_condition 定义用于对每一对联接行进行求值的谓词(比较运算符或关系运算符)。 当 SQL Server 处理联接时,查询引擎会从多种可行的方法中选择最有效的方法来处理联接。...默认情况下,UNION 运算符将从结果集中删除重复的行。如果使用 ALL (即UNION ALL)关键字,那么结果中将包含所有行而不删除重复的行。...使用 UNION 运算符时需遵循下列准则: 在用 UNION 运算符组合的语句中,所有选择列表中的表达式(如列名称、算术表达式、聚合函数等)数目必须相同。...在不需要常规使用视图时替换视图,也就是说,不必将定义存储在元数据中。 启用按从标量嵌套 select 语句派生的列进行分组,或者按不确定性函数或有外部访问的函数进行分组。
此外开窗函数ROW_NUMBER的使用也使得数据库分页变得异常的容易,其他的一些特性使用相对较少,在需要时再查阅即可。...其对两个输入表进行操作,右侧表往往是是一个派生表或者内联的TVF。其逻辑查询处理阶段将右侧表应用到左侧表的每一行,并生成组合的结果集。...集合操作默认都存在一个隐式去除重复(即包含DISDINCT)的行为,只有UNION ALL支持重复数据。这儿补充一个关于集合概念,集合指不包含重复数据的集合,包含重复数据的情况我们称之为多元集合。...在对两个(或多个)查询结果集进行集合操作时,需要注意其中的查询并不支持ORDER BY操作,如果还是需要这样的功能可以使用外部的ORDER BY或者是使用TOP等操作符将返回的游标转化为结果集。...表示分区开始,CURRENT ROW表示当前行,使用UNBOUNDED FOLLOWING表示分区中的最后一行。
这时就可以使用RANK函数了。 在order by子句中定义的列上,如果返回一行数据与另一行具有相同的值,rank函数将给这些行赋予相同的排名数值。...在排名的过程中,保持一个内部计数值,当值有所改变时,排名序号将有一个跳跃。...练习 用CTE删除重复数据 创建一个用于测试的表,并在该表里插入几条数据(包括重复的数据) /* Create Table with 7 records- 3 are duplicate records...删除重复数据4条惟一的记录 ?...这里我们设置一个条件——当我们读取到的记录大于一条(即有重复数据),我们删除除了第一条的所有其他(这里可能有点绕,简单的话就是保留一条重复的记录)*/
“WithCTE”节点中的CTE定义按解析顺序保存。这意味着,根据CTE定义对任何有效CTE查询的依赖性,可以保证CTE定义按拓扑顺序排列(即,给定CTE定义A和B,B引用A,A保证出现在B之前)。...被设置时删除spark时的所有hints。...DeduplicateRelations Resolution fixedPoint 删除LogicalPlan的任何重复关系。...在此步骤中,将检查参数名称是否重复,并检查参数的数量。2.解析lambda函数的函数表达式树中使用的lambda变量。...请注意,我们允许使用当前lambda之外的变量,这可以是在外部范围中定义的lambda函数,也可以是由计划的子级生成的属性。如果名称重复,则使用最内部作用域中定义的名称。
4.使用CASE WHEN枢转数据 您很可能会看到许多要求在陈述时使用CASE WHEN的问题,这只是因为它是一种多功能的概念。如果要根据其他变量分配某个值或类,则允许您编写复杂的条件语句。...它们都用来比较两个查询/表之间的行。所说,这两个人之间存在微妙的细微差别。 首先,除了过滤删除重复并返回不同的行与不在中的不同行。...as b on a.ManagerID = b.Id WHERE a.Salary > b.Salary 7.Rank vs Dense Rank vs Row Number 它是一个非常常见的应用,对行和价值进行排名...在SQL中,您可以使用几种方式将“等级”分配给行,我们将使用示例进行探索。...同样,差距将遵循重复的等级。 dense_rank()类似于等级(),除了重复等级后没有间隙。请注意,使用dense_rank(),Daniel排名第3,而不是第4位()。
4.使用CASE WHEN枢转数据 您很可能会看到许多要求在陈述时使用CASE WHEN的问题,这只是因为它是一种多功能的概念。如果要根据其他变量分配某个值或类,则允许您编写复杂的条件语句。...它们都用来比较两个查询/表之间的行。所说,这两个人之间存在微妙的细微差别。 首先,除了过滤删除重复并返回不同的行与不在中的不同行。...b on a.ManagerID = b.Id WHERE a.Salary > b.Salary 7.Rank vs DenseRank vs RowNumber 它是一个非常常见的应用,对行和价值进行排名...在SQL中,您可以使用几种方式将“等级”分配给行,我们将使用示例进行探索。...同样,差距将遵循重复的等级。 dense_rank()类似于等级(),除了重复等级后没有间隙。请注意,使用dense_rank(),Daniel排名第3,而不是第4位()。
4.使用CASE WHEN枢转数据 您很可能会看到许多要求在陈述时使用CASE WHEN的问题,这只是因为它是一种多功能的概念。如果要根据其他变量分配某个值或类,则允许您编写复杂的条件语句。...它们都用来比较两个查询/表之间的行。所说,这两个人之间存在微妙的细微差别。 首先,除了过滤删除重复并返回不同的行与不在中的不同行。...b on a.ManagerID = b.Id WHERE a.Salary > b.Salary 7.Rank vs Dense Rank vs Row Number 它是一个非常常见的应用,对行和价值进行排名...在SQL中,您可以使用几种方式将“等级”分配给行,我们将使用示例进行探索。...同样,差距将遵循重复的等级。 dense_rank()类似于Rank(),除了重复等级后没有间隙。请注意,使用dense_rank(),Daniel排名第3,而不是第4位。
使用 CASE WHEN 枢转数据 您很可能会看到许多要求在陈述时使用 CASE WHEN 的问题,这只是因为它是一种多功能的概念。如果要根据其他变量分配某个值或类,则允许您编写复杂的条件语句。...它们都用来比较两个查询 / 表之间的行。所说,这两个人之间存在微妙的细微差别。 首先,除了过滤删除重复并返回不同的行与不在中的不同行。...a.ManagerID = b.Id WHERE a.Salary > b.Salary ``` ### 7.Rank vs Dense Rank vs Row Numbe 它是一个非常常见的应用,对行和价值进行排名...在 SQL 中,您可以使用几种方式将 “等级” 分配给行,我们将使用示例进行探索。...Rank()返回从 1 开始的每行的唯一编号,除了有关系时,等级()将分配相同的数字。同样,差距将遵循重复的等级。 dense_rank()类似于等级(),除了重复等级后没有间隙。
4.使用CASE WHEN枢转数据 您很可能会看到许多要求在陈述时使用CASE WHEN的问题,这只是因为它是一种多功能的概念。如果要根据其他变量分配某个值或类,则允许您编写复杂的条件语句。...它们都用来比较两个查询/表之间的行。所说,这两个人之间存在微妙的细微差别。 首先,除了过滤删除重复并返回不同的行与不在中的不同行。...b on a.ManagerID = b.Id WHERE a.Salary > b.Salary 7.Rank vs Dense Rank vs Row Number 它是一个非常常见的应用,对行和价值进行排名...在SQL中,您可以使用几种方式将“等级”分配给行,我们将使用示例进行探索。...同样,差距将遵循重复的等级。 dense_rank()类似于等级(),除了重复等级后没有间隙。请注意,使用dense_rank(),Daniel排名第3,而不是第4位()。
对于上面的数据行,结果为: 图片 解决方案: 1. 使用正则表达式 第一感觉这是使用正则表达式的场景。...这就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。a.*?b匹配最短的,以a开始,以b结束的字符串。...总的想法是,首先对评论字符串以“]”为分隔符转多行,然后针对不同情况对每行求字符长度,之后按每条评论ID分组求和,得到符合规则的每条评论的长度,最后按评论长度分组进行二次聚合,得到每种长度的个数。...8-11行中的子查询,得出每条评论中成对中括号的个数(l1列),0表示评论字符串中没有成对的中括号,结果如下: 图片 7-12行中的子查询,结果为使用以“]”为分隔符转的多行: 图片...2-13行中的子查询,针对不同情况对每行求字符长度。
密码管理 「MySQL 8」增加了密码管理功能,开始允许限制重复使用以前的密码: MySQL不同版本密码管理比较 这里有几个属性,其中: 「password_history」 :此变量定义全局策略,表示在修改密码时...,密码可以重复使用之前密码的更改次数。...版本中,查询时对索引进行函数操作,则该索引不生效,基于此,MySQL 8中引入了 「函数索引」 。...「TIPS」:如果确需要执行drop表操作,请使用 if exists 来防止删除不存在的表时出现的错误。...其他 「MySQL 8」 还有很多比较实用的新特性,比如 : 「Window Function」,对于查询中的每一行,使用与该行相关的行执行计算。
4.使用CASE WHEN枢转数据 您很可能会看到许多要求在陈述时使用CASE WHEN的问题,这只是因为它是一种多功能的概念。如果要根据其他变量分配某个值或类,则允许您编写复杂的条件语句。...它们都用来比较两个查询/表之间的行。所说,这两个人之间存在微妙的细微差别。 首先,除了过滤删除重复并返回不同的行与不在中的不同行。... b on a.ManagerID = b.Id WHERE a.Salary > b.Salary 7.Rank vs Dense Rank vs Row Number 它是一个非常常见的应用,对行和价值进行排名...在SQL中,您可以使用几种方式将“等级”分配给行,我们将使用示例进行探索。...同样,差距将遵循重复的等级。 dense_rank()类似于等级(),除了重复等级后没有间隙。请注意,使用dense_rank(),Daniel排名第3,而不是第4位()。
密码管理MySQL 8增加了密码管理功能,开始允许限制重复使用以前的密码:这里有几个属性,其中:password_history :此变量定义全局策略,表示在修改密码时,密码可以重复使用之前密码的更改次数...password_reuse_interval :对于以前使用的帐户密码,此变量表示密码可以重复使用之前必须经过的天数。如果值为 0(默认值),则没有基于已用时间的重用限制。...隐藏索引不会被优化器使用,但仍然需要进行维护-创建、删除等。其常见应用场景有:软删除、灰度发布。...TIPS:如果确需要执行drop表操作,请使用 if exists 来防止删除不存在的表时出现的错误。...其他MySQL 8 还有很多比较实用的新特性,比如 :Window Function,对于查询中的每一行,使用与该行相关的行执行计算。
此抽象使由该视图表征的行集更容易访问,而且无需在临时表中复制或存储数据。 假定权限许可,这个视图还能在整个数据库中被重复使用。...如果想要在同一个批处理中多次使用派生表,此问题会变得更加严重,因为随后必须复制和粘贴派生表才能重复使用它。...当需要多次引用同一行集时,这非常有用;引用 CTE 两次比复制该查询要简单得多。 CTE 并不一定由 SELECT 语句使用;任何引用 CTE 所生成行集的语句都可使用它。...此外,CTE 后面也可以跟随另一个 CTE。在想要把中间结果聚集到行集时,可使用这种技术从其他 CTE 构建 CTE。当创建从其他 CTE 构建的 CTE 时,请用逗号分隔 CTE 的定义。...,递归用于解决您需要在不同情况下针对同一组数据重复执行同一逻辑时所遇到的问题。
如果在引用对象时省略架构名称,SQL Server将采用一定的办法来分析出架构名称是什么。如果不显示指定架构,那么在解析对象名称时,就会要付出一些没有意义的额外代价。因此,建议都加上架构名称。...③ 使用NOT EXISTS谓词取代NOT IN隐式排除NULL值:当对至少返回一个NULL值的子查询使用NOT IN谓词时,外部查询总会返回一个空集。...当需要使用表表达式,而且不计划重用它们的定义时,可以使用派生表或CTE,与派生表相比,CTE更加模块化,更容易维护。 当需要定义可重用的表表达式时,可以使用视图或内联表值函数。...INTERSECT集合运算在逻辑上会首先删除两个输入集中的重复行,然后返回只在两个集合中中都出现的行。换句话说:如果一个行在两个输入集中都至少出现一次,那么交集返回的结果中将包含这一行。 ...EXCEPT结合运算在逻辑上首先删除两个输入集中的重复行,然后返回只在第一个集合中出现,在第二个结果集中不出现的所有行。
,如:CTE。...UNION ALL中ALL的含义是返回所有重复行。与之类似,INTERSECT ALL中ALL的含义是不删除交集中的重复项。...EXCEPT只关注行是否重复,而不关注行出现的次数。...可以使用外联接或者NOT EXISTS来替代EXCEPT,但在比较运算时,EXCEPT将两个NULL值视为相等,而替代方案不会。...小结 标准SQL支持三个集合运算符:UNION、INTERSECT、EXCEPT,每个运算符均支持两种行为:去重(不带ALL关键字)和保留重复项(带上ALL关键字)。
领取专属 10元无门槛券
手把手带您无忧上云