zoukankan      html  css  js  c++  java
  • mysql基础--查询

    1、mysql查询的五种子句:

      where子句(条件查询):按照“条件表达式”指定的条件进行查询。

      group by子句(分组):按照“属性名”指定的字段进行分组。group by子句通常和count()、sum()等聚合函数一起使用。

      having子句(筛选):有group by才能having子句,只有满足“条件表达式”中指定的条件的才能够输出。

      order by子句(排序):按照“属性名”指定的字段进行排序。排序方式由“asc”和“desc”两个参数指出,默认是按照“asc”来排序,即升序。

      limit(限制结果集)。

    2、基础查询--where:

      where常用运算符

    运算符说明
    比较运算符
    < 小于
    <= 小于或等于
    = 等于
    !=或<> 不等于
    >= 大于或等于
    > 大于
    in 在某个人集合内
    between 在某范围内
    逻辑运算符
    not或! 逻辑非
    or或|| 逻辑或
    and或&& 逻辑与

    3、通配符的使用:

      SQL的模式匹配允许你使用“_”匹配任何单个字符,而“%”匹配任意数目字符(包括零个字符)。在 MySQL中,SQL的模式缺省是忽略大小写的。下面显示一些例子。  

      注意在你使用SQL模式时,你不能使用=或!=;而使用LIKE或NOT LIKE比较操作符。

      (1)为了找出以“b”开头的名字: 

    mysql> SELECT * FROM pet WHERE name LIKE "b%";

      (2)为了找出以“fy”结尾的名字:

    mysql> SELECT * FROM pet WHERE name LIKE "%fy";

       (3)为了找出包含一个“w”的名字:

    mysql> SELECT * FROM pet WHERE name LIKE "%w%";

      (4)为了找出包含正好2个字符开头第三个是a的名字,使用“_”模式字符:

    mysql> SELECT * FROM pet WHERE name LIKE "__a";

    由MySQL提供的模式匹配的其他类型是使用扩展正则表达式。当你对这类模式进行匹配测试时,使用REGEXP和NOT REGEXP操作符(或RLIKE和NOT RLIKE,它们是同义词)。

    4、正则表达式的使用:

      (1)“.” 匹配任何单个的字符。 

      (2)一个字符类“[...]”匹配在方括号内的任何字符。例如,“[abc]”匹配“a”、“b”或“c”。为了命名字符的一个范围,使用一个“-”。“[a-z]” 匹配任何小写字母,而“[0-9]”匹配任何数字。 

      (3)“ * ”匹配零个或多个在它前面的东西。例如,“x*”匹配任何数量的“x”字符,“[0-9]*”匹配的任何数量的数字,而“.*”匹配任何数量的任何东西。 

    正则表达式是区分大小写的,但是如果你希望,你能使用一个字符类匹配两种写法。例如,“[aA]”匹配小写或大写的“a”而“[a-zA-Z]”匹配两种写法的任何字母。 

    如果它出现在被测试值的任何地方,模式就匹配(只要他们匹配整个值,SQL模式匹配)。 

    为了定位一个模式以便它必须匹配被测试值的开始或结尾,在模式开始处使用“^”或在模式的结尾用“$”。 
    为了说明扩展正则表达式如何工作,上面所示的LIKE查询在下面使用REGEXP重写:

      (1)为了找出以“b”开头的名字,使用“^”匹配名字的开始并且“[bB]”匹配小写或大写的“b”:

    mysql> SELECT * FROM pet WHERE name REGEXP "^[bB]";

      (2)为了找出以“fy”结尾的名字,使用“$”匹配名字的结尾:

    mysql> SELECT * FROM pet WHERE name REGEXP "fy$";

      (3)为了找出包含一个“w”的名字,使用“[wW]”匹配小写或大写的“w”:

    mysql> SELECT * FROM pet WHERE name REGEXP "[wW]";

      (4)为了找出包含正好5个字符的名字,使用“^”和“$”匹配名字的开始和结尾,和5个“.”实例在两者之间:

    mysql> SELECT * FROM pet WHERE name REGEXP "^.....$";

      (5)你也可以使用“{n}”“重复n次”操作符重写先前的查询:

    mysql> SELECT * FROM pet WHERE name REGEXP "^.{5}$";

     5、使用数据处理函数:

      常用的文本处理函数:

      left(str,len)    返回串左边的字符

    select left("abcd",2);

      right(str,len)    返回串右边的字符

    select right("abcd",1);

      length(str)    返回串的长度

    select length("abcd");

      lower(str)     将串转换为小写

    select lower('ABCD');

      upper(str)     将串转换为大写 

    select upper('abcd');

      instr(str,substr)

      这个函数返回字符串在某一个字段的内容中的位置, 没有找到字符串返回0,否则返回位置(从1开始)

    select instr("substr","bs");    【返回 3】

      locate(substr,str)      locate(substr,str,pos) 

        第一个语法返回字符串 str中子字符串substr的第一个出现位置。第二个语法返回字符串 str中子字符串substr的第一个出现位置, 起始位置在pos。如若substr 不在str中,则返回值为0。 

    SELECT LOCATE('bar', 'foobarbar');  【返回 4】
    SELECT LOCATE('bar', 'foobarbar',5);  【返回 7】

      position(substr IN str) 

      返回子串 substr 在字符串 str 中第一次出现的位置。如果子串 substr 在 str 中不存在,返回值为 0。

    SELECT POSITION('bar', ‘foobarbar');   【返回 4】

      ltrim(str)    去掉串左边的空格

    select ltrim("  aac");

      rtrim(str)    去掉串右边的空格

    select rtrim("  aac");

    聚集函数如下表:

      
    AVG() 返回某列的平均值
    COUNT() 返回某列的行数
    MAX() 返回某列的最大值
    MIN() 返回某列的最小值
    SUM() 返回某列值之和

     distinct与聚集函数:

      MySQL5.0.3以及之后的版本,聚集函数和distinct可以搭配使用,比如:

      ①对所有的行执行计算,指定all参数或不给参数(all是默认所有行为,不需要指定,如果不指定distinct,则假定为all);

      ②只包含不同的值,指定distinct参数;

      ③如果指定列名,则distinct只能用于count();distinct不能用于count(*),因此不允许使用count(distinct);distinct必须使用列名,不能用于计算或者表达式;

    select avg(distinct prod_price) as avg_price from products where vend_id = 1003;

      这条SQL语句中,使用avg()函数返回vend列中vend_id=1003的对应的price平均价格,因为使用了distinct参数,因此平均值只考虑不同的值(唯一值)

    组合聚集函数:
      select语句可以包含多个聚集函数,比如:

    select count*as num_items,
    
              min(prod_price) as price_min,
    
              max(prod_price) as price_max,
    
              avg(prod_price) as price_avg
    
    from products;

    这条SQL语句,使用了单条select语句执行4个聚集计算,返回四个值(products表中items的数目、price的最高、最低以及平均值)

    PS:在指定别名以包含某个聚集函数的结果时,不应该使用表中实际的列名;这样便于使用SQL更加容易和理解,以及排除方便排除错误。

    6、group by 分组

      “Group By”从字面意义上理解就是根据“By”指定的规则对数据进行分组,所谓的分组就是将一个“数据集”划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理。

    select 类别, sum(数量) as 数量之和
    from A
    group by 类别

      注:group by语句中select指定的字段必须是“分组依据字段”,其他字段若想出现在select中则必须包含在聚合函数中。(聚集函数上面已给出)

    7、order by 排序

     (1)order by price  //默认升序排列
        (2)order by price desc //降序排列
        (3)order by price asc //升序排列,与默认一样
        (4)order by rand() //随机排列,效率不

    8、having

       having子句可以让我们筛选成组后的各种数据,where子句在聚合前先筛选记录,也就是说作用在group by和having子句前。而 having子句在聚合后对组记录进行筛选。 

    示例:

    select 类别, sum(数量) as 数量之和 from A
    group by 类别
    having sum(数量) > 18

    示例:Having和Where的联合使用方法

    select 类别, SUM(数量)from A
    where 数量 >8
    group by 类别
    having SUM(数量) >10

    where和having的区别:

      作用的对象不同。WHERE 子句作用于表和视图,HAVING 子句作用于组。
      WHERE 在分组和聚集计算之前选取输入行(因此,它控制哪些行进入聚集计算), 而 HAVING 在分组和聚集之后选取分组的行。因此,WHERE 子句不能包含聚集函数; 因为试图用聚集函数判断那些行输入给聚集运算是没有意义的。 相反,HAVING 子句总是包含聚集函数。(严格说来,你可以写不使用聚集的 HAVING 子句, 但这样做只是白费劲。同样的条件可以更有效地用于 WHERE 阶段。)
    在上面的例子中,我们可以在 WHERE 里应用数量字段来限制,因为它不需要聚集。 这样比在 HAVING 里增加限制更加高效,因为我们避免了为那些未通过 WHERE 检查的行进行分组和聚集计算。

    综上所述:
      having一般跟在group by之后,执行记录组选择的一部分来工作的。where则是执行所有数据来工作的。

    9、limit  

      limit [offset,] N
      offset 偏移量,可选,不写则相当于limit 0,N
           N  取出条目

      示例:取价格第4-6高的商品

    select good_id,goods_name,goods_price from goods order by good_price desc limit 3,3;

    10、总结:

      select字句顺序

    子句说明是否必须使用
    select 要返回的列
    from 要检索的表 仅从表中选择数据时使用
    where 行级过滤
    group by 分组说明 仅在按组计算聚集时使用
    having 组级过滤
    order by 输出排序顺序
    limit 要检索的行数
  • 相关阅读:
    第六天学习:Python数据类型(二)
    第五天学习:python数据类型(一)
    第四天学习:运算符
    第一天学习:python的安装及helloworld
    第二十五天学习:mysql(二)
    第二十四天学习:mysql(一)
    第二十三天学习:正则(2)
    第二十二天学习:正则
    第二十一天学习:模块(三)json
    第二十天学习:模块(二)
  • 原文地址:https://www.cnblogs.com/tg666/p/9526303.html
Copyright © 2011-2022 走看看