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. [HDU4734] 不要62(数位dp入门)

    >传送门< 题意:统计区间 [a,b] 中不含 4 和 62 的数字有多少个. 思路:数位dp 就是数位上不能有4也不能有连续的62,没有4的话在枚举的时候判断一下,不枚举4就可以保证状态 ...

  2. P1714 切蛋糕 单调队列

    题目: 题目描述 今天是小Z的生日,同学们为他带来了一块蛋糕.这块蛋糕是一个长方体,被用不同色彩分成了N个相同的小块,每小块都有对应的幸运值. 小Z作为寿星,自然希望吃到的第一块蛋糕的幸运值总和最大, ...

  3. Codeforces Round #550 (Div. 3) D. Equalize Them All (贪心,模拟)

    题意:有一组数,可以选择某个数\(a_i\)相邻的一个数\(a_j\),然后可以让\(a_i\)加上或者减去\(|a_i-a_j|\),问最少操作多少次使得数组中所有数相同. 题解:不难发现,每次操作 ...

  4. 牛客的两道dfs

    1.传送门:牛客13594-选择困难症 题意:给你k类物品,每类物品有a[i]个每个物品都有一个value,每类物品最多选一个,要求有多少种选法使得总value>m(没要求每类物品都必须选) 题 ...

  5. Codeforces Gym-102219 2019 ICPC Malaysia National E. Optimal Slots(01背包+输出路径)

    题意:给你一个体积为\(T\)的背包,有\(n\)个物品,每个物品的价值和体积都是是\(a_{i}\),求放哪几个物品使得总价值最大,输出它们,并且输出价值的最大值. 题解:其实就是一个01背包输出路 ...

  6. Codeforces Round #647 (Div. 2) - Thanks, Algo Muse! D. Johnny and Contribution (贪心,模拟)

    题意:有\(n\)个点,\(m\)条边,现在要给这些点赋值,,每次只能赋给某一点的四周(所连边)的最小没出现过的值.如果不能按照所给的数赋值,输出\(-1\),否则输出赋值顺序. 题解:我们用\(pa ...

  7. Codeforces Round #479 (Div. 3) E. Cyclic Components (思维,DFS)

    题意:给你\(n\)个顶点和\(m\)条边,问它们有多少个单环(无杂环),例如图中第二个就是一个杂环. 题解:不难发现,如果某几个点能够构成单环,那么每个点一定只能连两条边.所以我们先构建邻接表,然后 ...

  8. typedef struct xxx xxx与struct xxx区别 && “->”和“.”访问结构体变量

    1. struct //是C中的结构体的关键词.如: stuct node{ int a;.....} a; node 相当于结构体的类型,关键是其实在C中stuct node 才相当于一个数据类型, ...

  9. &#128218;C#/.NET/.NET Core推荐学习书籍(升职加薪,你值得拥有)

    前言: 作为一名程序员,我们无时无刻都要考虑着如何通过不断地学习来提升自己的核心竞争力.古人有云:"书中自有黄金屋,书中只有颜如玉",说明了书籍的重要性,没错工作多年来,发现身边那 ...

  10. Operating System:信号量

    pv原语操作(1)操作系统PV意思:PV操作与信号量的处理相关,P表示通过的意度思,V表示释放的意思.(2)p操作和v操作是不可中断问的程序段,称为原语.如果将信号量看作共享变量,则pv操作为其临界区 ...