mysql多表连接和子查询

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

文章实例的数据表,来自上一篇博客《mysql简单查询》:http://blog.csdn.net/zuiwuyuan/article/details/39349611


MYSQL的多表连接建立在有相互关系的父子表上,分为交叉连接、内连接、外连接、自连接


一、 交叉连接/笛卡尔交集

SELECT COUNT(*) FROM emp;    # 返回14行
SELECT COUNT(*) FROM dept;   #返回4行
SELECT COUNT(*) FROM emp,dept;         #返回14*4=56行数据
SELECT COUNT(*) FROM emp CROSS JOIN dept;  # 通过关键字CROSS JOIN进行交叉连接

SELECT * FROM emp,dept;
SELECT * FROM emp CROSS JOIN dept;

二、内连接

语法:

select ... from join_table
[inner] JOIN join_table2
[ON join_condition]
where where_definition


只列出这些连接表中与连接条件相匹配的数据行


内连接分类:
      等值连接: 在连接条件中使用=运算符来比较被连接列的列值
      非等值连接: 在连接条件中使用除等号以外的其他比较运算符来比较背连接的列的列值
      自然连接: 在连接条件中使用=运算符来比较被连接列的列值, 但它使用选择列表指出查询结果集合中所包含的列,并删除连接表中的重复列

2.1 连接条件就是主外键相连
SELECT * FROM emp e,dept d WHERE e.deptno=d.deptno;

标准的内连接语法
SELECT * FROM emp
INNER JOIN dept
ON  emp.deptno= dept.deptno;


三、外连接
      语法:
         select... from join_table
         (left|right|full) [outer] join join_table2
         on join_condition
         where where_definition
         
      不仅列出与连接条件相匹配的行,还列出左表(左连接),右表(右连接)或者两个表(全连接)中所有符合where过滤条件的数据行

3.1 左连接
在外连接中,某些不满足条件的列也会显示出来,也就是说,只限制其中一个表的行,而不限制另一个表的行
左连接,左表为主表,左边的表记录全部显示,如果没找到记录则补null
SELECT * FROM dept
LEFT JOIN emp
ON dept.deptno=emp.deptno;


SELECT * FROM emp
LEFT JOIN dept
ON emp.deptno=dept.deptno;

3.2 右连接
SELECT * FROM emp
RIGHT JOIN dept
ON dept.deptno=emp.deptno;


3.3 全连接(mysql不支持)
SELECT * FROM emp
FULL JOIN dept
ON dept.deptno=emp.deptno;

四、 子查询
    在某些情况下,当进行查询的时候,需要的条件是另外一个select语句的结果,这个时候,就要用到子查询
    为了给主查询提供数据而首先执行的查询被叫做子查询
    用于子查询的关键字主要包括in、not in、=、<>等


4.1 查询工资比ALLEN搞的员工

SELECT *
FROM emp
WHERE sal>(
SELECT sal FROM emp WHERE ename='ALLEN'
)


4.2 查询和ALLEN同一个部门的员工
SELECT *
FROM emp
WHERE deptno=(
SELECT deptno FROM emp WHERE ename='ALLEN'
)

4.3 查询月薪最高的员工的名字
SELECT ename,sal
FROM emp
WHERE sal=(
SELECT MAX(sal)
FROM emp
)

4.4  单行子查询返回多个结果--错误
SELECT *
FROM emp
WHERE sal=(
SELECT MIN(sal)
FROM emp
GROUP BY deptno
)


4.5 子查询没有返回结果

SELECT *
FROM emp
WHERE job=(
SELECT job
FROM emp
WHERE ename='lining'
)
4.6 in 与列表中的任意成员相等(等于子查询的任意结果)
SELECT *
FROM emp
WHERE sal IN(
SELECT sal
FROM emp
WHERE job='SALESMAN'
)

4.7 ANY 与子查询返回的每一个值比较(这里小于子查询的任一个结果)
SELECT *
FROM emp
WHERE sal<ANY(
SELECT sal
FROM emp
WHERE job='SALESMAN'
)


4.8  ALL与子查询返回的所有值比较 (这里要小于子查询的所有结果)

SELECT *
FROM emp
WHERE sal<ALL(
SELECT sal
FROM emp
WHERE job='SALESMAN'
)

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
14天前
|
SQL Java 关系型数据库
java连接mysql查询数据(基础版,无框架)
【10月更文挑战第12天】该示例展示了如何使用Java通过JDBC连接MySQL数据库并查询数据。首先在项目中引入`mysql-connector-java`依赖,然后通过`JdbcUtil`类中的`main`方法实现数据库连接、执行SQL查询及结果处理,最后关闭相关资源。
|
18天前
|
SQL JavaScript 关系型数据库
node博客小项目:接口开发、连接mysql数据库
【10月更文挑战第14天】node博客小项目:接口开发、连接mysql数据库
|
24天前
|
Java 关系型数据库 MySQL
【编程基础知识】Eclipse连接MySQL 8.0时的JDK版本和驱动问题全解析
本文详细解析了在使用Eclipse连接MySQL 8.0时常见的JDK版本不兼容、驱动类错误和时区设置问题,并提供了清晰的解决方案。通过正确配置JDK版本、选择合适的驱动类和设置时区,确保Java应用能够顺利连接MySQL 8.0。
110 1
|
27天前
|
Java 关系型数据库 MySQL
springboot学习五:springboot整合Mybatis 连接 mysql数据库
这篇文章是关于如何使用Spring Boot整合MyBatis来连接MySQL数据库,并进行基本的增删改查操作的教程。
44 0
springboot学习五:springboot整合Mybatis 连接 mysql数据库
|
2月前
|
SQL 缓存 关系型数据库
MySQL高级篇——关联查询和子查询优化
左外连接:优先右表创建索引,连接字段类型要一致、内连接:驱动表由数据量和索引决定、 join语句原理、子查询优化:拆开查询或优化成连接查询
MySQL高级篇——关联查询和子查询优化
|
26天前
|
SQL JavaScript 关系型数据库
Node.js 连接 MySQL
10月更文挑战第9天
18 0
|
2月前
|
SQL 关系型数据库 MySQL
MySQL C连接与使用
【9月更文挑战第21天】在 MySQL 中,可以通过 C 语言连接和操作数据库。首先需安装 MySQL 服务器及 C 开发库,然后在程序中包含必要头文件,初始化连接对象,并使用实际参数建立连接。执行 SQL 语句时,需替换表名等变量,获取并遍历结果集。最后,释放资源并关闭连接。过程中应注意错误处理、内存管理和安全性,以及性能优化。此方式适用于高效数据存储和检索的应用程序。
|
29天前
|
关系型数据库 MySQL Linux
Navicat 连接 Windows、Linux系统下的MySQL 各种错误,修改密码。
使用Navicat连接Windows和Linux系统下的MySQL时可能遇到的四种错误及其解决方法,包括错误代码2003、1045和2013,以及如何修改MySQL密码。
176 0
|
2月前
|
SQL JavaScript 关系型数据库
Node服务连接Mysql数据库
本文介绍了如何在Node服务中连接MySQL数据库,并实现心跳包连接机制。
40 0
Node服务连接Mysql数据库
|
2月前
|
关系型数据库 MySQL 数据库
docker启动mysql多实例连接报错Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’
docker启动mysql多实例连接报错Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’
168 0