广告
返回顶部
首页 > 资讯 > 数据库 >连接查询(多表查询)——MySQL
  • 610
分享到

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

数据库mysql多表查询 2023-08-18 16:08:18 610人浏览 安东尼
摘要

连接查询(多表查询) 又称多表查询,当查询的字段涉及多个表的时候,就要用到连接查询 分类: 为表起别名: 提高语句的简洁度区分多个重名字段注意:如果为表起了别名,则查询的字段就不能使用原来的别名去限定 内连接 查询A、B 交集部分数据 语

连接查询(多表查询)

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

分类:

在这里插入图片描述

为表起别名:

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

内连接

查询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 eleft outer join dept as don 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实现连接条件和筛选条件的分离,可读性较高

来源地址:https://blog.csdn.net/mankeywang/article/details/124000347

您可能感兴趣的文档:

--结束END--

本文标题: 连接查询(多表查询)——MySQL

本文链接: https://www.lsjlt.com/news/374348.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 连接查询(多表查询)——MySQL
    连接查询(多表查询) 又称多表查询,当查询的字段涉及多个表的时候,就要用到连接查询 分类: 为表起别名: 提高语句的简洁度区分多个重名字段注意:如果为表起了别名,则查询的字段就不能使用原来的别名去限定 内连接 查询A、B 交集部分数据 语...
    99+
    2023-08-18
    数据库 mysql 多表查询
  • MySQL多表连接查询详解
    目录多表连接查询内连接左连接右连接子查询总结多表连接查询 表与表之间的连接分为内连接和外连接 内连接:仅选出两张表互相匹配的记录 外连接:既包括两张表匹配的记录,也...
    99+
    2022-11-12
  • 【MySQL系列】MySQL复合查询的学习 _ 多表查询 | 自连接 | 子查询 | 合并查询
    「前言」文章内容大致是对MySQL复合查询的学习。 「归属专栏」MySQL 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 一、基本查询回顾二、多表查询三、自连接四、子查询4.1 单行子查询4.2 多行子查询4....
    99+
    2023-08-30
    mysql 学习 android
  • MybatisPlus多表连接查询
    mybatis-plus作为mybatis的增强工具,它的出现极大的简化了开发中的数据库操作,但是长久以来,它的联表查询能力一直被大家所诟病。一旦遇到left join或right join的左右连接,你还是得老老实实的打开xml文件,手写...
    99+
    2023-08-16
    mybatis java mysql
  • MySQL数据库:多表连接查询
    多表连接查询 注意:使用连接技术建议将表经行重命名! # explain 检索连接是否达标 # 内连接 # 语法1 from 表1 inner join 表2 on 主键字段=外键字段 [where 条件表达式] # 语法2 ...
    99+
    2022-01-30
    MySQL数据库:多表连接查询
  • mysql 连接查询(俗称连表查询)内连接、外连接、自然连接
    连接查询的分类 本文讨论中用到的测试数据``create table student(id int primary key auto_increment,name varchar(10));ins...
    99+
    2022-10-18
  • MySQL之单表查询、多表查询
    一、单表查询: 单个表的查询方法及语法顺序需要通过实际例子来熟悉 先将表数据创建下: mysql> create database singe_t1; # 建个数据库singe_t1 Query OK, 1 row aff...
    99+
    2023-01-31
    MySQL
  • mysql如何实现多表连接查询
    这篇文章给大家分享的是有关mysql如何实现多表连接查询的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。实际的项目,存在多张表的关联关系。不可能在一张表里面就能检索出所有数据。如果...
    99+
    2022-10-18
  • MySql数据库单表查询与多表连接查询效率对比
    这段时间在做项目的过程中,遇到一个模块,数据之间的联系很复杂,在建表的时候就很纠结,到底该怎么去处理这些复杂的数据呢,是单表查询,然后在业务层去处理数据间的关系,还是直接通过多表连接...
    99+
    2022-11-12
  • MySQL联合查询(多表查询)
    一、内连接 select *from 表1 [ inner | cross ] join 表2 [ on过滤条件 ] [ where查询条件 ] ; [ inner | cross ]: join 内连接关键字(必须要有...
    99+
    2023-09-14
    mysql 数据库 database
  • 【MySQL】MySQL表之联合查询(多表查询)
    📌前言:本篇博客介绍MySQL数据库的MySQL表之联合查询(多表查询),学习MySQL之前要先安装好MySQL,如果还没有安装的小伙伴可以看看博主前面的博客,里面有详细的安装教程。 那我们废话不多说,直接进入主体!...
    99+
    2023-08-16
    mysql 数据库 java
  • mysql 连表查询
    MySQL 连表查询可以通过使用 JOIN 语句来实现,基本语法如下: SELECT 列名 FROM 表1 JOIN 表2 ON 表1.列名 = 表2.列名; 其中,JOIN 为关键字,表示连...
    99+
    2023-10-05
    mysql 数据库 sql
  • mysql连接查询
    11.5连接查询(列连接) 问题:学生表有十条数据,成绩表有十条数据。 连接之后有多少条数据(笛卡尔积):10*10=100   连续查询会产生笛卡尔积;假设集合A = {a,b},集合B = {c,d} 两个集合的笛卡尔积{(a,c),...
    99+
    2020-01-06
    mysql连接查询
  • MySQL之连接查询和子查询
    多表连接的基本语法 多表连接,就是将几张表拼接为一张表,然后进行查询 select 字段1, 字段2, ... from 表1 {inner|lift|right} join 表2 on 连接条件; 有如下两张表:部门表和员工...
    99+
    2015-01-24
    MySQL之连接查询和子查询
  • 如何对MYSQL多表实现连接查询
    下面一起来了解下如何对MYSQL多表实现连接查询,相信大家看完肯定会受益匪浅,文字在精不在多,希望如何对MYSQL多表实现连接查询这篇短内容是你想要的。3种连接方式的区别:INNER JOIN(内连接,或等...
    99+
    2022-10-18
  • MySQL 四种连接和多表查询详解
    目录MySQL内连接、左连接、右连接、外连接、多表查询构建环境:一、INNERJION内连接(A∩B)二、LEFTJOIN左外连接(A全有)三、RIGHTJOIN右外连接(B全有)四...
    99+
    2022-11-12
  • mysql中怎么实现多表连接查询
    这篇文章将为大家详细讲解有关mysql中怎么实现多表连接查询,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。代码如下:SELECT FId ...
    99+
    2022-10-18
  • MySQL----多表查询
    MySQL----多表查询 多表关系表与表之间的联系:一对多(多对一)多对多一对一 多表查询多表查询的分类数据准备内连接外连接自连接联合查询子查询标量子查询列子查询行子查询表子查询 多表查询案例 多表关系 在进...
    99+
    2023-08-19
    mysql sql 数据库 多表查询 DB
  • 【MySQL】多表查询
    多表查询 多表关系 一对多(多对一)多对多一对一 一对多 案例:部门与员工 关系:一个部门对应多个员工,一个员工对应一个部门 实现:在多的一方建立外键,指向一的一方的主键 多对多 案例:学生与课程 关...
    99+
    2023-10-04
    mysql 数据库 sql
  • MySQL 多表查询
      union 结果集合并 使用多个select分别查询不同的表,把多个select查到的记录合并在一起 一个select查到m条记录,另一个select查到n条记录,合并之后就是m+n条记录   #查询全校...
    99+
    2017-05-29
    MySQL 多表查询
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作