内连接查询(使用的关键字 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';