MySQL的多表查询之联合查询

时间:2024-10-16 21:12:37
  1. union联合查询
  • union用于合并两个或多个select语句的结果集

  • unnion将两个表上下拼在一起

  • 要求:

    –两边select语句的字段数必须一致

    –两边可以有不同数据类型的字段

    –字段名默认按左边的表来设置

    select column_name from table1
    union
    select column_name from table2;
    
  1. inner join:内连接(交集)
    在这里插入图片描述
  • nner join 根据两个或多个表之间的共同列(即连接条件)来组合行。使用 INNER JOIN 时,只有当连接条件满足时,即在两个或多个表中都存在匹配的行时,才会返回结果。

  • 如果没有匹配的行,INNER JOIN 不会返回这些行

  • inner 可省略

  • 语法:

    --隐式内连接(SQL92标准)
    select * from table1, table2 where condition;
    
    --显式内连接(sql99标准)
    SELECT columns
    FROM table1
    INNER JOIN table2 ON table1.common_field = table2.common_field,
    [INNER JOIN table3 ON table1.common_field = table3.common_field];
    
    --多表内连接
    SELECT columns
    FROM table1
    INNER JOIN table2 ON table1.common_field = table2.common_field,
    INNER JOIN table3 ON table1.common_field = table3.common_field;
    

    table1table2 是要连接的两个表。

    common_field 是两个表共有的列,用于连接这两个表。

    columns 是你想要从连接的结果中选择的列。

  • 示例:

    假设有两个表:employeesdepartmentsemployees 表包含员工信息,departments 表包含部门信息,它们通过 department_id 列连接。

    SELECT 
    	employees.name, departments.department_name
    FROM 
    	employees
    INNER JOIN departments ON employees.department_id = departments.id;
    
  
  -- 这个查询将返回所有员工的姓名和他们所属的部门名称,但只有当员工和部门在 `department_id` 上有匹配时才会显示。 
 
  select 
  	departments.name, group_concat(employees.ename), count(*) 
  from 
  	dept
  join emp on departments.id = employees.department_id 
  group by 
  	departments.name 
  having 
  	count(*)>=3 
  order by 
  	count(*) desc;

– 这个查询将返回部门员工数≥3的部门名称,部门员工姓名,部门员工数量,并按部门员工数量的降序排列

  1. left [outer] join:左(外)连接
    在这里插入图片描述
  • left join关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配,如果右表没有匹配,则common_field结果为null。

  • 语法

    SELECT columns
    FROM table1
    LEFT JOIN table2 ON table1.common_field = table2.common_field;
    
  1. rigth (outer)join:右(外)连接
    在这里插入图片描述
  • ight join关键字从右表(table2)返回所有的行,即使左表(table1)中没有匹配,如果右表没有匹配,则common_field结果为null。

  • 语法

    SELECT columns
    FROM table1
    right JOIN table2 ON table1.common_field = table2.common_field;
    

在这里插入图片描述
full join:满外连接,mysql不支持满外连接,可以使用union关键字实现左外连接和右外连接的并集达到满外连接的效果

select * from table1 left join table2 on table1.column = taable2.column
union
select * from table1 right join table2 on table1.column = taable2.column
-- 使用union on也可以,union去重了,union on 未去重

6、交叉连接查询

  • 交叉连接查询返回被连接的两个表所有数据行的笛卡尔积

  • 笛卡尔积可以理解为一张表的每一行去和另外一张表的任意一行进行匹配

  • 假如A表有m行数据,B表有n行数据,则会返回m*n行数据

  • 这种查询会产生很多冗余数据,后期的其他查询可以在该集合的基础上进行条件筛选

  • 语法

select * from table1, table2, table3...;