2022/1/22 北京 mysql 多表关联查询,等值连接、非等值连接,外连接,内连接、自连接
一、笛卡尔积错误
要查询的俩个字段分别在俩张表 employee_id,department_name。所以要多表关联查询
select * from employees; -- 能查询出107条记录
select * from departments; -- 能查询出27条记录
笛卡尔积错误写法:
--下面俩种查询方式会造成笛卡尔积错误
select employee_id,department_name from employees,departments; -- 能查询出2889条记录select employee_id,department_name from employees cross join departments; --交叉连接
正确的写法:查出来106条记录,少一条?因为在有一个员工他部门id是空的
select employee_id,department_name
from employees,departments
--左表为主表,查出来会少一条记录,因为有一个员工没有部门id
where employees.'department_id'=departments.'department_id'
SELECT employee_id,`last_name` FROM employees
WHERE `department_id` IS NULL
二、多表关联--不明确的(ambiguous)
sql查询里要是加一个department_id,那么查询时就会报错,因为此时这个字段是不明确的。
所以在多表查询时推荐在每个字段前加上表名,不管它是不是俩个表都有的字段
-- 如果查询语句中出现了多个表中都有的字段,比如department_id,那么必须指明此字段所在的表
SELECT employees.employee_id,departments.department_name,employees.department_id
FROM employees,departments
WHERE employees.`department_id`= departments.`department_id`;
提高sql可读性,给表起别名
要注意的是,起了别名以后,一旦在select或where中使用表名的话,则必须使用表的别名,而不能使用表的原名
错误写法:
-- 如果查询语句中出现了多个表中都有的字段,比如department_id,那么必须指明此字段所在的表
SELECT employees.employee_id,departments.department_name,employees.department_id
FROM employees e,departments d
WHERE e.`department_id`= d.`department_id`;
正确写法:
-- 如果查询语句中出现了多个表中都有的字段,比如department_id,那么必须指明此字段所在的表
SELECT e.employee_id,d.department_name,e.department_id
FROM employees e,departments d
WHERE e.`department_id`= d.`department_id`;
三、三张表关联查询
得出结论:如果有n个表关联查询,则至少需要n-1个链接条件。
非等值连接
SELECT e.`last_name`,e.`salary`,j.`grade_level`
FROM employees e,`job_grades` j
WHERE e.`salary` BETWEEN j.`lowest_sal` AND j.`highest_sal`
四、SQL99 内连接
inner join inner可以省略
查出来的员工都有部门,查出来的部门也都有员工
合并具有同一列的俩个以上的表的行,结果集中不包含一个表与另一个表不匹配的行
-- sql99语法实现内连接
SELECT e.`last_name`,d.`department_name`
FROM `employees` e
INNER JOIN `departments` d
ON e.`department_id`=d.`department_id`
三个表的内连接
-- sql99语法实现内连接
SELECT e.`last_name`,d.`department_name`,l.`city`
FROM `employees` e
INNER JOIN `departments` d
ON e.`department_id`=d.`department_id`
INNER JOIN `locations` l
ON d.`location_id`=l.`location_id`;
五、外连接
合并具有同一列的俩个以上的表的行,结果集中除了包含一个表与另一个表匹配的行之外,还查询到了左表与右表不匹配的行。
- 左外连接:俩个表在连接过程中除了返回满足连接条件的行以外还返回左表中不满足条件的行
- 右外连接:俩个表在连接过程中除了返回满足连接条件的行以外还返回右表中不满足条件的行
左外连接: LEFT OUTER JOIN 【可以省略OUTER】
此时在内连接的基础上,可以再查出没有部门的员工
SELECT e.`last_name`,d.`department_name`
FROM `employees` e
LEFT OUTER JOIN `departments` d
ON e.`department_id`=d.`department_id`
右外连接 RIGHT OUTER JOIN 【可以省略OUTER】
此时在内连接的基础上,可以再查出一些没有员工的部门
SELECT e.`last_name`,d.`department_name`
FROM `employees` e
RIGHT OUTER JOIN `departments` d
ON e.`department_id`=d.`department_id`
满外连接 union
#查询所有员工和所有部门,包括没有指定部门的员工和没有分配员工的部门。
SELECT e.`last_name`,d.`department_name`
FROM `employees` e
LEFT OUTER JOIN `departments` d
ON e.`department_id`=d.`department_id`UNIONSELECT e.`last_name`,d.`department_name`
FROM `employees` e
RIGHT OUTER JOIN `departments` d
ON e.`department_id`=d.`department_id`
六、自连接
查询员工id,员工姓名及其管理者的id和姓名,区别于其他的地方在于管理者的id其实也是员工表的员工id。
-- 查询员工id,员工姓名及其管理者的id和姓名
SELECT e.`employee_id`,e.`last_name`,mgr.`employee_id`,mgr.`last_name`
FROM `employees` e,employees` mgr
where e.`manager_id`= mgr.`employee_id`-- 查询员工id,员工姓名及其管理者的id和姓名
SELECT e.`employee_id`,e.`last_name`,mgr.`employee_id`,mgr.`last_name`
FROM `employees` e
INNER JOIN employees` mgr
on e.`manager_id`=mgr.`employee_id`
7种SQL JOINS的实现
2022/1/22 北京 mysql 多表关联查询,等值连接、非等值连接,外连接,内连接、自连接相关推荐
- MySQL多表关联查询效率高点还是多次单表查询效率高,为什么?
这里写目录标题 MySQL多表关联查询对比多次单表查询,哪个效率高? 疑问: 高手解答: <阿里巴巴JAVA开发手册>里面写超过三张表禁止join 这是为什么?这样的话那sql要怎么写? ...
- Mysql多表关联查询
三表(replay_case.replay_task及general_flow)联合查询,注意select时,如果某个字段在不同的表中有重复的话需要指定具体的表,比如应该使用:select ...
- MYSQL多表关联查询与子查询
多表关联查询 关联查询又名连接查询,其主要包括了内连接,外连接,自连接,交叉连接等四个大类. 首先我们要清楚我们为什么要使用多表关联查询,肯定是因为我们想要显示的数据来自于两个或多个数据表内部,我们想 ...
- MySQL多表关联查询与存储过程
-- **************关联查询(多表查询)**************** -- 需求:查询员工及其所在部门(显示员工姓名,部门名称) -- 1.1 交叉连接查询(不推荐.产生笛卡尔乘积 ...
- mysql 子表 关联查询语句_MySQL-基本查询语句及方法,连表和子查询
一.基本查询语句 create table emp( id intnotnull unique auto_increment, name varchar(20) notnull, sex enum(' ...
- mysql多数据表关联查询慢问题解决方案
问题一:遇到一个问题,mysql库下表A有几万条数据:表B也有几万条数据,结果两表关联的时候,查询超级慢,30s内没反应. 问题一解决方案: 1. 加索引,但索引不要乱加,两表关联,必须要创建的索引是 ...
- mysql 子表 关联查询语句_MySQL基本SQL语句之单表查询、多表查询和子查询
一.简单查询: 基本语法:SELECT * FROM tb_name;查询全部 SELECT field1,field2 FROM tb_name; 投影 SELECT [DISTINCT] * FR ...
- mysql 子表 关联查询语句_mysql查询语句 和 多表关联查询 以及 子查询
1.查询一张表: select * from 表名: 2.查询指定字段:select 字段1,字段2,字段3-.from 表名: 3.where条件查询:select 字段1,字段2,字段3 from ...
- 面试官:为什么mysql不建议执行超过3表以上的多表关联查询?
概述 前段时间在跟其他公司DBA交流时谈到了mysql跟PG之间在多表关联查询上的一些区别,相比之下mysql只有一种表连接类型:嵌套循环连接(nested-loop),不支持排序-合并连接(sort ...
最新文章
- 【JVM】肝了一周,吐血整理出这份超硬核的JVM笔记(升级版)!!
- 转牛人博客 稀疏矩阵定义CSR COO CSC 第一个讲的清晰易懂的人
- python能做什么
- spoj Find Log
- The Best Way to Export an SVG from Sketch
- 数据库分库分表的几种方式
- 时间序列分析之:函数分解decompose
- 使用Hexo搭建个人博客的终极资料
- python判断、创建文件夹
- pythonifnotnone_python中if not x: 和 if x is not None: 和 if not x is None的使用和区别
- 如何需求分析和编写测试用例
- 第六章:编写安全应用
- windchill文件无法上传服务器,Windchill MethodServer无法启动
- 总结关于 Vue 框架面试题
- 17 任务调度相关类综述——Live555源码阅读(一)任务调度相关类
- vs连接Oracle 客户端库时引发 BadImageFormatException
- 记录利用CSS完美解决前端图片变形问题
- read()/write()的生命旅程之二——第二章:read()
- dubbo源码解析-zookeeper连接
- [Azure - VNet] 解决办法:Azure P2S VNet无法建立网络连接。“parameter is incorrect“ (Error 87 参数错误)
热门文章
- 记录一次错误:Springboot访问前端页面“No mapping for GET”
- 结构体的定义、初始化
- 使用express-jwt第三方包报错TypeError: expressJWT is not a function
- ffmpeg学习十二:滤镜(实现视频缩放,裁剪,水印等)
- android近期任务栏图片生成过程
- Git冲突:Your local changes would be overwritten by merge. Commit, stash or revert them to proceed.
- 激活函数变种(Sigmoid、Hard-Sigmoid、Tanh、ReLU、Leaky ReLU、ELU、SELU、ReLU6、Swish、Hard-Swish、Mish)
- 机械工程专业与c语言的联系,新工科背景下的机械专业C语言课程改革
- Android Zxing识别图片二维码识别率低
- zTree实现基本树