几个SQL的高级写法

这篇具有很好参考价值的文章主要介绍了几个SQL的高级写法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、ORDER BY FLELD() 自定义排序逻辑

MySql 中的排序 ORDER BY 除了可以用 ASC DESC,还可以通过 ORDER BY FIELD(str,str1,...) 自定义字符串/数字来实现排序。这里用 order_diy 表举例,结构以及表数据展示:

几个SQL的高级写法

 ORDER BY FIELD(str,str1,...) 自定义排序sql如下:

SELECT * from order_diy ORDER BY FIELD(title,'九阴真经', 
'降龙十八掌','九阴白骨爪','双手互博','桃花岛主',
'全真内功心法','蛤蟆功','销魂掌','灵白山少主');

查询结果如下:

几个SQL的高级写法

 如上,我们设置自定义排序字段为 title 字段,然后将我们自定义的排序结果跟在 title 后面。

二、EXISTS用法

在日常开发中,应该都对关键词 exists 用的比较少,估计使用 in 查询偏多。这里给大家介绍一下 exists 用法,引用官网文档:

几个SQL的高级写法

 可知 exists 后面是跟着一个子查询语句,它的作用是根据主查询的数据,每一行都放到子查询中做条件验证,根据验证结果(TRUE 或者 FALSE),TRUE的话该行数据就会保留,下面用 emp 表和 dept 表进行举例,表结构以及数据展示:

几个SQL的高级写法

 既入我们现在想找到 emp 表中 dept_name 与 dept表 中 dept_name 对应不上员工数据,sql 如下:

SELECT * from emp e where exists (
SELECT * from dept p where e.dept_id = p.dept_id 
and e.dept_name != p.dept_name
)

查询结果:

几个SQL的高级写法

 我们通过 exists 语法将外层 emp 表全部数据 放到子查询中与一一与 dept 表全部数据进行比较,只要有一行记录返回true。画个图展示主查询所有记录与子查询交互如下:

几个SQL的高级写法

  • 第一条记录与子查询比较时,全部返回 false,所以第一行不展示。
  • 第二行记录与子查询比较时,发现 销售部门 与 dept 表第二行 销售部 对应不上,返回 true,所以主查询该行记录会返回。
  • 第二行以后记录执行结果同第一条。

三、自连接查询

自连接查询是 sql 语法里常用的一种写法,掌握了自连接的用法我们可以在 sql 层面轻松解决很多问题。这里用 tree 表举例,结构以及表数据展示:

几个SQL的高级写法

 tree 表中通过 pid 字段与 id 字段进行父子关联,假如现在有一个需求,我们想按照父子层级将 tree 表数据转换成 一级职位 二级职位 三级职位 三个列名进行展示,sql 如下:

SELECT t1.job_name '一级职位', t2.job_name '二级职位', t3.job_name '三级职位' 
from tree t1 
    join tree t2 on t1.id = t2.pid 
    left join tree t3 on t2.id = t3.pid 
where t1.pid = 0;

结果如下:

几个SQL的高级写法

我们通过 tree t1 join tree t2 on t1.id = t2.pid 自连接展示 一级职位 二级职位,再用 left join tree t3 on t2.id = t3.pid 自连接展示 二级职位 三级职位,最后通过where 条件 t1.pid = 0过滤掉非一级职位的展示,完成这个需求。

四、更新emp表和dept表关联数据

 这里继续使用上文提到的 emp 表和 dept 表,数据如下:

几个SQL的高级写法

 可以看到上述 emp 表中 jack这个人 的部门名称与 dept 表实际不符合,现在我们想将 jack 的部门名称更新成 dept 表的正确数据,sql 如下:

update emp, dept set emp.dept_name = dept.dept_name
where emp.dept_id = dept.dept_id;

查询结果:

几个SQL的高级写法

 我们可以直接关联 emp 表和 dept 表并设置关联条件,然后更新 emp 表的 dept_name 为 dept 表的 dept_name。

五、ORDER BY 空值 NULL排序

ORDER BY 字句中可以跟我们要排序的字段名称,但是当字段中存在 null 值时,会对我们的排序结果造成影响。我们可以通过 ORDER BY IF(ISNULL(title), 1, 0) 语法将 null 值转换成0或1,来达到将 null 值放到前面还是后面进行排序的效果。这里继续用 order_diy 表举例,sql 如下:

SELECT * FROM order_diy ORDER BY  IF(ISNULL(title), 0, 1), money;

六、with rollup 分组统计数据的基础上,再进行统计汇总

MySql 中可以使用 with rollup 在分组统计数据的基础上再进行统计汇总,即用来得到 group by 的汇总信息。这里继续用order_diy 表举例,sql 如下:

SELECT name, SUM(money) as money 
FROM order_diy GROUP BY name WITH ROLLUP;

几个SQL的高级写法

 可以看到通过 GROUP BY name WITH ROLLUP 语句,查询结果最后一列显示了分组统计的汇总结果。但是 name 字段最后显示为 null,我们可以通过 coalesce(val1, val2, ...) 函数,这个函数会返回参数列表中的第一个非空参数。

SELECT coalesce(name, '总金额') name, SUM(money) as money 
FROM order_diy GROUP BY name WITH ROLLUP;

几个SQL的高级写法

 六、with as 提取临时表别名

with as 语法需要 MySql 8.0以上版本,它有一个别名叫做 CTE,官方对它的说明如下

公用表表达式 (CTE) 是一个命名的临时结果集,它存在于单个语句的范围内,稍后可以在该语句中引用,可以多次引用。

的作用主要是提取子查询,方便后续共用,更多情况下会用在数据分析的场景上。

如果一整句查询中多个子查询都需要使用同一个子查询的结果,那么就可以用 with as,将共用的子查询提取出来,加个别名。后面查询语句可以直接用,对于大量复杂的SQL语句起到了很好的优化作用。这里继续用 order_diy 表举例,这里使用 with as 给出 sql 如下:

-- 使用 with as
with t1 as (SELECT * from order_diy where money > 30),
t2 as (SELECT * from order_diy where money > 60)
SELECT * from t1 
where t1.id not in (SELECT id from  t2) and t1.name = '周伯通';

几个SQL的高级写法

 这个 sql 查询了 order_diy 表中 money 大于30且小于等于60之间并且 name 是周伯通的记录。可以看到使用 CTE 语法后,sql写起来会简洁很多。

七、存在就更新、不存在就插入

MySql 中通过on duplicate key update语法来实现存在就更新,不存在就插入的逻辑。插入或者更新时,它会根据表中主键索引或者唯一索引进行判断,如果主键索引或者唯一索引有冲突,就会执行on duplicate key update后面的赋值语句。 这里通过 news 表举例,表结构和说数据展示,其中 news_code 字段有唯一索引:

几个SQL的高级写法

 添加sql:

-- 第一次执行添加语句
INSERT INTO `news` (`news_title`, `news_auth`, `news_code`) 
VALUES ('新闻3', '小花', 'wx-0003') 
on duplicate key update news_title = '新闻3';
-- 第二次执行修改语句
INSERT INTO `news` (`news_title`, `news_auth`, `news_code`) 
VALUES ('新闻4', '小花', 'wx-0003') 
on duplicate key update news_title = '新闻4';

几个SQL的高级写法文章来源地址https://www.toymoban.com/news/detail-493773.html

