一、子查询
1、定义:一个查询中嵌套另一个查询
2、子查询的分类
(1)标量子查询
(2)列子查询
(3)行子查询
(4)表子查询(运用多)
3、子查询详解
(1)标量子查询(返回一个值)
-把一个sql 执行返回的一个值,作为另一个sql的条件,得到的结果是一行一列,一般出现在where之后-
备注:
标量子查询允许使用的比较运算符号:=,!=,>,<,>=,<=,<>
案例:财务部门的收入总和
步骤1:查询财务部门的编号
select dept1 from dept where dept_name='财务';
步骤2:将查询出来的一行一列作为条件
select sum(incoming) from emp where dept2=(select dept1 from dept where dept_name='财务' );
-注意点:判断能不能使用子查询,查看结果是否涉及两个表的字段
如:a、不能用子查询
b、可以用子查询
(2)列子查询(返回的结果是一个列)
定义:返回的是一列值
注意点:通常在where 之后使用,使用是in 或not in ,不运行使用比较运算符,因为它有多个值
案例:It技术部和财务部门入职员工的员工号
步骤1:SELECT dept1 from dept where dept_name='财务' or dept_name='销售';
步骤2:SELECT sid from emp where dept2 in (SELECT dept1 from dept where dept_name='财务' or dept_name='销售')
(3)行子查询
定义:返回的结果是一行多列,一般出现在where 的后面
案例:找出与牛八 年龄和入职时间一样的员工姓名
步骤1:找老九的年龄 和入职时间 :
select age,woektime_start from emp where name="老九" ;
步骤2:在emp中找到年里和入职时间相同的数据
select name from emp where (age,woektime_start) in (select age,woektime_start from emp where name="牛八" ) ;
(4)表子查询
-定义:返回的是多行多表 (返回的就是一个表),一般接在from 的后面,返回的是一个表
-临时表:as 临时表名
-步骤:
a、select * from (合表) where 条件
案例1:
select a.name from (select * from dept INNER JOIN emp on dept.dept1=emp.dept2) as a WHERE a.dept_name="财务"
案例2:
SELECT name,dept_name from emp left join dept on emp.dept2 = dept.dept1 where (age,dept1) in (SELECT max(age),dept2 from emp GROUP BY dept2);
b、select * from 表1 inner join ( )
案例:It技术部和财务部门入职员工的员工号
select sid from emp INNER JOIN (select * from dept where dept_name='财务' or dept_name='IT技术' )c ON emp.dept2=c.dept1
二、三表查询
1、三表连接
格式:select * from 表1,表2,表3 where 表1.关联字段1=表3.关联字段3 AND 表2.关联字段2=表3.关联字段 3;
案例:select * from student as a ,course as b,sc as c where a.stu_no=c.stu_no AND b.c_no=c.c_no ;
2、三表内连接
格式:select * from 表1 INNER JOIN 表3 on 表1.关联字段1=表3.关联字段3 INNER JOIN表2 on 表2.关联字段2=表3.关联字段3
案例:select * from student as a INNER JOIN sc as c on a.stu_no=c.stu_no INNER JOIN course as b on b.c_no=c.c_no
3、三表左连接
格式:select * from 表1 left JOIN 表3 on 表1.关联字段1=表3.关联字段3 left JOIN表2 on 表2.关联字段2=表3.关联字段3
案例:select * from student as a left JOIN sc as c on a.stu_no=c.stu_no left JOIN course as b on b.c_no=c.c_no
4、三表右连接
格式:格式:select * from 表1 right JOIN 表3 on 表1.关联字段1=表3.关联字段3 right JOIN表2 on 表2.关联字段2=表3.关联字段3
案例:select * from student as a right JOIN sc as c on a.stu_no=c.stu_no right JOIN course as b on b.c_no=c.c_no
5、先合两表在和一表
格式:select * from (select * from 表1 right JOIN 表3 on 表1.关联字段1=表3.关联字段3 ) 临时表s iner join 表2 on 临时表. 字段3=表2.字段2
案例:select * from (select a.*,c.sc_No,c.c_no,c.score from student AS a right JOIN sc c on a.stu_no=c.stu_no)as s INNER JOIN course as b on s.c_no=b.c_no
-注意:重复列的错误-
6、去除重复字段
案例:select * from (select a.* ,b.*,c.sc_no,c.score from student AS a right JOIN sc c on a.stu_no=c.stu_no right JOIN course as b on b.c_no=c.c_no) s