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`必須以","分割開。

   

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM