(五)连接查询(SQL99标准)、子查询、分页查询、联合查询
一、连接查询(SQL99标准)
1、含义:当要查询的数据来自多张表时要使用连接查询
2、语法:
select 查询列表
from 表1 别名
【连接类型】 join 表2 别名
on 连接条件
【where 筛选条件】
【group by 分组】
【having 筛选条件】
【order by 排序列表】
注意:SQL99标准支持以下连接方式:
#1内连接
#2外连接:左外、右外、全外连接
#3交叉连接(很少用到)
3、内连接:
案例一:查询部门个数>3的城市名和部门个数(分组函数+分组查询)

上图可以看出两个表之间的关系
SELECT COUNT(*),l.`city`
FROM departments d
INNER JOIN locations l ON d.`location_id`=l.`location_id`
GROUP BY l.`city`
HAVING COUNT(*)>3;
案例二:查询员工名、部门名、工种名,并按部门名降序(添加三表连接)
SELECT last_name,department_name,job_title
FROM employees e
INNER JOIN departments d ON e.`department_id`=d.`department_id`
INNER JOIN jobs j ON e.`job_id`=j.`job_id`
ORDER BY d.`department_name` DESC;
注意:根据上面两个案例可以看出内连接时连接类型使用INNER(可省略)
4、外连接(左外、右外连接)
①用到的库信息:

②区分左、右外连接:

③左外连接:
案例:查询男朋友不在男生表中的女神名
SELECT b.`name`
FROM beauty b
LEFT JOIN boys bo ON b.`boyfriend_id`=bo.`id`;
注意:左外连接类型使用LEFT OUTER ,其中OUTER可以省略
④右外连接:
案例:查询男朋友不在男生表中的女神名
SELECT b.`name`
FROM boys bo
RIGHT JOIN beauty b ON bo.`id`=b.`boyfriend_id`;
注意:右外连接类型使用RIGHT OUTER ,其中OUTER可以省略
⑤区分内外连接:

二、子查询
1、含义:SQL语句中嵌套其它完整的SQL语句
2、分类:
select后: 标量子查询(结果集只有一行一列)
from后:表子查询(多行多列)
where或having后:标量子查询()、列子查询(一列多行)、行子查询(一行多列)
exists后面:相关子查询、表子查询
注意:
①子查询要放在小括号中,且子查询不需要添加分号
②标量子查询:一般搭配单行操作符使用(> < >= <= = <>)
③列子查询:一般搭配多行操作符使用(in、any/some、all)
3、WHERE或HAVING后面的子查询:
①标量子查询:
案例1:谁的工资比 Abel 高? (子查询)
step1:查询Abel的工资
USE myemployees;
SELECT e.salary Abel的工资
FROM employees e
WHERE e.last_name='Abel';
step2:将step1的结果当作子查询嵌套在step中
SELECT last_name
FROM employees e
WHERE e.`salary`>(
SELECT e.salary Abel的工资
FROM employees e
WHERE e.last_name='Abel'
);
运行结果:

案例2:返回job_id与141号员工相同,salary比143号员工多的员工 姓名,job_id(多个子查询)
step1:查询141号员工的job_id
SELECT e.job_id
FROM employees e
WHERE e.`employee_id`=141;
step2:143号员工的工资
SELECT e.salary
FROM employees e
WHERE e.`employee_id`=143;
step3:将step1、step2的结果嵌套到step3中
SELECT e.last_name,e.job_id
FROM employees e
WHERE e.`job_id`=(
SELECT e.job_id
FROM employees e
WHERE e.`employee_id`=141
)AND e.salary > (
SELECT e.salary
FROM employees e
WHERE e.`employee_id`=143
);
案例3:查询最低工资大于50号部门最低工资的部门id和其最低工资(分组查询+HAVING后子查询)
SELECT department_id,MIN(salary)
FROM employees
GROUP BY department_id
HAVING MIN(salary)>( #筛选的时候注意是where还是having
SELECT MIN(salary)
FROM employees
WHERE department_id=50
);
②列子查询:
案例:返回location_id是1400或1700的部门中的所有员工姓名
SELECT e.last_name
FROM employees e
WHERE e.`department_id` IN(
SELECT d.department_id
FROM departments d
WHERE d.`location_id` IN(1400,1700)
);
注意:IN 等价于=ANY ( ) , NOT IN 等价于<> ALL( )
③行子查询:
案例:查询员工编号最小并且工资最高的员工信息
SELECT *
FROM employees
WHERE (employee_id,salary)=(
SELECT MIN(employee_id),MAX(salary)
FROM employees
);
或
SELECT *
FROM employees
WHERE employee_id=(
SELECT MIN(employee_id)
FROM employees
)AND salary=(
SELECT MAX(salary)
FROM employees
);
4、FROM后面的子查询
含义:FROM后面跟的是表,所以子查询的结果也应该是一张表。
注意:FROM后面的子查询必须要起别名
案例:查询每个部门的平均工资的工资等级
step1:查询每个 部门的平均工资和部门编号
SELECT AVG(salary),department_id
FROM employees
GROUP BY department_id;
运行结果:

