连接查询(多表查询)——MySQL

article/2025/9/24 9:01:55

连接查询(多表查询)

又称多表查询,当查询的字段涉及多个表的时候,就要用到连接查询

分类:

在这里插入图片描述

为表起别名:

  • 提高语句的简洁度
  • 区分多个重名字段
  • 注意:如果为表起了别名,则查询的字段就不能使用原来的别名去限定

内连接

查询A、B 交集部分数据

语法:

  1. 隐式内连接
    select 字段列表 from 表1,表2 where 筛选条件 ;

  2. 显式内连接
    select 字段列表 from 表1 【inner】 join 表2 on 连接条件 ... ;

  • 例题:

查询每一个员工的姓名 , 及关联的部门的名称
表结构: emp , dept
连接条件: emp.dept_id = dept.id

  • 隐式内连接实现
select emp.name , dept.name from emp , dept where emp.dept_id = dept.id ;

若果有员工没有部门,则不会显示

  • 显示内连接实现
select e.name, d.name 
from emp as e 
join dept as d 
on e.dept_id = d.id;

外连接

在这里插入图片描述

左右外连接

  1. 左外连接

左外连接相当于查询表A(左表)的所有数据和中间绿色的交集部分的数据。
表1的位置为左表,表2的位置为右表

select  字段列表  
from1  
leftouterjoin2  
on  条件...
  1. 右外连接
    右外连接相当于查询表B(右表)的所有数据和中间绿色的交集部分的数据。
    表1的位置为左表,表2的位置为右表
select  字段列表  
from1  
rightouterjoin2  
on  条件...
  • 想把右外连接改成左外连接,并且查询结果不改变,可以把right改为left,并且把表1和表2的位置调换

  • 例题:

  1. 查询emp表的所有数据, 和对应的部门信息
    由于需求中提到,要查询emp的所有数据,所以是不能内连接查询的,因为有一些中间数据查询不到,需要考虑使用外连接查询。
    表结构: emp, dept
    连接条件: emp.dept_id = dept.id
    (左外连接)
select e.*, d.name  
from  emp as e
left outer join dept as d
on e.dept_id = d.id
  1. 查询dept表的所有数据, 和对应的员工信息

表结构: emp, dept
连接条件: emp.dept_id = dept.id
(右外连接)

select d.*, e.* 
from emp e  # 左表
right outer join dept as d  # 右表 
on e.dept_id = d.id;

将右外改为左外

select d.*, e.* 
from dept as d 
left outer join emp as e 
on e.dept_id = d.id;

自连接

自连接查询,顾名思义,就是自己连接自己,也就是把一张表连接查询多次。

  • 语法:
select  字段列表  
from1  as 别名1  
join1  as 别名2  
on 条件....

注意:自连接表一定要起别名

对于自连接查询,可以是内连接查询,也可以是外连接查询

在这里插入图片描述

  • 例题: 1. 查询员工 及其 所属领导的名字,

普通员工和领导其实都属于员工,都在员工表当中,每个员工又有一项manager_id记录这他的领导的id值
用内连接

select a.name , b.name 
from emp as a , emp as b 
where a.managerid = b.id;
  • 例题2. 查询所有员工 emp 及其领导的名字 emp , 如果员工没有领导, 也需要查询出来
    表结构: emp a , emp b
    用外连接
select a.name as '员工', b.name as '领导' 
from emp as a 
left join emp as b 
on a.managerid = b.id;
  1. 当要查询girl表中的g_name和boy表中的b_name,girl表中的boyfriend_id与boy表中的id是对应的
    select g_name,b_name from boy,bearty
    where girl.boufriend_id = boy.id
    如果不加where筛选条件的话,会显示笛卡尔乘机的效果,出现许多的无用项

会用第一个表中的每一行和第二个表中的每一行进行逐个匹配,然后进行筛选,如果匹配会筛选出来
可以自由调换表的顺序

  1. 查询员工名和对应的部门名,员工名在employees表中,部门名在department表中
    select last_name,department_name
    from employees,department
    where employees.'department_id',department.'department_id'

SQL92语法

等值连接

为表起别名

当语句中经常出表名作用域的时候,每条语句就会很长,为精简语句

  1. 查询员工名,工种号,工种名
    select e.last_name,e.job_id,j.job_title
    from employees as e , job as j
    where e.'job_id'= j.job_id

