首页 > 数据库 >【MySQL】复合查询和内外连接

【MySQL】复合查询和内外连接

时间:2024-06-18 12:57:59浏览次数:14  
标签:JOIN 复合 查询 emp MySQL deptno where select

文章目录


MySQL复合查询和内外连接

1. 复合查询

1.1 多表查询

select * from `tb_1`, `tb_2`
	where dept.deptno = emp.deptno;

不加过滤条件,得到的结果被称为笛卡尔积。本质是取主表的每一条记录拼接上从表的每一条记录。

多表查询中一定会包含where条件,将主键和外键对应,可以将无意义的记录抛弃。

1.2 自连接

同一张表自己和自己拼接的叫做自连接。给两张相同的表起别名,就可以放到一起。

select * from emp wkr, emp ldr;
	where wkr.mgr = ldr.empno;

自连接的话,需要根据实际需求筛去不满足条件的数据。

1.3 子查询

子查询也称嵌套查询,也就是将select的结果作为另一个select的条件。

单行子查询

返回一行记录的查询称为单行子查询。

select * from emp where deptno=(select deptno from emp where ename='SMITH');

多行子查询

返回多行记录的查询称为多行子查询。关键字有:inallany

  • in 表示是否存在于集合中,存在即满足条件。
  • all 表示整个集合的每一个结果
  • any 表示集合中的任意一个结果
# 显示和10号部门具有的工作岗位相同的员工
select * from emp where job in (select distinct job from emp where deptno=10);
# 显示工资比10号部门所有人工资都高的员工
select * from emp where sal > all (select distinct sal from emp where deptno=10);
# 显示工资比10号部门任意员工工资高的员工
select * from emp where sal > any (select distinct sal from emp where deptno=10);

不管是单行还是多行子查询,都叫做单列子查询,返回的都是单列的一个字段的数据。

多列子查询

# 查询和SMITH的部门和岗位完全相同的所有雇员
select * from emp where (deptno, job)=(select deptno, job from emp where ename='SMITH');

from中使用子查询

from跟是的表名,既然我们查询出来的记录都可以看作表结构。这里就是一个数据查询的技巧,把子查询当作临时表使用。

# 显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资
select ename, emp.deptno, sal, myavg
	from emp, 
			 (select deptno, avg(sal) as myavg from emp group by deptno) as avg_tb
	where emp.deptno=avg_tb.deptno and sal>myavg;
	
# 显示每个部门的部门名,编号,地点和人员数量
select dname, dept.deptno, loc, cnt
	from emp, dept, 
			 (select deptno, count(*) cnt from emp group by deptno) as cnt_tb
	where cnt_tb.deptno=emp.deptno and cnt_tb.deptno=dept.deptno;

合并查询

合并查询是就是合并多个 select 的查询结果,可使用集合操作符 unionunion all

关键字解释
union取并集,将多个 select 结果合并到一起,自动去掉重复行
union all取并集,将多个 select 结果合并到一起,但不去重
select * from emp where sal > 2500 union     select * from emp where job='MANAGER';
select * from emp where sal > 2500 union all select * from emp where job='MANAGER';

OJ连接

  • https://www.nowcoder.com/practice/23142e7a23e4480781a3b978b5e0f33a
  • https://www.nowcoder.com/practice/355036f7f0c8429a85281f7ac05b457a
  • https://www.nowcoder.com/practice/32c53d06443346f4a2f2ca733c19660c
  • https://www.nowcoder.com/practice/e50d92b8673a440ebdf3a517b5b37d62

 

2. 内外连接

通过不同类型的表连接,可以将多个表中的数据有效地组合在一起,以满足复杂的查询需求。将详细介绍MySQL中常见的表连接方式,分别是 INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN 和 CROSS JOIN,并通过具体的表格数据展示它们的用法和特点。
下表总结了各种表连接方式的主要特点:

