联表查询之交叉连接、内、外连接

目录

1、交叉连接(笛卡尔积)

2、内连接

2.1 显示内连接(inner join)

2.2 隐示内连接

 2.3 内连接的练习

 2.3.1 查询第一或者二学期中所有的学生

2.3.2 查询第一和第二期所有的学生

 2.3.3 查询每个班级下的学生总数,并且按照学生总数升序在(降序)排列

 2.3.4 查询班级总人数>2的班级,并且人数降序排列

 3、外连接

3.1 左外连接(left outer join,outer可以省略)

3.1.1 左外连接练习

3.1.2 所需表(学生表和班级表)

​编辑

3.1.3 查询结果与内连接对比 

​编辑

3.2 右外连接

​编辑 3.2.1 右外连接练习

​编辑 3.2.2 所需数据

​编辑

3.2.3 查询结果

3.2.4 如果删掉外键之后再插入一条数据(第八条)然后右连接的查询结果?

3.3 全外连接(union)

3.3.1 运行结果


1、交叉连接(笛卡尔积)


三条查询语句 :前两条是单表查询,然后就是交叉查询

  

 注:第一个是单表,后面是交叉表(显得有点冗余)

2、内连接


2.1 显示内连接(inner join)


 注:,如图所示这个INNER是可以不用写的,查询结果也是也一样的

2.2 隐示内连接


 2.3 内连接的练习


 2.3.1 查询第一或者二学期中所有的学生


 注:虽然输入中文也可以查询,但不推荐,因为这个名称有可能会发生变化  

2.3.2 查询第一和第二期所有的学生


注:这个是错误的查询写法,先and,在or,那么就会这样

 而显得数据冗余了 

========================================================================= 

注:加个括号一起统计,就不会先查and,在查or了 。(第一个是隐示,第二个是显示)

 2.3.3 查询每个班级下的学生总数,并且按照学生总数升序在(降序)排列


注:这是点击美化sql之后的格式

 2.3.4 查询班级总人数>2的班级,并且人数降序排列


注:先分组(group),在筛选(having) 

 3、外连接


3.1 左外连接(left outer join,outer可以省略)


3.1.1 左外连接练习


3.1.2 所需表(学生表和班级表)


 

3.1.3 查询结果与内连接对比 


1. 

 

2.

 

 

3.

 

注:查询结果1是左外连接,2是内连接 ,3.以左表为主的话,应该有四个学期,但是学生表只有第一和第二,所有返回kong

3.2 右外连接


 3.2.1 右外连接练习


 3.2.2 所需数据


注:需要多家一条数据并且class_id为空(第七条)

3.2.3 查询结果


 

注:为null,是因为没有找到对于的id,如果想查没有班级的学生,就在后面加个

and class-id = null即可

 

 

3.2.4 如果删掉外键之后再插入一条数据(第八条)然后右连接的查询结果?


 

 

 

注:查询结果以右边为主,所有可以看到class_id,但是坐标的内容为null,那么如果再次使用内连接,还是一样没有匹配就不显示

 

 

3.3 全外连接(union)


 

 

 注:mysql是无法实现全外连接,但是可以通过union进行 

3.3.1 运行结果


 

 

### SQL查询的使用方法与示例 #### 一、内连接 (INNER JOIN) 内连接是最常用的查询方式之一,它返回两个中满足条件的数据记录。只有当两张中的数据匹配时才会被显示。 ```sql SELECT emp.name AS employee_name, dept.name AS department_name FROM emp INNER JOIN dept ON emp.dept_id = dept.id; ``` 此查询通过 `emp` `dept` 之间的 `dept_id` 字段建立了关系,并仅返回那些在两中都存在的记录[^1]。 --- #### 二、外连接 (OUTER JOIN) 外连接分为左外连接 (`LEFT OUTER JOIN`) 外连接 (`RIGHT OUTER JOIN`)。它们分别保留左侧或右侧中的所有记录,即使另一侧没有对应的匹配项也会显示出来。 ##### 左外连接 (LEFT OUTER JOIN) 左外连接会返回左边的所有记录以及右边中符合条件的记录;如果没有对应的关系,则右边的部分为空值。 ```sql SELECT users.name, orders.order_date, orders.order_amount FROM users LEFT JOIN orders ON users.user_id = orders.user_id; ``` 这段代码展示了如何获取所有的用户及其订单信息,即便某些用户尚未创建任何订单也依然会被列出[^5]。 ##### 右外连接 (RIGHT OUTER JOIN) 与此相反的是右外连接,它优先考虑右侧的内容: ```sql SELECT users.name, orders.order_date, orders.order_amount FROM users RIGHT JOIN orders ON users.user_id = orders.user_id; ``` 这里强调了即使是未绑定用户的孤立订单也能展示出来[^5]。 --- #### 三、全外连接 (FULL OUTER JOIN) 虽然 MySQL 不支持 FULL OUTER JOIN ,但在其他数据库系统如 PostgreSQL 或 Oracle 中可用。这种类型的连接组合了左外连结右外连结的功能,即无论哪一侧有无配对都会呈现完整的资料集。 ```sql -- 假设是在支持 FULL OUTER JOIN 的环境中运行 SELECT users.name, orders.order_date, orders.order_amount FROM users FULL OUTER JOIN orders ON users.user_id = orders.user_id; ``` 该命令旨在收集所有可能的相关条目而不论其是否存在对方端点上的关对象[^2]。 注意:对于不支持 FULL OUTER JOIN 的情况可以通过 UNION 来模拟实现这一功能。 --- #### 四、交叉连接 (CROSS JOIN) 交叉连接会产生笛卡尔积效果,意味着第一个格里的每一行都将同第二个格里每一条记录相乘形成新纪录集合。 ```sql SELECT * FROM tableA CROSS JOIN tableB; ``` 尽管这种方法很少用于实际应用当中因为它通常会导致非常庞大的结果集除非特别设计如此操作模式之外一般不会采用这种方式来进行日常数据分析工作[^3]. --- #### 五、并集/差集 运算符 除了传统的 JOIN 外还可以利用 UNION , INTERSECT 等关键字完成特定场景下的多处理需求. - **UNION**: 合并不重复的结果. ```sql SELECT column FROM tableA UNION SELECT column FROM tableB; ``` - **INTERSECT**: 获取交集部分 ```sql SELECT * FROM tableA INTERSECT SELECT * FROM tableB; ``` 这些工具提供了另一种视角去看待不同源之间共享或者差异之处的信息检索途径[^3]. --- ### 总结 以上就是几种常见的SQL查询的方式及其实现例子说明。根据具体的应用场合选择恰当的形式能够极大地提高效率同时也让我们的程序更加清晰易懂。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值