数据库之 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 ... 
随机推荐
- 假如用王者荣耀的方式学习webpack
			英雄介绍 崴博.派克诞生于遥远西方的勇士之地,拥有着高超的机械技艺,善于运用各种工具来实现一些看似不可能完成的事.游历王者大陆时机缘巧合遇到了年轻的墨子,与之成为好友.后协助大宗师墨子建造了大陆第一雄 ... 
- 这些Kubernetes常见安全问题,你遇到过几个?
			导语:在 Threat Stack 公布的2020年第一季度安全报告中,列举了在AWS Web服务部署Kubernetes的组织所遇到的最常见安全问题. 该报告建议已部署Kubernetes的IT组织 ... 
- 存储过程——公用表表达式(CTE)
			目录 0. 背景说明 1. 定义及语法细节 1.1 基本定义 1.2 基本语法 1.3 多个CTE同时声明 1.4 CTE嵌套使用 2. CTE递归查询 2.1 简介 2.2 准备工作 2.3 计算每 ... 
- 部署SSL站点 IIS+asp.net
			使用SSL必须要有证书,今天我们就使用IIS内置的证书完成SSL的部署. 1.打开MMC证书管理器,文件->添加/删除管理单元->证书,双击->确定 2.找到:个人->证书下有 ... 
- 一个小例子学习makefile
			前言 makefile推荐资料为陈皓的跟我一起写makefile,需要pdf资源的可以私我 正文 目录结构 ---include ------student.h ---src ------studen ... 
- 5-JVM常用的命令
			JVM常用的命令 jps :基础工具 查看JAVA进程PID. jps 命令用来查看所有 Java 进程,每一行就是一个 Java 进程信息. jps 仅查找当前用户的 Java 进程,而不是当前系统 ... 
- centos6下filebeat多开问题
			centos6下filebeat多开问题 0. 场景 比如之前在用filebeat做收集,但是想新开一个实例把之前的日志全部重新导一遍,如果直接指定filebeat -c 是不行的,因为filebea ... 
- 10.02经典类的bug
			#以下在python 3.6版本里已没有这个问题了1class A: def _init__(self): print ("this is A") def save(self): ... 
- mysql小白系列_11 MHA补充
			1.ssh_user 使用VIP方式需要在新的master主机上对网卡启alias并设置IP,普通用户没权限 2.VIP问题 配置以后主从后,在MHA管理节点启动masterha_manager,VI ... 
- 王艳 201771010127《面向对象程序设计(java)》第九周学习总结
			实验九 异常.断言与日志 实验时间 2018-10-25 1.实验目的与要求 (1) 掌握java异常处理技术: (2) 了解断言的用法: (3) 了解日志的用途: (4) 掌握程序基础调试技巧: 一 ... 
