mysql加强(4)~多表查询:笛卡尔积、消除笛卡尔积操作(等值、非等值连接),内连接(隐式连接、显示连接)、外连接、自连接

一、笛卡尔积

1、什么是笛卡尔积:

数学上,有两个集合A={a,b},B={1,2,3},则两个集合的笛卡尔积={{a,1}, {a,2}, {a,3}, {b,1}, {b,2}, {b,3}} 列出所有情况,一共是2*3=6条记录

在数据库中,笛卡尔积是多表查询没有连接条件时返回的表结果。

2、实际开发中应该避免全笛卡尔积 ----在 where 加入有效的连接条件【等值连接】

连接n张表,至少需要n-1个连接条件。

■ 所谓的多表查询---“都是两张表的查询”, 假如有A、B、C、D、E 五张表,先是A、B查询得到AB表,然后C再和AB表查询得到ABC表,然后...

3、外键约束:foreign key FK, 用来限定B表的某一列数据是来自A表的主键列,不允许乱写

【开发中往往是通过java代码检查数据的合法性,不使用外键!】
■ 外键作用:
  • 不允许乱写,要参考另外一张表的主键列,确定是合法数据
  • 和查询没有关系,没有外键不影响查询,仅仅是插入数据时候会做数据检查。
  • 在开发中要支持外键和事务,存储引擎必须是InnoDB
  • 使用外键性能较低,开发中,往往删除外键约束,检查数据是否合法是通过java代码(业务代码)
  • 外键--在“多的一方”,举例,多个员工属于都是属于销售部的(同一个部门)
  • 开发中添加外键,往往是通过下拉框从“多的一方”选出“一方”。

4、消除笛卡尔积(等值连接和非等值连接)

  • 等值连接:最常见的连接操作,通常是存在 主外键约束 条件的多表建立的,连接条件中两个字段通过 = 建立等值关系(连接条件是等号)。

  • 非等值连接:多表连接,连接条件为 不是用等号,用大于、小于、大于等于、小于等于

    #等值连接例子(其中表emp中的部门编号就是参照表dept的部门编号)--- 主外键约束 【不过外键咱一般不加哈哈哈,外键检查作用交给java业务逻辑代码啦】
    select * from emp e, dept d where e.deptno = d.deptno; 
    
    #非等值连接例子
    #查询员工的姓名、工资、所在部门的名称和工资的等级(表salgrade给出的是工资范围【等级号、最低工资、最高工资】)
    select e.ename,e.sal,d.dname,s.grade from emp e,dept d,salgrade s where e.deptno = d.deptno and e.sal between s.losal and s.hisal;
    


 