连接方式结果匹配条件不满足时备注
INNER JOIN返回符合连接条件的行不返回结果最常用的连接方式
LEFT JOIN返回左表中所有行,以及右表中符合条件的行右表列为NULL适用于需要左表所有行的情况
RIGHT JOIN返回右表中所有行,以及左表中符合条件的行左表列为NULL适用于需要右表所有行的情况
FULL JOIN返回左右表中所有行,不管是否有匹配的行NULL值适用于需要两个表所有行的情况
CROSS JOIN返回两个表的笛卡尔积适用于需要生成所有组合的情况

我们将使用以下两个示例表格进行表连接操作:

表格:employees

employee_idemployee_namedepartment_id
1Alice1
2Bob2
3CharlieNULL
4David1

表格:departments

department_iddepartment_name
1HR
2IT
3Finance

1. INNER JOIN

INNER JOIN 是最常见的表连接方式,它返回两个表中符合连接条件的行。

**示例查询及结果:**查询员工及其所在部门(基于employees和departments表格)。

SELECT e.employee_id, e.employee_name, d.department_name
FROM employees e
INNER JOIN departments d ON e.department_id = d.department_id;
employee_idemployee_namedepartment_name
1AliceHR
2BobIT
4DavidHR

2. LEFT JOIN

LEFT JOIN 返回左表中的所有行,以及右表中与左表中行匹配的行。如果右表中没有匹配的行,则会返回 NULL 值。

**示例查询及结果:**查询所有员工及其所在部门(基于employees和departments表格)。

SELECT e.employee_id, e.employee_name, d.department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.department_id;
employee_idemployee_namedepartment_name
1AliceHR
2BobIT
3CharlieNULL
4DavidHR

3. RIGHT JOIN

RIGHT JOIN 返回右表中的所有行,以及左表中与右表中行匹配的行。如果左表中没有匹配的行,则会返回 NULL 值。

**示例查询及结果:**查询所有部门及其员工(基于employees和departments表格)。

SELECT e.employee_id, e.employee_name, d.department_name
FROM employees e
RIGHT JOIN departments d ON e.department_id = d.department_id;
employee_idemployee_namedepartment_name
1AliceHR
2BobIT
4DavidHR
NULLNULLFinance

4. FULL JOIN

FULL JOIN 返回左右两个表中的所有行,如果某个表中没有匹配的行,则返回 NULL 值。

**示例查询及结果:**查询所有员工及其所在部门,包括没有部门的员工和没有员工的部门(基于employees和departments表格)。

SELECT e.employee_id, e.employee_name, d.department_name
FROM employees e
FULL JOIN departments d ON e.department_id = d.department_id;
employee_idemployee_namedepartment_name
1AliceHR
2BobIT
3CharlieNULL
4DavidHR
NULLNULLFinance

5. CROSS JOIN

CROSS JOIN 返回两个表的笛卡尔积,即左表中的每一行与右表中的每一行组合在一起。

如果执行一个简单的 CROSS JOIN 操作,假设表 orders 和表 products,它们分别有以下数据:

表格:orders

order_idorder_name
1Order A
2Order B

表格:products

product_idproduct_name
101Product X
102Product Y
103Product Z

执行如下的 CROSS JOIN 查询:

SELECT o.order_id, p.product_id, p.product_name
FROM orders o
CROSS JOIN products p;

将会得到以下结果,这是两个表的笛卡尔积:

order_idproduct_idproduct_name
1101Product X
1102Product Y
1103Product Z
2101Product X
2102Product Y
2103Product Z

这个结果显示了 orders 表中每个订单与 products 表中每个产品的所有组合。笛卡尔积操作是一种非常基础但强大的数据组合方式,通常用于需要生成所有可能组合的场景。

OJ练习

  • https://leetcode.com/problems/rank-scores/
  • https://leetcode.com/problems/exchange-seats/description/

标签:JOIN,复合,查询,emp,MySQL,deptno,where,select
From: https://blog.csdn.net/Z1tai/article/details/139770096

