MySQL:多表查询
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] JOIN、RIGHT [OUTER] JOIN、FULL [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:多表查询的更多相关文章
- MySQL多表查询之外键、表连接、子查询、索引
MySQL多表查询之外键.表连接.子查询.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为 ...
- Mysql 单表查询 子查询 关联查询
数据准备: ## 学院表create table department( d_id int primary key auto_increment, d_name varchar(20) not nul ...
- (转)Mysql 多表查询详解
MySQL 多表查询详解 一.前言 二.示例 三.注意事项 一.前言 上篇讲到mysql中关键字执行的顺序,只涉及了一张表:实际应用大部分情况下,查询语句都会涉及到多张表格 : 1.1 多表连接有 ...
- MySQL多表查询回顾
----------------------siwuxie095 MySQL 多表查询回顾 以客户和联系人为例(一对多) 1.内连接 /*内连接写法一*/ select * from t_custom ...
- python 3 mysql 单表查询
python 3 mysql 单表查询 1.准备表 company.employee 员工id id int 姓名 emp_name varchar 性别 sex enum 年龄 age int 入职 ...
- python3 mysql 多表查询
python3 mysql 多表查询 一.准备表 创建二张表: company.employee company.department #建表 create table department( id ...
- Mysql 单表查询-排序-分页-group by初识
Mysql 单表查询-排序-分页-group by初识 对于select 来说, 分组聚合(((group by; aggregation), 排序 (order by** ), 分页查询 (limi ...
- Mysql 单表查询where初识
Mysql 单表查询where初识 准备数据 -- 创建测试库 -- drop database if exists student_db; create database student_db ch ...
- MySQL多表查询合并结果union all,内连接查询
MySQL多表查询合并结果和内连接查询 1.使用union和union all合并两个查询结果:select 字段名 from tablename1 union select 字段名 from tab ...
- MySQL多表查询、事务、DCL:内含mysql如果忘记密码解决方案
MySQL多表查询.事务.DCL 多表查询 * 查询语法: select 列名列表 from 表名列表 where.... * 准备sql # 创建部门表 CREATE TABLE dept( id ...
随机推荐
- Ancient Printer HDU - 3460 贪心+字典树
The contest is beginning! While preparing the contest, iSea wanted to print the teams' names separat ...
- CQRS Event Sourcing介绍
什么是CQRS模式? CQRS是Command and Query Responsibility Segregation的缩写,直译就是命令与查询责任分离的意思. 命令会改变对象的状态,但不返回任何数 ...
- ElasticSearch入门到筋痛
1. 什么是ES ES中文网:https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html ES:是一款基于Lucene ...
- 实战交付一套dubbo微服务到k8s集群(8)之configmap使用
使用ConfigMap管理应用配置 拆分环境 主机名 角色 IP地址 mfyxw10.mfyxw.com zk1.od.com(Test环境) 192.168.80.10 mfyxw20.mfyxw. ...
- LeetCode 856. Score of Parentheses 括号的分数
其实是这道题的变式(某港带同学的C/C++作业) 增加一点难度,输入的S不一定为平衡的,需要自己判断是否平衡,若不平衡输出为0. 题目描述 Given a parentheses string s, ...
- pycharm 与 anaconda 关联
anaconda Anaconda指的是一个开源的Python发行版本,集成了许多数据分析的库. 使用tersorflow进行机器学习时常用Anaconda pycharm PyCharm是一种Pyt ...
- MarkDown(文本编译器)
MarkDown(一种高效的文本编译器) 推荐使用Typora 点击此处下载 使用方法 1. 首先创建一个文本文件xxx.txt. 2. 然后修改文件后缀为xxx.md.(可以记做玛德...) 3. ...
- Linux Bash Script conditions
Linux Bash Script conditions shell 编程之条件判断 条件判断式语句.单分支 if 语句.双分支 if 语句.多分支 if 语句.case 语句 refs http:/ ...
- NGINX configure auto generator
NGINX configure auto generator The easiest way to configure a performant, secure, and stable NGINX s ...
- js animation & requestAnimationFrame
js animation & requestAnimationFrame https://developer.mozilla.org/en-US/docs/Web/API/window/req ...