【MYSQL】-3 排序与过滤

作者: silent_eyes_77 | 来源:发表于2019-02-24 14:46 被阅读9次

    上周加入数据蛙二期培训,结束了孤独战斗的现状。断断续续自学了3个月(当然看了各种视频和各种书,一把辛酸泪。。。),现在选择报班,主要还是觉得一个靠谱的组织和团队,可以极大缓解我学习过程中不时闪现的焦虑和无助,最重要的是少走弯路。毕竟青春不再,年华易逝,浪费可耻哈哈哈哈~
    本文结合个人情况,依据学习规划,对《mysql必知必会》前9章内容关于排序和过滤操作进行知识点整理。

    一 . 排序

    子句排序:

    select [column1] from [table] order by [column2],[column3]…..
    column1 与 column2 不要求相等,也可以多列排序。

    select prod_name from products order by prod_name;
    
    升降顺序:默认升序 asc;降序 desc
    select prod_id,prod_price,prod_name from products 
    order by prod_price desc,prod_name;
    
    与 limit 组合找到最值
    select prod_price from products 
    order by prod_price desc
    limit 1;
    
    image.png

    二 . 过滤

    1. 按照指定条件搜索数据

    where:select [column1],[column2] from [table] where [column3]=x

    特性1:匹配时不区分大小写;
    特性2: 用单引号限定字符串;
      select prod_name,prod_price from products
      where prod_name='fuses';
    
    image.png
    特性3:匹配范围可以用 between ...and...;in ——见特性7
    特性4:where 和 order by 同时使用时,order by 放后面;
     select prod_name,prod_price from products
      where prod_price between 5 and 10 
      order by prod_price;
    
    image.png
    特性5:用于检查null值
    select cust_id from customers 
      where cust_email is null;
    
    特性6:结合逻辑操作符and & or,and 具有更高优先级
     select vend_id,prod_name,prod_price 
      from products
      where vend_id=1002 or vend_id=1003 and prod_price>=
    
    image.png

    这里搜索出来的是1003厂商制造的价格小于10美元的数据,和1002制造的数据。

    特性7:匹配范围还可以用 in(小值,大值)
     select prod_name,prod_price from products
      where vend_id in(1002,1003)
      order by prod_name;
    
      同义转换:功能与 or 相当
    
      select prod_name,prod_price from products
      where vend_id =1002 or vend_id =1003
      order by prod_name;
    

    这里用in 和or 查询结果都一样:

    image.png
    in操作符的优势

    1) 在使用长的合法选项清单时,IN操作符的语法更清楚且更直观。
    2) 在使用IN时,计算的次序更容易管理(因为使用的操作符更少)。
    3) IN操作符一般比OR操作符清单执行更快。
    4) IN的最大优点是可以包含其他SELECT语句,使得能够更动态地建立WHERE子句

    not 取反,找出与条件列不匹配的行
    select prod_name,prod_price
    from products
    where vend_id not in (1002,1003)
    order by prod_name;
    
    2. like:运用通配符进行过滤
    %:任何字符出现任意次数 (....where [column] like 'a%'):列 column 中以a开头的所有行;
    select prod_id,prod_name 
    from  products
    where prod_name like 'jet%';
    
    image.png

    注意:% 可以匹配尾空格;不能匹配null值

    _:匹配任意单个字符
    select prod_id,prod_name
    from products
    where prod_name like '_ ton anvil';
    

    通配符使用注意事项:
    1)优先选择其他操作符;
    2)使用时最好不要用在搜索模式的开始位置,会使得搜索变慢。
    3)注意通配符放置的位置

    3. 复杂过滤:正则表达式

    regexp:...where [column] regexp 'abc'

    完全匹配:
    select prod_name from products
     where prod_name regexp'%1000'
     order by prod_name;
    
    部分匹配:. :任意一个字符
    select prod_name from products
     where prod_name regexp '.000'
     order by prod_name;
    
    image.png

    注意,这里换成like,是不输出结果的。

    select prod_name from products
    where prod_name regexp'1000'
    order by prod_name;
    

    为什么呢?
    regexp vs like:
    1)like 匹配整个列,regex在列值内匹配。比如匹配1000,like会在一列中查找字符为1000的值,但是regexp在每一个值中找到含有字符1000的值;
    2)like 必须和通配符结合使用,否则不返回结果。

    或匹配(or):a|b—— 匹配 a 或者 b
    匹配多项中的一项:[123]-匹配1或2或3
    匹配特殊字符:前面加\
    匹配范围:[1-9]
     select prod_name
     from products
     where prod_name regexp '[1-8] ton'
     order by prod_name;
    
    其他匹配规则:

    ^ 文本的开始 ;$ 文本的结尾 ;[[:<:]] 词的开始 ;[[:>:]] 词的结尾

    相关文章

      网友评论

        本文标题:【MYSQL】-3 排序与过滤

        本文链接:https://www.haomeiwen.com/subject/rvovyqtx.html