数据库--SQL关键字的执行顺序

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

数据库相关链接:

数据库--数据类型http://t.csdn.cn/RtqMD

数据库--三大范式、多表查询、函数sql:http://t.csdn.cn/udJSG

数据库--MySQL增删改查:http://t.csdn.cn/xkiti



一、一条sql语句通常包括:

select   from   join   where   group by   having   order by   聚合函数   limit   top 

以及逻辑运算符not  and    or   

一: 语法顺序
    1. select
        ...
    2. from
        ...
    3. where
        ...
    4. group by
        ...
    5. having
        ...
    6. order by
        ...
     以上关键字只能按照这个顺序来, 不能颠倒
二: 执行顺序
    1. from       
    2. where
    3. group by  //分组
    4. having  //过滤
    5. select  
    6. order by  //排序
        👇👆
   1> 从某张表中查询数据
   2> 先经过where条件筛选出有价值的数据
   3> 对这些有价值的数据进行分组
   4> 分组之后可以使用 having 继续过滤筛选
   5> select 查询出来
   6> 最后排序输出

二、浅谈执行顺序:

1)、首先确定一点,并不是按照我们写的语句顺序,从左—>右执行的

2)、获取结果集 ----> 指定查询的某些字段 --> 按照某些内容进行排序

首先 执行from ,join 确定表之间的关系,得到初步的----->结果集1

where 对结果集1 进行筛选 得到–>结果集2

group by 进行分组 -->结果集3

对结果集3进行having筛选,得到 ---->结果集 4

指定查询的字段:

select 指定需要查询的字段,也可以是聚合函数 —>结果去重

合并分组结果集,并按照order by 的 条件进行排序

如果存在limit 或者top之类的话,这是在最后才会执行的

数据库--SQL关键字的执行顺序,数据库,java,数据库,sql,mysql

 三、实际问题and or

mybatisplus遇到的and和or优先级的问题处理

需求:

想在name={ 张三,李四,王五 }  中查找  密码=88888 或者 年龄=20的记录

SELECT id,user_name,password,name,age,email,birthday FROM tb_user
WHERE password = 88888 OR age >= 20 AND name IN ("张三","李四","王五")

数据库--SQL关键字的执行顺序,数据库,java,数据库,sql,mysql

 java查询代码:

(使用MyBatisPlus查询)

@Test
    public void testLogicSelect(){
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.eq("password","88888")
                .or()
                .ge("age",20)
                .in("name","张三","李四","王五");

        /**
         * SELECT id,user_name,password,name,age,email,birthday FROM tb_user
         * WHERE password = ? OR age >= ? AND name IN (?,?,?)
         */
        List<User> userList = userMapper.selectList(wrapper);
        userList.forEach(System.out::println);
    }
查询结果: 

看似需求的sql查询代码没问题,执行出来就发现问题,为什么会有“赵六”

User(id=1, userName=zhangsan, password=88888, name=张三, age=18, email=test1@yh.cn, birthday=2019-09-26T11:42:01)
User(id=2, userName=lisi, password=88888, name=李四, age=20, email=test2@yh.cn, birthday=2019-10-01T11:42:08)
User(id=3, userName=wangwu, password=88888, name=王五, age=28, email=test3@yh.cn, birthday=2019-10-02T11:42:14)
User(id=4, userName=zhaoliu, password=88888, name=赵六, age=21, email=test4@yh.cn, birthday=2019-10-05T11:42:18)

问题的根本原因就是在于这个 AND 和 OR 的优先级。关系型运算符优先级高到低为:NOT > AND > OR

wrapper.eq("password","88888")
                .or()
                .ge("age",20)
                .in("name","张三","李四","王五");

1.  先执行了后两句.ge("age",20)
                .in("name","张三","李四","王五");

2.  将1.执行结果和第一句进行or或运算

                .eq("password","88888")
                .or()
                .ge("age",20)
                .in("name","张三","李四","王五");

解决方案:

这里用到了lambda表达式,从格式化后的代码也可以看出运算级别。

代码里的wp名字随便起,但是不能是wrapper,即不能是wrapper = new QueryWrapper<>();

@Test
    public void testLogicSelect() {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.and(wp -> wp   //这里的wp名字随便起,但是不能是wrapper,即不能是wrapper = new QueryWrapper<>();
                        .eq("password", "88888")
                        .or()
                        .ge("age", 20))
                .in("name", "张三", "李四", "王五");


        /**
         * SELECT id,user_name,password,name,age,email,birthday FROM tb_user
         * WHERE password = ? OR age >= ? AND name IN (?,?,?)
         */
        List<User> userList = userMapper.selectList(wrapper);
        userList.forEach(System.out::println);
    }

