MySQL之数据操作之多表查询

1>多表连接查询

    语法:

        SELECT 字段1,...字段n
            FROM 表1 INNER|LEFT|RIGHT JOIN 表2
            ON 表1.字段 = 表2.字段;

    如上,先找到两张表,再根据on筛选条件筛选记录,得出一张新的(合体)表,再基于新表查值。

    连接分为三种情况,inner,left,right

    --->内连接 inner:只取两张表的共同部分。

    --->左连接 left:在内连接的基础上保留左表的记录,即做连接之后的结果

        包含 左表.字段 所有有值的记录,其中有些记录的值可能并不满足 on筛选条件。

    --->右连接 right:在内连接的基础上保留右表的记录

    --->模拟 full join 的全连接,MySQL本身不支持 full join语法,但是可以通过union实现。

        select 字段 from 表1 left join 表2 on 表1.字段=表2.字段

        union select 字段 from 表1 right join 表2 on 表1.字段=表2.字段;

    例子,如下,有两张表,班级表和学生表,学生表的class_id逻辑上和班级表的id一样,并没有设置

    外键进行强关联,并且各有条数据与另一张表没有对应关系,看下各连接的实际效果。

    

    

2>符合条件连接查询

    现在加入表连接,把之前的select语法和顺序再完善一下,如下(重中之重):

    --->关键字定义顺序

    SELECT DISTINCT 字段1,..字段n
    FROM 表1 <join_type> JOIN 表2
    ON join的筛选条件
    WHERE where筛选条件
    GROUP BY 字段
    HAVING having删选条件
    ORDER BY 字段 [desc]
    LIMIT 限制查询数量

    --->语句执行顺序

    第7步:查询             SELECT 
    第8步:去重             DISTINCT <select_list>
    第1步:先找表          FROM <left_table>
    第3步:表连接          <join_type> JOIN <right_table>
    第2步:on筛选         ON <join_condition>
    第4步:where筛选   WHERE <where_condition>
    第5步:排序        GROUP BY <group_by_list>
    第6步:having筛选  HAVING <having_condition>
    第9步:排序             ORDER BY <order_by_condition>
    第10步:限制数量    LIMIT <limit_number>

    例子,基于上面的表

    # 找出huang所在的班级名称
    select class.name,student.name from class inner join student 
    on class.id=student.class_id where student.name='huang';

3>子查询

        -->子查询是将一个查询语句嵌套在另一个查询语句中。
        -->内层查询语句的查询结果,可以为外层查询语句提供查询条件。

        -->子查询中可以包含:IN、NOT IN、ANY、ALL、EXISTS 和 NOT EXISTS等关键字

            EXISTS关字键字表示存在。在使用EXISTS关键字时,内层查询语句不返回查询的记录。
            而是返回一个bool值。True或False.
            当返回True时,外层查询语句将进行查询;当返回值为False时,外层查询语句不进行查询

        -->还可以包含比较运算符:= 、 !=、> 、<等

    

猜你喜欢

转载自blog.csdn.net/huangql517/article/details/80268017