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;

Logo

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

更多推荐