注意:运行结果是一张表
step2:根据step1得出的表,判断工资等级
SELECT ag_dep.*,g.`grade_level`
FROM (
SELECT AVG(salary) ag,department_id
FROM employees
GROUP BY department_id
) ag_dep
INNER JOIN job_grades g
ON ag_dep.ag BETWEEN lowest_sal AND highest_sal;
5、SELECT后面子查询(仅支持标量子查询)
案例:查询每个部门的员工个数
SELECT d.*,(
SELECT COUNT(*)
FROM employees e
WHERE d.`department_id`=e.department_id
)个数
FROM departments d;
6、EXITS后面的子查询
语法:(返回值仅为1/0,当括号中表不为空时返回1,否则返回0)
SELECT EXISTS(SELECT * FROM employees);
案例:查询有员工的部门名
SELECT department_name
FROM departments d
WHERE EXISTS(
SELECT *
FROM employees e
WHERE e.`department_id`=d.`department_id`
);
三、分页查询
1、含义:从一张表中选出连续几行数据要用到分页查询。
2、语法:
SELECT 查询列表
FROM 表
【JOIN TYPE JOIN 表2
ON 连接条件
WHERE 筛选条件
GROUP BY 分组字段
HAVING 分组后的筛选
ORDER BY 排序的字段】
LIMIT 【OFFSET,】size;
注意:OFFESET:起始索引(默认从0开始) SIZE:总行数
案例1:有奖金的员工信息,显示工资较高的前10名
step1:降序排列有奖金的员工信息
SELECT e.*
FROM employees e
WHERE e.`commission_pct` IS NOT NULL
ORDER BY e.`salary` DESC;
step2:将员工信息的前十条筛选出来
SELECT e.*
FROM employees e
WHERE e.`commission_pct` IS NOT NULL
ORDER BY e.`salary` DESC
LIMIT 0,10;
案例2:已知页数page和每页的行数size,写出通式
SELECT 查询列表
FROM 表
LIMIT (page-1)*size,size;
四、联合查询
1、优点:当多张表之间没有连接条件时,使用UNION(联合查询)很方便。
2、语法:
查询语句1
UNION
查询语句2
UNION
……
注意:
①要求多条查询语句的查询列数一致且每条查询语句都要完整(可单独执行),非最后一条查询条件不需要添加分号
②最终显示的字段名称是第一条查询条件中所查询的内容,要保证所有查询语句所查询的内容一致且数目相等
③UNION查询默认去重,可使用UNION ALL来避免去重
案例1:查询部门编号>90或邮箱包含a的员工信息
SELECT * FROM employees WHERE email LIKE '%a%'
UNION
SELECT * FROM employees WHERE department_id>90;
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
复习整理,如有错误请指出。
(五)连接查询(SQL99标准)、子查询、分页查询、联合查询的更多相关文章
- Mysql的查询语句(联合查询、连接查询、子查询等)
Mysql的各个查询语句(联合查询.连接查询.子查询等) 一.联合查询 关键字:union 语法形式 select语句1 union[union选项] select 语句2 union[union选项 ...
- 【软件实施面试】MySQL和Oracle联合查询以及聚合函数面试总结
软件实施面试系列文章第二弹,MySQL和Oracle联合查询以及聚合函数的面试总结.放眼望去全是MySQL,就不能来点Oracle吗?之前面过不少公司,也做过不少笔试题,现在已经很少做笔试题了.你肚子 ...
- SQL之联合查询学习笔记
定义: 联合查询可合并多个相似的选择查询的结果集.等同于将一个表追加到另一个表,从而实现将两个表的查询组合到一起,使用谓词为UNION或UNION ALL. 语法格式 UNION 可以将两个或两个以上 ...
- MySQL(16):Select-union(联合查询)
1. Select-union(联合查询) union用于把来自许多SELECT语句的结果组合到一个结果集合中. 用法: SELECT ...UNION [ALL | DISTINCT]SELECT ...
- MyBatis联合查询和使用association 进行分步式查询
查询Emp的同时,查出emp对应的部门Department 方法1:联合查询,使用级联属性封装结果集 <!-- 联合查询,使用级联属性封装结果集 type:要自定义规则的javaBean类型 i ...
- linq中如何实现多个条件的联合查询
目前接触处理数据这一块比较多,在处理内存中的数据源的时候我一般使用的是linq,linq使用起来像sql语句一样,用法简单,功能强大. 最近需要实现一个从两个不同的文件读取不同的数据,然后根据这两个数 ...
- baby sqli 联合查询加入数据 手工注入
0x00 BabySQli 原题目描述:刚学完sqli,我才知道万能口令这么危险,还好我进行了防护,还用md5哈希了密码! 登陆页面,查看源码后点进search.php看到一段可疑的句子MMZFM42 ...
- 18 12 06 sql 的 基本语句 查询 条件查询 逻辑运算符 模糊查询 范围查询 排序 聚合函数 分组 分页 连接查询 自关联 子查询
-- 数据的准备 -- 创建一个数据库 create database python_test charset=utf8; -- 使用一个数据库 use python_test; -- 显示使用的当前 ...
- SQL连接、合并、子查询
连接:连接分为内连接.外连接.交叉连接 内连接和外连接都是在笛卡尔积的基础做一些修改. 合并查询:把两个相似的结果可以用union联合起来. mysql> select id,time from ...
随机推荐
- hadoop(hbase)副本数修改
一.需求场景 随着业务数据的快速增长,物理磁盘剩余空间告警,需要将数据备份从3份修改为1份,从而快速腾出可用磁盘容量. 二.解决方案 1. 修改hdfs的副本数 Hbase 的数据是存储在 hdfs ...
- 基于vue+Django的简迩音乐用户界面实现
应这次软件工程课程要求,我们团队着力打造一个音乐播放器软件. 软件实现主要采用基于Vue.js+Python Django,前后端分离架构实现网页. 用户界面主要功能:呈现用户收藏歌单歌曲信息,并且提 ...
- 201771010128王玉兰《面向对象程序设计(Java)》第十二周学习总结
第一部分:理论知识 1.AWT与Swing简介 (1)Swing用户界面库是非基于对等体的GUI工具箱. Swing具有更丰富并且更方便的用户界面元素集合. Swing对底层平台的依赖很少,因此与 ...
- 21-8 数据检索2 top和distinct
--distinct关键字,根据已经查询出的结果然后去除重复 select distinct * from TblStudent --Top(一般会配合order by一起使用) ---------- ...
- ES[7.6.x]学习笔记(十)聚合查询
聚合查询,它是在搜索的结果上,提供的一些聚合数据信息的方法.比如:求和.最大值.平均数等.聚合查询的类型有很多种,每一种类型都有它自己的目的和输出.在ES中,也有很多种聚合查询,下面我们看看聚合查询的 ...
- 获取MP4媒体文件时长
由于之前上传MP4文件没有保存视频时长,现在有需要,所以只好写代码读取时长.找了几个发现是 c/c++ 实现,或者是借助 FFmpeg 实现. 一个偶然在 GitHub 上面发现一个 c 文件,由于获 ...
- VS中自定义代码片段
VS - 工具 - 代码片段管理器 实现:propnotify 加 Tab 键 生成属性定义代码片段 (包含一个字段定义,一个属性get/set定义,其中set会触发属性值变更事件) <?xml ...
- Eclipse中常用快捷键的使用
1.补全代码的声明:alt + / 2.快速修复: ctrl + 1 3.批量导包:ctrl + shift + o 4.使用单行注释:ctrl + / 5.使用多行注释: ctrl + shift ...
- HTTP 冷知识 | HTTP 请求中,空格应该被编码为 %20 还是 + ?
HTTP 请求中,空格应该被编码为什么?今天我们走进 RFC 文档和 W3C 文档,了解一下这个「史诗级」大坑. 1.%20 还是 + ? 开始讲解前先看个小测试,在浏览器里输入 blank test ...
- Alpha冲刺 —— 5.1
这个作业属于哪个课程 软件工程 这个作业要求在哪里 团队作业第五次--Alpha冲刺 这个作业的目标 Alpha冲刺 作业正文 正文 github链接 项目地址 其他参考文献 无 一.会议内容 1.展 ...