大家好我是程序员_蓝天, 本文是为了方便初学者能够快速学习MySQL,写的可能不是很好,希望大家多多包涵。 每个赞都是我前进的动力
多表查询
错误方法:
select * from emp,dept;
--笛卡尔积 :a 和 b 两个集合,去 a,b 所有的组合情况
--消除无效数据
select * from emp,dept where dep_id=dept.did; --隐式内连接
-
连接查询
-
内连接:相当于查询 a, b 交集的数据
语法
--隐式内连接 SELECT 字段列表 FROM 表1,表2… WHERE 条件; --显示内连接 SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 条件;案例:隐式内连接
select emp.name,emp.gender,dept.dname from emp,dept where dep_id=dept.did;select t1.name,t1.gender,t2.dname from emp t1,dept t2 where dep_id=dept.did;显示内连接
select * from emp inner join dept on emp.dep_id=dept.did select * from emp join dept on emp.dep_id=dept.did -
外连接:
左外连接:相当于查询 a 表所有数据和交集部门的数据
--左外连接,一般用 SELECT 字段列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON条件案例:查询 emp 所有数据和对应部门信息
select * from emp left join dept on emp.dep_id=dept.did右外连接:相当于查询 b 表所有数据和交集部门的数据
--右外连接 SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON条件案例:查询 dept 表所有的数据和对应员工信息
select * from emp left join dept on emp.dep_id=dept.didselect * from dept left join emp on emp.dep_id=dept.did
-
-
子查询
- 概念:查询中嵌套查询,称嵌套查询为子查询
* 子查询根据查询结果不同,作用不同:
* 单行单列:作为条件值,使用 = != > < 等进行条件判断
```mysql
SELECT 字段列表 FROM 表 WHERE 字段名 = (子查询);
```
* 多行单列:作为条件值,使用 in 等关键字进行条件判断
```mysql
SELECT 字段列表 FROM 表 WHERE 字段名 in (子查询);
```
案例:查询财务部所有员工信息
```mysql
select did from dept where dname='财务部';
select * from emp where dep_id=(select did from dept where dname='财务部');
```
查询财务部和市场部所有员工信息
```mysql
select did from dept where dname='财务部' or dname='市场部';
select * from emp where dep_id=(select did from dept where dname='财务部' or dname='市场部');
select * from emp where dep_id in(2,3)
select * from emp where dep_id in(select did from dept where dname='财务部' or dname='市场部')
```
* 多行多列:作为虚拟表
```mysql
SELECT 字段列表 FROM (子查询) WHERE 条件;
```
案例:查询入职日期时'2011-11-11'之后的员工信息和部门信息
```mysql
select * from emp where join_date>'2011-11-11';
select * from emp,dept where emp.dep_id=dept.did;
select * from (select * from emp where join_date>'2011-11-11') t1,dept where t1.dep_id=dept.did;
```
多表查询案例:
1.查询所有员工信息。编号,姓名,工资,职位名称,职位描述
分析:
1.员工编号,姓名,工资在 emp 员工表中
2.职位名称,职位描述在 job 职位表中
3.job 职务表合 emp 员工表是一对多的关系 emp.job = job.id
隐式内连接
select * from emp,job where emp.job_=job.id;
select emp.id,emp.name,emp.salary,job.jname,job.descriptio from emp,job where emp.job_=job.id;
显示内连接
select emp.id,emp.name,emp.salary,job.jname,job.descriptio from emp inner join job on emp.job_=job.id;
2.查寻员工编号,姓名,工资,职务名称,职务描述,部门名称,部门位置
分析:1.员工编号,姓名,工资在 emp 员工表中
2.职位名称,职位描述在 job 职位表中
3.job 职务表合 emp 员工表是一对多的关系 emp.job = job.id
4.部门名称,部门位置来自于部门表 dept
5.dept 和 emp 一对多关系,dept.id = emp.dept_id
隐式内
select emp.id,emp.name,emp.salary,job.jname,job.descriptio,dept.dname,dept.loc from emp,job ,dept where emp.job_=job.id and dept.id=emp.dept_id;
显示内
select emp.id,emp.name,emp.salary,job.jname,job.descriptio,,dept.dname,dept.loc from emp inner join job on emp.job_=job.id inner join job on dept.id=emp.dept_id;
3.查询员工姓名,工资,工资等级
分析:1.员工编号,姓名,工资在 emp 员工表中
2.工资等级信息 salarygrdae 职位表中
3.emp.salary >= salarygrdae.losalary and emp.salary <= salarygrdae.hisalary
select emp.ename emp.salary,t2.grade from emp,salarygrade t2 where emp.salary>= t2.losalary and emp.salary<=t2.hisalary
4.查询员工姓名,工资,职务名称,职务描述,部门名称,部门位置,工资等级
分析:1.员工编号,姓名,工资在 emp 员工表中
2.职务名称,职务描述在 job
3.job 和 emp 是一对多关系 emp.job_id = job.id
4.部门名称,部门位置, 来自 dept
5.工资等级信息 salarygrdae 职位表中
6.emp.salary >= salarygrdae.losalary and emp.salary <= salarygrdae.hisalary
select emp.id,emp.name,emp.salary,job.jname,job.descriptio,,dept.dname,dept.loc,t2.grade from emp inner join job on emp.job_=job.id inner join job on dept.id=emp.dept_id inner join salarygrade t2 on emp.salary between t2.losalary and t2.hisalary;
5.查询出部门编号、名称、位置、人数
分析:1.部门编号、名称、位置,在 dept
2.部门人数:在 emp 按照 dept.id 进行分组,然后 count(*)统计数量
3.使用子查询,让部门表和分组后的表进行内连接
select * from dept;
select dept_id,count(*) from empt group by dept.id;
select * from dept,(select dept_id,count(*) from empt group by dept.id) t1 where dept.id=t1.sept_id;
select dept.id,dept.dname,dept.loc,t1.count from dept,(select dept_id,count(*) count from empt group by dept.id) t1 where dept.id=t1.sept_id;
原创-程序员_蓝天