[1]内连接引入:
实际开发中往往需要针对两张甚至更多张数据表进行操作,而这多张表之间需要使用主键和外键关联在一起, 然后使用连接查询来查询多张表中满足要求的数据记录。一条SQL语句查询多个表,得到一个结果,包含多个表的数据。效率高。在SQL99中,连接查询需要使用 join关键字实现。 提供了多种连接查询的类型: cross、natural、using、on 交叉连接(CROSS JOIN)是对两个或者多个表进行笛卡儿积操作,所谓笛卡儿积就是关系代数里的一个概念,表示两个表中的每一行数据任意组合 的结果。比如:有两个表,左表有m条数据记录,x个字段, 右表有n条数据记录, y个字段,则执行交叉连接后将返回m*n条数据记录,x+y个字 段。
-- 查询员工的编号,姓名,部门编号:
SELECT EMPNO,ENAME,DEPTNO FROM EMP;
-- 查询员工的编号,姓名,部门编号,部门名称:
SELECT * FROM EMP;-- 14条记录
SELECT * FROM DEPT;-- 4条记录
-- 多表查询:
-- 交叉连接:CROSS JOIN
SELECT *
FROM EMP
CROSS JOIN DEPT;
-- 14*4=56条记录 笛卡尔乘积:把所有的都匹配一次,没有实际意义,有理论意义
SELECT *
FROM EMP
JOIN DEPT;
-- CROSS 可以省略不写,MySQL中可以,Oracle中不可以
-- 自然连接:NATUREAL JOIN
-- 优点:自动匹配所有的同名列,同名列只展示一次,简单!
SELECT *
FROM EMP
NATURAL JOIN DEPT;
-- 缺点:查询字段的时候,没有指定字段所属的数据库表,效率低
-- 解决:指定表名
SELECT EMP.EMPNO,EMP.ENAME,EMP.SAL,DEPT.DNAME,DEPT.LOC
FROM EMP
NATURAL JOIN DEPT;
-- 缺点:表名太长
-- 解决:给表起别名
SELECT E.EMPNO,E.ENAME,E.SAL,D.DNAME,D.LOC
FROM EMP E
NATURAL JOIN DEPT D;
-- 自然连接 NATURAL JOIN 缺点:自动匹配表中所有的同名列,但有时候我们只想匹配部分同名列:
-- 解决:内连接 - using子句:
SELECT *
FROM EMP E
INNER JOIN DEPT D -- INNER 可以不写
USING(DEPTNO) -- 这里不能写natural join了,这里是内连接
-- using缺点:关联的字段,必须是同名的
-- 解决: 内连接 - on子句:
SELECT *
FROM EMP E
INNER JOIN DEPT D
ON (E.DEPTNO = D.DEPTNO);-- 可以不同名,例如ON(E.CNO = D.DEPTNO)
-- 多表连接查询的类型:
-- 1.交叉链接:CROSS JOIN
-- 2.自然连接:NATURAL JOIN
-- 3.内连接:-USING 子句
-- 4. 内连接 - ON 子句
-- 综合看:内连接 - ON子句只用最多
SELECT *
FROM EMP E
INNER JOIN DEPT D
ON (E.DEPTNO = D.DEPTNO)
WHERE SAL>3500;
-- 条件:
-- 1.筛选条件:WHERE HAVING
-- 2.链接条件: ON,USING,NATURAL
-- SQL99语法:筛选条件和连接条件是分开的