赞
踩
嵌套在一个SQL语言中的DQL语句,该DQL被称为子查询
应用场景:
DQL中使用子查询
在SELECT字句中,将当前子查询结果作为一个字段展示
WHERE字句中,将当前子查询结果作为过滤条件使用
DML中使用:将一个查询结果集用于增删改操作
子查询分类:
单行单列子查询,该子查询的结果集只有一个值
多行多列子查询,该子查询结果集是多个值
多行单列子查询是可以检索出若干个值。因为作为过滤条件使用,一般配合:IN,NOT IN使用。因为等于是不能同时等于好几个值的,只能同于其中之一
多行多列子查询,将该子查询当做一张表使用
可以将一个查询结果集当做一张表创建出来
联合多张表查询数据,查询结果集中的字段来自与多张表;
表与表中的记录会产生对应关系,用于我们联合查询。
一对一:A表的一条记录仅唯一对应B表中的一条记录,反过来B表中的一条记录也仅唯一对应A表中的一条记录。
一对多:A表中的一条记录对应B表中的多条记录,但是反过来B表中的一条记录仅能唯一对应A表中的一条记录
多对多:A表中的一条记录能够对应B表中的多条记录;
同时B表中的一条就也能对应A表中的多条记录
在DQL中我们会指定连接条件,用来让数据库在查询中知道两张表中记录与记录的对应关系,从而查询出对应的记录。
关联查询中连接条件通常不可以忽略或缺失,否则会产生笛卡尔积
语法: SELECT 字段,...
FROM 表A,表B[,表C,...]
WHERE A表与B表的连接条件
AND [其他表的连接条件]
AND 过滤条件
注意:连接条件要同时满足,且如果还有过滤条件时,也要与过滤条件同时满足
N张表关联查询,至少要有N-1个连接条件
将关联查询的结果集进行统计
实例:查看工资最高的老师班里的学生共多少人?
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)
多对多关系: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='语文';
内连接是关联查询的另一种写法;
内连接查询只会查询到符合条件得记录,结果和表关联查询是一样的。
语法:SELECT 子句
FROM 表A J
OIN 表B ON A与B的连接条件
[JOIN 表C ON A与C或B与C的连接条件
...
]
WHERE 过滤条件
外连接也用于关联查询,特点:可以将不满足连接条件的记录也查询出来
左外连接(LEFT JOIN):
以JOIN左侧为驱动表,该表中所有记录都要体现在结果集中,右侧表不满足连接条件的记录对应的字段全部为NULL
右外连接(RIGHT JOIN):
以JOIN右侧作为驱动表,该表中的记录都要体现在结果集中,左侧表不满足连接条件的字段都补NULL
自连接是指当前表中的一条记录可以对应自己的多条记录;
具有相同属性的一组数据之间又存在上下级的树状结构数据。
示例:
查看'刘苍松'的下属都有谁?
SELECT t.name,m.name
FROM teacher t
JOIN teacher m ON t.manager=m.id
WHERE m.name='刘苍松';
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。