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;

表的别名有什么好处?

  1. 第一:执行效率高。
  2. 第二:可读性好。

连接查询的分类

根据语法出现的年代

  • 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后面不能直接使用分组函数。

正确写法:

  1. 找出平均薪资
select avg(sal) from emp;
  1. where过滤
select * from emp where sal > 2073.214286;
  1. 合并一二步
select * from emp where sal > (select avg(sal) from emp);

from后面嵌套子查询

  • 找出每个部门的平均薪水等级
  1. 找出每个部门的平均薪水(按照部门编号,求sal的平均值)
select deptno,avg(sal) as avgsal from emp group by deptno;
  1. 将上面的结果作为临时表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的复习(五):联表查询和子查询相关推荐

  1. MySQL学习记录04where条件子句、联表查询、子查询

    文章目录 MySQL学习记录04where条件子句.联表查询.子查询 4.1DQL 4.2指定查询字段 4.3where条件子句 4.4联表查询 4.5分页和排序 4.6子查询 MySQL学习记录04 ...

  2. MySQL数据库基础(多表关联查询、内外全连接、复合条件查询、子查询)

    文章目录 一.笛卡尔积查询 二.内.外.全连接查询 三.复合条件查询 四.子查询 五.EXIST判断 本篇文章主要介绍MySQL里的多表关联查询,其中包括了笛卡尔积查询.内连接查询.外连接查询.全连接 ...

  3. mysql多表连接 索引_MySQL多表查询之外键、表连接、子查询、索引

    一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为空,用来保证数据完整性 外键:是另一表的主键, ...

  4. mysql多表查询书籍_MySQL多表查询及子查询

    1. MySQL数据库执行查询操作时的查询流程: 请求-->查询缓存 请求-->查询缓存-->解析器-->预处理器-->优化器-->查询执行引擎-->存储引擎 ...

  5. 第四篇:Mysql查询-多表联合查询-及子查询

    mysql查询语句 多表联合查询 几子查询 1,单表查询:select * from 表名; eg:  select * from t1; 2,按条件查询: select 字段1,字段2,字段n... ...

  6. 【一周入门MySQL—3】多表查询、子查询、常用函数

    多表查询.子查询.常用函数 一.多表查询 多表查询:通过不同表中具有相同意义的关键字段,将多个表进行连接,查询不同表中的字段信息. 对应关系 一对一:比如下图的人员信息表和人员身份证对应表,一个员工只 ...

  7. MySQL学习笔记06【多表查询、子查询、多表查询练习】

    MySQL 文档-黑马程序员(腾讯微云):https://share.weiyun.com/RaCdIwas 1-MySQL基础.pdf.2-MySQL约束与设计.pdf.3-MySQL多表查询与事务 ...

  8. mysql查询子表的语句_MySQL基本SQL语句之单表查询、多表查询和子查询

    一.简单查询: 1.基本语法: SELECT * FROM tb_name;//查询全部 SELECT field1,field2 FROM tb_name; //投影 SELECT [DISTINC ...

  9. mysql多表查询sql语句怎么写_MySQL基本SQL语句之单表查询、多表查询和子查询

    一.简单查询: 基本语法: SELECT * FROM tb_name;查询全部 SELECT field1,field2 FROM tb_name; 投影 SELECT [DISTINCT] * F ...

最新文章

  1. 阿里开源首个DL框架,新型XDL帮你搞定大规模稀疏数据
  2. linux用dd测试磁盘速度
  3. redis6持久化主从复制
  4. c语言位运算_C语言自增减、逻辑运算、位运算、位移运算及三目运算操作
  5. 【web】Good ad ~
  6. 加拿大达内科技_美股继续暴跌模式 达内教育却“暴走”股价近翻倍
  7. python拆分合并文件_Python 视频文件的分割和合并
  8. multi-view face detection using deep convolutional neural networksz
  9. 文件类型总结 MIME
  10. Apache Kylin中对上亿字符串的精确Count_Distinct示例
  11. spark原理和spark与mapreduce的最大区别
  12. 广数928te_广数928TE系统说明书
  13. Java的企业级开发项目--OA办公系统
  14. 服务器虚拟机6的安装教程,VMware vCenter 6.7 安装过程(图文教程)
  15. 生物信息百Jia软件(十七):flash
  16. TensorFlow系列——feature_column特征工具说明
  17. 使用RestTemplate:报错Could not extract response: no suitable HttpMessageConverter found for response typ
  18. justify/align-content/items使用区别
  19. 惊!最靠谱的谷歌与edge浏览器安装扩展插件方法
  20. ECCV 2022 | 阿里提出:快速动作识别的时空自注意力模型

热门文章

  1. 90后美女CEO想找个CTO,我给她个技术经理,她说天啊太好用了!
  2. 腾讯架构调整之后,7大作战营41路军,依旧没有中台
  3. Github上竟然有这么多可以帮你赚钱的项目
  4. windows核心编程---未处理异常,向量化异常处理与C++异常
  5. 关于在pdf文件中的中文字体显示
  6. JavaScript-彻底讲清楚什么是变量提升
  7. PS图层拼合与图层复合的区别
  8. [github上传项目:使用token]
  9. 小程序图片加水印实现代码,带效果图
  10. 计算机名字怎么改数字,微信名字后面的小数字怎么弄 教你昵称添加电话号码...