SQL语句 外连接与内连接

数据库的表连接

本文章通过学习《慕课网实战》总结

内连接 JOIN

从多张表提取数据,必须指定关联的条件。

Select empno,ename,dname
From t_emp JOIN t_dept;
ON e.deptno = d.deptno;
//如果不定义关联条件就会出现无条件连接,两张表的数据会交叉连接,产生笛卡尔积

例子

//查询每名员工的部门信息
Select e.empno,e.ename,d.dname
FROM  t_emp e  JOIN t_dept d ON e.deptno = d.deptno;
//ON子句可以用where子句替代

连接三张表

//查询每名员工的工号、姓名、部门名称、底薪、职位、工资等级
Select e.empno,e.ename,d.dname,e.sal,e.job,s.grade
FROM  t_emp e  JOIN t_dept d ON e.deptno = d.deptno
JOIN t_salgrade s ON e.sal BETWEEN s.losal AND s.hisal

内连接的数据表不一定有同名字段,只要字段之间符合逻辑关系就可以

查询底薪超过平均底薪的员工信息

//错误示范
 //连接条件里不能出现聚合函数
SELECT e2.empno,e2.ename,e2.sal
FROM t_emp e1  JOIN t_emp e2 ON e2.sal > AVG(e1.sal);

修改后

SELECT e.empno,e.ename,e.sal
FROM t_emp e JOIN
(SELECT Avg(sal) avg FROM t_emp) t
on e.sal >= t.avg;

问题:查询RESEARCH部门的人数、最高底薪、最低底薪 、平均底薪、平均工龄

floor()函数:四舍五入

// 问题:查询RESEARCH部门的人数、最高底薪、最低底薪 、平均底薪、平均工龄
SELECT COUNT(*),MAX(e.sal),MIN(e.sal),AVG(e.sal),
FLOOR(AVG(DATEDIFF(NOW(),e.hiredate)/365))
FROM t_emp E JOIN t_dept d ON e.deptno= d.deptno
WHERE d.dname = "RESEARCH";

内连接查询练习1

//查询每种职业的最高工资、最低工资、平均工资、最高工资等级、最低工资等级
SELECT MAX(e.sal + IFNULL(e.comm,0)),MIN(e.sal + IFNULL(e.comm,0)),AVG(e.sal + IFNULL(e.comm,0)),MAX(s.grade),MIN(s.grade)
FROM  t_emp e JOIN t_salgrade s
ON (e.sal + IFNULL(e.comm,0))BETWEEN s.losal AND s.hisal
GROUP BY job;

内连接查询练习2

//查询每个底薪超过平均底薪的员工信息
SELECT e.empno,e.ename,e.sal
FROM t_emp e JOIN
(SELECT deptno AVG(sal) as avg FROM t_emp GROUP BY deptno) t
ON e.deptno=t.deptno AND e.sal >= t.avg;

外连接 LEFT JOIN

外连接与内连接的区别在于,除了符合条件的记录之外,结果集中还会保留不符合条件的记录。

// 例子
SELECT e.empno,e.ename ,d.dname
FROM t_emp e LEFT JOIN t_dept d
on e.deptno = d.deptno

左连接与右连接

左外连接就是保留坐标所有的记录,与右表做连接。如果右表有符合条件的记录就与左表连接。如果右表没有符合条件的记录,就用NULL与左表连接。右外连接也是如此。

外连接练习1

//查询每个部门的名称和部门的人数
SELECT d.dname,COUNT(e.deptno)
FROM t_dept d LEFT JOIN t_emp e
ON d.deptno = e.deptno
GROUP BY d.deptno;
//注意为什么用COUNT(e.deptno),而不是COUNT(*)或COUNT(d.deptno)

外连接练习2

UNION 关键字可以将多个查询语句的结果集进行合并

# 查询每个部门的名称和部门的人数?如果没有部门的员工,部门名称可以用NULL代替
(
SELECT d.dname,COUNT(e.deptno)
FROM t_dept d LEFT JOIN t_emp e
ON d.deptno = e.deptno
GROUP BY d.deptno
)
UNION
(
SELECT d.dname,COUNT(*)
FROM t_dept d RIGHT JOIN t_emp e
ON d.deptno = e.deptno
GROUP BY d.deptno
);
// 注意:想一想为什么第二个需要用COUNT(*)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值