MySql-多表查询(非常重要)

一:多表关系

二:概述/分类:

在SQL语句中,如何来去除无效的笛卡尔积呢? 我们可以给多表查询加上连接查询的条件即可。

select * from emp , dept where emp.dept_id = dept.id;

分类:

三:内连接-消除笛卡尔积

四:外连接


select e.*,d.name from emp e join dept d on e.dept_id = d.id;

五:自连接


select e1.name ,e2.name  from emp e1 join emp e2 on e1.managerid=e2.id;

B.查询所有员工 emp 及其领导的名字 emp , 如果员工没有领导, 也需要查询出来
表结构: emp a , emp b

select e1.name ,e2.name  from emp e1 left join emp e2 on e1.managerid=e2.id;

联合查询:

select * from emp where salary < 5000 or age > 50;
select * from emp where salary < 5000 union all select * from emp where age > 50;

六:子查询

1.标量子查询

select * from emp where entrydate > (select entrydate from emp where name = "方东白");

2.列子查询

select * from emp where salary > all ( select salary from emp where dept_id =
(select id from dept where name = '财务部') );

C. 查询比研发部其中任意一人工资高的员工信息

select * from emp where salary > some ( select salary from emp where dept_id =
(select id from dept where name = '研发部') );

3.行子查询

4.表子查询

 案例:

create table salgrade(
grade int,
losal int,
hisal int
) comment '薪资等级表';
insert into salgrade values (1,0,3000);
insert into salgrade values (2,3001,5000);
insert into salgrade values (3,5001,8000);
insert into salgrade values (4,8001,10000);
insert into salgrade values (5,10001,15000);
insert into salgrade values (6,15001,20000);
insert into salgrade values (7,20001,25000);
insert into salgrade values (8,25001,30000);

-- 查询员工的姓名、年龄、职位、部门信息 (隐式内连接)
select e.name,e.age,e.job,d.name from emp e,dept d where e.dept_id = d.id;

-- 查询年龄小于30岁的员工的姓名、年龄、职位、部门信息(显式内连接)
select e.name,e.age,e.job,d.name from emp e join dept d on e.dept_id = d.id and e.age < 30 ;

-- 查询拥有员工的部门ID、部门名称
select e.* ,d.name from emp e left join dept d on e.dept_id = d.id;


select distinct d.id , d.name from emp e , dept d where e.dept_id = d.id;

-- 查询所有年龄大于40岁的员工, 及其归属的部门名称; 如果员工没有分配部门, 也需要展示出来(外连接)

select e.*,d.name from emp e left join dept d on e.dept_id = d.id where e.age > 40;

-- 查询所有员工的工资等级

select e.*,s.* from salgrade s join  emp e on e.salary >= s.losal and e.salary <= s.hisal;

select e.* , s.grade , s.losal, s.hisal from emp e , salgrade s where e.salary >=
s.losal and e.salary <= s.hisal;

select e.* , s.grade , s.losal, s.hisal from emp e , salgrade s where e.salary
between s.losal and s.hisal;

-- 查询 "研发部" 所有员工的信息及 工资等级
select e.*,s.grade from emp e,salgrade s,dept d where d.id=e.dept_id and d.name = '研发部' and e.salary between s.losal and s.hisal;

-- 查询 "研发部" 员工的平均工资
select avg(e.salary) from emp e ,dept d where e.dept_id = d.id and d.name= '研发部';

-- 查询工资比 "灭绝" 高的员工信息
select * from emp e where salary > (select emp.salary from emp where emp.name = '灭绝');

-- 查询比平均薪资高的员工信息

select * from emp e where e.salary > (select avg(salary) from emp );

-- 查询低于本部门平均工资的员工信息 **

select * from emp e2 where e2.salary < (select avg(e1.salary) from emp e1 where e1.dept_id = e2.dept_id );


-- 查询所有的部门信息, 并统计部门的员工人数 **
select d.id, d.name ,(select count(*) from emp e where e.dept_id = d.id) from dept d;

-- 查询所有学生的选课情况, 展示出学生名称, 学号, 课程名称
select s.name,s.no,c.name from student s,student_course sc, course c where s.id = sc.studentid and sc.courseid = c.id;

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值