小结:

第一句话:从执行顺序中我们可以发现,所有的查询语句都是从 FROM 开始执行的。

第二句话:在实际执行过程中,每个步骤都会为下一个步骤生成一个虚拟表,这个虚拟表将作为下一个执行步骤的输入。 

第三句话:关系型运算符优先级高到低为:NOT > AND > OR

看到这了,点个赞再走吧!文章来源地址https://www.toymoban.com/news/detail-659070.html

到了这里,关于数据库--SQL关键字的执行顺序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • sql中的explain关键字用法

    在SQL中,使用 EXPLAIN 可以获取查询的执行计划,以便进行性能优化和查询调优。执行计划提供了关于查询操作的详细信息,涵盖了多个表头字段,每个字段都提供了特定的信息。以下是explain表头字段解释: id :每个操作的唯一标识符。这个字段通常是一个递增的整数

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

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

    2024年02月16日
    浏览(46)
  • 【SQL】SQL的基础知识-语法、关键字、函数

    SQL(Structured Query Language)是一种用于管理关系数据库管理系统(RDBMS)的语言。在本文中,我们将讨论SQL的基础知识,包括语法、和函数。 SQL语法由多个和操作符组成,用于完成对数据的操作。以下是SQL的基础语法: 其中, SELECT 用于选择要查询的列,

    2024年02月06日
    浏览(55)
  • 常用的 SQL Server 关键字及其含义

    SQL Server 是一种关系型数据库管理系统(RDBMS),提供了用于管理和操作数据库的各种。 以下是一些常用的 SQL Server 及其含义: SELECT: 用于从数据库中检索数据。 INSERT: 用于将新记录插入到数据库表中。 UPDATE: 用于更新数据库表中的记录。 DELETE: 用于从数据库表

    2024年02月08日
    浏览(59)
  • SQL语句——DESC关键字,降序练习

    学习 1、DESC是descend下降的缩写,降序,只要放在需要降序的字段前面就可以了, 2、对多个字段执行降序排列的话就是字段名+DESC以逗号隔开再字段名+DESC.....最后以分号结尾 3、select xxx(字段) from xxx(表) where (条件xxxx) ,排序、分组操作都是在where条件之后的,查询xxxx字段从

    2024年02月16日
    浏览(42)
  • Sql Server中Cross Apply关键字的使用

    在写一个业务的时候,有1列数据如下: 车牌号 湘A00001/湘G00001 湘A00002/湘G00002 湘A00003/湘G00003/湘A8888888 湘A00004/湘G00004/湘A00001 我的查询条件也是车牌号,我会传入如下参数: 我需要判断我传入的车牌号是否包含上面的列数据,举例上面的表为B表,那么B表列中的车牌号,我的

    2024年02月05日
    浏览(44)
  • 【Go 基础篇】Go语言中的defer关键字:延迟执行与资源管理

    在Go语言中, defer 是一种用于延迟执行函数调用的。它提供了一种简洁而强大的方式,用于在函数返回之前执行一些必要的清理操作或者释放资源。 defer 的灵活性和易用性使得它在Go语言中广泛应用于资源管理、错误处理和代码结构优化等方面。🚀🚀🚀 本篇博客将详

    2024年02月11日
    浏览(57)
  • MySQL索引3——Explain关键字和索引优化(SQL提示、索引失效、索引使用规则)

    目录 Explain 索引性能分析 Id ——select的查询序列号 Select_type——select查询的类型 Table——表名称 Type——select的连接类型 Possible_key ——显示可能应用在这张表的索引 Key——实际用到的索引 Key_len——实际索引使用到的字节数 Ref    ——索引命中的列或常量 Rows——预

    2024年02月14日
    浏览(57)
  • SQL FULL OUTER JOIN 关键字:左右表中所有记录的全连接解析

    SQL RIGHT JOIN返回右表(table2)中的所有记录以及左表(table1)中的匹配记录。如果没有匹配,则左侧的结果为0条记录。 注意:在某些数据库中,RIGHT JOIN被称为RIGHT OUTER JOIN。 在本教程中,我们将使用著名的Northwind示例数据库。 以下是“Orders”表的部分选择: OrderID C

    2024年02月05日
    浏览(54)
  • MySQL索引3——Explain关键字和索引使用规则(SQL提示、索引失效、最左前缀法则)

    目录 Explain 索引性能分析 Id ——select的查询序列号 Select_type——select查询的类型 Table——表名称 Type——select的连接类型 Possible_key ——显示可能应用在这张表的索引 Key——实际用到的索引 Key_len——实际索引使用到的字节数 Ref    ——索引命中的列或常量 Rows——预

    2024年02月14日
    浏览(44)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包