zoukankan      html  css  js  c++  java
  • mysql中的模糊查询

    • Mysql 使用通配符进行模糊查询(like,%,_)
      • 通配符的分类
      • 通配符的使用
    • Mysql 使用内置函数进行模糊查询(locate,position,instr,find_in_set)
      • 1、LOCATE('substr',str,pos)方法
      • 2、POSITION('substr' IN `field`)方法
      • 3、INSTR(`str`,'substr')方法
      • 4、FIND_IN_SET(str1,`field`)方法

    Mysql 使用通配符进行模糊查询(like,%,_)

    通配符的分类

    1)%百分号通配符: 表示任何字符出现任意次数 (可以是0次).

    2)_下划线通配符:表示只能匹配单个字符,不能多也不能少,就是一个字符.

    like操作符

    LIKE作用是指示mysql后面的搜索模式是利用通配符而不是直接相等匹配进行比较.

    注意: 如果在使用like操作符时,后面的没有使用通用匹配符效果是和=一致的,SELECT * FROM products WHERE products.prod_name like '1000';只能匹配的结果为1000,而不能匹配像JetPack 1000这样的结果.

    通配符的使用

    1)%通配符使用:
        匹配以"test"开头的记录:(包括记录"test")
        select * from blog where title_name like 'test%';

        匹配包含"test"的记录(包括记录"test")
        select * from blog where title_name like '%test%';

        匹配以"test"结尾的记录(包括记录"test",不包括记录"test ",也就是test后面有空格的记录,这里需要注意)
        SELECT * FROM blog where title_name like '%test';

    2)_通配符使用:
        SELECT * FROM blog where title_name like '_test';
        匹配结果为: 像"test"这样记录.

        SELECT * FROM blog where title_name like 'test__';
        匹配结果为: 像"test"这样的记录.(一个下划线只能匹配一个字符,不能多也不能少)

    注意事项:

        注意大小写,在使用模糊匹配时,也就是匹配文本时,mysql是可能区分大小的,也可能是不区分大小写的,这个结果是取决于用户对MySQL的配置方式.如果是区分大小写,那么像Test12这样记录是不能被"test__"这样的匹配条件匹配的.(mysql配置区分大小写)
        注意尾部空格,"%test"是不能匹配"test "这样的记录的.
        注意NULL,%通配符可以匹配任意字符,但是不能匹配NULL,也就是说SELECT * FROM blog where title_name like '%';是匹配不到title_name为NULL的的记录.
    技巧与建议:
        正如所见, MySQL的通配符很有用。但这种功能是有代价的:通配符搜索的处理一般要比前面讨论的其他搜索所花时间更长。这里给出一些使用通配符要记住的技巧。

    •  不要过度使用通配符。如果其他操作符能达到相同的目的,应该使用其他操作符。
    •  在确实需要使用通配符时,除非绝对有必要,否则不要把它们用在搜索模式的开始处。把通配符置于搜索模式的开始处,搜索起来是最慢的(因为要对全库进行扫描)。
    •  仔细注意通配符的位置。如果放错地方,可能不会返回想要的数.

    Mysql 使用内置函数进行模糊查询(locate,position,instr,find_in_set)

    1、LOCATE('substr',str,pos)方法

        解释:返回 substr 在 str 中第一次出现的位置。如果 substr 在 str 中不存在,返回值为 0,如果substr 在 str 中存在,返回值为substr 在 str中第一次出现的位置。

                    如果pos存在,返回 substr 在 str 第pos个位置后第一次出现的位置。
        实例:

    • select locate('Light','ight_20'); 返回0
    • select locate('Light','Light_20'); 返回1
    • select locate('Light','test_Light_20'); 返回6
    • select locate('Light','Light_20',3); 返回0   
    • select locate('Light','test_Light_20'); 返回6

            例如数据库中字段scene_name有HDR_Light_20,Normal_Light_16,Light_12三种
                select * from VTD_RESULT where locate('Light',scene_name)>0;
                select * from VTD_RESULT where locate('Light',scene_name,3)>0; 

        备注:Light是要搜索的内容,scene_name为被匹配的字段,查询出所有存在scene_name的数据

                1.查出HDR_Light_20,Normal_Light_16,Light_12数据

                2.查出HDR_Light_20,Normal_Light_16数据

    2、POSITION('substr' IN `field`)方法

        这个方法可以理解为locate()方法的别名,因为它和locate()方法的作用是一样的。
        实例:
            例如数据库中字段scene_name有HDR_Light_20,Normal_Light_16,Light_12三种
                select * from VTD_RESULT where position('Light' in scene_name)>0; 查出HDR_Light_20,Normal_Light_16,Light_12数据

    3、INSTR(`str`,'substr')方法

        实例:select * from VTD_RESULT where instr(scene_name,'Light')>0;

    除了上述的方法外,还有一个函数FIND_IN_SET,这个方法比较特殊,他所查询的必须要是以“,”分隔开。

    4、FIND_IN_SET(str1,`field`)方法

        返回`field`中str1所在的位置索引,其中`field`必须以","分割开。

       

  • 相关阅读:
    mac c++编译出现segmentation fault :11错误
    ssh 连接缓慢解决方法
    237. Delete Node in a Linked List
    203. Remove Linked List Elements
    Inversion of Control Containers and the Dependency Injection pattern
    82. Remove Duplicates from Sorted List II
    83. Remove Duplicates from Sorted List
    SxsTrace
    使用CCleaner卸载chrome
    decimal and double ToString problem
  • 原文地址:https://www.cnblogs.com/mianbaoshu/p/10930491.html
Copyright © 2011-2022 走看看