当前位置: 首页 > news >正文

mysql学习教程,从入门到精通,SQL 删除表(DROP TABLE 语句)(21)

1、SQL 联表查询(Join)

在编写SQL联表查询(Join)时,我们首先要明确查询的目的,即我们需要从哪些表中提取数据,以及这些表之间如何关联。以下是一个简单的示例,假设我们有两个表:employees(员工表)和departments(部门表)。我们的目标是查询出每个员工的姓名、部门ID以及他们所属的部门名称。

1.1、表结构

employees 表

  • employee_id INT:员工ID
  • name VARCHAR:员工姓名
  • department_id INT:部门ID
    departments 表
  • department_id INT:部门ID
  • department_name VARCHAR:部门名称

1.2、SQL 联表查询

为了实现我们的目标,我们可以使用 INNER JOIN(内连接),因为它会返回两个表中匹配的记录。如果员工所属的部门在 departments 表中存在,则该员工的信息及其部门名称将被返回。

SELECT  e.name AS employee_name,  e.department_id,  d.department_name  
FROM  employees e  
INNER JOIN departments d ON e.department_id = d.department_id;

1.3、解释

  1. SELECT 语句:我们选择了 employees 表中的 name 列(重命名为 employee_name),department_id 列,以及 departments 表中的 department_name 列。
  2. FROM 语句:指定了查询的起始表为 employees,并且我们为这个表设置了一个别名 e,以便在后续的查询中简化引用。
  3. INNER JOIN 语句:通过 INNER JOIN 语句将 employees 表与 departments 表连接起来。连接条件是 e.department_id = d.department_id,即 employees 表中的 department_id 列的值必须等于 departments 表中的 department_id 列的值。同样,我们也为 departments 表设置了一个别名 d
  4. ON 子句:指定了 JOIN 的条件,即如何连接这两个表。在这个例子中,条件是员工所属的部门ID与部门表中的部门ID相匹配。
    通过这种方式,我们可以得到每个员工及其所属部门的名称,结果集将只包含那些在 departments 表中有对应部门ID的 employees 表中的记录。如果你想要包括那些在 departments 表中没有对应部门ID的 employees 表中的记录(例如,那些尚未分配部门的员工),你可以使用 LEFT JOIN 替代 INNER JOIN。
    当然可以,以下是一些具体的SQL联表查询(Join)案例,这些案例将展示不同类型的JOIN操作(如INNER JOIN、LEFT JOIN、RIGHT JOIN等)在实际应用中的使用。

1.4、案例一:INNER JOIN(内连接)

场景:查询所有已分配部门的员工及其部门名称。
表结构

  • employees 表:包含员工ID、员工姓名和部门ID。
  • departments 表:包含部门ID和部门名称。
    SQL查询
SELECT  e.employee_id,  e.name AS employee_name,  d.department_name  
FROM  employees e  
INNER JOIN departments d ON e.department_id = d.department_id;

结果:返回所有在 departments 表中有对应部门ID的 employees 表中的记录,包括员工ID、员工姓名和部门名称。

1.5、案例二:LEFT JOIN(左连接)

场景:查询所有员工及其部门名称,包括那些尚未分配部门的员工。

SQL查询

SELECT  e.employee_id,  e.name AS employee_name,  d.department_name  
FROM  employees e  
LEFT JOIN departments d ON e.department_id = d.department_id;

结果:返回 employees 表中的所有记录,对于在 departments 表中没有对应部门ID的员工,其部门名称将显示为NULL。

1.6、案例三:RIGHT JOIN(右连接)

注意:在实际应用中,RIGHT JOIN 较少使用,因为可以通过交换表的位置和使用LEFT JOIN来达到相同的效果。但为了完整性,这里还是给出一个例子。
场景:查询所有部门及其对应的员工姓名(如果有的话)。
SQL查询

SELECT  d.department_id,  d.department_name,  e.name AS employee_name  
FROM  departments d  
RIGHT JOIN employees e ON d.department_id = e.department_id;

结果:返回 departments 表中的所有记录,对于在 employees 表中没有对应员工的部门,其员工姓名将显示为NULL。但请注意,这个查询在逻辑上与将 employeesdepartments 表的位置互换并使用LEFT JOIN是等效的。

1.7、案例四:FULL JOIN(全连接)

注意:并非所有数据库系统都支持FULL JOIN,但可以通过UNION操作结合LEFT JOIN和RIGHT JOIN来模拟。
场景:查询所有员工及其部门名称,包括那些尚未分配部门的员工和那些没有员工的部门。
模拟FULL JOIN的SQL查询

SELECT  e.employee_id,  e.name AS employee_name,  d.department_name  
FROM  employees e  
LEFT JOIN departments d ON e.department_id = d.department_id  
UNION  
SELECT  e.employee_id,  e.name AS employee_name,  d.department_name  
FROM  employees e  
RIGHT JOIN departments d ON e.department_id = d.department_id  
WHERE e.employee_id IS NULL; -- 排除LEFT JOIN中已经包含的记录

但请注意,上面的查询实际上并不完全正确,因为它会尝试从RIGHT JOIN中选择NULL的 employee_id,这在大多数情况下并不是我们想要的。一个更准确的模拟FULL JOIN的方法是分别执行LEFT JOIN和RIGHT JOIN,并确保RIGHT JOIN部分只选择那些在LEFT JOIN中未出现的记录(这通常涉及到子查询或临时表)。然而,为了简洁起见,这里不展示完整的模拟过程。
在实际应用中,如果数据库支持FULL JOIN,可以直接使用它,如下所示:

SELECT  e.employee_id,  e.name AS employee_name,  d.department_name  
FROM  employees e  
FULL JOIN departments d ON e.department_id = d.department_id;

这将返回两个表中的所有记录,对于不匹配的记录,相应的字段将显示为NULL。


http://www.mrgr.cn/news/33026.html

相关文章:

  • 深耕电通二十年,崔光荣升电通中国首席执行官
  • Linux基础---13三剑客及正则表达式
  • 网络丢包定位记录(二)
  • AI一点通: 简化大数据与深度学习工作流程, Apache Spark、PyTorch 和 Mosaic Streaming
  • 黑群晖安装教程
  • Centos Stream 9+PHP8+TP8+Workerman4.1+Nginx代理SSL
  • 【计网】从零开始掌握序列化与反序列化 --- 基础知识储备与程序重构
  • Android SystemUI组件(07)锁屏KeyguardViewMediator分析
  • 简单水印通过python去除
  • C++原始指针的补充
  • Linux命令:用于创建新的用户组的命令行工具groupadd 详解
  • 链表(单向不带头非循环)
  • 深入理解指针(5)
  • 使用Django 搭建自动化平台
  • 求1000以内所有恰好能分解成10组两个素数之和
  • Python爬虫-Post请求中,参数只有value没有key,如何正确处理?
  • 初始网络编程(下)
  • 常见的中间件漏洞
  • MySQL高阶1907-按分类统计薪水
  • 华为摄像机/NVR主动注册协议接入SVMSP平台