MySQL基础——DQL语言的学习(连接查询)

本文涉及的产品
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
RDS Agent(兼容OpenClaw),2核4GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: DQL语言学习进阶六(连接查询)!

DQL语言学习进阶六(连接查询)

一、含义

连接查询又称多表查询,当查询的字段来自于多个表时,就会用到连接查询


二、笛卡尔乘积现象

当查询多个表时,没有添加有效的连接条件,导致多个表所有行实现完全连接

表1有m行,表2有n行,结果m*n行

发生原因:没有有效的连接条件

如何避免:添加有效的连接条件


三、分类

(一) 按年代分类

sql92标准(仅支持内连接)

sql99标准【推荐】


(二) 按功能分类

   内连接:

     等值连接

     非等值连接

     自连接

   外连接:

     左外连接

     右外连接

    全外连接(MySQL不支持)

   交叉连接


一、sql92标准

1、等值连接

语法:

select 查询列表
from 表1 别名,表2,别名
where 表1.key= 表2.key【and 筛选条件】
【group by 分组字段】
【having 分组后的筛选】
【order by 排序字段】

特点:等值标准:

(1)多表等值连接的结果为多表的交集部分

(2)n表连接,至少需要n-1个连接条件

(3)多表的顺序没有要求

(4)一般需要为表起别名

(5)可以搭配前面介绍的所有子句使用,比如排序、分组、筛选


例1:查询女神名和对应的男神名

select name,boyname 
from boys, beauty
where beauty.boyfriend_id= boys.id;

例2:查询员工名和对应的部门名

select last_name, department_name
from employee, department
where employee. 'department_id'=department.'department_id';

为表起别名

(1)提高语句简洁度

(2)区分多个重名的字段

注:如果为表起了别名,则查询的字段就不能使用原来的表名去限定


例:查询员工号,工种号,工种名

select e.last_name, e.job_id, j.job_titlefrom employee e, job j
where e.'job_id'= j.'job_id';

两个表的顺序可以调换

可以添加筛选


例1、查询有奖金的员工名,部门名

select last_name,department_name
from employee e, department d
where e.'department_id'= d.'department_id'and e.'commssion_pct'isnotnull;

例2、查询城市名中第二个字段为o的部门名和城市名

select department_id, city
from department d, location l
where d.'location_id'= l.'location_id'and city like'_o%';

可以加分组


例1、查询每个城市的部门数

selectcount(*) 个数,city
from department d, location l
where d.'location_id'= l.'location_id'groupby city;

可以加函数


例:查询每个工种的工种名和员工的个数,并且按员工个数降序

select job_id,count(*)from employee e, job.jwhere e.'job_id'= j.'job_id'groupby job_title
orderbycount(*)desc;

可以实现三表连接


例:查询员工名,部门名和所在的城市

select last_name,department_name,city
from employee e, department d, location l
where e.'department_id'= d.'department_id'and d.'department_id'= l.'department_id'and city like'a%';


2、非等值连接

语法:

select 查询列表
from 表1 别名,表2,别名
where 非等值的连接条件
【and 筛选条件】
【group by 分组字段】
【having 分组后的筛选】
【order by 排序字段】

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

select salary,grade_level
from employee e, grade g
where salary between g.'loweat_sal'and g.'higheat_sal'and g.'grade_level'='A';

3、自连接

语法:

select 查询列表
from 表 别名1,表,别名2
where 等值的连接条件
【and 筛选条件】
【group by 分组字段】
【having 分组后的筛选】
【order by 排序字段】

例:查询员工名和上级的名称

select e. employee_id, e.last_name, m.memployee_id, m.last_namefrom employee e, employee m
where e.'manager_id'= m.'manger_id';

二、sql99语法

语法:

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

内连接:inner

外连接(左外:left【outer】、右外:right【outer】、全外:full【outer】)

交叉连接:cross


(一)内连接

1、语法:

select 查询列表
from 表1 别名
【inner】 join 表2 别名 on 连接条件
where 筛选条件
groupby 分组列表
having 分组后的筛选
orderby 排序列表
limit 子句;

2、分类:

等值连接

非等值连接

自连接连接


3、特点:

(1)添加排序、分组、筛选

(2)inner可以省略

(3)筛选条件放在where后面,连接条件放在on后面,提高分离性,便于阅读

(4)inner join连接和sql92语法中的等值连接效果是一样的,都是查询多表的交集

(表的顺序可以调换

内连接的结果=多表的交集

n表连接至少需要n-1个连接条件)


1、等值连接


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

select last_name, department_name
from employee e
inner join department d
on e.'department_id'= d.'department_id';


例2:查询名字中包含a的员工名和工种名(添加筛选)

select last_name, job_title
from employee e
inner join job j
on e.'job_id'= j.'job_id'where e.'last_name'like'%a%';


例3、查询部门个数大于3的城市名和部门个数(添加分组+筛选)

(1)查询每个城市的部门个数

(2)在(1)的基础上筛选满足条件

select city,count(*) 部门个数
from department d
inner join location l
on d.'location_id'= l.'location_id'groupby city
havingcount(*)>3;


例4、查询哪个部门的员工个数>3的部门名和员工个数,并按个数降序(添加排序)

(1)查询每个部门的员工个数

selectcount(*),department_name
from employee e
inner join department d
on e.'department_id'= d.'department_id'groupby department;


(2)在(1)的结果上筛选员工个数>3的记录,并排序