加筛选条件

  1. 查询有奖金的员工名、部门名
    select last_name,department_name
    from employees as e , department as d
    where e.'department_id' = d.'department_id'
    and e.'commission_pct'is not null 已经有一个where筛选了不能再用where,用and

  2. 查询城市名中第二个字符为o的部门名和城市名
    select department_name,city
    from department as d,location as l
    where d.'location_id' = l.'location_id'
    and city like '_o%'

加分组

  1. 查询每个城市的部门个数
    select count(*) as 个数 , city
    from department as d = location as l
    group by city

  2. 查询有奖金的每个部门的部门名,和部门的领导编号和该部门的最低工资标准
    select department_name , manager_id,min(salary)
    from employees as e , department as d
    where e.'department_id' = d.'department_id'
    and commission_pct is not null
    group by department_name,d,manager_id ;

加排序

  1. 查询每个工种的工种名和员工的个数,并按员工个数降序
    select job_title , count(*)
    from employees as e , job as j
    where e.'job_id'= j.job_id
    group by job_title
    order by count(*) desc

实现三表连接

  1. 查询员工名,部门名,和所用城市名
    select last_name,department_name,city
    from employees as e , department as d , location as l
    where e.'department_id' = d.'department_id'
    and d.'location_id' = l.'location_id'

非等值连接

也就是把上面的等于号换成了不等于(大于、小于、不等)

  1. 查询员工的工资和工资级别
    select salary,grade_level
    from employees e,job_frades g
    where salary between g.'lowest_sal' and g.'higthest_sal'
    追加其他条件。
    and g.'lowest_sal'='A';只查看等级为A的

自连接

把原来这一张表当做多张表来使用,由表中的数据找到另一个数据,再由找到的数据回过头来找另一个数据,可以这样往复下去

  1. 查询员工名,和他对应的上级名,每一个有员工对应的上级编号
    select e.employee_id,e.last_name,m.employee_id,m.last_name
    from employees.e,employees.me代表员工表,m代表领导表。其实都在一张表里,重命名来避免冲突
    where e.'manager_id' = m.'employees_id'

SQL99语法

语法:
select 查寻列表
from 表1 as 别名 【连接类型】
join 表2 as 别名
on【连接条件】
【where 筛选条件】
【group by 分组】
【having 筛选条件】
【order by 排序列表】

内连接

1.等值连接

  • 特点
    1. 可以添加排序、分组、筛选
    2. inner可以省略
    3. 筛选条件放在where后面,连接条件放在on后面,提高分离性,便于阅读。
    4. inner join连接SQL192语法中的等值连接效果是一样的,都是查询多表的交集。
  1. 查询员工名,部门名
    select last_name,department_name
    from department d
    innner join demployees as e
    on e.'department_id' = d.'department_id'

  2. 查询名字中包含e的员工名和工种名(添加了筛选条件)
    select last_name,job_id
    from employees as e
    inner join as j
    on e.'job_id' = j.'job_id'
    where e.'last_name' like '%e%' ;

  3. 查询部门个数>3的城市名和部门个数(添加分组、筛选条件)
    select city,count(*) as 部门个数
    from departments as d
    inner hoin locations as l
    on d.'location_id' = l.'location_id'
    group by city
    having count(*)>3

  4. 查询哪个部门的员工个数>3的部门名和员工个数,并按个数降序
    select count(*) , department_id
    from employees as e
    inner hoin departments as d
    on e.'department_id' = d.'department_id'
    group by department_name
    having count(*)>3
    order by count(*) desc

1.非等值连接

  1. 查询员工的工资级别
    select salary,grade_level
    from employees as e
    join job_grades as g
    on e.'salary' between g.'lowest_sal' and g.'hightest_sal' ;

  2. 查询每个工资级别的个数,并按照级别降序。
    select count(*),grade_level
    from employees as e
    join job_grades as g
    on e.'salary' between g.'lowest_sal' and g.'hightest_sal'
    having count(*)>20
    order by grade_lecel desc

自连接

把原来这一张表当做多张表来使用,由表中的数据找到另一个数据,再由找到的数据回过头来找另一个数据,可以这样往复下去

  1. 查询员工名,和他对应的上级名 (每一个有员工对应的上级编号)
    select m.employee_id,m.last_name
    from employees as e e代表员工表,m代表领导表。其实都在一张表里,重命名来避免冲突
    join employees as m
    on e.'manager_id' = m.'employees_id'

外连接

