自学内容网 自学内容网

mysql快速精通(四)多表查询

主打一个实用

一. 连接查询

  1. 交叉连接

    交叉连接返回两个表的笛卡尔积,即每个表的每一行与另一个表的每一行组合

    语法:

    SELECT *FROM table1 CROSS JOIN table2;
    
  2. 内连接

    查询两张表都存在的数据,即排除两张表的未匹配部分

    语法:

    SELECT 字段名 FROM 左表 INNER JOIN 右表 ON 条件;
    
  3. 外连接

    a. 左外连接

    保留左表部分(包括其未匹配部分),可以通过加上右表对应字段等于空的条件排除交集部分

    语法:

     SELECT 字段名 FROM 左表 LEFT OUTER JOIN 右表 ON 条件
    

    b. 右外连接

    保留右表部分(包括其未匹配部分),可以通过加上左表对应字段等于空的条件排除交集部分

    语法:

     SELECT 字段名 FROM 左表 RIGHT OUTER JOIN 右表 ON 条件
    
  4. 自连接

自连接算是外连接的一种特殊情况,这里单独提出来,所用语法与交叉连接相似

自连接是指连接同一个表的两个不同实例,用于在同一个表中比较不同行之间的数据,例如我需要查询表中工资为平均值的员工姓名,由于在where里面不能使用聚合函数,所以无法通过单表实现,但可以借助自连接实现

SELECT columns
FROM table1 AS alias1
JOIN table1 AS alias2 ON alias1.column = alias2.column;
  1. 全外连接

保留两表所有行,在mysql里面需要用UNION实现,UNION会取并集并去除,所以可以直接将左连接与右连接并起来

语法:

SELECT columns
FROM table1
LEFT JOIN table2 ON table1.column = table2.column
UNION
SELECT columns
FROM table1
RIGHT JOIN table2 ON table1.column = table2.column

二. 子查询

  1. 单行子查询

使用单行运算符的子查询,"= > >= < <= != "

举例:

select * from emp where salary>(select salary from emp where name='眨眼睛')
  1. 多行子查询

同理,“in、any、all”

举例

# 查询工资高于5000的员工(使用in)
SELECT dept.name FROM dept WHERE dept.id IN (SELECT dept_id FROM emp WHERE salary > 5000)

# 查询工资在眨眼睛以上的所有员工(使用any)
select name,salary from emp where salary >=any(select salary from emp where name='眨眼睛')

# 查询工资比眨眼睛高的所有员工(使用all)
select name,salary from emp where salary >all(select salary from emp where name='眨眼睛')
  1. 多列子查询
# 查询部门在纽约并且入职时间在xxx时间以后的员工信息
SELECT 
    emp.id AS emp_id,
    emp.name AS emp_name,
    emp.salary AS emp_salary,
    dept.id AS dept_id,
    dept.name AS dept_name
FROM 
    employees emp,
    (SELECT * FROM departments WHERE location = 'New York') AS dept
WHERE 
    emp.department_id = dept.id
    AND emp.join_date > '2011-01-01';


原文地址:https://blog.csdn.net/m0_73756108/article/details/140356637

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!