Mysql笔记(四)多表连接查询
程序员文章站
2021-11-28 11:23:50
...
这是我在学习Mysql之路上做的笔记,今天将它粘出来。这一篇主要是Mysql多表连接查询。有错误的欢迎大家指出。。。
数据库的创建参考我的另一篇博客 https://blog.csdn.net/csdnluolei/article/details/83409945
#多表连接查询
- 交叉连接:交叉连接又叫笛卡尔积,它是指不使用任何条件,直接将一个表的所有记录和另一个表中的所有记录一一匹配。取两个表并集。
- 内连接则是只有条件的交叉连接,根据某个条件筛选出符合条件的记录,不符合条件的记录不会出现在结果集中,即内连接只连接匹配的行。取两个表交集。
- 外连接左外连接、右外连接、全外链接
- 左外连接,也称左连接,左表为主表,左表中的所有记录都会出现在结果集中,对于那些在右表中并没有匹配的记录,仍然要显示,右边对应的那些字段值以NULL来填充。
- 右外连接,也称右连接,右表为主表,左连接和右连接可以互换。
- 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='开发工程师'
);