Mysql--连接查询和子查询

连接查询和子查询

一、连接查询

1.1 概念

连接查询:也可以叫跨表查询,需要关联多个表进行查询

1.2 根据年代分类

SQL92:1992
SQL99:1999,更新的语法,主要掌握这种

DBA:DataBase Administrator【数据库管理员】
老的DBA可能还在编写SQL92语法。

1.3 根据连接方式分类

内连接:等值连接
       非等值连接
       自连接

外连接:左外连接(左连接)
       右外连接(右连接)

全连接

1.4 多表的连接查询

所有涉及到的表:

员工表:

员工表.PNG

部门表:

部门表.PNG

薪水等级表:

薪水等级表.PNG
1.4.1 内连接中的等值连接

注意:在进行多表连接查询的时候,尽量给表起别名,这样效率高,可读性高。

select e.ename,d.dname from emp e,dept d;
但不能使用as

若两张表进行连接查询的时候没有任何条件限制,最终的查询总数是两张表记录条数的乘积,这种现象被称为笛卡尔积现象。为了避免笛卡尔积现象的发生,必须在进行表连接的时候添加限制条件

例一:查询每一个员工所在的部门名称,要求最终显示员工和对应的部门名

SQL92语法:内连接中的等值连接
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;

SQL99语法的优点:

表连接独立出来了,结构更清晰。对表连接不满意的话,可以再追加where进行过滤。
select e.ename,d.dname from emp e inner join dept d on e.deptno=d.deptno;

select e.ename,d.dname from emp e join dept d on e.deptno=d.deptno;//inner可以省略

注意:在连接查询的时候虽然使用了限制条件,但是匹配的次数没有减少,还是56次,只不过这一次的结果都是有效记录

1.4.2 内连接中的非等值连接

例二:找出每一个员工对应的工资等级,要求显示员工名,工资,工资等级

员工薪水.PNG
SQL92语法:内连接中的非等值连接
select e.ename,e.sal,s.grade from emp e,salgrade s 
where e.sal between s.losal and s.hisal;

SQL99语法:内连接中的非等值连接(inner可以省略)
select e.ename,e.sal,s.grade from emp e (inner)join salgrade s 
on e.sal between s.losal and s.hisal;
1.4.3 内连接中的自连接

例三:找出每一个员工的上级领导,要求显示员工名以及对应的领导名

例三.PNG
SQL92语法:内连接中的自连接
select a.ename empname,b.ename leadername from 
emp a ,emp b where a.mgr=b.empno;


SQL99语法:内连接中的自连接
select a.ename empname,b.ename leadername from 
emp a (inner)join emp b on a.mgr=b.empno;
1.4.4 外连接
内连接:查询出A表和B表能够完全匹配的记录
外连接:查询出A表和B表能够完全匹配的记录之外,
       将其中一张表的记录无条件的完全查询出来,对方表没有匹配的记录,
       会自动模拟出null与之匹配。

左外:把join关键字左边的表数据全部显示
右外:把join关键字右边的表数据全部显示

外连接的查询结果条数>=内连接的查询结果条数

例四:找出每一个员工对应的部门名称,要求部门名全部显示

SQL99语法:
外连接中的右外连接(右连接)(outer可以省略)
select e.ename,d.dname from emp e right (outer) join 
dept d on e.deptno=d.deptno;

外连接中的左外连接(左连接)(outer可以省略)
select e.ename,d.dname from dept d left (outer)join 
emp e on e.deptno=d.deptno;

注意:任何一个右外连接都可以写成左外连接,任何一个左外连接也同样可以写成右外连接

为什么inner和outer可以省略,加上去有什么好处?

可以省略,因为区分内连接和外连接依靠的不是这些关键字,
而是看SQL语句中是否存在left/right;
若存在,表示一定是一个外连接,其他都是内连接
加上去的好处是增强可读性。

例五:找出每一个员工对应的领导名,要求显示所有的员工:

select a.ename empname,b.ename leadername from 
emp a left join emp b on a.mgr=b.empno;

例六:找出每一个员工对应的部门名称,以及该员工对应的工资等级。
要求显示员工名、部门名、工资等级

多表进行表连接的语法格式:

select xxx from a join b on 条件 join c on 条件;
原理:a表和b表连接之后,a表再和c表连接
例六.PNG
例六2.PNG
select e.ename,d.dname,s.grade from emp e
join dept d on e.deptno=d.deptno join
salgrade s on e.sal between s.losal and s.hisal;

二、子查询

子查询就是select语句嵌套select语句,可以理解为子查询是一张表

2.1 在where语句中使用子查询

找出薪水比公司平均薪水高的员工,要求显示员工名和薪水

select ename,sal from emp where sal>avg(sal);
报错!分组函数不能直接使用在where后面

第一步:找出公司的平均薪水
select avg(sal) from emp; 

第二步:找出薪水大于平均薪水的员工信息
select ename,sal from emp where sal>2073.214286;

即:select ename,sal from emp where sal>(select avg(sal) form emp);

2.2 在from语句中使用子查询(将查询结果当做临时表)

找出每个部门的平均薪水,并且要求显示平均薪水的薪水等级

第一步:找出每个部门的平均薪水
select deptno,avg(sal) as avgsal from emp group by deptno;

第二步:将上面的查询结果当做临时表t,t表和salgrade s表进行表连接,
条件:t.avgsal between s.losal and s.hisal

即:
select t.deptno,t.avgsal,s.grade
from (select deptno,avg(sal) as avgsal from emp group by deptno) t
join salgrade s
on t.avgsal between s.losal and s.hisal;

2.3 在select语句中使用子查询

select e.ename,(select d.dname from dept d where e.deptno=d.deptno)
as dname from emp e;

三、union和limit

3.1 union

作用:合并查询结果集

找出工作岗位是salesman和manager的员工

select ename,job from emp where 
job='manager' or job='salesman';

或:select ename,job from emp where
job in('manager','salesman');

使用union:
select ename,job from emp where job='manager'
union
select ename,job from emp where job='salesman';

注意:使用union,要求两个select的字段数量相同,类型可以不同,但在oracle中,类型也要求相同。

例:

select ename as enamedname from emp
union
select dname as enamedname from dept;

3.2 limit

  • 1.limit用来获取一张表中的某部分数据
  • 2.limit只有在mysql数据库中存在,不通用,是mysql数据库管理系统的特色。

例:找出员工表中前5条记录

select ename from emp limit 5;

以上sql语句的limit中的5表示从表中记录下标0开始,取5条
等同于下面的sql语句:

select ename from emp limit 0,5;

limit的语法:

limit 起始下标,长度
如果起始下标没有指定,默认从0开始,0表示表中第一条记录。

例:找出公司中工资排名在前5名的员工(limit出现在sql语句的最后位置上)

思路:按照工资降序排列取前5个
select ename,sal from emp order by sal desc limit 5;

例:找出工资排名在3-9名的员工

select ename,sal from emp order by sal desc limit 2,7;
MySql中通用的分页sql语句:
每页显示3条记录
第1页:0,3
第2页:3,3
第3页:6,3
第4页:9,3
...

每页显示pageSize条记录
第pageSize页:(pageNo-1)*pageSize,pageSize

通用的分页SQL(只适用于mysql数据库管理系统)

select t.* from t
order by t.x desc/asc
limit (pageNo-1)*pageSize,pageSize;

计算共有多少页:
pageCount = (totalCount + count - 1)/count ;
pageCount:共有多少页
totalCount:总共多少条数据
count:每页显示多少条数据

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容