SELECT查询不但可以从一张表查询数据,还可以从多张表同时查询数据。查询多张表的语法是:SELECT * FROM <表1> <表2>,普通多表查询会获取M x N行记录,所以一般使用连接查询或子查询获取多张表的数据;

连接查询

连接查询对多个表进行 JOIN 运算,简单地说,就是先确定一个主表作为结果集,然后,把其他表的行有选择性地“连接”在主表结果集上。

连接查询分为内连接和外连接,内连接只返回同时存在于两张表的行数据,外连接返回右表都存在的行。如果某一行仅在右表存在,那么结果集就会以NULL填充剩下的字段。

内连接

内连接是最常用的一种JOIN查询,内连接查询的语法格式

# 标准语法,INNER可省略
SELECT ... FROM 表1 JOIN 表2 ON 连接条件 ; # 衍生语法1(WHERE与ON的作用相同)
SELECT ... FROM 表1 JOIN 表2 WHERE 连接条件 ; # 衍生语法2
SELECT ... FROM 表1 , 表2 WHERE 连接条件 ;

查询实例:

# 连接员工表与部门表两张表
SELECT e.empno,e.ename,d.dname
FROM t_emp e
JOIN t_dept d ON e.deptno=d.deptno ; # 连接员工表、部门表、登记表三张表
SELECT e.empno,e.ename,d.dname,e.sal,e.job,s.grade
FROM t_emp e
JOIN t_dept d ON e.deptno=d.deptno
JOIN t_salgrade s ON e.sal BETWEEN s.losal AND s.hisal; # 连接自身:查询与SCOTT同部门的人
SELECT e2.ename
FROM t_emp e1
JOIN t_emp e2 ON e1.deptno=e2.deptno
WHERE e1.ename="SCOTT" AND e2.ename!="SCOTT"; # 进阶练习1:查询员工表中工资超过平均工资的人
# 与WHERE一样,ON子句也不能使用聚合函数,这里将聚合结果作为一张表来连接
SELECT e.ename,e.sal
FROM t_emp e
JOIN (SELECT AVG(sal) avg FROM t_emp) t ON e.sal>=t.avg;

内连接的数据表不一定需要同名字段或外键关联,只需字段之间符合逻辑关系即可

外连接

由于内连接只返回同时存在于两张表的行数据,如果员工表中有部门编号为NULL的特殊员工,使用内连接就会遗漏这个员工的信息,这时候就需要使用外连接,外连接分为LEFT [OUTER] JOINRIGHT [OUTER] JOINFULL [OUTER] JOIN,左右相对JOIN关键字前后的表而言的:

左连接实例1:查询所有员工(包括部门为NULL)的部门信息

SELECT e.ename,d.dname
FROM t_emp e
LEFT JOIN t_dept d ON e.deptno=d.deptno;

左连接实例2:查询所有部门的人数

SELECT d.dname,COUNT(e.deptno)
FROM t_dept d
LEFT JOIN t_emp e ON d.deptno=e.deptno
GROUP BY d.deptno;

MySQL数据库不支持全连接查询,可使用UNION关键字实现全连接:

(SELECT d.dname,COUNT(e.deptno)
FROM t_dept d
LEFT JOIN t_emp e ON d.deptno=e.deptno
GROUP BY d.deptno)
UNION
(SELECT d.dname,COUNT(*)
FROM t_dept d
RIGHT JOIN t_emp e ON d.deptno=e.deptno
GROUP BY d.deptno);

内连接中,ON与WHERE的用法一样;外连接中不太一样,WHERE能筛选掉更多数据。

子查询

根据所在位置,子查询可分为WHERE、FROM、SELECT子查询。对于WHERE、SELECT子查询,每次比较都会运行一次,非常低效,不推荐使用,一般转化为表连接查询。对于FROM子查询只会执行一次,可以经常使用。

根据子查询的返回结果,可以分为单行和多行子查询,单行子查询即子查询返回一个值,很容易使用。对于多行子查询,可以使用IN、ALL、ANY、[NOT] EXISTS关键字来处理

