笛卡尔积:是多表查询的数据基础(最全面的拼装)
A表 m行 x列
B表 n行 y列
结果:A×B m*n行 x+y列
按照需求自己处理 emp表和dept表数据之间没有进行匹配
第一个表中的所有行和第二个表中的所有行都发生连接
连接条件被省略;连接条件是无效的
// 查询 emp,dept 表中的数据
SELECT e.empno,e.ename,e.sal,e.comm,e.deptno,d.deptno,d.dname,d.loc
FROM emp e,dept d
多表连接
WHERE 限定条件
限制歧义列名
在使用多个表时,可以用表名作为前缀来限制列
通过使用表前缀可以提高性能
通过使用列的别名可以区分来自不同表 但是 名字相同的列
//查询 emp,dept 表中的数据
SELECT e.empno,e.ename,e.sal,e.comm,e.deptno,d.deptno,d.dname,d.loc
FROM emp e,dept d
WHERE e.deptno = d.deptno
SELECT :最先执行 定义查询结果集的结构
决定表的结构
其他每次传输数据
FROM emp e, dept d:形成m*n循环
FROM 属于内层,把两行合并成一行
WHERE:对FROM子句的查询结果集再次过滤
如果 WHERE 为真 执行 SELECT
等值连接:两表用 = 进行连接;多表用 AND,或者 inner Join ON
//查询 emp,dept 表中的数据
SELECT e.empno'员工编号',e.ename'员工姓名',e.sal'工资',d.loc'地址',s.grade'工资等级'
FROM emp e,dept d,salgrade s
WHERE e.deptno = d.deptno and e.sal BETWEEN losal and hisal
ORDER BY s.grade ASC
多表连接
//多表连接
// 查询员工的姓名 部门名称 工作地点
SELECT e.ename,d.dname,d.loc,l.addreess
FROM emp e
INNER JOIN dept d
ON e,deptno = d.deptno
INNER JOIN location l
ON d.loc = l.locid
//等值连接
SELECT e.ename,d.dname,d.loc,l.addreess
FROM emp e,dept d,location l
WHERE e.deptno = d.deptno AND d.loc = l.locid
内连接(Inner JOIN ON)
On 后边只写两个表的关联条件
WHERE写在On后:写限制条件
Inner可以省略
SELECT e.ename , e.sal
FROM dept d
INNER JOIN emp e
ON e.deptno = d.deptno
WHERE e.sal > 3000
非等值连接(两张表没有关联条件)
//查询每个员工的姓名 工资 工资等级
SELECT e.ename ,e.sal ,s.grade
FROM emp e,salgrade s
WHERE e.sal between s.losal AND s.hisal
外连接:(OUTER JOIN)
左外连接:(LEFT OUTER JOIN)
将左表符合条件的数据与不符合条件的数据全部查询出来
//LEFT OUTER JOIN
SELECT e.ename,e.job,e.sal,d.dname
FROM emp e
LEFT OUTER JOIN dept d
ON e.deptno = d.deptno
//LEFT JOIN
SELECT e.ename,e.job,e.sal,d.dname
FROM emp e
LEFT JOIN dept d
ON e.deptno = d.deptno
右外连接:(GRIGHT OUTER JOIN)
将右表符合条件的数据与不符合条件的数据全部查询出来
全外连接:(FULL OUTER JOIN)(ORACLE 数据库支持,Mysql不支持)
将左右表符合条件的数据与不符合条件的数据全部查询出来
自连接
将一张表当成两张表来看,两张表是一模一样的;表中的数据要有一定的规律
//自连接
SELECT w.ename,m.ename
FROM emp w,emp m
WHERE w.mgr = m.empno
//LEFT OUTER JOIN
SELECT w.ename,m.ename
FROM emp w LEFT OUTER JOIN emp m
ON w.mgr = m.empno