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 ...
最新文章
- 二叉搜索树的简明实现(ES5 ES6)
- 零基础学python 明日科技-明日科技 - 课程
- C++11智能指针shared_ptr、weak_ptr、unique_ptr用法
- java数据库易错程序题_JAVA程序改错 (易错题)(示例代码)
- RocketMQ消息支持的模式-消息同步发送
- sql server链接查询
- C语言10进制写法,用c语言编写函数Htoi(s)把由16进制数成10进制的数
- python写一个类600行代码_带你领略算法的魅力,一个600行代码的分词功能实现(一)...
- 移动通信matlab实现,现代移动通信中的调制技术研究及Matlab实现
- PyTorch学习(二):Transform
- BERT简介及中文分类
- AI:ModelScope(一站式开源的模型即服务共享平台)的简介、安装、使用方法之详细攻略
- ElasticSearch(待改)
- SQL语句查询重复语句并进行标记和更新
- 美国通胀大幅下降?可衰退却成为投资者2023年最担心的问题
- Educational Codeforces Round 81 (Rated for Div. 2)
- UEFI模式安装Windows Linux双系统
- Elasticsearch实战-实现Hotel索引库的自动补全、拼音搜索功能
- ICASSP 2022 | 用于多模态情感识别的KS-Transformer
- Jcrop图片裁剪+canvas+thinkphp
热门文章
- h5页面输入框在安卓手机上被键盘挡住
- P-Tuning v2: Prompt Tuning Can Be Comparable to Fine-tuning Universally Across Scales and Tasks论文笔记
- 奈学教育《大数据架构师》课程大纲
- TypeError [ERR_INVALID_ARG_TYPE]: The “path“ argument must be of type string(已解决)
- 基于三代测序技术的微生物组学研究进展
- python随机库函数_python标准库中的随机分布函数
- 自编码器(Autoencoder)基本原理与模型实现
- C++ 链表的基本操作
- 红米5plus刷android one,安卓刷机必备!TWRP恢复工具添加支持红米5/雷蛇手机
- 怎么用cmd强制修改密码