数据库多表查询____表连接,子查询

内连接查询(使用的关键字 inner join  -- inner可以省略)

隐式内连接:select *from A,B where 条件;

显示内连接:select *from A inner join B on 条件;

外连接查询(使用的关键字 outer join -- outer可以省略)

左外连接:left outer join

select * from A left outer join B on 条件;

右外连接:right outerjoin

select * from A right outer join B on 条件;


 

有两张表,一张员工表,一张部门表。建表和数据的代码如下:

1. 创建部门表(id,name)

# 创建部门表

create table dept(

      idint primary key auto_increment,

      namevarchar(20)

)

 

insert into dept (name) values ('开发部'),('市场部'),('财务部');

 

2. 员工表,员工表(id, 姓名,性别,工资,入职日期,部门ID)

# 创建员工表

create table employee (

      idint primary key auto_increment,

      namevarchar(10),

      genderchar(1),   -- 性别

      salarydouble,   -- 工资

      join_datedate,  -- 入职日期

      dept_idint,

      foreignkey (dept_id) references dept(id) -- 外键,关联部门表(部门表的主键)

)   

 

insert intoemployee(name,gender,salary,join_date,dept_id) values('孙悟空','男',7200,'2013-02-24',1);

insert intoemployee(name,gender,salary,join_date,dept_id) values('猪八戒','男',3600,'2010-12-02',2);

insert intoemployee(name,gender,salary,join_date,dept_id) values('唐僧','男',9000,'2008-08-08',2);

insert intoemployee(name,gender,salary,join_date,dept_id) values('白骨精','女',5000,'2015-10-07',3);

insert intoemployee(name,gender,salary,join_date,dept_id) values('蜘蛛精','女',4500,'2011-03-14',1);

按要求实现下面的查询功能。

操作步骤描述

查询工资最高的员工是谁?

查询工资小于平均工资的员工有哪些?

查询大于5000的员工,来至于哪些部门,输出部门的名字

查询开发部与财务部所有的员工信息,分别使用子查询和表连接实现

查询2011年以后入职的员工信息和部门信息,分别使用子查询和表连接实现

 

 

1) 查询工资最高的员工是谁?

select * fromemployee where salary = (select max(salary) from employee);

 

2) 查询工资小于平均工资的员工有哪些?

      2.1) 查询平均工资

selectavg(salary) from employee;

 

      2.2) 小于平均工资的员工

select* from employee where salary < (select avg(salary) from employee);

 

3) 查询大于5000的员工,来至于哪些部门,输出部门的名字

      3.1) 查询大于5000的员工,来至于哪些部门的id

select dept_idfrom employee where salary >5000;

 

      3.2) 外查询  Subquery returns more than 1row

select * from deptd where d.id in  (select dept_id fromemployee where salary >5000);

 

4) 查询开发部与财务部所有的员工信息

      4.1) 子查询

      select * from employee where dept_id in(select d.id from dept d where d.name='开发部' or d.name='财务部');

 

      4.2) 表连接

      select e.* from employee e inner join deptd on e.dept_id = d.id where d.name='开发部' or d.name='财务部';

 

5) 查询2011年以后入职的员工信息和部门信息

● 使用子查询:

      5.1) 查询出2011年以后入职的员工信息

      select * from employee where join_date >='2011-1-1';

 

      5.2) 查询所有的部门信息,与上面的虚拟表中的信息比对,找出所有部门ID相等的员工。

      select * from dept d ,(select * from employee where join_date>='2011-1-1')  e where d.id =e.dept_id;

 

● 使用表连接:

      select  d.*, e.* from employee einner join dept d on e.dept_id = d.id where e.join_date >= '2011-1-1';

 

 

 

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhangwenzheng0526/article/details/78167814
文章标签: 数据库 设计 java
个人分类: 基础
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