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

这是我在学习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='开发工程师'
    );

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值