Mysql连接查询

Mysql连接查询

前言

使用MySQL连接查询可以让我们从多个表中获取数据并进行组合,以便在一个结果集中显示所有相关的数据。这种查询方式非常适合需要从多个表中获取数据的场景,例如销售报告、客户关系管理等。通过连接查询,我们可以将两个或多个表中的数据进行组合,以便在一个结果集中显示所有相关的数据。这种查询方式可以帮助我们更好地管理和分析数据,提高数据处理的效率和准确性。通过学习和掌握这种查询方式,我们可以更好地管理和分析数据。

连接查询特点及其区别

MySQL连接查询的优点:

  1. 可以轻松地从多个表中获取数据并进行组合,以便在一个结果集中显示所有相关的数据。
  2. 可以提高数据处理的效率和准确性,因为可以避免重复的数据处理和冗余的数据存储。
  3. 可以更好地管理和分析数据,因为可以将不同的数据源整合在一起,以便更好地理解和利用数据。

MySQL连接查询的缺点:

  1. 在处理大量数据时,连接查询可能会导致性能问题,因为它需要对多个表进行扫描和匹配。
  2. 如果连接查询中包含复杂的子查询或嵌套查询,则可能会导致性能问题和代码复杂性增加。
  3. 如果连接查询中包含大量的 JOIN 操作,则可能会导致索引失效,从而影响查询性能。

MySQL连接查询的区别:

  1. 内连接(INNER JOIN):只返回两个表中匹配的行,即左表和右表都有匹配的行。
  2. 左连接(LEFT JOIN):返回左表中的所有行,即使没有匹配的右表行。
  3. 右连接(RIGHT JOIN):返回右表中的所有行,即使没有匹配的左表行。
  4. 全连接(FULL JOIN):返回两个表中的所有行,如果没有匹配的行则用 NULL 填充。

数据库数据准备

-- 创建部门表
CREATE TABLE dept (
  id INT PRIMARY KEY AUTO_INCREMENT,
  NAME VARCHAR(20)
);

INSERT INTO dept (NAME) VALUES ('开发部'),('市场部'),('财务部');

-- 创建员工表
CREATE TABLE emp (
  id INT PRIMARY KEY AUTO_INCREMENT,
  NAME VARCHAR(10),
  gender CHAR(1),   -- 性别
  salary DOUBLE,   -- 工资
  join_date DATE,  -- 入职日期
  dept_id INT
);

INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('孙悟空','男',7200,'2013-02-24',1);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('猪八戒','男',3600,'2010-12-02',2);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('唐僧','男',9000,'2008-08-08',2);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('白骨精','女',5000,'2015-10-07',3);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('蜘蛛精','女',4500,'2011-03-14',1);

内连接

隐式内连接

#隐式内连接
SELECT * FROM emp,dept WHERE emp.id = dept.id;

在这里插入图片描述

显式内连接

#显式内连接
SELECT * FROM emp INNER JOIN dept ON emp.id = dept.id;

在这里插入图片描述

小结:

  • 内连接查询的是公共部分,满足连接条件(主外键关系)的部分
  • 用左边表的记录去匹配右边表的记录,如果符合条件的则显示

外连接

左外连接

#左外连接
SELECT * FROM emp LEFT JOIN dept ON emp.id = dept.id;

在这里插入图片描述

右外连接

#右外连接
SELECT * FROM emp RIGHT JOIN dept ON emp.id = dept.id;

在这里插入图片描述

小结:

  • 左外连接:在内连接的基础上保证左边表的数据全部显示
  • 右外连接:在内连接的基础上保证右边表的数据全部显示

子查询

什么是子查询?
一个查询里面至少包含2个select

子查询结果的三种情况

子查询结果是值的情况

问题1:查询工资最高的员工是谁
分解:查询最高工资

SELECT MAX(salary) FROM emp;

在这里插入图片描述

查询工资是9000的员工(即查询工资最高的员工)

SELECT * FROM emp WHERE salary=(SELECT MAX(salary) FROM emp);

在这里插入图片描述

子查询结果是单列多行的时候

问题1:查询工资小于平均工资的员工有哪些
分解:查询平均工资

 SELECT AVG(salary) FROM emp;

在这里插入图片描述

查询工资小于平均工资的员工

SELECT * FROM emp WHERE salary < (SELECT AVG(salary) FROM emp);

在这里插入图片描述

子查询的结果是多行多列

问题1:查询工资大于5000的员工,来自于哪些部门的名字

分解:查询工资大于5000的员工

  SELECT dept_id FROM emp WHERE salary > 5000;

根据子查询结果查询部门名字

SELECT dept.name FROM dept WHERE dept.id IN (SELECT dept_id FROM emp WHERE salary > 5000);

在这里插入图片描述

书籍推荐

以下是一些MySQL书籍的推荐及其推荐理由:

  1. 《高性能 MySQL》:这本书讲解了如何优化 MySQL 数据库,包括索引、查询优化、缓存等方面。对于想要提高 MySQL 数据库性能的同学来说非常有用。

  2. 《MySQL 技术内幕》:这本书深入讲解了 MySQL 数据库的内部原理和实现细节,包括存储引擎、事务处理、锁机制等方面。适合想要深入了解 MySQL 数据库的同学。

  3. 《MySQL 必知必会》:这本书是一本入门级别的 MySQL 教程,适合初学者学习。书中内容简单易懂,涵盖了 MySQL 的基本概念、SQL 语句、数据表设计等方面。

  4. 《MySQL 8.0 实战从入门到精通》:这本书介绍了 MySQL 8.0 的新特性和用法,包括分区表、JSON 支持、全文搜索等方面。适合已经掌握 MySQL 基础知识并想深入学习 MySQL 8.0 的同学。

  5. 《MySQL 开发与运维》:这本书介绍了 MySQL 数据库的开发和运维方面的知识,包括使用 PHP、Python、Java 等语言连接 MySQL、备份和恢复数据、监控和调优等方面。适合想要从事 MySQL 开发和运维工作的同学。

希望对你有所帮助~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TorlesseLiang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值