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

版权声明:本文为博主原创文章,转载请附上博文链接! https://blog.csdn.net/csdnluolei/article/details/83410321

数据库的创建参考我的另一篇博客 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、内连接,条件:主外键关联

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

#3、外连接

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

扫描二维码关注公众号,回复: 4749993 查看本文章
 
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='开发工程师'

猜你喜欢

转载自blog.csdn.net/qq_38085240/article/details/85061899