MYSQL中的多表操作

-- 1.创建表时创建外键约束
create table if not exists emp(
	eid varchar(20) primary key,
	ename varchar(20),
	age int,
	dept_id varchar(20),
	constraint emp_fk foreign key (dept_id) references dept (deptno) -- 外键约束
);

-- 2.创建表后创建外键约束
create table if not exists dept2(
	deptno varchar(20) primary key,-- 部门号
	name varchar(20) -- 部门名字
);
create table if not exists emp2(
	eid varchar(20) primary key,
	ename varchar(20),
	age int,
	dept_id varchar(20)
);
-- 创建外键约束
alter table emp2 add constraint emp2_fk foreign key(dept_id) references dept2(deptno);

-- 3.删除外键约束
alter table emp2 drop foreign key dept_id_fk;

-- 4.交叉连接查询(笛卡儿积)
SELECT * from dept3,emp3;

-- 5.内连接查询
-- 5.1隐式内连接
SELECT * from dept3,emp3 where dept3.deptno=emp3.dept_id;
SELECT * from dept3 a,emp3 b where dept3.deptno=emp3.dept_id;
SELECT * from dept3 a,emp3 b where a.deptno=b.dept_id and name='研发部';
SELECT * from dept3 a,emp3 b where a.deptno=b.dept_id and (name='研发部' or name ='销售部');
SELECT * from dept3 a,emp3 b where a.deptno=b.dept_id and name in('研发部','销售部');-- 简化
-- 5.2显示内连接
SELECT * from dept3 inner join emp3 on dept3.deptno=emp3.dept_id;
SELECT * from dept3 a join emp3 b on a.deptno=b.dept_id;
SELECT * from dept3 a join emp3 b on a.deptno=b.dept_id and name='研发部';
SELECT * from dept3 a join emp3 b on a.deptno=b.dept_id and (name='研发部' or name ='销售部');
SELECT * from dept3 a join emp3 b on a.deptno=b.dept_id and name in('研发部','销售部');-- 简化
SELECT a.name,a.deptno,count(1) from dept3 a join emp3 b on a.deptno=b.dept_id GROUP BY a.deptno,name;

-- 6.左外连接查询
SELECT * from dept3 a left outer join emp3 b on a.deptno=b.dept_id;
SELECT * from dept3 a left join emp3 b on a.deptno=b.dept_id;
-- SELECT * from A 
-- 	left join B on 条件1
-- 	left join C on 条件2
--  left join D on 条件3;

-- 7.右外连接查询
SELECT * from dept3 a right outer join emp3 b on a.deptno=b.dept_id;
-- SELECT * from A 
-- 	right join B on 条件1
-- 	right join C on 条件2
--  right join D on 条件3;

-- 8.满外查询 
-- 使用union关键字实现左外连接和右外连接的并集
-- SELECT * from dept3 a full join emp3 b on a.deptno =b.dept_id;-- 不能执行
-- 8.1.union是将两个查询结果上下拼接,并去重
SELECT * from dept3 a left join emp3 b on a.deptno =b.dept_id 
union
SELECT * from dept3 a right join emp3 b on a.deptno =b.dept_id;

-- 8.2.union ALL将查询结果上下拼接,不去重
SELECT * from dept3 a left join emp3 b on a.deptno =b.dept_id 
union all 
SELECT * from dept3 a right join emp3 b on a.deptno =b.dept_id;

-- 9.子查询
-- 9.1.查询年龄最大的员工信息,显示信息包括员工号,员工名字,员工年龄
-- 方式一:查询最大年龄:
SELECT max(age) from emp3;
-- 方式二:让每个员工的年龄的最大年龄进行比较,相满足条件
SELECT * from emp3 where age=(SELECT max(age) from emp3);--  单行单列,可以作为一个值来用

