sql-DQL-多表联查
多表查询
笛卡尔积
- 左表的每条数据和右表的每条数据组合,这种效果称为笛卡尔乘积

select * from emp, dept;

- 笛卡尔积引入了很多无用的数据,要完成多表查询,需要设置过滤条件来消除无用的数据
连接查询
- 从哪些表中查询数据
- 关联条件是什么
- 查询哪些字段
内连接查询
用左边表的记录去匹配右边表的记录,如果符合条件的则显示。如:从表.外键=主表.主键
1. 隐式内连接:使用where
-- 查询所有员工信息和对应的部门信息
select * from emp ,dept where emp.DEPTNO = dept.DEPTNO;
-- 查询员工表的工号\姓名\部门名称
select emp.EMPNO,emp.ENAME,dept.DEPTNO,dept.DNAME
from emp ,dept
where emp.DEPTNO = dept.DEPTNO;
2. 显式内连接:使用inner join ... on ...
select 字段列表 from 表名1 [inner] join 表名2 on 条件
-- 将隐式内连接改成显示内连接
select emp.EMPNO,emp.ENAME,dept.DEPTNO,dept.DNAME
from emp
inner join dept
on emp.DEPTNO = dept.DEPTNO;
select emp.EMPNO,emp.ENAME,dept.DEPTNO,dept.DNAME
from emp
join dept
on emp.DEPTNO = dept.DEPTNO;
外连接查询
1. 左外连接
用左边表的记录去匹配右边表的记录,如果符合条件的则显示;否则,显示 NULL
:在内连接的基础上保证左表的数据全部显示(左表是部门,右表员工)
select 字段列表 from 表1 left [outer] join 表2 on 条件;
-- 查询所有员工信息,如果员工有部门,则查询部门名称,没有部门,则不显示部门名称
select emp.*,dept.DNAME from emp left OUTER join dept on emp.DEPTNO = dept.DEPTNO;
-- 省略OUTER关键字
select emp.*,dept.DNAME from emp left join dept on emp.DEPTNO = dept.DEPTNO;
-- mysql不支持 这种写法
select emp.*,dept.DNAME from emp , dept where emp.DEPTNO = dept.DEPTNO(+);
2. 右外连接
用右边表的记录去匹配左边表的记录,如果符合条件的则显示;否则,显示 NULL
:在内连接的基础上保证右表的数据全部显示
select 字段列表 from 表1 right [outer] join 表2 on 条件;
-- 右连接
select emp.*,dept.DNAME from dept RIGHT OUTER join emp on emp.DEPTNO = dept.DEPTNO;
select emp.*,dept.DNAME from dept RIGHT join emp on emp.DEPTNO = dept.DEPTNO;
-- mysql不支持这种写法
select emp.*,dept.DNAME from emp , dept where emp.DEPTNO(+) = dept.DEPTNO;
-- 该sql仅用于演示右外连接写法 和上面2条sql 含义不一样
3.全外连接
全外 = 左外+右外+去重
-- 全外连接 mysql不支持
select emp.empno,emp.ename,emp.deptno,dept.deptno,dept.dname
from emp
full outer join dept
on emp.deptno = dept.deptno;
自连接
将一张表,通过别名“视为”不同的表
select e.ename 员工, b.ename 领导
from emp e,emp b
where e.mgr = b.empno ;
自连接不适合操作大表 层次查询
画层次图
oracle
select level,empno,ename,mgr from emp
connect by prior empno=mgr
start with mgr is null
order by 1;
子查询
查询中嵌套查询,称嵌套查询为子查询。
示例:查询工资比SCOTT高的员工信息
第一步:查SCOTT的工资
select sal from emp where ename='SCOTT';
第二步:查询比3000高的员工
select * from emp where sal > 3000;
子查询:子查询的查询结果,作为主查询的查询条件。
以上两步骤,合二为一:
select * from emp where sal > ( select sal from emp where ename='SCOTT' );
子查询注意:
a.子查询可以出现的位置:where、select、having、from ;不能出现在group by后面。
b. 主查询和子查询可以不是同一张表
e. 一般不在子查询中排序;但在Top-N分析问题中,必须对子查询排序
子查询中的null
not in不能有null
not in (10,20,null)
示例:查询是老板的员工信息
select * from emp where empno not in (select mgr from emp);
必须排空: (select mgr from emp where mgr is not null)
子查询不同情况
1. 子查询的结果是单行单列的
可以作为条件,使用运算符去判断 运算符: > >= < <= =
也可以使用在 select 后 或 having后
-- 查询员工工资小于平均工资的人
SELECT * FROM emp WHERE emp.sal < (SELECT AVG(sal) FROM emp);
2. 子查询的结果是 *多行单列* 的
可以作为条件,使用多行运算符来判断
in
-- 查询'SALES'和'OPERATIONS'所有的员工信息
SELECT * FROM emp WHERE deptno IN (SELECT deptno FROM dept WHERE dNAME = 'SALES' OR dNAME = 'OPERATIONS');
子查询中的运算符 any、all
any: 和集合中任意一个值比较
查询工资比30号部门其中一个员工高的员工信息
select * from emp where sal > any (select sal from emp where deptno=30);
等价于 > (select min(sal) from …)
all: 和集合中的所有值比较
查询工资比30号部门所有员工高的员工信息
select * from emp where sal > all (select sal from emp where deptno=30);
等价于 > (select max(sal) from…)
3. 子查询的结果是多行多列的
可以作为一张虚拟表参与查询
-- 查询员工入职日期是1986-11-11日之后的员工信息和部门信息
-- 子查询
SELECT * FROM dept t1 ,(SELECT * FROM emp WHERE emp.hiredate > '1986-11-11') t2 WHERE t1.deptno = t2.deptno; -- 注意oracle和mysql日期格式区别 oracle:'11-11月-86'
-- 可以改写成普通内连接
集合
- union:并集,返回各个查询的所有记录,重复部分,只出现一次。
- union all:并集,返回各个查询的所有记录,重复部分 不受影响。
- intersect,交集:返回两个集合 共用的记录。
- minus,补集:返回 包含在第一个查询集合中,但同时不包含在第二个查询集合中的记录。
-- intersect 和 minus mysql不支持
select * from emp where deptno =10
union
select * from emp where deptno =20;
select * from emp where deptno =10
union all
select * from emp where deptno =20;
select * from emp where deptno != 10
intersect
select * from emp where deptno =20;
select * from emp where deptno !=10
minus
select * from emp where deptno =20;
sql-DQL-多表联查的更多相关文章
- mybatis-plus注解版实现多表联查(sql)
mybatis注解版实现多表联查 需求: 用户有角色,角色有权限,需要一次取用户信息包含角色信息及其对应权限 实体类: package cn.zytao.taosir.common.model.use ...
- mybatis.net 多表联查
mybatis.net针对多表联查,其实不用讲联查出的所有的列全部做一个新的resultMap,我们完全可以通过集成关系来实现,真是上一次说的懒加载,在一定程度上可以提高其性能,但这并不是说懒加载性能 ...
- asp.net mvc 三层加EF两表联查
首先打开vs软件新建项目创建web中的mvc项目再右击解决方案创建类库项目分别创建DAL层和BLL层再把DAL层和BLL层的类重命名在mvc项目中的Models文件夹创建model类在DAL创建ADO ...
- SQLServer多表联查,多表分页查询
多表联查: select p.*,s.Sheng , i.Shifrom [dbo].[ProductRecordInfo] --表名 p left join [ShengInfo] s on ...
- [工作日志] 2018-11-30 重要: 1. 多条件+ 分页 + 多表联查 2. idea拉新分支
多条件+ 分页 + 多表联查 多条件查询 1.pom依赖 <dependency> <groupId>commons-dbutils</groupId> <a ...
- .NET MVC+ EF+调用存储过程 多表联查以及VIEW列表显示
直接上干活,至于网上的一大堆处理方式不予评论,做好自己的就是最好的,供大家不走弯路 1.view页面 <link href="~/Content/bootstrap.css" ...
- Sql 2000系统表 语句查询表结构
SQL2000系统表的应用 –1:获取当前数据库中的所有用户表 select Name from sysobjects where xtype=’u’ and status>=0 –2:获取 ...
- DQL多表查询
DQL多表查询 一.多表查询实现多个表之间查询数据 1.交叉连接笛卡尔积:A表中的每一行匹配B表中的每一行基本结构:select [数据库名1.]表名1,属性名1,......, [数据库名.]表名. ...
- Mybatis中多表联查,查询出来的字段出现重名,造成数据异常的解决方法!
在做一对多出现的问题,引发的思考:当数据库表中,主表的主键id和明细表的中的字段名相同时怎么办?Mybatis进行自动映射赋值的时候会不会出现异常? 注意:M ...
- 你真的会玩SQL吗?表表达式,排名函数
你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...
随机推荐
- Java学习day24
今天学习了IP地址.端口以及TCP/UDP通信协议 网络连接与过去的信件类似,需要知道对方的地址才能寄出去,在计算机网络中,我们的地址就是IP以及端口号 IP能用来唯一定位一台联网的计算机 本机的IP ...
- Python 一网打尽<排序算法>之先从玩转冒泡排序开始
1. 前言 所谓排序,就是把一个数据群体按个体数据的特征按从大到小或从小到大的顺序存放. 排序在应用开发中很常见,如对商品按价格.人气.购买数量--显示. 初学编程者,刚开始接触的第一个稍微有点难理解 ...
- python的字典及相关操作
一.什么是字典 字典是Python中最强大的数据类型之一,也是Python语言中唯一的映射类型.映射类型对象里哈希值(键,key)和指向的对象(值,value)是一对多的的关系,通常被认为是可变的哈希 ...
- 新手入门C语言第九章:C函数
C 函数 函数是一组一起执行一个任务的语句.每个 C 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数.您可以把代码划分到不同的函数中.如何划分代码到不同的函数中 ...
- 【原创】记一次DouPHP站点的RCE实战之旅
声明 本次实践是在合法授权情况下进行,数据已经全部脱敏,主要是提供思路交流学习,请勿用于任何非法活动,否则后果自负. 实战记录 信息收集 1,踩点站点 通过fofa 查到目标DouPHP框架该站点(也 ...
- 用Eclipse远程调试服务器tomcat
BEGIN; 在做远程调试时,在windows系统和非windows系统下的配置,Tomcat中会有所差别,具体如下: 第一步.配置tomcat 一.在windows系统中: 打开�TALINE_HO ...
- Day 005:PAT练习--1047. 编程团体赛(20)
编程团体赛的规则为:每个参赛队由若干队员组成:所有队员独立比赛:参赛队的成绩为所有队员的成绩和:成绩最高的队获胜.现给定所有队员的比赛成绩,请你编写程序找出冠军队. 输入格式: 输入第一行给出一个正整 ...
- Python抽象基类:ABC谢谢你,因为有你,温暖了四季!
Python抽象基类:ABC谢谢你,因为有你,温暖了四季! Python抽象基类:ABC谢谢你,因为有你,温暖了四季! 实例方法.类方法和静态方法 抽象类 具名元组 参考资料 最近阅读了<Pyt ...
- Istio实践(4)- 故障注入、熔断及ServiceEntry
前言:接上一篇istio多服务应用部署及调用,本文介绍通过流量管理(故障注入.请求超时等)以及ServiceEntry外部服务部署应用 1.设置服务延迟 修改springbootapp-vs-v1.y ...
- Django/SQL server 配置实现(附下载安装)
连接方案1: conn = pymssql.connect(host='127.0.0.1', port=1433, user='sa', password='password', database= ...