数据库
首页 > 数据库> > MySQL连表查询

MySQL连表查询

作者:互联网

前期表准备:

#建表
create table dep (id int,name varchar(20));

create table emp (
    id int primary key auto_increment,
    name varchar(20),
    sex enum ('male','female') not null default 'male',
    age int,
    dep_id int
);

#录入数据
insert into dep values (200,'技术'),(201,'人力资源'),(202,'销售'),(203,'运营');
insert into emp values 
(7,'jason','male',18,200),
(8,'mony','female',28,201),
(9,'kay','male',38,201),
(10,'wose','female',48,202),
(11,'dessy','male',58,203),
(12,'mar','male',68,204);

查询:

select * from emp,dep where emp.dep_id = dep.id; #这是拼表查询
#mysql也知道,在后面查询数据过程中,肯定会经常用到拼表操作,所以特地开设了对应的方法
    inner join  #内连接
    left join   #左连接
    right join  #右连接
    union   #全连接
#inner join 内连接 #只拼接两张表中公有的数据部分
select * from emp inner join dep on emp.dep_id = dep.id;

#left join 左连接 左表所有的数据都展示出来,没有的对应项则用null展示;
select * from emp left join dep on emp.dep_id = dep.id;

#right join 右连接 右表所有的数据都展示出来,没有的对应项则用null展示;
select * from emp right join dep on emp.dep_id = dep.id;  

子查询:

#子查询就是我们平时解决问题的思路
#分步解决问题:
#第一步
#第二步
#将一个查询语句的结果当做另外一个查询语句的条件去用
#1.查询部门是技术或者人力资源的员工信息;
    #先获取部门的id
    select id from dep where name ='技术' or name ='人力资源';
    #再去员工表里面筛选出对应的员工
    select name from emp where dep_id in (200,201);
 #将2条语句合为1条
 select * from emp where dep_id in (select id from dep where name='技术' or name='人力资源') ; 

总结:

#查询平均年龄在25岁以上的部门名称
#'只要是多表查询,就有两种思路:1.连表,2.子查询'
#连表操作
#1.先拿到部门和员工表,拼接之后的结果
#2.分析语义,得出需要进行分组
select dep.name from emp inner join dep on emp.dep_id = dep.id group by dep.name having avg(age)>25;
#子查询
select name from dep where id in (select dep_id from dep group by dep_id having avg(age)>25);

  

CREATE TABLE `dept_emp` (
`emp_no` int(11) NOT NULL,
`dept_no` char(4) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`dept_no`));

CREATE TABLE `salaries` (
`emp_no` int(11) NOT NULL,
`salary` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`from_date`));

INSERT INTO dept_emp VALUES(10001,'d001','1986-06-26','9999-01-01');
INSERT INTO dept_emp VALUES(10002,'d001','1996-08-03','9999-01-01');
INSERT INTO dept_emp VALUES(10003,'d004','1995-12-03','9999-01-01');
INSERT INTO dept_emp VALUES(10004,'d004','1986-12-01','9999-01-01');
INSERT INTO dept_emp VALUES(10005,'d003','1989-09-12','9999-01-01');
INSERT INTO dept_emp VALUES(10006,'d002','1990-08-05','9999-01-01');
INSERT INTO dept_emp VALUES(10007,'d005','1989-02-10','9999-01-01');
INSERT INTO dept_emp VALUES(10009,'d006','1985-02-18','9999-01-01');
INSERT INTO dept_emp VALUES(10010,'d006','2000-06-26','9999-01-01');
INSERT INTO salaries VALUES(10001,88958,'2002-06-22','9999-01-01');
INSERT INTO salaries VALUES(10002,72527,'2001-08-02','9999-01-01');
INSERT INTO salaries VALUES(10003,43311,'2001-12-01','9999-01-01');
INSERT INTO salaries VALUES(10004,74057,'2001-11-27','9999-01-01');
INSERT INTO salaries VALUES(10005,94692,'2001-09-09','9999-01-01');
INSERT INTO salaries VALUES(10006,43311,'2001-08-02','9999-01-01');
INSERT INTO salaries VALUES(10007,88070,'2002-02-07','9999-01-01');
INSERT INTO salaries VALUES(10009,95409,'2002-02-14','9999-01-01');
INSERT INTO salaries VALUES(10010,94409,'2001-11-23','9999-01-01');

#获取所有部门中员工薪水最高的相关信息,给出dept_no, emp_no以及其对应的salary,按照部门编号升序排列
select dept_emp.dept_no as dept_no_a, dept_emp.emp_no, max(salaries.salary) as salary
from dept_emp,salaries
where salaries.emp_no=dept_emp.emp_no
group by dept_emp.emp_no,dept_emp.dept_no
having max(salaries.salary) = 
(
    select max(salaries.salary) 
    from dept_emp inner join salaries
    on salaries.emp_no=dept_emp.emp_no 
    where dept_emp.dept_no = dept_no_a
)
order by dept_no_a;

 
delete from stock   
where (org_id,material_id,state) in  
(SELECT * from (select org_id,material_id, state 
from stock WHERE state = 1 group by org_id,material_id,state having count(*) > 1) as a ) 

  

标签:01,no,dep,查询,连表,dept,emp,MySQL,id
来源: https://www.cnblogs.com/xiehong/p/14722136.html