连接查询(续)— SQL99语法

2024-04-29 15:58
文章标签 查询 连接 语法 sql99

本文主要是介绍连接查询(续)— SQL99语法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 进阶6:连接查询(续)
    • SQL99语法
      • (一)内连接
        • 1、等值连接
        • 2、等值连接
        • 3、自连接
      • (二)外连接
      • (三)交叉连接(笛卡尔乘积)
  • 测试:

进阶6:连接查询(续)

SQL99语法

语法:select 查询列表from 表1 别名 【连接类型】join 表2 别名on 连接条件【where 筛选条件】【group by 分组】【having 筛选条件】【order by 排序条件】分类:内连接:inner外连接:左外:left【outer】右外:right【outer】全外:full【outer】交叉连接:cross

(一)内连接

在这里插入图片描述

语法:

select 查询列表
from 表1 别名 
inner join 表2 别名
on 连接条件
【where 筛选条件】
【group by 分组】
【having 筛选条件】
【order by 排序条件】分类:等值非等值自连接特点:
①添加排序、分组、筛选
②inner可以省略
③ 筛选条件放在where后面,连接条件放在ON后面,提高分离性,便于阅读
④inner join连接和sql92语法中的等值连接效果是一样的,都是查询多表的交集
1、等值连接

案例1 :查询员工名、部门名

SELECT last_name,department_name 
FROMemployees e INNER JOIN departments d ON e.`department_id` = d.`department_id` ;

结果:
在这里插入图片描述
案例2:查询名字中包含e的员工名和工种名(添加筛选)

SELECT last_name,job_title 
FROMemployees e INNER JOIN jobs j ON e.`job_id` = j.`job_id` 
WHERE last_name LIKE "%e" ;

结果:
在这里插入图片描述
案例3:查询部门个数>3的城市名和部门个数,(添加分组+筛选)
分步骤:

  1. 查询每个城市的部门个数
  2. 在1结果上筛选满足条件的
SELECT city,COUNT(*) 部门个数 
FROMlocations l INNER JOIN departments d ON d.`location_id` = l.`location_id` 
GROUP BY city 
HAVING COUNT(*) > 3 ;

结果:
在这里插入图片描述
案例4:查询哪个部门的员工个数>3的部门名和员工个数,并按个数降序(添加排序)

SELECT department_name,COUNT(*) 员工个数 
FROMdepartments d INNER JOIN employees e ON d.`department_id` = e.`department_id` 
GROUP BY department_name 
HAVING COUNT(*) > 3 
ORDER BY COUNT(*) DESC ;

结果:
在这里插入图片描述
案例5:查询员工名、部门名、工种名,并按部门名降序(添加三表连接)

SELECT last_name,department_name,job_title 
FROMemployees e INNER JOIN departments d ON e.`department_id` = d.`department_id` INNER JOIN jobs j ON e.`job_id` = j.`job_id` 
ORDER BY department_name DESC ;

结果:
在这里插入图片描述

2、等值连接

案例1:查询员工的工资级别

SELECT salary,grade_level 
FROMemployees e INNER JOIN job_grades j ON e.`salary` BETWEEN j.`lowest_sal` AND j.`highest_sal` ;

结果:
在这里插入图片描述
案例2:查询工资级别的个数>20的个数,并且按工资级别降序

SELECT COUNT(*) 个数,grade_level 
FROMjob_grades j INNER JOIN employees e ON e.`salary` BETWEEN j.`lowest_sal` AND j.`highest_sal` 
GROUP BY grade_level 
HAVING COUNT(*) > 20 
ORDER BY grade_level DESC ;

结果:
在这里插入图片描述

3、自连接

案例1:查询员工的名字、上级的名字

SELECT e.`last_name`,m.`last_name` 
FROMemployees e INNER JOIN employees m ON e.`manager_id` = m.`employee_id` ;

结果:
在这里插入图片描述
案例2:查询姓名中包含字符k的员工的名字、上级的名字

SELECT e.`last_name` 姓名,m.`last_name` 上级姓名 
FROMemployees e INNER JOIN `employees` m ON e.`manager_id` = m.`employee_id` 
WHERE e.`last_name` LIKE "%k%" ;

结果:
在这里插入图片描述

(二)外连接

在这里插入图片描述

应用场景:用于查询一个表中有,另一个表没有的记录
结果=表1能一一匹配表2-内容+表1不能不配表2-内容(为NULL)
特点:

  1. 外连接的查询结果为主表中的所有记录
    如果从表中有和它匹配的,则显示匹配的值
    如果从表中没有和它匹配的,则显示NULL
    外连接查询结果=内连接结果+主表中有而从表没有的记录
  2. 左外连接,left join 左边的是主表
    右外连接,right join 右边的是主表
  3. 左外和右外交换两个表的顺序,可以实现同样的效果
  4. 全外连接=内连接的结果(交集)+表1中有但表2没有的+表2中有但表1没有的