二、多表连接查询(所谓'连接'---通过一个列名去寻找对应的另外一个列名

1、多表查询分类:

内连接(隐式/显式连接)、外连接(左外连接、右外连接、全外连接)、自连接

2、多表查询图示:


 

3、当多表查询有重名的列时,必须在列名前加上表名【一般用别名】作为前缀。

# 当多表中有重名列时,必须在列名前加上表名【一般用别名】作为前缀。
select * from emp, dept where emp.deptno = dept.deptno;
select * from emp e, dept d where e.deptno = d.deptno; 


 

4、内连接查询

(1)隐式连接语法(没有join):

​ select [字段1[,字段2....]]

​ from 表A, 表B

​ where 查询过滤条件 and 消除笛卡尔积的连接条件

​ [order by 排序字段1 asc|desc [,排序字段2[asc|desc],...]]

(2) 显示连接语法(有join)---常用

​ select [字段1[,字段2....]]

​ from 表A [inner] join 表B on 消除笛卡尔积的连接条件 [join 表C on 消除笛卡尔积条件...]

​ where 查询过滤条件

​ [order by 排序字段1 asc|desc [,排序字段2[asc|desc],...]]

#查询员工编号,员工名称,员工所属部门编号和名称。
select e.empno, e.ename, d.deptno, d.dname from emp e join dept d on e.deptno = d.deptno;
# 显示查询的等值连接,当列名是相同时,可以使用using
select e.empno, e.ename, d.deptno, d.dname from emp e join dept d using (deptno);

#查询员工编号,员工名称,员工所属部门编号和名称以及薪资等级
select e.empno, e.ename, d.deptno, d.dname,s.grade from emp e join dept d on e.deptno = d.deptno join salgrade s on e.sal between s.losal and s.hisal;

  • 自然连接:是表之间的同名列都进行等值连接。

■ 内连接【等值连接】---匹配条件才显示。


 

5、外连接

■ 内连接最大问题:必须匹配条件才能查询出来

例如新人没有分配部门,但是多表查询的时候,查询员工编号、姓名、所属于部门时,新人的信息就不会显示出来。

(1)左连接/外连接 【以谁为准,谁显示全部,以哪张表为准,显示该表的全部,连接那张不满足补null】

  • 左(外)连接:查询出join左边表的所有数据,若是右边表不匹配使用null填充。
  • 右(外)连接:查询出join右边表的所有数据,若是左边表不匹配使用null填充。

(2)全外连接查询
  • mysql 暂时不支持,但是可以通过 union+左右连接完成。

    select e.ename, d.dname from emp e left join dept d on e.deptno = d.deptno
    union
    select e.ename, d.dname from emp e right join dept d on e.deptno = d.deptno;
    


 

6、自连接(自己和自己连接,把一张表看成两张表使用,通过别名区分)---常用

  • 在查询语句中,一张表可以重复使用多次,完成多次连接的需要。

    #查询员工名称和其对应的主管名称     emp 表有员工名称的列(主管也属于员工),也有主管的编号---通过主管的编号去找对应的员工名称【连接】
    select e1.ename, e2.ename from emp e1 join emp e2 on e1.mgr = e2.empno;
    


 

❀ 总结:多表连接查询,所谓'连接'---通过一个列名去寻找对应的另外一个列名

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
查询:limit和offset 内连接:inner join on 内连接是指只返回两个中都有数据匹配的行,也就是说只返回匹配的结果集。在 MySQL 中,内连接可以使用“inner join on”来实现。例如: ``` SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id; ``` 这个查询语句将返回 table1 和 table2 中都有匹配数据的行。 交叉连接尔积 交叉连接是指返回两个中的所有可能组合,也就是说返回的结果集是两个尔积。在 MySQL 中,可以使用“cross join”关键字来实现交叉连接。例如: ``` SELECT * FROM table1 CROSS JOIN table2; ``` 这个查询语句将返回 table1 和 table2 中的所有可能组合。 等值连接等值连接是指返回两个中某个列值相等的行。在 MySQL 中,可以使用“inner join on”来实现等值连接。例如: ``` SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id; ``` 这个查询语句将返回 table1 和 table2 中 id 列值相等的行。 自然连接: 自然连接是指返回两个中所有列名相同且列值相等的行,不需要指定任何连接条件。在 MySQL 中,可以使用“natural join”关键字来实现自然连接。例如: ``` SELECT * FROM table1 NATURAL JOIN table2; ``` 这个查询语句将返回 table1 和 table2 中所有列名相同且列值相等的行。 自连接: 自连接是指在同一个中进行连接查询。在 MySQL 中,可以使用“inner join on”关键字来实现自连接。例如: ``` SELECT a.id, a.name, b.name FROM table1 a INNER JOIN table1 b ON a.parent_id = b.id; ``` 这个查询语句将返回 table1 中每个行的 id、name 以及它的父级 name。 连接连接是指返回两个中匹配和不匹配的行,一般分为左连接、右连接和全连接。 左连接: 左连接是指返回左中所有行以及右中匹配的行。在 MySQL 中,可以使用“left join on”关键字来实现左连接。例如: ``` SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id; ``` 这个查询语句将返回 table1 中所有行以及 table2 中匹配的行。 右连接: 右连接是指返回右中所有行以及左中匹配的行。在 MySQL 中,可以使用“right join on”关键字来实现右连接。例如: ``` SELECT * FROM table1 RIGHT JOIN table2 ON table1.id = table2.id; ``` 这个查询语句将返回 table2 中所有行以及 table1 中匹配的行。 全连接: 全连接是指返回左和右中所有行。在 MySQL 中,可以使用“full outer join on”关键字来实现全连接。例如: ``` SELECT * FROM table1 FULL OUTER JOIN table2 ON table1.id = table2.id; ``` 这个查询语句将返回 table1 和 table2 中所有行。 子查询: 子查询是指在一个查询语句中嵌套另一个查询语句,用于获取需要的数据。通常分为单行子查询和多行子查询。 单行子查询: 单行子查询是指返回一行数据的子查询。例如: ``` SELECT name FROM table1 WHERE id = (SELECT id FROM table2 WHERE name = 'John'); ``` 这个查询语句将返回 table1 中 id 和 table2 中 name 匹配的行的 name 字段。 多行子查询: 多行子查询是指返回多行数据的子查询。例如: ``` SELECT name FROM table1 WHERE id IN (SELECT id FROM table2 WHERE age > 18); ``` 这个查询语句将返回 table1 中 id 和 table2 中 age 大于 18 的行的 name 字段。 TopN查询: TopN查询是指获取查询结果集中前 N 行数据。在 MySQL 中,可以使用“limit”关键字来实现分页查询,例如: ``` SELECT * FROM table1 LIMIT 10; ``` 这个查询语句将返回 table1 中的前 10 行数据。 同时,可以使用“limit offset, count”来实现分页查询,例如: ``` SELECT * FROM table1 LIMIT 10, 20; ``` 这个查询语句将返回 table1 中从第 11 行开始的 20 行数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值