• MySql之查询基础与进阶


     转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/8283547.html

    一:基本查询

    SELECT [DISTINCT] 列1,列2,列3...
    FROM 表1,表2...
    

    二:分页查询

    SELECT [DISTINCT] 列1,列2,列3...
    FROM 表1,表2...
    WHERE 条件
    LIMIT n,m; //从n行开始的m行中检索

    三:排序查询

    SELECT 列名...
    FROM 表名...
    ORDER BY 排序列名... [DESC|ASC]
    LIMIT n,m; //limit必须位于ORDER BY语句之后

        多列排序:如果指定多个排序列,则根据先后顺序比较,如果列1值同,再比较列2,根据列2排序。

        排序方向:DESC逆序、ASC顺序。

    四:条件查询

    SELECT 列名...
    FROM 表名...
    WHERE 条件

    where子句操作符:

    =  等于
    <> 不等于
    !=  不等于
    < 小于
    <= 小于等于
    > 大于
    >= 大于等于
    BETWEEN n AND m 在n到m之间
    IS NULL 空值检测
    NOT 取反操作,如:NOT IN 、NOT BETWEEN等
    IN 范围:范围判断,如:IN (N,M)、IN(SELECT子查询

    组合子句

    AND :多条子句必须都成立
    OR:多条语句某些成立
    () :使用括号来保证语句的优先级

    五:模糊查询

    通配符:

    % :任意字符任意次数
    _ :任意字符一次

    模糊查询条件语句:

    SELECT 列...
    FROM 表...
    WHERE 列名 LIKE '模式'  //模式由 具体值与通配符组成

    六:正则表达式查询

    正则表达式查询语句:

    SELECT 列..
    FROM 表..
    WHERE 列名 REGEXP '正则表达式'

    正则表达式的构成:

    内容:

    .  匹配任意一个字符
    n|m or匹配:n或者m
    [多个值、n-m]  范围匹配
    [:alnum:]    任意字母和数字(通[a-zA-Z0-9]) 
    [:alpha:]    任意字符(同[a-zA-Z]) 
    [:blank:]    空格和制表符(同[\t])
    [:cntrl:]   ascii控制字符 
    [:digit:]    任意数字(同[0-9]) 
    [:xdigit:]   任意十六进制数字
    [:lower:]    任意小写字母 
    [:upper:]    任意大写字母 
    [:space:]    包括空格在内的任意空白字符

    次数:

         *      0个或者多个匹配 
         +      1个或者多个匹配(等于{1,}) 
         ?     0个或者1个匹配(等于{0,1}) 
         {n}    指定数目的匹配 
         {n,}   不少于指定数目的匹配 
         {n,m}  匹配数目的范围(m不超过255)

    位置:

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

    七:计算字段

        计算字段不实际存在于表中,而是通过检索表中已有数据,进行一系列操作、计算而得到的结果,进行输出。

    1)拼接:将多个列、字符串拼接在一起进行输出

    SELECT Concat(列1,字符,列2,字符)
    FROM 表

    2)算术运算:将列参与的算术运算结果作为一列进行输出

    SELECT 列+-*/运算 AS 结果别名
    FROM 表名 

    3)使用函数:使用函数对某列值进行处理再输出函数结果

    SELECT 函数(列名) AS 结果别名
    FROM 表名

    函数主要分为四类:

    文本处理函数:

    Left() :返回串的左边字符
    Right() :返回串的右边字符
    Length():返回串长度
    Locate():找出串的一个子串
    SubString():返回子串
    Lower():将串转为小写
    Upper():将串转为大写
    LTrim():去掉串的左边空格
    RTrim():去掉串的右边空格
    Trim():去掉两边空格
    Soundex():根据发音来模糊查询,sound as

    时间与日期处理函数:

     

     使用技巧:灵活使用上述函数截取一个  日期时间 字符串的  年、月、日、日期、时、分、秒、时间  部分。

    数值处理函数:

     

    系统函数:用户信息、系统状态等函数。一般不会在编程中用到。

    八:汇总数据

        可以使用聚集函数,对满足查询条件的数据们进行汇总统计,例如:求极大极小值、求平均值等。

     

    九:分组查询

    SELECT 列..
    FROM 表..
    WHERE 条件 //分组前过滤:对所有记录进行过滤 GROUP BY 分组列
    HAVING 条件 //分组后过滤:对各组记录的过滤 ORDER BY 排序列 [DESC
    |ASC]

    十:SELECT查询子句格式

    SELECT 列名
    FROM 表名
    WHERE 条件
    GROUP BY 分组列
    HAVING 分组过滤条件
    ORDER BY 排序列
    LIMIT 检索的页数、行数

    十一:子查询

        1)用于过滤条件的子查询

        WHERE子句中的IN、NOT IN操作符用于判断范围,而这个范围包括简单的数值范围,也包括一系列的数据集合,而这些数据集合有可能直接给出,也可以从数据库的表中进行查询。其中,从数据库中检索出一系列数据作为WHERE子句的判断范围,就是子查询

    SELECT 列
    FROM 表
    WHERE 列 INNOT IN (SELECT 子查询)

        2)作为计算字段的子查询

        在SELECT子句中,可以直接检索表中的列,也可以内嵌查询语句,检索其他表中的列。在SELECT子句中作为计算字段进行的查询,也是子查询一般在SELECT子句中的子查询都是进行数据汇总操作,如:统计总数、平均值、最大最小值等

    SELECT 列...,(SELECT 子查询) AS 子查询结果别名

    十二:联结查询

     1)等值联结(内部联结)

    SELECT 列..
    FROM table1,table2
    ON table1.列 = table2.列
    SELECT 列。。
    FROM table1 INNER JOIN table2
    ON table1.列 = table2.列

    2)多表联结(通过WHERE子句中的AND,使得多个表之间的某些列值相等)

    SELECT 列...
    FROM 表...【可以使用别名来简化表名的表达】
    WHERE tab1.列  = tab2.列 AND tab2.列 = tab3.列 ...

    3)外部联结

    SELECT 列。。。
    FROM table1 LEFTRIGHT OUTER JOIN table2
    ON table1.列 = table2.列

    十三:组合查询(多语句查询)

    SELECT 语句1
    UNION
    SELECT 语句2
    UNION 
    SELECT 语句3
    ...

    注意:

    1)UNION组合的多个查询语句,必须检索相同的 列、聚集函数或者表达式。也就是说各个语句的输出列相同。组合查询的结果就是 同一张输出表,各列的值来自不同的查询语句

    2)UNION自动合并重复列,如果需要显示所有列(包括重复),则使用 UNION ALL来组合。

    十四:全文本搜索

    1)MySQL最常用的两种数据库引擎为MyISAM和InnoDB。

        MyISAM支持全文本搜索,但不支持事务。

        InnoDB支持事务、外键等高级特性,但不支持全文本搜索。

    2)一般搜索

        前面介绍的检索,都是对于整张表进行检索的。随着表中数据的不断增加,检索可能会变得耗时。

    3)全文本搜索

        全文本搜索是一种高级索引。

        在建立表时,我们可以为某些列创建FULLTEXT索引。这样一来,每当有增加、修改、删除行时,MySQL都会自动更新索引。

        索引的存在形式:

        目前,使用最多的是 B-Tree 的形式。

        另一种形式是 哈希表  。

        索引如何提高性能:

        当我们为某列建立索引时,数据库则为该列的值们维护一张索引表。

        索引表以 (列值,行地址)  的形式来保存数据,每当有记录插入、修改、删除 时,都和同步更新索引表。

        我们在使用索引进行查询时,只需检索  索引表  ,根据索引表中的列值来过滤记录,根据对应的 行地址  来确定在数据库中真正的表中的对应记录。

    4)建立FULLTEXT索引

    CREATE TABLE tableName
    (
      列名  类型  限制条件,
      ...
      PRIMARY KEY(主键),
      FULLTEXT(建立索引的列名),
    
    )ENGINE=MyISAM;

    5)进行全文本搜索

    SELECT 列..
    FROM 表
    WHERE Match(建立了全文本索引的列) Against('查找模式'); //查找模式可以是具体值,也可以是模糊查询,或者正则表达式

    6)进行扩展的全文本搜索

        查询扩展:首先进行一次全文本搜索,得出要查找的记录;然后根据这些记录中出现的单词作为查找值再进行一次全文本查询;最后得出结果。

    SELECT 列..
    FROM 表
    WHERE Match(建立了全文本索引的列) Against('查找模式' WITH QUERY EXPANSION); 

    7)全文本布尔查询

        布尔查询通过模式中的操作符,在进行全文本查询时根据 查找内容是否存在、存在次数、模糊匹配  等等情况进行检索。

    SELECT 列..
    FROM 表
    WHERE Match(建立了全文本索引的列) Against('表达式' IN BOOLEAN MODE);

    表达式中的操作符主要有:

     

       

  • 相关阅读:
    MySQL锁系列3 MDL锁
    MySQL锁系列2 表锁
    MySQL锁系列1
    MySQL open table
    MySQL优化器join顺序
    MySQL优化器cost计算
    MySQL源码 优化器
    MySQL源码 解析器
    MySQL源码 数据结构hash
    微信小程序爬坑日记
  • 原文地址:https://www.cnblogs.com/ygj0930/p/8283547.html
Copyright © 2020-2023  润新知