加载中...
加载中...
MySQL笔记(四)多表连接查询

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;  

#标准

复制收展SQLSELECT 
*
FROM
tb_dept
CROSS JOIN
tb_emp;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

复制收展SQLSELECT
*
FROM
tb_dept
INNER JOINt b_emp
WHERE
tb_dept.deptno=tb_emp.dept_id;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

#3、外连接

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

复制收展SQLSELECT
*
FROM
tb_deptd
LEFT JOIN tb_empe
ONd.deptno=e.dept_id;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

#右连接

复制收展SQLSELECT
*
FROM
tb_dept d
RIGHT JOIN tb_empe
ON d.deptno=e.dept_id;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

复制收展SQLSELECT
*
FROM
tb_empe1,tb_empe2
WHERE
e1.dept_id=e2.dept_id;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

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

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

复制收展SQLSELECT
*
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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

#USING子句

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

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

复制收展SQLSELECT
*
FROM
tb_deptd
LEFT JOIN tb_empe
USING(id);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

#子查询

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

复制收展SQLSELECT
*
FROM
tb_emp
WHERE
sal>(
SELECT
sal
FROM
tb_emp
WHERE
ename='Smith'
);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

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

复制收展SQLSELECT
ename
FROM
tb_emp
WHERE
sal=(SELECT MAX(sal) FROM tb_emp);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

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

复制收展SQLSELECT
*
FROM
tb_emp
WHERE
sal>ANY(
SELECT
sal
FROM
tb_emp
WHERE
job='开发工程师'
);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

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

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

复制收展SQLSELECT
*
FROM
tb_emp
WHERE
sal<ALL(
SELECT
sal
FROM
tb_emp
WHERE
job='开发工程师'
);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13


CSDN链接:https://blog.csdn.net/csdnluolei/article/details/83410321  

没有更多推荐了 [去首页]
image
文章
376
原创
293
转载
83
翻译
0
访问量
183399
喜欢
73
粉丝
5
码龄
7年
资源
3

文章目录

加载中...
0
0