mysql-7-join
#进阶7:连接查询
/*
多表连接:查询的字段来自多个表 按功能分类:
内连接:
等值连接
非等值连接
自连接
外连接:
左外连接
右外连接
全外连接
交叉连接
*/ USE girls; SELECT * FROM beauty;
SELECT * FROM boys; #SQL92语法
#一、内连接
#1、等值连接
#案例1:查询女生对应的男生名
SELECT name, boyName
FROM beauty, boys
WHERE beauty.boyfriend_id = boys.id; #案例2:查询员工名和对应的部门名
SELECT last_name, department_name
FROM myemployees.employees, myemployees.departments
WHERE employees.department_id = departments.department_id; #使用别名
#如果有重名,可以这样解决。但如果表使用了别名,就不能再在查询中用原名
SELECT E.last_name, D.department_name
FROM myemployees.employees AS E, myemployees.departments AS D
WHERE E.department_id = D.department_id; USE myemployees; #加筛选
#案例3:查询有奖金的员工名、部门名
SELECT last_name, department_name, commission_pct
FROM employees as e, departments as d
WHERE (e.department_id = d.department_id) AND (e.commission_pct IS NOT NULL); #案例4:查询城市名中第二个字符为o的部门名和城市名
SELECT department_name, city
FROM departments as d, locations as l
WHERE (d.location_id = l.location_id) AND (department_name LIKE '_O%'); # 加分组
#案例5:查询每个城市的部门个数
SELECT count(*), city
FROM departments as d, locations as l
WHERE d.location_id = l.location_id
GROUP BY city; #加排序
#案例6:查询每个工种的工种名和员工个数,并且按员工个数降序
SELECT job_title, count(*)
FROM employees as e, jobs as j
WHERE e.job_id = j.job_id
GROUP BY job_title
ORDER BY count(*) DESC; #多表连接
#案例7:查询员工名、部门名和所在的城市
SELECT last_name, department_name, city
FROM employees as e, departments as d, locations as l
WHERE e.department_id = d.department_id AND d.location_id = l.location_id; SELECT * FROM job_grades; #2、非等值连接
#案例8:查询员工工资和工资级别
SELECT salary, grade_level
FROM employees as e, job_grades as g
WHERE salary BETWEEN g.lowest_sal AND g.highest_sal
ORDER BY grade_level; #3、自连接
#案例9:查询员工名和领导的名称
SELECT e1.last_name as 员工, e2.last_name as 领导
FROM employees as e1, employees as e2
WHERE e1.manager_id = e2.employee_id; #SQL99语法
/*
SELECT 查询列表
FROM 表1 别名 【连接类型】
JOIN 表2 别名
ON 连接条件
【WHERE 筛选条件】
*/
#一、内连接:INNER
/*
SELECT 查询列表
FROM 表1 别名
INNER JOIN 表2 别名
ON 连接条件
【WHERE 筛选条件】 用于查询多个表中都有的记录,两个表的交集
*/
#1、等值连接
#案例1:查询员工名、部门名
SELECT last_name, department_name
FROM employees as e
INNER JOIN departments as d
ON e.department_id = d.department_id; #案例2:查询员工名、部门名、工种名,并按部门名降序
SELECT last_name, department_name, job_title
FROM employees as e
INNER JOIN departments as d ON e.department_id = d.department_id
INNER JOIN jobs as j ON e.job_id = j.job_id
ORDER BY department_name DESC; #2、非等值连接
#案例3:查询员工工资和工资级别
SELECT salary, grade_level
FROM employees as e
INNER JOIN job_grades as g
ON salary BETWEEN g.lowest_sal AND g.highest_sal
ORDER BY grade_level; #案例4:查询每个工资级别>20的个数,并且按工资级别降序
SELECT count(*), grade_level
FROM employees as e
INNER JOIN job_grades as g
ON e.salary BETWEEN g.lowest_sal AND g.highest_sal
GROUP BY grade_level
HAVING count(*) > 20
ORDER BY grade_level DESC; #3、自连接
#案例5:查询包含k字符的员工名、及其领导的名称
SELECT e1.last_name as 员工, e2.last_name as 领导
FROM employees as e1
INNER JOIN employees as e2
ON e1.manager_id = e2.employee_id
WHERE e1.last_name LIKE '%k%'; #二、外连接
/*
用于查询一个表中有、另一个表中没有的记录。主从表的交集+主从表的差集 有主从表之分 1、外连接的查询结果为主表中的所有记录
如果从表中有和它匹配的,则显示匹配的值
如果从表中没有和它匹配的,则显示null
外连接的查询结果=内连接结果+主表有而从表中没有的记录 2、左外连接,left join 左边是主表
右外连接,right join 右边是主表 3、交换顺序,左外、右外等价
*/
#1、左外连接:LEFT 【OUTER】 USE girls;
#案例1:查询男友不在男生表中的的女生名
SELECT b.name
FROM beauty as b
LEFT OUTER JOIN boys as bo
ON b.boyfriend_id = bo.id
WHERE bo.id IS NULL; # id是主键 #2、右外连接:RIGHT 【OUTER】
#交换顺序,主表在后,和左外连接等价
SELECT b.name
FROM boys as bo
RIGHT OUTER JOIN beauty as b
ON b.boyfriend_id = bo.id
WHERE bo.id IS NULL; #案例2:查询没有员工的部门
USE myemployees;
SELECT d.*, e.employee_id
FROM departments as d
LEFT OUTER JOIN employees as e
ON d.department_id = e.department_id
WHERE e.department_id IS NULL; #3、全外连接:FULL 【OUTER】
#查询的是两个表的并集 #三、交叉连接:CROSS
#两个表的笛卡尔积 #多表连接案例
#查询编号>3的女生的男友信息,如果有则列出详细,如果没有则用null填充
USE girls;
SELECT b.id, b.name, bo.*
FROM beauty as b
LEFT OUTER JOIN boys as bo
ON b.boyfriend_id = bo.id
WHERE b.id > 3; #查询哪个城市没有部门
USE myemployees;
SELECT l.city
FROM locations as l
LEFT OUTER JOIN departments as d
ON l.location_id = d.location_id
WHERE d.location_id IS NULL; #查询部门名为Sal或IT的员工信息
SELECT e.*, d.department_name
FROM employees as e
INNER JOIN departments as d
ON e.department_id = d.department_id
WHERE d.department_name IN ('Sal', 'IT');
mysql-7-join的更多相关文章
- MySQL Left Join,Right Join
魂屁,东西发这里了关于Left Join,Right Join的 在讲MySQL的Join语法前还是先回顾一下联结的语法,呵呵,其实连我自己都忘得差不多了,那就大家一起温习吧(如果内容有错误或有疑问, ...
- MySQL Full Join的实现
MySQL Full Join的实现 由于MySQL不支持FULL JOIN,以下是替代方法 left join + union(可去除反复数据)+ right join select * from ...
- mysql left join
MySQL左连接不同于简单连接.MySQL LEFT JOIN提供该表额外字段在左侧. 如果使用LEFT JOIN,得到的所有记录的匹配方式相同, 在左边表中得到的每个记录不匹配也会有一个额外的记录. ...
- MySQL的JOIN(一):用法
JOIN的含义就如英文单词"join"一样,连接两张表,大致分为内连接,外连接,右连接,左连接,自然连接.这里描述先甩出一张用烂了的图,然后插入测试数据. CREATE TABLE ...
- MySQL的JOIN(三):JOIN优化实践之内循环的次数
这篇博文讲述如何优化内循环的次数.内循环的次数受驱动表的记录数所影响,驱动表记录数越多,内循环就越多,连接效率就越低下,所以尽量用小表驱动大表.先插入测试数据. CREATE TABLE t1 ( i ...
- MySQL的JOIN(四):JOIN优化实践之快速匹配
这篇博文讲述如何优化扫描速度.我们通过MySQL的JOIN(二):JOIN原理得知了两张表的JOIN操作就是不断从驱动表中取出记录,然后查找出被驱动表中与之匹配的记录并连接.这个过程的实质就是查询操作 ...
- MySQL的JOIN(五):JOIN优化实践之排序
这篇博文讲述如何优化JOIN查询带有排序的情况.大致分为对连接属性排序和对非连接属性排序两种情况.插入测试数据. CREATE TABLE t1 ( id INT PRIMARY KEY AUTO_I ...
- Mysql Nested-Loop Join Algorithms
MySQL在多表之间执行join时,利用一种nested-loop algorithm 或者其变种:(嵌套循环) Nested-Loop Join Algorithm 一个简单的嵌套循环连 ...
- [转]MySQL update join语句
原文地址:https://www.jianshu.com/p/f99665266bb1 在本教程中,您将学习如何使用MySQL UPDATE JOIN语句来执行跨表更新.我们将逐步介绍如何使用INNE ...
- mysql的join操作
一.Join语法概述 join 用于多表中字段之间的联系,语法如下: ... FROM table1 INNER|LEFT|RIGHT JOIN table2 ON conditiona table1 ...
随机推荐
- 痞子衡嵌入式:导致串行NOR Flash在i.MXRT下无法正常下载/启动的常见因素之SFDP
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是导致串行NOR Flash在i.MXRT下无法正常下载/启动的常见因素之SFDP. i.MXRT系列MCU发布已两年多了,基于i.MXR ...
- 基于canal的client-adapter数据同步必读指南
本文将介绍canal项目中client-adapter的使用,以及落地生产中需要考虑的可靠性.高可用与监控报警.(基于canal 1.1.4版本) canal作为mysql的实时数据订阅组件,实现了对 ...
- graph attention network(ICLR2018)官方代码详解(te4nsorflow)
论文地址:https://arxiv.org/abs/1710.10903 代码地址: https://github.com/Diego999/pyGAT 我并没有完整看过这篇论文,但是在大致了解其原 ...
- vue、react等SPA应用页脚组件闪烁的解决办法
大家好,我是木瓜太香.大家在开发单页应用的时候,经常会遇到这样的需求,头部和尾部两个组件是大多数组件公用的,而中间的内容区域则是单独存在的,而且一般内容组件逻辑会比较多,如果我们不停刷新页面可能会出现 ...
- 如何编写一个简单的Linux驱动(一)
前言 最近在学习Linux驱动,记录下自己学习的历程. 驱动的基本框架 Linux驱动的基本框架包含两部分,“模块入口.出口的注册”和“模块入口.出口函数的实现”,如下方代码. static int ...
- 0 mysql 安装
1 安装网址 https://dev.mysql.com/downloads/installer/ 选择 mysql server版本一路next 2.配置环境 mysql 默认安装位置是: C:\P ...
- C#中TextBox设置readonly不能读取数据问题
在ASP.NET中前端设置控件TextBox的属性为Readonly="True"时,如果之前有设定初始值,或通过JS方式给其赋值后,在后台访问其Text值却无法获取,这种问题的解 ...
- pwnable——flag
分析 此题为reverse题目,首先放入ida查看: 程序函数太少,应该加过壳 在hex view中发现程序通过upx加壳,利用upx -d 指令解压得到程序,重新放入ida查看 程序非常简单,读取f ...
- docker启动容器报错 Unknown runtime specified nvidia.
启动docker容器时,报错 问题复现 当我启动一个容器时,运行以下命令: docker run --runtime=nvidia .... 后面一部分命令没写出来,此时报错的信息如下: docker ...
- 实践案例丨基于 Raft 协议的分布式数据库系统应用
摘要:简单介绍Raft协议的原理.以及存储节点(Pinetree)如何应用 Raft实现复制的一些工程实践经验. 1.引言 在华为分布式数据库的工程实践过程中,我们实现了一个计算存储分离. 底层存储基 ...