数据库的多表查询
select 字段名 别名,... from 表名 别名,... inner join 表名1 别名1 on 多表之间的关联关系 where 条件 order by 排序字段1[asc丨desc],排序字段2[asc丨desc]...;(升|降)
1.简介
用户想要查询字段来自于多张表,一般来说多张表之间都会存在这一对多的关联。
如:emp雇员表(empno,ename,job,mgr,hiredate,sal,comm,deptno)deptno外键----子表
dept部门表(deptno,dname,loc) deptno主键-----父表
主关键字:在一张表中某一个字段,这个字段所对应的值唯一不能有重复,二不能是空值
外部关键字:在某个表中,某一个字段它不是当前表的主关键字,但是它是其他表的主关键字,我们能在当前表中就可以成为这个字段为外部关键字。
父表----主关键字----子表-----外部关键字 一对多关系
2.基本用法:
2.1语法
select 列名1,列名2,... from 表名 别名 where 条件 order by 排序字段1[asc丨desc],排序字段2[asc丨desc]...;(升|降)
示例:
将emp表与dept表进行多表查询(笛卡尔积)关系为二维表
select * from emp,dept;
注意:要避免笛卡尔积。
通过两张表的关联字段进行比较,去掉笛卡尔积,多表查询时一般都会有某种关系(一对多)
连接查询:去掉重复属性的等值相连
select * from emp,dept where emp.deptno=dept.deptno;
2.2示例
例如:查询雇员编号,雇员姓名,工资,所在部门名称及其位置?
select empno,ename,sal,dname,loc from emp e,dept d where e.deptno=d.deptno;
例如:查询雇员的姓名,工资,入职时间,所在部门的编号以及部门的名称 ?
select ename,sal,hiredate,d.deptno,dname from emp e,dept d where e.deptno=d.deptno;
改名之后就用改名后的表,(用d不用dept)
因为from先执行
例如:查询雇员姓名,雇员工资,领导姓名,领导工资?
select e.ename 员工姓名,e.sal+ifnull(e.comm,0) 员工工资,m.ename 领导姓名,m.sal+ifnull(m.comm,0) 领导工资 form emp e,emp m where e.mgr=m.empno;
例如:查询雇员姓名,雇员工资,部门名称,领导姓名领导工资?
select e.ename 员工姓名,e.sal+ifnull(e.comm,0) 员工工资,d.dname,m.ename 领导姓名,m.sal+ifnull(m.comm,0) 领导工资 form emp e,emp m,dept d where e.mgr=m.empno and e.deptno=d.deptno;
例如:查询雇员姓名,雇员工资,部门名称,工资所在等级?
select e.ename 雇员姓名,e.sal 雇员工资,d.dname 部门名称,s.grade 工资所在等级 from emp e,dept d,salgrade s where e.deptno=d.deptno and e.sal between s.losal and s.hisal;
例如:查询雇员姓名,雇员工资,部门名称,雇员工资所在等级,领导姓名,领导工资,领导工资所在等级?
select e.ename 雇员姓名,e.sal 雇员工资,d.dname 部门名字,s.grade 雇员工资等级,m.ename 领导姓名,m.sal 领导工资,sm.grade 领导工资等级 from emp e,emp m,dept d,salgrade s,salgrade sm where e.deptno=d.deptno and e.sal between s.losal and s.hisal and e.mgr=m.empno and m.sal between sm.losal and sm.hisal;
3、sql99标准
3.1什么是sql99
3.2内连接
select 字段名 别名,... from 表名 别名,... inner join 表名1 别名1 on 多表之间的关联关系 where 条件 order by 排序字段1[asc丨desc],排序字段2[asc丨desc]...;(升|降)
3.3外连接
分类:
左连接:left outer join...on,也称为做左连接left join...on
以左边的表为主表,无论如何都会显示主表中的所有数据
右连接:right outer join...on,也称为右连接right join...on
以右边的表为主表,无论如何都会显示主表中的所有数据
语法:
select 字段名 别名,... from 表名 别名,... left join 表名1 别名1 on 多表之间的关联关系 where 条件 order by 排序字段1[asc丨desc],排序字段2[asc丨desc]...;(升|降)
例如:查询雇员姓名、工资、领导姓名、领导工资?(左连接与右连接)
select e.ename,e.sal,m.ename,m.sal from emp e,emp m where e.mgr=m.empno;
select e.ename,e.sal,m.ename,m.sal from emp e inner join emp m on e.mgr=m.empno;---有问题
select e.ename,e.sal,m.ename,m.sal from emp e join emp m on e.mgr=m.empno;---有问题
select e.ename,e.sal,m.ename,m.sal from emp e left join emp m on e.mgr=m.empno;
select e.ename,e.sal,m.ename,m.sal from emp e right join emp m on e.mgr=m.empno;---有问题
例如:查询部门编号、部门名称、部门位置、部门中的雇员姓名、工资?
select d.deptno 部门编号,d.dname 部门名称,d.loc,e.ename,e.sal from dept d join emp e on d.deptno=e.deptno order by d.deptno;
select d.deptno 部门编号,d.dname 部门名称,d.loc,e.ename,e.sal from dept d left join emp e on d.deptno=e.deptno order by d.deptno;

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)