用于查询主表的时候,主表中没有,但是附表中,主表通过外连接附表来查询数据
特点:

  1. 外连接查询结果为主表中的所有数据。
    如果主表中有与之匹配的显示匹配值。
    表中没有与之匹配的显示null
    外连接查询结果=内连接结果+主表中有而从表中没有的数据

  2. 左外连接,left join左边的是主表
    右外连接,right join右边的是主表。

  3. 左外和右外交换两个表的顺序可以实现同样的效果。

  4. 查询男朋友 不在男神表的的女神名

    左外连接
    SELECT b.*,bo.*
    FROM boys bo
    LEFT OUTER JOIN beauty b
    ON b.'boyfriend_id' = bo.'id'
    WHERE b.'id' IS NULL;

  5. 查询哪个部门没有员工

    1. 左外
      SELECT d.*,e.employee_id
      FROM departments 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
      FROM employees e
      RIGHT OUTER JOIN departments d
      ON d.'department_id' = e.'department_id'
      WHERE e.'employee_id' IS NULL;

全外
USE girls;
SELECT b.*,bo.*
FROM beauty b
FULL OUTER JOIN boys bo
ON b.'boyfriend_id' = bo.id;

交叉连接

SELECT b.*,bo.*
FROM beauty b
CROSS JOIN boys bo;

sql92和 sql99 pk

功能:sql99支持的较多
可读性:sql99实现连接条件和筛选条件的分离,可读性较高


http://chatgpt.dhexx.cn/article/VU82sqFd.shtml

相关文章

MySQL-多表查询

一、表架构 student(sid,sname,sage,ssex) 学生表course(cid,cname,tid) 课程表sc(sid,cid,score) 成绩表teacher(tid,tname) 教师表 二 、建表sql语句 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0;-- ---------------------------- -- Table structure for course -- --…

Java中的XML解析

前言 这几天在手写Spring IOC的时候遇上了xml文件的解析,通过解析Spring.xml配制文件的方式来创建对象。因为之前从来都没遇见过相关的需求,所以对此做一份记录 XML (eXtensible Markup Language) 意为可扩展标记语言,被多数技术人员用以选择…

Java - XML文件解析

Java对XML文件的解析 一、前言二、实例分析 - DOM方式解析XML文件2.1 XMLDomParseUtil - 抽象工具类2.2 待解析xml文件示例2.3 解析xml文件2.3.1 新建一个用于存储xml文件中各节点的属性和属性值的类2.3.2 解析实际节点 2.4 测试 一、前言 1、HTTP网络传输中的数据组织方式有三…

Java解析XML文件的方式

在项目里,我们往往会把一些配置信息放到xml文件里,或者各部门间会通过xml文件来交换业务数据,所以有时候我们会遇到“解析xml文件”的需求。一般来讲,有基于DOM树和SAX的两种解析xml文件的方式,在这部分里,…

java解析xml格式的节点属性值

xml示例&#xff1a; <ResponseContent><Parameter><Document><RecordSet id"1"><Master name"purchase"><Record><Field name"orderNumber" value"1P05-151200172"/><Field name"…

Java解析XML字符串

在网上找了很多Java语言解析XML字符串的资料&#xff0c;很多内容写得很繁复&#xff0c;没有普适性&#xff0c;遂自己动手写了一个用Java解析XML的工具类。话不多说&#xff0c;直接看下面代码&#xff1a; XML解析工具类&#xff1a; import org.dom4j.Document; import o…

JAVA解析xml报文

目录 问题需求 响应报文格式 1&#xff0c;开发导入的依赖 2&#xff0c;开发样例 3&#xff0c;测试结果 问题需求 在工作中此项目请求指定项目之后&#xff0c;项目会返回一个xml报文格式的响应&#xff0c;此时我需要判断返回的报文是否是成功的响应报文&#xff0c;如…

Java解析xml

记录工作中遇到的一些问题和解决方式&#xff0c;自己摘抄整理了一下用来巩固&#xff0c;如有不足或有更好的方式 欢迎交流。 java解析xml的话有四种方式&#xff0c;分别为DOM,SAX,DOM4J,JDOM 转载&#xff1a;Java解析XML(4种方法)_蓝星花的博客-CSDN博客_java解析xml 这里的…

Java解析XML(4种方法)

xml文件 <?xml version"1.0" encoding"utf-8" ?> <class><student><firstname>cxx1</firstname><lastname>Bob1</lastname><nickname>stars1</nickname><marks>85</marks></stud…