相关文章

  • MySQL:创建账户及修改密码
    1、创建账户MySQL5.8:grantallprivilegeson*.*totst@%identifiedby'123456';MySQL8.0:createuser'tst'@'%'identifiedby'123456';grantallprivilegeson*.*to'tst'@'%'withgrantoption;......
  • sql注入之联合查询的学习记录
    我本人也是一个小白有什么错误的地方希望大佬可以指出,有什么疑问也可以留言,希望可以互相交流学习一下。 sql注入经典之联合注入关于联合注入是sql注入中最经典的也是大部分初学ctf的师傅们最开始接触的注入方式测试注入点首先在注入的时候都需要先测试一下注入点?id=1'o......
  • mysql数据库名带下划线等特殊字符时,分权限报错
    原文链接:mysql数据库名带下划线分权限报错_mob64ca12f24f3a的技术博客_51CTO博客 MySQL数据库名带下划线分权限报错解析在使用MySQL进行数据库操作时,我们经常会遇到数据库名带下划线导致权限报错的情况。这是因为MySQL对于数据库名中的下划线有特殊的处理机制,容易导致权限控制......
  • MySQL入门学习.子查询.IN
        IN子查询是MySQL中一种常见的子查询类型,用于在查询中确定一个值是否在另一个查询的结果集中。IN子查询的特点是简洁明了,它可以在一个查询中方便地检查一个值是否在一组值中,非常适用于需要进行条件验证或关联查询的情况。   在MySQL中,有以下几种常见的......
  • MySQL入门学习-子查询.EXISTS
        子查询EXISTS是MySQL中的一种子查询类型,用于检查子查询结果集是否为空。如果子查询结果集不为空,则EXISTS子查询返回TRUE;否则,返回FALSE。    子查询EXISTS的特点是它只关心子查询结果集是否为空,而不关心结果集中的具体内容。这使得EXISTS子查......
  • MySQL 情节:SQL 语句的表演
    本文由ChatMoney团队出品第一幕:解析与优化-“翻译官与谋士”SQL解析器是第一个上场的角色,任务就是把SQL请求翻译成MySQL能听懂的语言。就像你点餐时,服务员得听懂你到底要什么菜。不然你说“我要一盘炒青菜”,结果服务员听成了“我要一盘草皮”,那谁也吃不下去啊!接下来......
  • MySQL 的故事:一场 SQL 语句的戏剧演绎
    本文由ChatMoney团队出品第一幕:解析与优化-“翻译官与谋士”SQL解析器是第一个上场的角色,任务就是把SQL请求翻译成MySQL能听懂的语言。就像你点餐时,服务员得听懂你到底要什么菜。不然你说“我要一盘炒青菜”,结果服务员听成了“我要一盘草皮”,那谁也吃不下去啊!接下来......
  • Windows11[虚拟机] Kettle 通过SSH隧道 连接远程[Mac] Mysql数据库
    Kettle无法直接连接使用SSH通道的MySQL,需要通过SSH隧道(推荐),具体操作如下所示:一、搭建XshellSSH隧道转发1、点击“连接”借助Xshell7,首先创建会话mac(名字随便写),右键-->属性,在弹出窗口中填写名称(随便写),填写主机:SSH隧道的ip地 点击“添加”按钮出现如下,填写源主机:localh......
  • OceanBase中OCP平台显示的TOPSQL模块是如何查询出来的
    说明:oba脚本通过变量的方式直接实现以下三个查询,如手工查询需要分别执行SQL获取对应的变量信息1.server_id检查方式selecta.idserver_id,a.svr_ip,a.zone,b.primary_zone,b.tenant_namefrom__all_servera,__all_tenantbwheretenant_id=1001orderby3;2.计算总cpu--这......
  • Navicat和SQLynx功能比较三(数据导出:使用MySQL近千万数据测试)
    数据导出的功能在数据库管理工具中是最普遍的功能之一。所以数据导出的功能稳定性和性能也是数据库管理工具是否能很好地满足应用需求的一个考虑因素。目录1.整体比较2.示例2.1 前置环境2.2Navicat导出2.3 SQLynx导出2.4 性能对比结果(690万行数据)3.结论Nav......