ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

MySQL连表查询

2021-04-30 15:36:24  阅读:201  来源: 互联网

标签:01 no dep 查询 连表 dept emp MySQL id


前期表准备:

#建表
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='人力资源') ; 

总结:

  • 表的查询结果可以作为其他表的查询条件;
  • 也可以通过起别名的方式把它作为一张虚拟表跟其他表关联;
  • 多表查询就是2种方式:
  • 1、先拼接表再查询
  • 2、子查询,一步一步来
#查询平均年龄在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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有