Mysql连接查询
前言:
使用MySQL连接查询可以让我们从多个表中获取数据并进行组合,以便在一个结果集中显示所有相关的数据。这种查询方式非常适合需要从多个表中获取数据的场景,例如销售报告、客户关系管理等。通过连接查询,我们可以将两个或多个表中的数据进行组合,以便在一个结果集中显示所有相关的数据。这种查询方式可以帮助我们更好地管理和分析数据,提高数据处理的效率和准确性。通过学习和掌握这种查询方式,我们可以更好地管理和分析数据。
连接查询特点及其区别
MySQL连接查询的优点:
- 可以轻松地从多个表中获取数据并进行组合,以便在一个结果集中显示所有相关的数据。
- 可以提高数据处理的效率和准确性,因为可以避免重复的数据处理和冗余的数据存储。
- 可以更好地管理和分析数据,因为可以将不同的数据源整合在一起,以便更好地理解和利用数据。
MySQL连接查询的缺点:
- 在处理大量数据时,连接查询可能会导致性能问题,因为它需要对多个表进行扫描和匹配。
- 如果连接查询中包含复杂的子查询或嵌套查询,则可能会导致性能问题和代码复杂性增加。
- 如果连接查询中包含大量的 JOIN 操作,则可能会导致索引失效,从而影响查询性能。
MySQL连接查询的区别:
- 内连接(INNER JOIN):只返回两个表中匹配的行,即左表和右表都有匹配的行。
- 左连接(LEFT JOIN):返回左表中的所有行,即使没有匹配的右表行。
- 右连接(RIGHT JOIN):返回右表中的所有行,即使没有匹配的左表行。
- 全连接(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书籍的推荐及其推荐理由:
-
《高性能 MySQL》:这本书讲解了如何优化 MySQL 数据库,包括索引、查询优化、缓存等方面。对于想要提高 MySQL 数据库性能的同学来说非常有用。
-
《MySQL 技术内幕》:这本书深入讲解了 MySQL 数据库的内部原理和实现细节,包括存储引擎、事务处理、锁机制等方面。适合想要深入了解 MySQL 数据库的同学。
-
《MySQL 必知必会》:这本书是一本入门级别的 MySQL 教程,适合初学者学习。书中内容简单易懂,涵盖了 MySQL 的基本概念、SQL 语句、数据表设计等方面。
-
《MySQL 8.0 实战从入门到精通》:这本书介绍了 MySQL 8.0 的新特性和用法,包括分区表、JSON 支持、全文搜索等方面。适合已经掌握 MySQL 基础知识并想深入学习 MySQL 8.0 的同学。
-
《MySQL 开发与运维》:这本书介绍了 MySQL 数据库的开发和运维方面的知识,包括使用 PHP、Python、Java 等语言连接 MySQL、备份和恢复数据、监控和调优等方面。适合想要从事 MySQL 开发和运维工作的同学。
希望对你有所帮助~
6701

被折叠的 条评论
为什么被折叠?



