多表的查询
笛卡尔积的概念:(了解)
表A表B
aid anamebidbname
a1aa1b1bb1
a2aa2b2bb2
b3bb3
* 查询的语法
select * from 表A,表B;返回的结果就是笛卡尔积。
结果:
a1aa1b1bb1
a1aa1b2bb2
a1aa1b3bb3
a2aa2b1bb1
a2aa2b2bb2
a2aa2b3bb3
select * from dept,emp; 多表查询 内连接(用的比较多) 普通内连接 通过使用 select * from 表1 inner join 表2 on 条件 隐式内连接 通过使用select * from 表1,表2 where 条件
普通内连接
* 前提条件:需要有外键的。
* 提交关键字inner join ... on
select * from dept inner join emp on dept.did = emp.dno;
隐式内连接(用的是最多的)
* 可以不使用inner join ... on关键字
select * from dept,emp where dept.did = emp.dno;
多表查询—外链接
左外连接(把左边表所有的数据都查出来)
语法:select * from 表1 left outer join 表2 … On
右外连接 (把右边表所有的数据都查出来)
语法:select * from 表1 right outer join 表2 … On
画图描述链接的区别
*外连接
* 左外链接(看左表,把左表所有的数据全部查询出来)
* 前提条件:需要有外键的。
* 语法:使用关键字left [outer] join ... on
select * from dept left outer join emp on dept.did = emp.dno;
* 右外链接(看右表,把右表所有的数据全部查询出来)
* 前提条件:需要有外键的。
* 语法:使用关键字right [outer] join ... on
select * from dept right join emp on dept.did = emp.dno; 多表查询—子查询
在sql语言中,select…from…语为一个查询块,将一个查询块嵌套在另一个查询块中作为条件称为嵌套查询,也称为子查询.
外层的查询块称为父查询,内层的查询块称为子查询。
语法:select * from table where 条件 > (select * from table where 条件)
* 查询的内容需要另一个查询的结果。
select * from emp where ename > (select * from emp where 条件);
any 任意
all全部
>any大于结果的最小值
>all大于结果的最大值 作业
查看所有人所属的部门名称和员工名称?
select dept.dname,emp.ename from dept,emp where dept.did = emp.dno;
select d.dname,e.ename from dept d,emp e where d.did = e.dno;
统计每个部门的人数(按照部门名称统计,分组group by count)
select d.dname,count(*) from dept d,emp e where d.did = e.dno group by d.dname;
统计部门的平均工资(按部门名称统计 ,分组group by avg)
select d.dname,avg(salaly) from dept d,emp e where d.did = e.dno group by d.dname;
统计部门的平均工资大于公司平均工资的部门(子查询)
* 公司的平均工资
select avg(salaly) from emp;
* 部门的平均工资
select d.dname,avg(e.salaly) as sa from dept d,emp e where d.did = e.dno group by d.dname having sa > (select avg(salaly) from emp);