MySQL的语句查询——子查询和三表查询

一、子查询

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

posted @   uai  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示