MySql的复习(五):联表查询和子查询
MySql的复习(五):联表查询和子查询
查询结果去重
关于查询结果的去重:distinct关键字
select distinct job from emp; // distinct关键字去除重复记录。
distinct关键字只能用于所有字段的前面。
错误写法:select ename,distinct job from emp;
正确写法:select distinct deptno,job from emp;
关于表的别名
关于表的别名:
select e.ename,d.dname from emp e,dept d;
表的别名有什么好处?
- 第一:执行效率高。
- 第二:可读性好。
连接查询的分类
根据语法出现的年代
- SQL92:比较旧的语法
- SQL99:比较新的语法
SQL92语法
内连接
- 显示每个员工的信息,并显示所属部门的名称
select emp.ename, dept.dname from emp, dept where emp.deptno=dept.deptno;
-- 也可以使用别名
select e.ename, d.dname from emp e, dept d where e.deptno=d.deptno;
只查询相等的数据(连接条件相等的数据)
自连接
只有一张表连接,具体的查询方法,把一张表看作两张表即可,如下面示例:第一个表emp e代码了员工表,emp m代表了领导表,相当于员工表和部门表一样
- 取得员工和所属领导的名字
select e.ename, m.ename from emp e, emp m where e.mgr=m.empno;
SQL99语法
- (内连接)显示薪水大于2000的员工信息,并显示所属部门的名称
-- 采用SQL92语法:
select e.ename, e.sal, d.dname from emp e, dept d where e.deptno=d.deptno and e.sal > 2000;
-- 采用SQL99语法:
select e.ename, e.sal, d.dname from emp e join dept d on e.deptno=d.deptno where e.sal>2000;
-- 或 :(但是在实际中一般不加inner关键字)
select e.ename, e.sal, d.dname from emp e inner join dept d on e.deptno=d.deptno where e.sal>2000;
- (外连接)显示员工信息,并显示所属的部门名称,如果某一个部门没有员工,那么该部门也必须显示出来
-- 右连接:
select e.ename, e.sal, d.dname from emp e right join dept d on e.deptno=d.deptno;
-- 左连接:
select e.ename, e.sal, d.dname from dept d left join emp e on e.deptno=d.deptno;
-- 以上两个查询效果相同
根据表的连接方式
内连接
等值连接
非等值连接
自连接
外连接
左外连接(左连接)
右外连接(右连接)
全连接
等值连接
条件是等量关系
- 查询每个员工的部门名称。要求显示员工的名字和部门名字
-- SQL92:(太老,不用了)select e.ename,d.dnamefromemp e, dept dwheree.deptno = d.deptno;-- SQL99:(常用的)select e.ename,d.dnamefromemp ejoindept done.deptno = d.deptno;// inner可以省略的,带着inner目的是可读性好一些。select e.ename,d.dnamefromemp einner joindept done.deptno = d.deptno;
语法:...AjoinBon连接条件where...
非等值条件
连接条件中的关系是非等量关系。
- 找出每个员工的工资等级,要求显示员工名、工资、工资等级。
select e.ename,e.sal,s.grade
fromemp e
joinsalgrade s
one.sal between s.losal and s.hisal;-- inner可以不省略
select e.ename,e.sal,s.grade
fromemp e
inner joinsalgrade s
one.sal between s.losal and s.hisal;
自连接
- 找到员工和对应上级领导
selecta.ename as '员工名',b.ename as '领导名'
from emp a
inner joinemp b
ona.mgr = b.empno;
外连接
什么是外连接,和内连接有什么区别?
最重要的特点是:主表的数据无条件全部查出
内连接:假设A和B表进行连接,使用内连接的话,凡是A表和B表能够匹配上的记录查询出来,这就是内连接。AB两张表没有主副之分,两张表是平等的。外连接:假设A和B表进行连接,使用外连接的话,AB两张表中有一张表是主表,一张表是副表,主要查询主表中的数据,捎带着查询副表,当副表中的数据没有和主表中的数据匹配上,副表自动模拟出NULL与之匹配。外连接的分类?左外连接(左连接):表示左边的这张表是主表。右外连接(右连接):表示右边的这张表是主表。左连接有右连接的写法,右连接也会有对应的左连接的写法。
- 找到每个员工的上级领导,所有员工的都必须全部查询出来
-- 内连接:
select a.ename '员工', b.ename '领导'
fromemp a
joinemp b
ona.mgr = b.empno;-- 外连接:(左外连接/左连接)
select a.ename '员工', b.ename '领导'
fromemp a
left joinemp b
ona.mgr = b.empno;-- outer是可以省略的。
select a.ename '员工', b.ename '领导'
fromemp a
left outer joinemp b
ona.mgr = b.empno;-- 外连接:(右外连接/右连接)
select a.ename '员工', b.ename '领导'
fromemp b
right joinemp a
ona.mgr = b.empno;-- outer可以省略。
select a.ename '员工', b.ename '领导'
fromemp b
right outer joinemp a
ona.mgr = b.empno;
- 找出哪个部门没有员工
selectd.*
from emp e
right joindept d
one.deptno = d.deptno
wheree.empno is null;
三张表连接查询
- 找出每一个员工的部门和工资等级
-- 注意,解释一下:
-- ....
-- A
-- join
-- B
-- join
-- C
-- on
-- ...-- 表示:A表和B表先进行表连接,连接之后A表继续和C表进行连接。select e.ename,d.dname,s.gradefromemp ejoindept done.deptno = d.deptnojoinsalgrade sone.sal between s.losal and s.hisal;
- 找出每一个员工的部门名称、工资等级以及上级领导
selecte.ename '员工',d.dname '部门名称',s.grade '工资等级',e1.ename '领导姓名'
fromemp e
join dept d
on e.deptno = d.deptno
joinsalgrade s
on e.sal between s.losal and s.hisal
left joinemp e1
on e.mgr = e1.empno;
子查询
子查询就是嵌套的select语句,可以理解为子查询是一张表
select语句当中嵌套select语句,被嵌套的select语句是子查询。
子查询可以出现在哪里?select..(select).from..(select).where..(select).
where子句中使用子查询
找出高于平均薪资的员工信息
错误写法:
select * from emp where sal > avg(sal); //错误的写法,where后面不能直接使用分组函数。
正确写法:
- 找出平均薪资
select avg(sal) from emp;
- where过滤
select * from emp where sal > 2073.214286;
- 合并一二步
select * from emp where sal > (select avg(sal) from emp);
from后面嵌套子查询
- 找出每个部门的平均薪水等级
- 找出每个部门的平均薪水(按照部门编号,求sal的平均值)
select deptno,avg(sal) as avgsal from emp group by deptno;
- 将上面的结果作为临时表t,让表t和salgrade s相连
select t.*,s.grade
from(select deptno,avg(sal) as avgsal from emp group by deptno) t
joinsalgrade s
ont.avgsal between s.losal and s.hisal;
select后面嵌套子查询语句
- 找出每个员工所在的部门的名称,要求显示员工名和部门名
-- 方法一:
select e.ename,d.dname
fromemp e
joindept d
one.deptno = d.deptno;
-- 方法二:
select e.ename,(select d.dname from dept d where e.deptno = d.deptno) as dname
from emp e;
MySql的复习(五):联表查询和子查询相关推荐
- MySQL学习记录04where条件子句、联表查询、子查询
文章目录 MySQL学习记录04where条件子句.联表查询.子查询 4.1DQL 4.2指定查询字段 4.3where条件子句 4.4联表查询 4.5分页和排序 4.6子查询 MySQL学习记录04 ...
- MySQL数据库基础(多表关联查询、内外全连接、复合条件查询、子查询)
文章目录 一.笛卡尔积查询 二.内.外.全连接查询 三.复合条件查询 四.子查询 五.EXIST判断 本篇文章主要介绍MySQL里的多表关联查询,其中包括了笛卡尔积查询.内连接查询.外连接查询.全连接 ...
- mysql多表连接 索引_MySQL多表查询之外键、表连接、子查询、索引
一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为空,用来保证数据完整性 外键:是另一表的主键, ...
- mysql多表查询书籍_MySQL多表查询及子查询
1. MySQL数据库执行查询操作时的查询流程: 请求-->查询缓存 请求-->查询缓存-->解析器-->预处理器-->优化器-->查询执行引擎-->存储引擎 ...
- 第四篇:Mysql查询-多表联合查询-及子查询
mysql查询语句 多表联合查询 几子查询 1,单表查询:select * from 表名; eg: select * from t1; 2,按条件查询: select 字段1,字段2,字段n... ...
- 【一周入门MySQL—3】多表查询、子查询、常用函数
多表查询.子查询.常用函数 一.多表查询 多表查询:通过不同表中具有相同意义的关键字段,将多个表进行连接,查询不同表中的字段信息. 对应关系 一对一:比如下图的人员信息表和人员身份证对应表,一个员工只 ...
- MySQL学习笔记06【多表查询、子查询、多表查询练习】
MySQL 文档-黑马程序员(腾讯微云):https://share.weiyun.com/RaCdIwas 1-MySQL基础.pdf.2-MySQL约束与设计.pdf.3-MySQL多表查询与事务 ...
- mysql查询子表的语句_MySQL基本SQL语句之单表查询、多表查询和子查询
一.简单查询: 1.基本语法: SELECT * FROM tb_name;//查询全部 SELECT field1,field2 FROM tb_name; //投影 SELECT [DISTINC ...
- mysql多表查询sql语句怎么写_MySQL基本SQL语句之单表查询、多表查询和子查询
一.简单查询: 基本语法: SELECT * FROM tb_name;查询全部 SELECT field1,field2 FROM tb_name; 投影 SELECT [DISTINCT] * F ...
最新文章
- 阿里开源首个DL框架,新型XDL帮你搞定大规模稀疏数据
- linux用dd测试磁盘速度
- redis6持久化主从复制
- c语言位运算_C语言自增减、逻辑运算、位运算、位移运算及三目运算操作
- 【web】Good ad ~
- 加拿大达内科技_美股继续暴跌模式 达内教育却“暴走”股价近翻倍
- python拆分合并文件_Python 视频文件的分割和合并
- multi-view face detection using deep convolutional neural networksz
- 文件类型总结 MIME
- Apache Kylin中对上亿字符串的精确Count_Distinct示例
- spark原理和spark与mapreduce的最大区别
- 广数928te_广数928TE系统说明书
- Java的企业级开发项目--OA办公系统
- 服务器虚拟机6的安装教程,VMware vCenter 6.7 安装过程(图文教程)
- 生物信息百Jia软件(十七):flash
- TensorFlow系列——feature_column特征工具说明
- 使用RestTemplate:报错Could not extract response: no suitable HttpMessageConverter found for response typ
- justify/align-content/items使用区别
- 惊!最靠谱的谷歌与edge浏览器安装扩展插件方法
- ECCV 2022 | 阿里提出:快速动作识别的时空自注意力模型
热门文章
- 90后美女CEO想找个CTO,我给她个技术经理,她说天啊太好用了!
- 腾讯架构调整之后,7大作战营41路军,依旧没有中台
- Github上竟然有这么多可以帮你赚钱的项目
- windows核心编程---未处理异常,向量化异常处理与C++异常
- 关于在pdf文件中的中文字体显示
- JavaScript-彻底讲清楚什么是变量提升
- PS图层拼合与图层复合的区别
- [github上传项目:使用token]
- 小程序图片加水印实现代码,带效果图
- 计算机名字怎么改数字,微信名字后面的小数字怎么弄 教你昵称添加电话号码...