MySQL:多表查询的更多相关文章

  1. MySQL多表查询之外键、表连接、子查询、索引

    MySQL多表查询之外键.表连接.子查询.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为 ...

  2. Mysql 单表查询 子查询 关联查询

    数据准备: ## 学院表create table department( d_id int primary key auto_increment, d_name varchar(20) not nul ...

  3. (转)Mysql 多表查询详解

    MySQL 多表查询详解 一.前言  二.示例 三.注意事项 一.前言  上篇讲到mysql中关键字执行的顺序,只涉及了一张表:实际应用大部分情况下,查询语句都会涉及到多张表格 : 1.1 多表连接有 ...

  4. MySQL多表查询回顾

    ----------------------siwuxie095 MySQL 多表查询回顾 以客户和联系人为例(一对多) 1.内连接 /*内连接写法一*/ select * from t_custom ...

  5. python 3 mysql 单表查询

    python 3 mysql 单表查询 1.准备表 company.employee 员工id id int 姓名 emp_name varchar 性别 sex enum 年龄 age int 入职 ...

  6. python3 mysql 多表查询

    python3 mysql 多表查询 一.准备表 创建二张表: company.employee company.department #建表 create table department( id ...

  7. Mysql 单表查询-排序-分页-group by初识

    Mysql 单表查询-排序-分页-group by初识 对于select 来说, 分组聚合(((group by; aggregation), 排序 (order by** ), 分页查询 (limi ...

  8. Mysql 单表查询where初识

    Mysql 单表查询where初识 准备数据 -- 创建测试库 -- drop database if exists student_db; create database student_db ch ...

  9. MySQL多表查询合并结果union all,内连接查询

    MySQL多表查询合并结果和内连接查询 1.使用union和union all合并两个查询结果:select 字段名 from tablename1 union select 字段名 from tab ...

  10. MySQL多表查询、事务、DCL:内含mysql如果忘记密码解决方案

    MySQL多表查询.事务.DCL 多表查询 * 查询语法: select 列名列表 from 表名列表 where.... * 准备sql # 创建部门表 CREATE TABLE dept( id ...

随机推荐

  1. vector的几种初始化及赋值方式

    转自https://www.cnblogs.com/quyc/p/12857054.html (1)不带参数的构造函数初始化 //初始化一个size为0的vector vector<int> ...

  2. Educational Codeforces Round 30

    Educational Codeforces Round 30  A. Chores 把最大的换掉 view code #pragma GCC optimize("O3") #pr ...

  3. Codeforces Round #428 (Div. 2) C. Journey (简单搜索)

    题意:给你一颗树(边是无向的),从根节点向下走,统计走到每个子节点的概率,求所有叶子节点的深度乘上概率的和. 题解:每层子节点的概率等于上一层节点的概率乘\(1\)除以这层的子节点数,所以我们用\(d ...

  4. 洛谷P1119-灾后重建-floyd算法

    洛谷P1119-灾后重建 题目描述 给出\(B\)地区的村庄数NN,村庄编号从\(0\)到\(N-1\),和所有\(M\)条公路的长度,公路是双向的. 给出第\(i\)个村庄重建完成的时间\(t_i\ ...

  5. Dcoker命令使用详解

    Docker语法说明 docker [OPTIONS] COMMAND [arg...] OPTIONS --config=~/.docker :指定本地客户端配置文件. -D, --debug :开 ...

  6. 二进制安装kubernetes(二) kube-apiserver组件安装

    根据架构图,我们的apiserver部署在hdss7-21和hdss7-22上: 首先在hdss7-200上申请证书并拷贝到21和22上: 创建证书文件: # cd /opt/certs # vi c ...

  7. Qt开发Activex笔记(一):环境搭建、基础开发流程和演示Demo

    前言   使用C#开发动画,绘图性能跟不上,更换方案使用Qt开发Qt的控件制作成OCX以供C#调用,而activex则是ocx的更高级形式.  QtCreator是没有Active控件项目的,所有需要 ...

  8. codeforces 11B Jumping Jack

    Jack is working on his jumping skills recently. Currently he's located at point zero of the number l ...

  9. C# 类 (5)

    Static 静态成员 创建一个类,实例化它,然后使用实例的各种方法或者属性 然而有时候我们不想实例化这个类,难道我们就没法用他里面的成员了吗?比如计算矩形的面积,就是长*宽,万年不变 当然可以,用s ...

  10. HHVM的全称是"HipHop for PHP",开放源代码。采用PHP许可证授权!

    http://hhvm.com/ https://github.com/xgqfrms/hhvm 什么是HHVM高性能服务器? HHVM是由Facebook公司出品的高性能开源服务器,用来执行hack ...