一、查询相关概念

  1.笛卡尔件表系返回的

        表一字段a,行b;表二字段c,行d

        表一和表二的笛卡尔:字段=a+c =b*d

  2.连接类型

      内连接(INNER JOIN):表系笛卡尔积数据,保留表系中所有匹配记录

      自然根据表系中相同名的字段自动进记录匹配,再去重

                             内连查询中存在的一特殊的等值连接,表其自身

      值连系笛卡尔中,选择所匹配字段相等的记录

      不等值连!=

  3.连接方式

           接(OUTER JOIN系笛卡尔积数据,不保留表中所有匹配据,还会保留部分不匹配的记录

              查询返回操作表中至少一表的所有

           左外系笛卡尔积数据除了选择匹配数则记录包含关联左表中不匹配记录,以左主保留

FROM tb1 LEFT JOIN tb2 ON tb1.col=tb2.col

           右外…右

FROM tb1 RIGHT JOIN tb2 ON tb1.col=tb2.col

           全外…左右两边表全

  4.查询(嵌套查询):查询之中嵌套了其他若干查询

      子查询:在查询语句嵌套着查询语句 基于某语句的查询结果再次进行的查询

    IN:主查询件是子查询查询结

    ANY:主查询为满足子查询查询返回查询结果中任意一条数

                = ANY > ANY < ANY

    ALL:主查询为满足子查询查询返回查询结果中所有

    EXISTS:布尔型,ture&false

 

 

 

二、单查询

  1.基本介绍

    (1)SELECT原理

           Query Cache查询缓存组件,再查询结果确定是有用

查询执行路径中的组件:查询缓存、解析器、预处理器、优化器、查询执行引擎、存储引擎;

    (2)SELECT语句的执行流程

FROM Clause --> WHERE Clause --> GROUP BY --> HAVING Clause --> ORDER BY --> SELECT --> LIMIT

    (3)单表查询语法

SELECT

    [ALL | DISTINCT | DISTINCTROW ]

      [SQL_CACHE | SQL_NO_CACHE]

    select_expr [, select_expr ...]

    [FROM table_references

    [WHERE where_condition]

    [GROUP BY {col_name | expr | position}

      [ASC | DESC], ... [WITH ROLLUP]]

    [HAVING where_condition]

    [ORDER BY {col_name | expr | position}

      [ASC | DESC], ...]

    [LIMIT {[offset,] row_count | row_count OFFSET offset}]

    [FOR UPDATE | LOCK IN SHARE MODE]

       说明:

1) DISTINCT数据去重;

2) SQL_CACHE: 显式指定存储查询结果于缓存之中;

    SQL_NO_CACHE: 显式查询结果不予缓存;

  说明:

         query_cache_type的值为'ON'时,查询缓存功能打开;

            SELECT的结果符合缓存条件即会缓存,否则,不予缓存;显式指定SQL_NO_CACHE,不予缓存;

         query_cache_type的值为'DEMAND'时,查询缓存功能按需进行;

                  显式指定SQL_CACHE的SELECT语句才会缓存;其它均不予缓存;

3) 字段显示可以使用别名:col1 AS alias1, col2 AS alias2, ...

4) WHERE子句:指明过滤条件以实现“选择”的功能过滤条件布尔型表达式;

      支持语法格式:

算术操作符:+, -, *, /, %

比较操作符:=, !=, <>, <=>, >, >=, <, <=

逻辑操作符:NOTANDORXOR

BETWEEN min_num AND max_num

IN (element1, element2, ...)

IS NULL:为空值

IS NOT NULL:非空

LIKE %表示任意长度的任意字符_表示任意单个字符;

RLIKE:

REGEXP:匹配字符串可用正则表达式书写模式;

5) GROUP:根据指定的条件把查询结果进行“分组”以用于做“聚合”运算:

6) HAVING: 对分组聚合运算后的结果指定过滤条件;

7) ORDER BY: 根据指定的字段对查询结果进行排序;

升序:ASC降序:DESC

8) LIMIT [[offset,]row_count]:对查询的结果进行输出行数数量限制;

9) 对查询结果中的数据请求施加“锁”:

FOR UPDATE: 写锁,排他锁;

LOCK IN SHARE MODE: 读锁,共享锁

 

  2.避免重复查询

          SELECT  DISTINCT field1,field n FROM table_name

        注意:则运算:用AS义别名,或省略AS关键

  3.示格式查询

           SELECT  CONCAT(field格式) AS 名】FROM table_name

  4.查询

        SELECT field1,field n FROM table_name WHERE CONDITION

               _通配符:匹配一字符

              %通配符:任意度字符

  5.排序查询

        SELECT field1,field n FROM table_name WHERE CONDITION  ORDER  BY  filedldm1 [ASC|DESC] [,filedldm1 [ASC|DESC],]

  6.限制记录查询数

         SELECT field1,field n FROM table_name WHERE CONDITION  LIMIT  OFFSET_START,ROW_COUNT

  7.统计和分组数记录查询

         COUNT()AVG()SUM()MAX()MIN()

  8.组数查询

        SELECT function() FROM table_name WHERE CONDITION GROUP BY field

  9.实现统计功能的分组数查询

         SELECT  GROUP_CONCAT(field)  FROM table_name  WHERE CONDITION GROUP BY field

  10.多字段分组查询

         SELECT  GROUP_CONCAT(field), function(field) FROM table_name  WHERE CONDITION GROUP BY field1,field2……fieldn

  11.HAVING子句限定分组查询

          SELECT  function(field)  FROM table_name  WHERE CONDITION  GROUP BY field1,field2……fieldn HAVING CONTITION

     注意:

             WHERE:实现条件限制记录

             HAVING:实现条件限制分组数记录

 

 

 

三、多表查询

  1.多表查询实现方式

    (1) FROM子句利用(,)分多表,在WHERE子句中通过逻辑来实现匹配

    (2) FROM子句用 ”JOIN ON”ON后接

 

  2.子查询

  (1)用在WHERE子句中的子查询

        1) 用于比较表达式中的子查询;子查询仅能返回单个值;

      SELECT Name,Age FROM students WHERE Age>(SELECT avg(Age) FROM students);

        2) 用于IN中的子查询:子查询应该单键查询并返回一个或多个值从构成列表;

      SELECT Name,Age FROM students WHERE Age IN (SELECT Age FROM teachers);

        3) 用于EXISTS;

    (2)用于FROM子句中的子查询

使用格式:SELECT tb_alias.col1,... FROM (SELECT clause) AS tb_alias WHERE Clause;

示例:

                SELECT s.aage,s.ClassID FROM (SELECT avg(Age) AS aage,ClassID FROM students WHERE ClassID IS NOT NULL GROUP BY ClassID) AS s WHERE s.aage>30;

    (3)联合查询:UNION

  SELECT Name,Age FROM students UNION SELECT Name,Age FROM teachers;