SQL子查询、关联查询 | 您所在的位置:网站首页 › sql里面的聚合函数能嵌套聚合函数吗 › SQL子查询、关联查询 |
1、子查询(SubQuery)
嵌套在一个SQL语言中的DQL语句,该DQL被称为子查询 应用场景: DQL中使用子查询 在SELECT字句中,将当前子查询结果作为一个字段展示 WHERE字句中,将当前子查询结果作为过滤条件使用 DML中使用:将一个查询结果集用于增删改操作 子查询分类: 单行单列子查询,该子查询的结果集只有一个值 多行多列子查询,该子查询结果集是多个值 多行单列子查询是可以检索出若干个值。因为作为过滤条件使用,一般配合:IN,NOT IN使用。因为等于是不能同时等于好几个值的,只能同于其中之一 多行多列子查询,将该子查询当做一张表使用 可以将一个查询结果集当做一张表创建出来 2、关联查询联合多张表查询数据,查询结果集中的字段来自与多张表; 表与表中的记录会产生对应关系,用于我们联合查询。 2.1 关联关系分类一对一:A表的一条记录仅唯一对应B表中的一条记录,反过来B表中的一条记录也仅唯一对应A表中的一条记录。 一对多:A表中的一条记录对应B表中的多条记录,但是反过来B表中的一条记录仅能唯一对应A表中的一条记录 多对多:A表中的一条记录能够对应B表中的多条记录; 同时B表中的一条就也能对应A表中的多条记录 2.2连接条件在DQL中我们会指定连接条件,用来让数据库在查询中知道两张表中记录与记录的对应关系,从而查询出对应的记录。 关联查询中连接条件通常不可以忽略或缺失,否则会产生笛卡尔积 语法: SELECT 字段,... FROM 表A,表B[,表C,...] WHERE A表与B表的连接条件 AND [其他表的连接条件] AND 过滤条件 注意:连接条件要同时满足,且如果还有过滤条件时,也要与过滤条件同时满足 2.3N张表关联N张表关联查询,至少要有N-1个连接条件 2.4关联查询与聚合函数将关联查询的结果集进行统计 实例:查看工资最高的老师班里的学生共多少人? SELECT COUNT(*) FROM teacher t,class c,student s WHERE t.id=c.teacher_id AND s.class_id=c.id AND t.salary=(SELECT MAX(salary) FROM teacher) 2.5多对多关系多对多关系:A表与B表双向看待都是一对多,就是多对多关系 多对多关系需要提供一张关联关系表来维持多对多关系,该表保存着两张产生关系标的外键字段。 查看学习语文的学生都有谁,列出学生姓名、科目名称、学生成绩? SELECT s.name,su.name,tss.score FROM subject su,student s,t_stu_subject_score tss WHERE su.id=tss.subject_id AND s.id=tss.stu_id AND su.name='语文'; 2、连接查询 2.1 内连接内连接是关联查询的另一种写法; 内连接查询只会查询到符合条件得记录,结果和表关联查询是一样的。 语法:SELECT 子句 FROM 表A J OIN 表B ON A与B的连接条件 [JOIN 表C ON A与C或B与C的连接条件 ... ] WHERE 过滤条件 2.2 外连接外连接也用于关联查询,特点:可以将不满足连接条件的记录也查询出来 左外连接(LEFT JOIN): 以JOIN左侧为驱动表,该表中所有记录都要体现在结果集中,右侧表不满足连接条件的记录对应的字段全部为NULL 右外连接(RIGHT JOIN): 以JOIN右侧作为驱动表,该表中的记录都要体现在结果集中,左侧表不满足连接条件的字段都补NULL 2.3 自连接自连接是指当前表中的一条记录可以对应自己的多条记录; 具有相同属性的一组数据之间又存在上下级的树状结构数据。 示例: 查看'刘苍松'的下属都有谁? SELECT t.name,m.name FROM teacher t JOIN teacher m ON t.manager=m.id WHERE m.name='刘苍松'; |
CopyRight 2018-2019 实验室设备网 版权所有 |