引入:查询男朋友 不在男神表的的女神名(左外连接)

SELECT b.`name`,bo.* 
FROMbeauty b LEFT OUTER JOIN boys bo ON b.`boyfriend_id` = bo.`id` 

结果:
在这里插入图片描述
案例1:查询哪个部门没有员工
(1)左外

SELECT d.*,e.employee_id 
FROMdepartments d LEFT OUTER JOIN employees e ON d.`department_id` = e.`department_id` 
WHERE e.`employee_id` IS NULL ;

结果:
在这里插入图片描述
(2)右外

SELECT d.*,e.employee_id 
FROMemployees e RIGHT OUTER JOIN departments d ON d.`department_id` = e.`department_id` 
WHERE e.`employee_id` IS NULL ;

结果和上面的结果一样

(3)全外(不支持)

USE girls ;SELECT b.*,bo.* 
FROMbeauty b FULL OUTER JOIN boys bo ON b.`boyfriend_id` = bo.id ;

(三)交叉连接(笛卡尔乘积)

在这里插入图片描述

SELECT b.*,bo.* 
FROMbeauty b CROSS JOIN boys bo ;

测试:

1、查询编号>3的女神的男朋友信息,如果有则列出详细,如果没有,用NULL填充

SELECT b.`id`,b.`name`,bo.* 
FROMbeauty b LEFT OUTER JOIN boys bo ON b.`boyfriend_id` = bo.`id` 
WHERE b.`id` > 3 ;

结果:
在这里插入图片描述
2、查询哪个城市没有部门

SELECT city,d.* 
FROMdepartments d RIGHT OUTER JOIN locations l ON d.`location_id` = l.`location_id` 
WHERE d.`department_id` IS NULL ;

结果:
在这里插入图片描述
3、查询部门名为SAL或IT的员工信息

SELECT d.department_name,e.* 
FROMdepartments d LEFT JOIN employees e ON d.`department_id` = e.`department_id` 
WHERE d.`department_name` IN('SAL','IT');

结果:
在这里插入图片描述

这篇关于连接查询(续)— SQL99语法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/946521

相关文章

从入门到精通MySQL联合查询

《从入门到精通MySQL联合查询》:本文主要介绍从入门到精通MySQL联合查询,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下... 目录摘要1. 多表联合查询时mysql内部原理2. 内连接3. 外连接4. 自连接5. 子查询6. 合并查询7. 插入查询结果摘要前面我们学习了数据库设计时要满

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

mysql表操作与查询功能详解

《mysql表操作与查询功能详解》本文系统讲解MySQL表操作与查询,涵盖创建、修改、复制表语法,基本查询结构及WHERE、GROUPBY等子句,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随... 目录01.表的操作1.1表操作概览1.2创建表1.3修改表1.4复制表02.基本查询操作2.1 SE

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN

XML重复查询一条Sql语句的解决方法

《XML重复查询一条Sql语句的解决方法》文章分析了XML重复查询与日志失效问题,指出因DTO缺少@Data注解导致日志无法格式化、空指针风险及参数穿透,进而引发性能灾难,解决方案为在Controll... 目录一、核心问题:从SQL重复执行到日志失效二、根因剖析:DTO断裂引发的级联故障三、解决方案:修复

mysql查询使用_rowid虚拟列的示例

《mysql查询使用_rowid虚拟列的示例》MySQL中,_rowid是InnoDB虚拟列,用于无主键表的行ID查询,若存在主键或唯一列,则指向其,否则使用隐藏ID(不稳定),推荐使用ROW_NUM... 目录1. 基本查询(适用于没有主键的表)2. 检查表是否支持 _rowid3. 注意事项4. 最佳实

SpringBoot连接Redis集群教程

《SpringBoot连接Redis集群教程》:本文主要介绍SpringBoot连接Redis集群教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 依赖2. 修改配置文件3. 创建RedisClusterConfig4. 测试总结1. 依赖 <de

MySQL存储过程之循环遍历查询的结果集详解

《MySQL存储过程之循环遍历查询的结果集详解》:本文主要介绍MySQL存储过程之循环遍历查询的结果集,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言1. 表结构2. 存储过程3. 关于存储过程的SQL补充总结前言近来碰到这样一个问题:在生产上导入的数据发现

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA