美文网首页
MySQL多表查询

MySQL多表查询

作者: lily_5945 | 来源:发表于2020-12-25 15:32 被阅读0次

    首先我们来了解一下表与表之间的关系:一对一、一对多、多对多。
    这里我们把多表查询分为四个学习模块:连接查询、合并结果集、子查询和自然连接

    一、连表查询

    • 交叉连接:又名笛卡尔积,使用交叉连接会产生笛卡尔积
      假设集合A={a, b},集合B={0, 1, 2},则两个集合的笛卡尔积为{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)
      同时查询到两个表就是笛卡尔积:select * from 表1,表2 ;
    • 给查询结果器取别名:select * from 表1 别名1;(取了别名后,要查询表的字段需要用 别名.字段 来查询)
    • 如何保证多表联查时数据正确:在查询时要把主键和外键保持一致
    • 内连接:查询两个表的交集,解决笛卡尔积现象,查询正确需要的数据
    # 隐式内连接,使用where条件消除笛卡尔积,多个表在后面加and
    select * from 表1,表2 WHERE 表1.字段 = 表2.字段;
    # 显示内连接,多个表在JOIN ...ON 后面添加 JOIN ... ON,如果还有条件,直接在后面写where、and 
    select * from 表1 JOIN 表2 ON 表1.字段 = 表2.字段; 
    # 以下是三个表student 、score 、course  的两种方法的查询例子
    select st.name,sc.score,c.name from student st, score sc, course c WHERE st.id= sc.sid AND sc.cid=c.cid;
    select st.name,sc.score,c.name from student st JOIN score sc ON st.id=sc.sid JOIN course c ON sc.cid=c.cid;
    
    • 外连接之左外连接:左边表中的数据全部查出来,右表当中,只查满足条件的数据
    select * from 表1  LEFT OUTER JOIN 表2 ON 表1.字段 = 表2.字段;  #OUTER 可省略
    select * from student st LEFT OUTER JOIN score sc ON st.sid=sc.sid;
    
    • 外连接之右外连接:右边表中的数据全部查出来,左边表中,只查满足条件的数据
    select * from 表1 RIGHT OUTER JOIN 表2 ON 表1.字段=表2.字段;  #OUTER 可省略
    select * from student st RIGHT OUTER JOIN score sc ON st.sid=sc.sid;
    

    二、子查询

    • 什么是子查询:将一个查询结果作为另一个查询的对象,即两个以上的select语句。也就是SQL语句嵌套
    select * from (select * from 表名) as 别名
    select * from where 带select语句的条件
    
    • 出现位置和注意事项
      1,where后,把select查询出来的结果当做另一个select的条件值
      2,from后,把查询出的结果当做一个新表
      3,注意,查询的虚拟表必须要取别名

    三、合并结果集

    • 什么是合并结果集:把两个select语句的查询结果合并到一起
    • 注意事项:被合并的两个结果:列数、列类型必须相同
    • 合并结果集的两种方式
    # UNION,合并时去除重复的记录
    select * from 表1 UNION select * from 表2;
    # UNION ALL,合并时不去除重复记录
    select * from 表1 UNION ALL select * from 表2;
    

    四、自然连接

    释义:
    1,连接查询会产生无用笛卡尔集,我们通常使用主外键关系来去除它,而自然连接无需你去给出主外键等式,他会自动找到这一等式。也就是说不用去写条件。

    select * from 表1 NATURAL JOIN 表2;
    

    要求:
    1,两张连接的表中列名称和类型完全一致的列作为条件;
    2,会去除相同的列;
    3,如果有两个相同的字段名,其中一个相同的字段内容不同,则查询的数据是空的;

    相关文章

      网友评论

          本文标题:MySQL多表查询

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