混合开发架构|Android工程集成React Native、Flutter、ReactJs

混合开发架构|Android工程集成React Native、Flutter、ReactJs 架构设计说明创建安卓原生工程创建Flutter集成嵌入原生工程 创建React Native解决RN报错问题集成嵌入原生工程RN集成后&#xff0c;启动报错 底部导航栏架构设计原生仿招商银行首页原生Android Socket 即时通讯Rea…

Android MVVM开发框架

MVVM 数据双向绑定&#xff0c;通过数据驱动UI&#xff0c;M提供数据&#xff0c;V视图&#xff0c;VM即数据驱动层 MVP框架图 &#xff08;图片来源于网络&#xff09; 学习MVVM开发框架&#xff0c;要先了解DataBinding&#xff0c;DataBinding 是什么&#xff1f; DataBi…

Android: 开发框架设计

Android 开发框架 Android运用框架的目的不外乎是实现代码的代码解耦、逻辑分类、快速集成 便于维护等目的&#xff1b;Android 开发架构从早期的MVC &#xff0c;到近年到MVP 架构&#xff0c;到最近流行到MVVM 架构。不断到对业务逻辑、代码结构进行分层&#xff0c;便于快速…

安卓框架

http://www.cnblogs.com/jincheng-yangchaofan/articles/7018780.html 框架&#xff1a;提供一定能力的小段程序 一.榜单介绍 排行榜包括四大类&#xff1a; 单一框架&#xff1a;仅提供路由、网络层、UI层、通信层或其他单一功能的框架 混合开发框架&#xff1a;提供开发hy…

安卓应用开发顶级框架大盘点,总有一款适合你

作者 | Slava Vaniukov 译者 | 苏本如&#xff0c;责编 | 夕颜 封图 | CSDN下载自视觉中国 出品 | CSDN&#xff08;ID:CSDNnews&#xff09; 随着软件开发向移动应用的转变&#xff0c;越来越多的企业意识到&#xff0c;移动应用程序对于企业和客户之间建立牢固的联系至关重要…

嵌入式Android底层开发(一)——安卓开发的整体框架与简述

一、Android简介 Android是一种基于Linux内核&#xff08;不包含GUN组件&#xff09;的自由及开放源代码的操作系统&#xff0c;主要使用于移动设备&#xff0c;如智能手机和平板电脑&#xff0c;由美国Google公司和开放手机联盟领导及开发。 主要参数表&#xff1a; 参数上…

Android 框架

背景 我们有一个需求&#xff1a;我们需要查询用户账号信息&#xff0c;用户输入账号&#xff0c;点击按钮可进行查询账号信息&#xff0c;如果查询数据成功&#xff0c;则将数据展示在界面上&#xff1b;如果查询数据失败&#xff0c;则在界面上提升获取数据失败。 假如说我们…

Android - 框架使用

目录 1 Gson解析JSON 1.1 引入依赖 1.2 使用 1.3 安装插件 1.4 Demo 2 下滑刷新&#xff0c;上滑加载新数据 2.1 背景 2.2 引入依赖 2.3 代码实现 3 加载网络图片 3.1 背景 3.2 引入依赖 3.3 代码实现 4 轮播图 4.1 引入依赖 4.2 代码实现 5 网络数据请求 Re…

Android 快速开发框架 集成框架

由于自己经常写项目&#xff0c;没有一个方便开发的一套框架怎么行&#xff0c;所以在日常开发总自己整理了一套&#xff0c;请各位过目&#xff0c;不喜勿喷。一个新项目搭建需要具备的环境:先导入我制作的jar包。添加必要的权限。需要一个Application初始化数据,下面开始调用…

Android应用-开发框架设计

目录 1. &#x1f4c2; 简介 1.1 背景 1.2 专业术语 2. &#x1f531; 总体设计思想 2.1 分层&#xff1a;组件化设计框架 2.2 分类&#xff1a;应用开发架构图 3. ⚛️ 框架详细设计 3.1 组件化框架外形 3.2 业务模块化 3.3 代码编程框架 4. &#x1f4a0; 框架其他…

Android常用框架

1.缓存框架 1.1DiskLruCache&#xff1a;Java实现基于LRU的磁盘缓存&#xff0c;DiskLruCache不是google官方所写&#xff0c;但是得到了官方推荐&#xff0c;DiskLruCache没有编写到SDK中去&#xff0c;如需使用可直接copy这个类到项目中去。使用场景&#xff1a;如“清除…