数据库之 MySQL --- 数据处理 之多表查询 (三)
个人博客网:https://wushaopei.github.io/ (你想要这里多有)
一、多表查询
【1】什么是多表查询?
- 即,从多个表中获取数据。
- 注意: 在多表查询是,如果列明在两个表中都有,那么列名前需要加上表名
- sql优化:列名前最好加上表名,尤其在多表查询时
SELECT employees.`first_name`,employees.`department_id`
departments.`department_id`,departments.`department_name`
FROM employees,departments -- 错误,缺少连接条件
-- 发生了笛卡尔集错误
-- 愿因: 缺少多表之间的连接条件,或者连接条件错误
SELECT e.first_name,e.department_id,-- 可以使用表的别名
d.department_id,d.department_name
FROM employees e, departments d -- 错误,缺少连接条件
【2】关于笛卡尔集 :
- 笛卡尔集会在下面条件下产生:
省略连接条件
连接条件无效
所有表中的所有行互相连接
为了避免笛卡尔集, 可以在 WHERE 加入有效的连接条件。
【3】使用笛卡尔集与不使用的对比
①查出所有数据
SELECT * FROM employees
SELECT * FROM departments
②不使用笛卡尔集的普通子查询(MySQL连接)
在 WHERE 子句中写入连接条件。
在表中有相同列时,在列名之前加上表名前缀
-- 需求: 查询每个员工所在部门的名称
SELECT employees.`first_name`,employees.`department_id`,
departments.`department_id`,departments.`department_name`
FROM employees,departments
WHERE employees.`department_id`= departments.`department_id`
③使用JOIN ON 实现多表查询,解决笛卡尔集的问题
-- sq199规定了多表查询的规则
-- 使用 join on
-- 注意: 如果有n个表需要连表查询,那么至少得有n-12个连接条件
SELECT e.first_name,d.department_id,l.city
FROM employees e JOIN departments d
ON e.department_id = d.department_id
JOIN locations l
ON d.location_id = l.location_id
MySQL 连接
【1】自连接,非自链接
-- 自连接需求: 查找员工和员工的领导
SELECT e.first_name,m.first_name
FROM employees e JOIN employees m
ON e.`manager_id` = m.`employee_id`
-- 非自连接:两张不同的表进行连接查询
-- 等值连接,非等值连接
-- 等值连接案例
SELECT e.first_name,d.department_name
FROM employees e JOIN departments d
ON e.department_id = d.department_id
-- 非等值连接需求: 查看所有员工薪水的等级
SELECT e.first_name,e.`salary`,j.grade
FROM employees e JOIN job_grades j
ON e.`salary`>= j.lowest_sal AND e.`salary` <=j.highest_sal
【2】 内连接,外连接
-- 内连接:
合并具有同一列的两个以上的表的行,结果集中不包含一个表与另一个表不匹配的行
-- 外连接: 左外连接 VS 右外连接
-- 左外连接: 两个表在连接过程中除了返回满足连接条件的行以外还返回左表中不满足条件的行
-- 这种连接成为左外连接
SELECT e.`first_name`,e.`department_id`,d.department_name
FROM employees e LEFT OUTER JOIN departments d
ON e.`department_id` = d.department_id
-- 右外连接:两个表在连接过程中除了返回满足连接条件的行意外还返回右表中不满足条件的行
-- 这种连接成为右外连接
SELECT e.`first_name`,e.`department_id`,d.department_id,d.department_name
FROM employees e RIGHT OUTER JOIN departments d
ON e.`department_id` = d.department_id
-- 满外连接 full join (mysql不支持)
数据库之 MySQL --- 数据处理 之多表查询 (三)的更多相关文章
- 数据库相关--mysql中的单表查询
一.完整的单表查询语句 select [distinct] *|字段1,字段2, .... from 表名 [where 条件1] [group by 字段名 [having 条件2] ] [orde ...
- mysql 基础入门 单表查询
单表查询 select 表头,表头 as 别名 ,表头(+-*/的运算) from table_a 1.条件查询 where + 条件 <> , != 不等于 = 等于,也可以表示字符串值 ...
- mysql中的回表查询与索引覆盖
了解一下MySQL中的回表查询与索引覆盖. 回表查询 要说回表查询,先要从InnoDB的索引实现说起.InnoDB有两大类索引,一类是聚集索引(Clustered Index),一类是普通索引(Sec ...
- mysql加强(4)~多表查询
mysql加强(4)~多表查询:笛卡尔积.消除笛卡尔积操作(等值.非等值连接),内连接(隐式连接.显示连接).外连接.自连接 一.笛卡尔积 1.什么是笛卡尔积: 数学上,有两个集合A={a,b},B= ...
- mysql 数据操作 单表查询 目录
mysql 数据操作 单表查询 mysql 数据操作 单表查询 简单查询 避免重复DISTINCT mysql 数据操作 单表查询 通过四则运算查询 mysql 数据操作 单表查询 concat()函 ...
- mysql 数据操作 多表查询 目录
mysql 数据操作 多表查询 准备 多表连接查询介绍 mysql 数据操作 多表查询 多表连接查询 笛卡尔积 mysql 数据操作 多表查询 多表连接查询 内连接 mysql 数据操作 多表查询 多 ...
- mysql 数据操作 单表查询 where 约束 目录
mysql 数据操作 单表查询 where约束 between and or mysql 数据操作 单表查询 where约束 is null in mysql 数据操作 单表查询 where约束 li ...
- mysql 数据操作 单表查询 group by 分组 目录
mysql 数据操作 单表查询 group by 介绍 mysql 数据操作 单表查询 group by 聚合函数 mysql 数据操作 单表查询 group by 聚合函数 没有group by情况 ...
- 数据库开发-Django ORM的单表查询
数据库开发-Django ORM的单表查询 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查询集 1>.查询集相关概述 查询会返回结果的集,它是django.db.mod ...
随机推荐
- 使用Android studio过程中发现的几个解决R变红的办法
刚开始使用Android studio的时候,好几次碰见新建了一个xml文件,或者new了一个activity之后,Android studio莫名其妙的报错了,而显示红色的地方就是常用的(R.id. ...
- 【Hadoop离线基础总结】oozie的安装部署与使用
目录 简单介绍 概述 架构 安装部署 1.修改core-site.xml 2.上传oozie的安装包并解压 3.解压hadooplibs到与oozie平行的目录 4.创建libext目录,并拷贝依赖包 ...
- u-boot 源码分析(1) 启动过程分析
u-boot 源码分析(1) 启动过程分析 文章目录 u-boot 源码分析(1) 启动过程分析 前言 配置 源码结构 api arch board common cmd drivers fs Kbu ...
- 真正免费,不限页数的PDF转Word工具
真正免费,不限页数的PDF转Word工具 我们知道PDF转Word工具非常多,但大部分都有各种限制,限大小,限页数,加水印等等. 这其中绝大部分其实并不能做到格式完全一样,遇到图片更是直接傻了. 我们 ...
- Java SPI机制简述
概述 SPI全称Service Provider Interface,是一种为框架提供良好扩展性的机制.一般由框架开发方定义接口规范(如java.sql.Driver),而第三方厂商为之提供自己的实现 ...
- zabbix email报警
把email 报警整了一遍 . 1 ,先把mail 系统整好. 我用的是sendmail yum install -y sendmail sendmail-cf vim /etc/mail/local ...
- 数据分析之Numpy、Matplotlib库
NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库. 菜鸟教程:https://www.run ...
- MYSQL mysql.user表中权限对应的解释
命令标识 授权表中对应的列 说明 CREATE Create_priv 创建数据库.表或索引 CREATE TEMPORARY TABLES Create_tmp_table_priv 创建临时数据表 ...
- Java集合--阻塞队列及各种实现的解析
阻塞队列(Blocking Queue) 一.队列的定义 说的阻塞队列,就先了解下什么是队列,队列也是一种特殊的线性表结构,在线性表的基础上加了一条限制:那就是一端入队列,一端出队列,且需要遵循FIF ...
- BATJ解决千万级别数据之MySQL 的 SQL 优化大总结
引用 在数据库运维过程中,优化 SQL 是 DBA 团队的日常任务.例行 SQL 优化,不仅可以提高程序性能,还能减低线上故障的概率. 目前常用的 SQL 优化方式包括但不限于:业务层优化.SQL 逻 ...