关联查询、子查询与分页查询

关联查询

关联关系分为一对一,一对多,多对多关系
关联查询就是从多张表中查询数据,当我们使用n张表使用关联查询,至少要有n-1个连接条件。否则可能产生笛卡尔积。笛卡尔积是数据库中第一大杀手,没意义,占用资源。

外键就是保存另一张表主键的那一列,还有外键的表,在关联关系中处于“多”的哪一方。

等值连接

连接查询中最常见的一种,通常是在有主外键关联关系的表间建立,并将连接条件设定为有关系的列,使用等号"="连接相关的表。

内连接(JOIN ON)

内连接返回所有满足连接条件的记录。
当查询的字段,在多张表中都存在时,应当用表别名.字段名来区分。

例:

SELECT d.loc,e.ename FROM emp e JOIN dept d ON(e.deptno=d.deptno);

外连接

外连接分为左外连接,右外连接和全外连接。

左外连接:以左面的表为主,若右边的表有不满足条件的,补null。
右外连接正好相反。
全外连接,所有不满足的内容都补null;
MySQL不支持FULL OUTER JOIN。

自连接

自连接是一种特殊的连接查询,数据的来源是一个表,即关联关系来自于单表中的多个列表中的列参照同一个表中的其它列的情况称作自参照表。
自连接是通过将表用别名虚拟成两个表的方式实现,可以是等值或不等值连接。

自连接特点:自己表中有一个外键保存自己表的主键。

子查询

使用子查询的情景:当一次查询建立在另一次查询的基础之上的,就需要子查询。

子查询在WHERE中

子査询嵌入的语句称作主査询或父査询;
主查询可以是SELECT语句,也可以是其它类型的语句比如DML或DDL语句。

  • 单行单列子查询可以用于 > < = >= <= <>等比较操作;
  • 多行单列子查询可以使用IN,ANY,ALL等
  • 多行多列或单行多列(一般没意义),多行多列子查询通常用于建立在二次查询,常出现在FROM子句中。

在子查询中需要引用到主查询的字段数据,使用EXISTS关键字。
EXISTS后便的子查询至少返回一行数据,则整个条件返回TRUE。

    SELECT ename,job FROM emp
    WHERE job=(SELECT job FROM emp WHERE ename='SCOTT');

    SELECT deptno,ename,sal FROM emp 
    WHERE sal > (SELECT AVG(sal) FROM emp);

    SELECT empno,ename,job,sal,deptno FROM emp
    WHERE deptno IN(SELECT deptno FROM emp
    WHERE job='SALESMAN') AND job<>'SALESMAN';
    
    --EXISTS在这里的用法是看部门表中所有部门编号在员工表中是否能关联查询出数据,能查询出来就保留。
    SELECT deptno,dname FROM dept d WHERE EXISTS
    (SELECT * FROM emp e WHERE d.deptno=e.deptno);

子查询在HAVING子句中

    SELECT deptno,MIN(sal) FROM emp GROUP BY deptno 
    HAVING MIN(sal) > (SELECT MIN(sal) FROM emp WHERE deptno=30);
    
    SELECT empno,ename,job,sal,e.deptno 
    FROM emp e,(SELECT AVG(sal) avg_sal,deptno FROM emp m GROUP BY deptno) s
    WHERE e.deptno=s.deptno AND e.sal>s.avg_sal;

把一个查询结果集当做一张表看待,这种形式称之为视图。视图实际也是数据库对象

分页查询

ROWNUM被称作伪列,用于返回标识行数据顺序的数字。
就是将当前查出的结果集为每一行编一个号,编号始终从1开始。
SELECT ROWNUM, empno, ename, sal FROM emp;
想使用ROWNUM作为过滤条件,应先使用ROWNUM进行一次查询,在此结果之上进行一次查询即可。

SELECT FROM (SELECT ROWNUM rn,e.* FROM emp e) WHERE rn>3;

分页三步:1,排序;2,编号;3,取范围;

MySQL的分页查询是用limit函数:
取前5条数据
select * from table_name limit 0,5 
或者
select * from table_name limit 5 
查询第11到第15条数据
select * from table_name limit 10,5
limit关键字的用法:
LIMIT [offset,] rows
offset指定要返回的第一行的偏移量,rows第二个指定返回行的最大数目。初始行的偏移量是0(不是1)。*

MySQL的ROWNUM实现方法:

SELECT @rownum:=@rownum+1 AS rownum, frutas.*
FROM (SELECT @rownum:=0) r, frutas;

DECODE函数

DECODE (expr, search1, result1[, search2, result2...][, default])
DECODE用于比较参数exp的值,如果匹配到哪一个 search条件,就返回对应的result结果;
可以有多组search和result的对应关系,如果任何一个search条件都没有匹配到,则返回最后default的值
default参数是可选的,如果没有提供default参数值,当没有匹配到时,将返回NULL。

和DECODE函数功能相似的有CASE语句,实现类似于if- else的操作•

MySQL中没有DECODE函数,只可以用case,when,then,end语句解决。

对于一个列中,几个不同的值看做一组,这时可以使用DECODE函数,先将不同的值转为一个值,因为GROUP BY根据值相同的看做一组

当一个字段中的默认排序方式不能满足我们的排序要求,我们可以使用DECODE将这些值转换为一个可以由小到大排序的值,这样就能按照我们的要求排序了。

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