mysql多表查询详解
在mysql中把查询结果去除重复记录【distinct】
如:select distinct job from emp;// 去除员工表工作字段中的重复记录
需要注意的是distinct只能出现在所有字段的最前方:
如 : 多字段去除重复的记录
select distinct ename, job ,sal from emp;
count() 函数 起到的作用是记数,统计数量
如:select count (distinct job) from emp;select // 统计工作岗位的数量
在mysql中的连接查询:
2.1、什么是连接查询?
从一张表中单独查询,称为单表查询。
emp表和dept表联合起来查询数据,从emp表中取员工名字,从dept表中取 部门名字。
这种跨表查询,多张表联合起来查询数据,被称为连接查询。
2.2、连接查询的分类
根据语法的年代分类:
SQL92:1992年的时候出现的语法
SQL99:1999年的时候出现的语法
我们这里重点学习SQL99.(这个过程中简单演示一个SQL92的例子)
根据表连接的方式分类:
内连接:
等值连接
非等值连接
自连接
外连接:
左外连接(左连接)
右外连接(右连接)
全连接(不讲)
当两张表进行连接查询,没有任何条件限制的时候,最终查询结果条数,是
两张表条数的乘积,这种现象被称为:笛卡尔积现象。(笛卡尔发现的,这是一个数学现象。)
连接查询如何避免笛卡尔积现象?
连接时加条件,满足这个条件的记录被筛选出来!
select
e.ename,d.dname
from
emp e, dept d
where
e.deptno = d.deptno; // 表起别名。很重要。效率问题。
内连接查询之等值连接查询:
查询每个员工所在部门名称,显示员工名和部门名?
sql 92 语法
select e.ename ,d.dname from emp e, dept d where e.deptno = d.deptno;
使用SQL99 语法进行查询
select e.ename,d.dname from emp e join dept d on e.deptno = d.deptno;
//inner可以省略(带着inner可读性更好!!!一眼就能看出来是内连接)
在我们的内连接查询中可以带有inner关键之(带有inner关键字的话效果更好可读性更强)但是inner关键字也可以省略不写。
select e.ename,d.dname
fromemp e
inner joindept d
one.deptno = d.deptno; // 条件是等量关系,所以被称为等值连接。
内连接之非等值连接
找出每个员工的薪资等级,要求显示员工名、薪资、薪资等级?
select e.ename, e.sal, s.grade
fromemp e
inner joinsalgrade s
one.sal between s.losal and s.hisal; // 条件不是一个等量关系,称为非等值连接。
找出每个员工的薪资等级,要求显示员工名、薪资、薪资等级并且升序排列
select e.ename , e.sal , s.grade from emp e inner join salgrade son e.sal between s.losal and hisalorder bye.sal asc;
内连接查询之(自连接查询)
查询员工的上级领导,要求显示员工名和对应的领导名?
select e.ename ,e.empno, e.mgr from emp e;
技巧:一张表看成两张表。
select a.ename as '员工名', b.ename as '领导名'
fromemp a
joinemp b
ona.mgr = b.empno; //员工的领导编号 = 领导的员工编号
以上就是mysql的内连接查询
主义 :自连接查询将一张表看做是两张表
MYSQL的外连接查询:
内连接:(A和B连接,AB两张表没有主次关系。平等的。)
select e.ename,d.dname
fromemp e
joindept d
one.deptno = d.deptno; //内连接的特点:完成能够匹配上这个条件的数据查询出来。
在mysql中的外连接查询:分为左外连接查询和右外连接查询
select e.ename,d.dname
fromemp e
right outer join dept d
one.deptno = d.deptno;**//右外连接查询**
right代表什么:表示将join关键字右边的这张表看成主表,主要是为了将
这张表的数据全部查询出来,捎带着关联查询左边的表。
在外连接当中,两张表连接,产生了主次关系。
select e.ename,d.dname
fromdept d
left outer join emp e
one.deptno = d.deptno;**//左外连接查询**
带有right的是右外连接,又叫做右连接。
带有left的是左外连接,又叫做左连接。
任何一个右连接都有左连接的写法。
任何一个左连接都有右连接的写法。
外连接的查询结果条数一定是 >= 内连接的查询结果条数?
正确。
如:查询每个员工的上级领导,要求显示所有员工的名字和领导名?
select a.ename as '员工名', b.ename as '领导名'
fromemp a
left joinemp b
ona.mgr = b.empno;
三张表,四张表怎么连接?
语法:select ...fromajoinbona和b的连接条件joincona和c的连接条件right joindona和d的连接条件一条SQL中内连接和外连接可以混合。都可以出现!
如:找出每个员工的部门名称以及工资等级,
要求显示员工名、部门名、薪资、薪资等级?
select e.ename, d.dname, e.sal, s.grade
from emp ejoin dept don d.deptno = e.deptno // 等值连接joinsalgrade son e.sal between s.losal and s.hisal; // 非等值链接
如:找出每个员工的部门名称以及工资等级,还有上级领导,
要求显示员工名、领导名、部门名、薪资、薪资等级?
select e.ename , e.mgr , d.dname,e.sal, s.grade,l.ename from emp e join dept d on e.deptno = d.deptno join salgrade s on e.sal between s.losal and hisalleft outer join emp l on e.mgr = l.empno;
MYSQL子查询:
select语句中嵌套select语句,被嵌套的select语句称为子查询。
子查询都可以出现在哪里呢?select..(select).from..(select).where..(select).
找出比最低工资高的员工姓名和工资?
第一步:查询最低工资是多少
select min(sal) as minsal from emp;
找出>800的
select ename, sal from emp where sal > 800;
两条语句合并:
select ename,sal from emp where sal >(select min(sal) as minsal from emp);
from子句中的子查询
注意:from后面的子查询,可以将子查询的查询结果当做一张临时表。(技巧)
找出每个岗位的平均工资的薪资等级。
第一步:找出每个岗位的平均工资(按照岗位分组求平均值)
select job,avg(sal) from emp group by job; // t表
第二步 :把以上的查询结果就当做一张真实存在的表t
select * from salgrade; // s表
t表和s表进行表连接,条件:t表avg(sal) between s.losal and s.hisal;
select t.*, s.grade // 查询t表中的所有字段,s表中的薪资等级字段from(select job,avg(sal) as avgsal from emp group by job) tjoinsalgrade s // 内连接查询ont.avgsal between s.losal and s.hisal; // 非等值连接
select后面出现的子查询(这个内容不需要掌握,了解即可!!!)
找出每个员工的部门名称,要求显示员工名,部门名?
select e.ename,e.deptno,(select d.dname from dept d where e.deptno = d.deptno) as dname from emp e;
union 关键字 合并查询结果集:
查询工作岗位是MANAGER和SALESMAN的员工?
select ename '员工名字', job as '工作岗位' from emp where job = 'MANAGER' or job = 'SALESMAN';
同时还可以使用我们的union语句进行查询
select e.ename as '员工名字' , e.job as '工作岗位' from emp e where job ='MANAGER'unionselect e.ename as '员工名字' , e.job as '工作岗位' from emp e where job ='SALESMAN';
union的效率要高一些。对于表连接来说,每连接一次新表,
则匹配的次数满足笛卡尔积,成倍的翻。。。
但是union可以减少匹配的次数。在减少匹配次数的情况下,
还可以完成两个结果集的拼接。
union在使用的时候的注意事项:
union在进行结果集合并的时候,要求两个结果集的列数相同。
在oracle中由于语法严格 ,不可以,报错。要求:结果集合并时列和列的数据类型也要一致。
limit(非常重要)
完整用法:limit startIndex, length
startIndex是起始下标,length是长度。
起始下标从0开始。
缺省用法:limit 5; 这是取前5.
**按照薪资降序,取出排名在前5名的员工?select ename, sal from emp order by sal desc limit 0 ,5;
select ename, sal from emp order by sal desc limit 5;// **缺省写法**
select ename,salfromemporder by sal desclimit 5; //取前5
--------------------------------------------------------------select ename,salfromemporder by sal desclimit 0,5;
注意:mysql当中limit在order by之后执行!!!!!!
取出工资排名在[3-5]名的员工?
select ename, sal from emp order by sal desc limit 2,3; // 表示的是从第三位开始取,取的位数长度是3
取出工资排名在[5-9]名的员工?
select ename,salfromemporder by sal desclimit4, 5;
分页:分页查询
每页显示3条记录第1页:limit 0,3 [0 1 2]第2页:limit 3,3 [3 4 5]第3页:limit 6,3 [6 7 8]第4页:limit 9,3 [9 10 11]
每页显示pageSize条记录
第pageNo页:limit (pageNo - 1) * pageSize , pageSize
公式是:记住limit (pageNo-1)*pageSize , pageSize
关于DQL语句的大总结:select ...from...where...group by...having...order by...limit...执行顺序?1.from2.where3.group by4.having5.select6.order by7.limit..
查考自动力节点的b站教程
mysql多表查询详解相关推荐
- mysql多表查询详解_MySQL多表查询详解上
时光在不经意间,总是过得出奇的快.小暑已过,进入中暑,太阳更加热烈的绽放着ta的光芒,...在外面被太阳照顾的人们啊,你们都是勤劳与可爱的人啊.在房子里已各种姿势看我这篇这章的你,既然点了进来,那就由 ...
- Mysql 多表查询详解
Mysql 多表查询详解 一.前言 二.示例 三.注意事项 一.前言 上篇讲到Mysql中关键字执行的顺序,只涉及了一张表:实际应用大部分情况下,查询语句都会涉及到多张表格 : 1.1 多表连接有 ...
- mysql单表查询详解
文章目录 一.单表查询 1.1 创建数据库 1.2 单表查询 1.2.1 查询所有字段 1.2.2 使用通配符*查询所有字段 1.2.3 查询指定字段 1.2.4 去重distinct的使用 1.2. ...
- 七、MySQL 多表查询详解(附练习题及答案----超详细)
文章目录 一.笛卡尔积(或交叉连接)的理解 二.多表查询分类讲解 2.1 分类1:等值连接 vs 非等值连接 2.2 分类2:自连接 vs 非自连接 2.3 分类3:内连接 vs 外连接 2.4 SQ ...
- mysql 联表比对,MySQL联表查询详解/超详细mysql left join,right join,inner join用法分析比较...
超详细mysql left join,right join,inner join用法分析 下面是例子分析 表A记录如下: aID aNum 1 a20050111 2 a20050112 3 a200 ...
- mysql 联表详解_MySQL多表查询详解
多表查询 1. 表与表之间的关系 <1> 一对一用户表和身份信息表,用户表是主表 男人表.女人表 create table man(mid int primary key auto_inc ...
- mysql 三个表内连接查询_MySQL多表查询详解
多表查询 1. 表与表之间的关系 <1> 一对一 用户表和身份信息表,用户表是主表 男人表.女人表 create table man( mid int primary key auto_i ...
- mysql之慢查询详解,mysqldumpslow的使用
简言 1. mysql中的慢查询是我们分析问题,定位问题的利器,巧妙使用可以快速解决问题 2. 原理:运行时间超过 long_query_time 的sql语句会被写入到慢查询日志文件中或者mysql ...
- MySQL 几种连表查询详解
第一步:首先介绍表连接分类(内连接,外连接,交叉连接)和连接方法(如下): A)内连接:join,inner join B)外连接:left join,left outer join,right jo ...
最新文章
- 自定义全局按键修饰符
- 你可能不需要一个 JavaScript 框架(二)
- [IE技巧] IE Security Zone 的注册表设置
- [转载]Flash P2P 文件共享基础教程
- 需求分析的20条法则
- P2742 [USACO5.1]圈奶牛Fencing the Cows /【模板】二维凸包
- Oracle的 MODEL 查询
- Javascript 强制浏览器渲染Dom文档
- linux系统安装klocwork,linux下klocwork的使用
- react实现动画电子倒计时组件
- 最新10款好看的英文字体下载
- 水浒传 第三十六回 没遮拦追赶及时雨 船火儿夜闹浔阳江
- java读写二进制文件 移动指针 seek_文件与文件夹操作
- Lingo 中的各种函数
- 公有云厂商服务内容对比
- 戴尔服务器R730XD增加万兆光卡后风扇满速运转解决办法
- htc刷Android7.0,快来膜拜HTC神机HD2,谁说低配刷不了安卓7.0?
- MTK哪些芯片支援VoLTE Feature
- 如何用分布式Pollard-Rho法对椭圆曲线离散对数问题(ECDLP)进行攻击(上)
- inno setup基础使用教程
热门文章
- Error: The apk for your currently selected variant (app-release-unsigned.apk) is not signed. Please
- allegro 走线切换层_PCB 18种特殊走线的画法与技巧
- 谷歌浏览器 android4.4,谷歌发布移动版Chrome浏览器仅限Android4.0
- 组装计算机需要哪九件部件,组装各种电脑配件的规则是什么?组装电脑各配件规则介绍...
- XCode 苹果开发者账号,无法本地编译项目,问题所在 The app identifier “xxxx“ cannot be registered to your development team
- python词语匹配相似度_python文本相似度计算
- Jini技术常见问题解答
- bootmgr快速修复win7_Win7进入死亡倒计时,全国一半电脑要遭殃?
- Django中filer和get的区别
- 史上首次!苹果谷歌高调合作,打通iOS和安卓,蓝牙匿名追踪新冠接触者,5月上线