美文网首页
子查询,联结查询,组合查询的用法以及异同

子查询,联结查询,组合查询的用法以及异同

作者: 加一片柠檬233 | 来源:发表于2019-03-31 20:16 被阅读0次
    1. 子查询

    子查询:允许把一个查询嵌套在另一个查询当中的查询。子查询先从内部查询开始,在到外部查询,依次从里到位的顺序对代码可读性和可理解性较好,但性能比较差。

    select max(score) from score where subject_id=(select id from subject where subject='语文');
    //80
    
    2. 联结查询

    联结是一种机制,用来在一条SELECT语句中关联表,可以联结多个表返回一组输出。
    MySQL可以联结多个表,但是联结处理有可能非常耗费资源,因此不要联结不必要的表,联结的表越多,性能下降越厉害。
    1.内联结
    又叫等值联结,基于两个表之间的相等测试,查询结果是左右连接的交集。
    语法:

    SELECT * FROM table1 AS t1 INNER JOIN table2 AS t2 ON t1.column = t2.column;
    
    select score as 数学 from score 
    inner join subject on score.subject_id=subject.id 
    inner join student on score.student_id=student.id 
    where student.name='张三' AND subject.subject='数学';//70
    

    2.外联结
    1) 左外联结
    以左表为准,去右表找数据,如果没有匹配的数据,则以null补空位,所以输出结果数>=左表原数据数
    语法:

    SELECT * FROM table1 AS t1 LEFT JOIN table2 AS t2 ON t1.column = t2.column;
    

    例:

    SELECT * FROM student LEFT JOIN score ON student.id = score.student_id;
    
    image.png

    2) 右外联结
    以右表为准,去左表找数据,如果没有匹配的数据,则以null补空位,所以输出结果数>=右表原数据数
    语法:

    SELECT * FROM table1 AS t1 RIGHT JOIN table2 AS t2 ON t1.column = t2.column;
    

    例:

    SELECT * FROM score RIGHT JOIN  student ON student.id = score.student_id;
    
    image.png

    3) 交叉联结
    从一张表中循环取出每一条记录, 每条记录都去另外一张表进行匹配: 匹配一定保留(没有条件匹配), 而连接本身字段就会增加(保留),最终形成的结果叫做: 笛卡尔积。
    语法:

    SELECT * FROM table1 AS t1 CROSS JOIN table2 AS t2;
    

    4) 自联结
    有时需要在同一张表中进行联结条件的匹配或字段比较,可以使用自联结。
    语法:

    SELECT * FROM table t1, table t2 WHERE t1.column1=t2.column2;
    

    例:

    SELECT * FROM student CROSS JOIN score;
    
    image.png
    3. 组合查询

    执行多个查询(多条SELECT语句),并将结果作为单个查询结果集返回。这些组合查询通常称为并(union)或复合查询。
    语法:

    SELECT * FROM table1 WHERE condition 
    UNION
    SELECT * FROM table2 WHERE condition;
    

    UNION中的每个查询必须包含相同的列、表达式或聚集函数;UNION默认从查询结果集中自动去除重复的行,如果 想返回所有匹配行,可使用UNION ALL;用UNION查询时,只能使用一条ORDER BY子句,它必须出现在最后一条SELECT之后。

    • 有两种基本情况,其中需要使用组合查询:
      在单个查询中,从不同表中返回类似结构的数据。
      *对单个表执行多个查询,按照单个查询返回数据。

    例:

    select avg(score) from score where subject_id=(select id from subject where subject='语文')
    union
    select avg(score) from score ;
    //70
    //67.625
    

    相关文章

      网友评论

          本文标题:子查询,联结查询,组合查询的用法以及异同

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