selectcount(*)个数,department_id
from employee e
inner join department d
on e.'department_id'= d.'department_id'groupby department_name
havingcount(*)>3orderbycount(*)desc;


例5、查询员工名、部门名、工种名,并按部门名排序

select last_name, department_name, job_title
from employee e
inner join department d on e.'department_id'= d.'department_id'inner join job j on e.'job_id'= j.'job_id'orderby department_name desc;


2、非等值连接

例:查询员工的工资级别

select salary,grade_level
from employee e
join job_graded g
on e.'salary'between g.'lowest_sal'and g.'hightest_sal';


3、自连接

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

select e.last_name, m.last_namefrom employee e
join employee m
on e.'manager_id'= m.'employee_id';


(二)外连接

1、应用场景:用于查询一个表中有,另一个表没有的记录

2、语法:

select 查询列表
from 表1 别名
left/right/full【outer】 join 表2 别名 on 连接条件
where 筛选条件
groupby 分组列表
having 分组后的筛选
orderby 排序列表
limit 子句;


3、特点:

(1)外连接的查询结果为主表中的所有记录,如果从表中有和它匹配的,则显示匹配的值;如果从表中没有和它匹配的,则显示null

外连接查询结果=内连接结果+主表中有而从表中没有的记录

(2)左外连接:left join 左边的是主表

        右外连接:right join 右边的是主表

        全外连接:full join 两边都是主表

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

(4)全外连接=内连接的结果+表1中有但表2中没有的+表2中有但表1中没有的

(5)一般用于查询除了交集部分的剩余的不匹配的行

例1:查询男友不在男生表的女生名

左外连接:

select b.name, bo.*from beauty b
left outer join boy bo
on b.'boyfrind_id'= bo.'id';


右外连接:

select b.name, bo.*from boy bo
left outer join beauty b
on bo.'id'= b.'boyfrind_id';


例2:查询哪个部门没有员工

左外:

select d.*, e.employee_idfrom department d
left outer join employee e
on d.'department_id'= e.'department_id'where e.'employee_id'isnull;


右外:

select d.*, e.employee_idfrom employee e
left outer join department d
on d.'department_id'= e.'department_id'where e.'employee_id'isnull;


全外连接:

use girl
select b.*, bo.*from beauty b
full outer join boy bo
on b.'boyfrind_id'= bo.id;


交叉连接:

语法:

select 查询列表
from 表1 别名
cross join 表2 别名;


特点:类似于笛卡尔乘积

select b.*, bo.*from beauty b
cross join boy bo;


sql92 PK sql99

功能:sql99支持的较多

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

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
8月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
895 6
|
9月前
|
SQL 关系型数据库 MySQL
MySQL的查询操作语法要点
储存过程(Stored Procedures) 和 函数(Functions) : 储存过程和函数允许用户编写 SQL 脚本执行复杂任务.
366 14
|
9月前
|
SQL 关系型数据库 MySQL
MySQL的查询操作语法要点
以上概述了MySQL 中常见且重要 的几种 SQL 查询及其相关概念 这些知识点对任何希望有效利用 MySQL 进行数据库管理工作者都至关重要
241 15
|
9月前
|
SQL Java 关系型数据库
Java连接MySQL数据库环境设置指南
请注意,在实际部署时应该避免将敏感信息(如用户名和密码)硬编码在源码文件里面;应该使用配置文件或者环境变量等更为安全可靠地方式管理这些信息。此外,在处理大量数据时考虑使用PreparedStatement而不是Statement可以提高性能并防止SQL注入攻击;同时也要注意正确处理异常情况,并且确保所有打开过得资源都被正确关闭释放掉以防止内存泄漏等问题发生。
443 13
|
9月前
|
SQL 关系型数据库 MySQL
排除通过IP访问MySQL时出现的连接错误问题
以上步骤涵盖了大多数遇到远程连接 MySQL 数据库时出现故障情形下所需采取措施,在执行每个步骤后都应该重新尝试建立链接以验证是否已经解决问题,在多数情形下按照以上顺序执行将能够有效地排除并修复大多数基本链接相关故障。
587 3
|
9月前
|
关系型数据库 MySQL 数据管理
Mysql基础学习day03-作业
本内容包含数据库建表语句及多表查询示例,涵盖内连接、外连接、子查询及聚合统计,适用于员工与部门数据管理场景。
172 1
|
9月前
|
SQL 关系型数据库 MySQL
Mysql基础学习day02-作业
本教程介绍了数据库表的创建与管理操作,包括创建员工表、插入测试数据、删除记录、更新数据以及多种查询操作,涵盖了SQL语句的基本使用方法,适合初学者学习数据库操作基础。
191 0
|
9月前
|
SQL 关系型数据库 MySQL
Mysql基础学习day03
本课程为MySQL基础学习第三天内容,主要讲解多表关系与多表查询。内容涵盖物理外键与逻辑外键的区别、一对多、一对一及多对多关系的实现方式,以及内连接、外连接、子查询等多表查询方法,并通过具体案例演示SQL语句的编写与应用。
262 0
|
9月前
|
SQL 关系型数据库 MySQL
Mysql基础学习day01-作业
本教程包含三个数据库表的创建练习:学生表(student)要求具备主键、自增长、非空、默认值及唯一约束;课程表(course)定义主键、非空唯一字段及数值精度限制;员工表(employee)包含自增主键、非空字段、默认值、唯一电话号及日期时间类型字段。每个表的结构设计均附有详细SQL代码示例。
173 0
|
9月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
584 158

推荐镜像

更多