欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Mysql笔记(四)多表连接查询

程序员文章站 2021-11-28 11:23:50
...

这是我在学习Mysql之路上做的笔记,今天将它粘出来。这一篇主要是Mysql多表连接查询。有错误的欢迎大家指出。。。

数据库的创建参考我的另一篇博客 https://blog.csdn.net/csdnluolei/article/details/83409945

#多表连接查询

  1. 交叉连接:交叉连接又叫笛卡尔积,它是指不使用任何条件,直接将一个表的所有记录和另一个表中的所有记录一一匹配。取两个表并集。
  2. 内连接则是只有条件的交叉连接,根据某个条件筛选出符合条件的记录,不符合条件的记录不会出现在结果集中,即内连接只连接匹配的行。取两个表交集。
  3. 外连接左外连接、右外连接、全外链接
  4. 左外连接,也称左连接,左表为主表,左表中的所有记录都会出现在结果集中,对于那些在右表中并没有匹配的记录,仍然要显示,右边对应的那些字段值以NULL来填充。
  5. 右外连接,也称右连接,右表为主表,左连接和右连接可以互换。
  6. MySQL目前还不支持全外连接。可以用左连接union右连接实现。

自连接只有一个表的查询

#JOIN

#相当于我们平时用的where,就是把两张表中同时满足a.id=b.id的数据找出来;

SELECT *FROM tb_depta JOIN tb_emp b ON a.s_id=b.s_id;

#1、交叉连接/迪卡尔交集

SELECT *FROM tb_dept,tb_emp;

#标准

SELECT 
    *
FROM
    tb_dept
CROSS JOIN
    tb_emp;

#2、内连接,条件:主外键关联

SELECT
    *
FROM
    tb_dept
INNER JOINt b_emp
WHERE
    tb_dept.deptno=tb_emp.dept_id;

#3、外连接

#左连接:以左表为主表,取两表交集,加上左表剩下的将被查询

SELECT
    *
FROM
    tb_deptd
LEFT JOIN tb_empe
ONd.deptno=e.dept_id;

#右连接

SELECT
    *
FROM
tb_dept d
RIGHT JOIN tb_empe
ON d.deptno=e.dept_id;

#4、自连接:只涉及到一个表

SELECT
    *
FROM
    tb_empe1,tb_empe2
WHERE
    e1.dept_id=e2.dept_id;

#5、外连接:OUTERJOIN(MySQL不支持OUTERJOIN,)

#外连接就是求两个集合的并集。从笛卡尔积的角度讲就是从笛卡尔积中挑出ON子句条件成立的记录,然后加上左表中剩余的记录,最后加上右表中剩余的记录。

#另外MySQL不支持OUTERJOIN,但是我们可以对左连接和右连接的结果做UNION操作来实现。

SELECT
    *
FROM
    tb_deptd
LEFT JOIN tb_empe
ON d.deptno=e.dept_id
UNION
    SELECT
        *
    FROM
        tb_deptd
    RIGHT JOIN tb_empe
    ON d.deptno=e.dept_id;

#USING子句

#功能相当于ON,区别在于USING指定一个属性名用于连接两个表,而ON指定一个条件。

#deptno与dept_id不同名,无法用Using,这里用id代替下。

SELECT
*
FROM
    tb_deptd
LEFT JOIN tb_empe
USING(id);

#子查询

#查询工资比Smith高的员工信息

SELECT
    *
FROM
    tb_emp
WHERE
    sal>(
    SELECT
        sal
    FROM
        tb_emp
    WHERE
        ename='Smith'
    );

#查询月工资最高的员工姓名

SELECT
    ename
FROM
    tb_emp
WHERE
    sal=(SELECT MAX(sal) FROM tb_emp);

#ANY与子查询返回的任意值比较,大于最小,小于最大

#查询工资比开发工程师工资高的员工信息

SELECT
    *
FROM
    tb_emp
WHERE
    sal>ANY(
    SELECT
        sal
    FROM
        tb_emp
    WHERE
        job='开发工程师'
    );

#ALL,大于最大,小于最小

#查询工资比开发工程师工资低的员工信息

SELECT
    *
FROM
    tb_emp
WHERE
    sal<ALL(
    SELECT
        sal
    FROM
        tb_emp
    WHERE
        job='开发工程师'
    );

 

 

相关标签: Mysql