• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    MySQL中连接查询和子查询的问题

    多表连接的基本语法

    多表连接,就是将几张表拼接为一张表,然后进行查询

    select 字段1, 字段2, ...
    from 表1 {inner|lift|right} join 表2
    on 连接条件;

    有如下两张表:部门表和员工表

    交叉连接和笛卡尔积现象

    交叉连接

    交叉连接,又名无条件内连接/笛卡尔连接

    第一张表种的每一项会和另一张表的每一项依次组合

    select * from employee,department;

    上述结果肯定不是我们想晓得的,左表中每一个人都有4个部门,仔细观察这4条记录,正好是左表每一条记录和右表一一匹配后的结果。

    笛卡尔积现象

    笛卡尔积现象产生的原因:两张表没有有效的连接条件。既然你没有连接条件,本表中的第一行肯定是能和另外表中的所有行进行一一匹配,同理,本表中的第二行肯定是能和另外表中的所有行进行一一匹配,以此类推,本表中的最后一行m也可以和另外表中的所有行进行一一匹配。若另外一张表有n行,那么最后显示的行数,肯定就是m*n行了。

    如果不想产生笛卡尔积现象,就需要添加有效的表连接条件。拿上述例子来说,左表dep_id只有和右表id相等时,才代表他们的部门。

    内连接

    内连接(INNER JOIN)是找几张表的交集,即根据条件筛选出来正确的结果。

    select emp.id,emp.name,emp.age,emp.dep_id,emp.gender,dep.id,dep.name
    from employee as emp INNER JOIN department as dep
    on emp.dep_id=dep.id;

    由于部门表中没有id=5的部门,所以员工表dep_id=5的这条记录没有返回;而由于行政部没有员工,所以这条记录也没返回。

    外连接

    左外连接

    左连接(left join)是以左表为准,如果右表中没有合适的记录,用NULL补全;其本质是在内连接的基础上增加左表有结果而右表没有的记录(内连接时,这种情况的记录会忽略)。

    select emp.id,emp.name,emp.age,emp.dep_id,emp.gender,dep.id,dep.name
    from employee as emp left join department as dep
    on emp.dep_id=dep.id;

    右外连接

    跟左连接正好相反,右连接(right join)是以右表为准,如果左表中某些字段没有合适的结果,用NULL补全;其本质是在内连接的基础上增加右表有结果而左表没有的记录(内连接时,这种情况的记录会忽略)。

    select emp.id,emp.name,emp.age,emp.dep_id,emp.gender,dep.id,dep.name
    from employee as emp right join department as dep
    on emp.dep_id=dep.id;

    全外连接

    全外连接,在内连接的基础上,展示左右表的所有的记录,而左右表中缺省记录以NULL补全。

    MySQL中并没有全外连接的FULL JOIN语法,而是借助UNION/UNION ALL语句实现。

    UNIONUNION ALL的区别,UNION具有去重功能。

    select emp.id,emp.name,emp.age,emp.dep_id,emp.gender,dep.id,dep.name
    from employee as emp left join department as dep
    on emp.dep_id=dep.id
    union
    select emp.id,emp.name,emp.age,emp.dep_id,emp.gender,dep.id,dep.name
    from employee as emp right join department as dep
    on emp.dep_id=dep.id;

    子查询

    子查询中还可以包含比较运算符,如=!=>等。

    -- 查询平均年龄在20以上的部门名称
    select name
    from department
    where id in (
    select dep_id
    from employee
    group by dep_id
    having avg(age) > 20);
    
    -- 查询财务部员工姓名
    select name 
    from employee
    where dep_id in (
    select id 
    from department 
    where name='财务部');
    
    
    -- 查询所有大于平均年龄的员工的年龄和姓名
    select name,age 
    from employee 
    where age > (
    select avg(age) from employee);

    到此这篇关于MySQL中连接查询和子查询的问题的文章就介绍到这了,更多相关MySQL连接查询和子查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • mysql连接查询、联合查询、子查询原理与用法实例详解
    • 详解MySql基本查询、连接查询、子查询、正则表达查询
    • MySQL查询优化:用子查询代替非主键连接查询实例介绍
    • mysql连接查询(左连接,右连接,内连接)
    • 详解MySQL中的分组查询与连接查询语句
    • mysql实现多表关联统计(子查询统计)示例
    • 详解MySQL子查询(嵌套查询)、联结表、组合查询
    • MySQL子查询操作实例详解
    上一篇:mysql配置SSL证书登录的实现
    下一篇:MySQL事务的隔离性是如何实现的
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    MySQL中连接查询和子查询的问题 MySQL,中,连接,查询,和,子,