到了这里,关于几个SQL的高级写法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spark SQL自定义collect_list分组排序

    想要在spark sql中对group by + concat_ws()的字段进行排序,可以参考如下方法。 原始数据如下: 目标数据如下: spark-shell: 1.使用开窗函数 因为使用开窗函数本身会使用比较多的资源, 这种方式在大数据量下性能会比较慢,所以尝试下面的操作。 2.使用struct和sort_array(array,asc?tru

    2024年02月01日
    浏览(39)
  • mysql GROUP BY 怎么 order by 排序

    在 MySQL 中使用 GROUP BY 子句时,如果需要对结果进行排序,可以使用 ORDER BY 子句来对分组后的结果进行排序。 ORDER BY 子句应该放在 GROUP BY 子句之后,使用逗号来分隔需要排序的列,并在排序列后指定排序顺序。例如: 在这个例子中,SELECT 语句选择了表 table1 中的列 column1 和

    2024年02月16日
    浏览(58)
  • Mybatis xml中排序(order by)条件用#{}查询失败

    问题描述: 处理简单分页时,发现从外部传入的排序条件无法生效,但程序无报错,正常返回列表,只是排序条件不对; 原因: #{}表示一个占位符,当#{}传入的数据是一个字符串时,会自动将传入的数据加一个双引号。 解决方法: 使用${}将传入的数据直接显示生成在sql中

    2024年01月17日
    浏览(47)
  • Hive(23):Select高级查询之SORT/ORDER/CLUSTER/DISTRIBUTE BY

    1 ORDER BY ORDER BY [ASC|DESC] Hive SQL中的ORDER BY语法类似于SQL语言中的ORDER BY语法。会对输出的结果进行全局排序,因此底层使用MapReduce引擎执行的时候,只会有一个reducetask执行。也因此,如果输出的行数太大,会导致需要很长的时间才能完成全局排序。 默认排序顺序为升序(ASC)

    2024年02月15日
    浏览(46)
  • SQL优化(3):order by优化

    MySQL的排序,有两种方式: Using filesort : 通过表的索引或全表扫描,读取满足条件的数据行,然后在排序缓冲区sort buffer中完成排序操作,所有不是通过索引直接返回排序结果的排序都叫 FileSort 排序。 Using index : 通过有序索引顺序扫描直接返回有序数据,这种情况即为 using

    2024年02月01日
    浏览(48)
  • SQL ORDER BY 关键字

    ORDER BY 用于对结果集进行排序。 ORDER BY 用于对结果集按照一个列或者多个列进行排序。 ORDER BY 默认按照升序对记录进行排序。如果需要按照降序对记录进行排序,您可以使用 DESC 。 ORDER BY 子句后面的列名指示按哪些列进行排序。如果您指定多个列

    2024年02月16日
    浏览(47)
  • [SQL挖掘机] - ORDER BY语句

    当您想对查询结果进行排序时,可以使用 ORDER BY 子句。ORDER BY 子句允许您按照一个或多个列的值对结果进行排序。 在上述语法中,我们首先指定要选择的列,并在 order by 子句中指定要排序的列。可以同时指定多个列,它们将按照指定的顺序逐个排序。 其中, asc 表示升序排序

    2024年02月15日
    浏览(46)
  • Selenium的xpath高级写法-实用篇

    提示:阅读本章之前,请先阅读目录 //div[text()=‘我是子级’]/parent::div[text()=‘我是父级’] //div[text()=‘我是后面一个的兄弟’]/preceding-sibling::div[1] //div[text()=‘我是后面一个的兄弟’]/following-sibling::div[1] //div[contains(text(), ‘包含我这些内容,就符合’)] //span[normalize-space(tex

    2024年02月14日
    浏览(35)
  • MySQL使用SELECT 语句不加ORDER BY默认是如何排序的?

    大家好,我是阿飞云 怕什么真理无穷,进一步有近一步的欢喜 记录一个 MySQL 查询排序的问题,一个SQL语句没有加 order by ,那么查询出来的结果到底是按照什么规则排序的呢?查询了网上的一些资料,分享如下: •MyISAM 表 MySQL Select 默认排序是按照物理存储顺序显示的(不

    2024年02月10日
    浏览(50)
  • 【mysql学习篇】Order by与Group by优化以及排序算法详解

    Case1: 分析: 利用 最左前缀 法则:中间字段不能断,因此查询用到了name索引,从key_len=74也能看出,age索引列用在排序过程中,因为Extra字段里没有using filesort 注意: order by age 虽然用到了索引,但是不会在key_len列体现 Case 2: 分析: 从explain的执行结果来看:key_len=74,查询

    2024年02月15日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包