-- 9.2.查询研发部和销售部的员工信息,包括员工号,员工名字
-- 方式一:关联查询
SELECT * from dept3 a join emp3 b on a.deptno=b.dept_id and (name ='研发部' or name='销售部');
-- 方式二:子查询
-- 先查询研发部和销售部的部门号:deptno
SELECT deptno from dept3 where name='研发部' or name ='销售部';
-- 查询那个员工的部门号时1001或1002
SELECT * FROM emp3 where dept_id in (SELECT deptno from dept3 where name='研发部' or name ='销售部');-- 多行单列,多个值

-- 9.3.查询研发部20岁以下的员工信息,包括员工号/员工名字/部门名字
-- 方式1-关联查询
SELECT * from dept3 a join emp3 b on a.deptno =b.dept_id and (name='研发部' and age<20);
-- 方式2-子查询
-- 在部门表中查询研发部信息
SELECT * from dept3 where name='研发部';-- 一行多利
-- 在员工表中查询年龄小于20岁的年龄信息
SELECT * from emp3 where age<30;
-- 将以上两个查询结果进行关联查询
SELECT * from (SELECT * from dept3 where name='研发部') t1 join (SELECT * from emp3 where age<30) t2 on t1.deptno=t2.dept_id ;-- 多行多列

-- 10.子查询关键字ALL
-- 10.1.查询年龄大于'1003'部门所有年龄的员工信息
SELECT * from emp3 where age > all(SELECT age from emp3 where dept_id ='1003');
-- 10.2.查询不属于任何一个部门的员工信息
SELECT * from emp3 where dept_id !=all(SELECT deptno from dept3);

-- 11.子查询关键字ANY/SOME(大于一个就行)
-- 查询年龄大于'1003'部门任意一个员工年龄的的员工信息`
SELECT * from emp3 where age>any(SELECT age from emp3 where dept_id='1003') and dept_id!='1003';

-- 12.子查询关键字IN
-- 查询研发部和销售部员工信息,包括员工号,员工名字
SELECT eid,ename from emp3 where dept_id in(SELECT deptno from dept3 where name='研发部' or name ='销售部');

-- 13.子查询关键字-EXISTS
SELECT * from emp3 where exists(SELECT * from emp3);-- 全表输出
-- 查询公司是否有大于60岁的员工,有则输出
SELECT * from emp3 a where exists(SELECT * from emp3 where a.age>60);
SELECT * from emp3 a where eid in(SELECT eid from emp3 where a.age>60);
-- 查询有所属部门的员工信息
SELECT * from emp3 a where exists(SELECT * from dept3 b where a.dept_id=b.deptno);
SELECT * from emp3 a where dept_id in(SELECT deptno from dept3 b where a.dept_id=b.deptno);

-- 14.自关联查询
CREATE TABLE t_sanguo(
	eid int primary key,
	ename varchar(20),
	manager_id int,-- 外键列
	foreign key (manager_id) references t_sanguo(eid)-- 添加子关联约束
);
-- 添加数据
insert into t_sanguo values(1,'刘协',NULL);
insert into t_sanguo values(2,'刘备',1);
insert into t_sanguo values(3,'关羽',2);
insert into t_sanguo values(4,'张飞',2);
insert into t_sanguo values(5,'曹操',1);
insert into t_sanguo values(6,'许褚',5);
insert into t_sanguo values(7,'典韦',5);
insert into t_sanguo values(8,'孙权',1);
insert into t_sanguo values(9,'周瑜',8);
insert into t_sanguo values(10,'鲁肃',8);

-- 14.1.查询每一个人物和它的上级
SELECT * from t_sanguo a,t_sanguo b where a.manager_id=b.eid;
SELECT a.ename,b.ename from t_sanguo a,t_sanguo b where a.manager_id=b.eid;
SELECT a.ename,b.ename from t_sanguo a join t_sanguo b on a.manager_id=b.eid;

-- 14.2.查询所有人物及上级
SELECT a.ename,b.ename from t_sanguo a left join t_sanguo b on a.manager_id=b.eid;

-- 14.3.查询所有人物/上级.上上级 比如:张飞 刘备 刘协
SELECT 
	a.ename,b.ename,c.ename
from t_sanguo a 
	left join t_sanguo b on a.manager_id=b.eid
	left join t_sanguo c on b.manager_id=c.eid;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值