让建站和SEO变得简单

让不懂建站的用户快速建站,让会建站的提高建站效率!

  • 清点SQL中几个比较实用的小 Tips!

    发布日期:2022-05-10 09:27    点击次数:194
     1. 引子

    专家好,我是安果!

    使命中,咱们时时需要编写 SQL 剧本,对数据库进行增、删、改、查,很少会商酌到 Sql 性能优化

    实质上,从性能角度商酌,有好多 Sql 重要字都有它们各自的使用场景;若是使用适合,能大地面进步后端做事的反应效果

    底下以 Mysql 为例,陈列出几个比较实用的小 Tips

    2. union、union all、or

    union [all] 代表融合查询,即:将多个查询落拓团结起来成一个落拓并复返

    PS:union 融合查询针对每一个查询落拓,必须保证列数量、列数据类型及查询端正一致

    语法如下: 

    # 以两张表的融合查询为例 # table_one:表一 # table_two:表二 # 表一中的查询字段:table_one_field1,table_one_fileld2... # 表二种的查询字段:table_two_field1,table_two_field2... # 提防:表一、表二查询字段数量、字段类型、字段端正应该保持一致 select table_one_field1,table_one_fileld2... from table_one union [all] select table_two_field1,table_two_field2... from table_two; 

    其中,union、union all、or 三者的辨别如下:

    union

    表聚会后会诳骗字段的端正进行排序,以此筛选掉重迭的数据行,终末再复返落拓

    因此,当数据量很大时效果很低

    union all

    比拟 union,union all 在表聚会时不会删除重迭的数据行,奏凯复返表融合后的落拓

    因此,union all 奉行效果要高好多,在不需要去重和排序时,更保举使用 union all

    or

    or 用于 SQL where 子句中,SQL 剧本可读性更高,然而它会引起全表扫描,根底不走索引查询

    是以往往情况下,union [all] 查询会诳骗索引进行查询,奉行效果要高于 or;然而当 or 条目中查询列沟通,or 的奉行效果要高于 union

    3. group by + having、where

    group by 分组查询,凭据一个或多个列对落拓集进行分组,一般协作团员函数使用

    语法如下: 

    # 查询字段:多个查询字段 select 查询字段...,团员函数... from table_one where 条目语句 group by 分组字段...having 分组条目;  # 比如 select red_num1,count(red_num1) from dlt where create_at>='2021-11-01' group by red_num1; 

    其中,having 和 where 使用上有底下辨别:

    where

    在 group by 分组前奉行,将查询落拓按照条目过滤数据

    需要提防的是,where 无法与团员函数一道使用

    having

    只可协作 group by 使用,在分组之后奉行,用于过滤满足条目的组

    需要提防的是,分组是一个耗时的操作,提议在分组前使用 where 对数据进行一次过滤,然后再进行分组

    比如,where 搭配 having 一道使用 

    # 查询表dlt # 领先,使用where通过工夫过滤数据 # 然后,使用字段red_num1+group by对数据进行分组 # 终末,使用having对分组后的数据再进行一次过滤 select red_num1,count(red_num1) from dlt where create_at>='2021-10-01' group by red_num1 having count(red_num1)>=2; 
    4. exists、in

    exists 用于 where 子句中,一般用于判断子查询中是否会复返数据,若是复返的数据不为空,则为 True,不然为 False

    PS:exists 也不错搭配 not 使用,查询出不悦足子查询语句的数据

    语法如下: 

    -- exists使用 select * from 表一 where exists(select * from 表二 where 条目判断语句);  -- not exists使用 select * from 表一 where not exists(select * from 表二 where 条目判断语句); 

    in 不异用于 where 子句中,筛选出某个表字段存在于多个值中的所少见据

    重要字 in 常见的 2 种使用神气如下: 

    -- in 使用 -- 神气一 select * from 表名 where 字段 in(过滤字段1,过滤字段2,过滤字段3...);  -- 神气二 select * from  表名1 where  字段1 in (select 字段2 from 表名2 where condition) 

    由于 SQL 做子查询最优决策是小表运转大表,关于 in 来说是子查询表运转外在,当子查询表数据少于主表数据时保举使用

    而 exists 是外在运转子查询表,因此当外在数据少于子查询表时更保举使用