数据库 SQL 学习笔记
主子查询(自链接)
- 查询目标:获取雇员姓名、雇员工资、领导姓名、领导工资
- SQL 示例 1
SELECT E.ENAME 雇员姓名, E.SAL 雇员工资
FROM EMP E, EMP M
WHERE E.MGR = M.EMPNO;
解释:通过 EMP 表的自连接,将雇员表 E 和作为领导的雇员表 M 关联起来,条件是雇员的领导编号 MGR 等于领导的雇员编号 EMPNO 。
- SQL 示例 2
sql
SELECT E.ENAME, E.SAL, D.DNAME, M.ENAME
FROM EMP E, DEPT D, EMP M
WHERE E.MGR = M.EMPNO AND E.DEPTNO = D.DEPTNO;
解释:多表连接,在上述基础上增加了 DEPT 部门表,通过部门编号 DEPTNO 关联 EMP 表和 DEPT 表,同时通过领导编号关联雇员和领导,获取更多信息。
查询雇员相关综合信息
- 查询目标:雇员的姓名、雇员工资、部门名称、工资等级
- SQL 示例
SELECT E.ENAME, E.SAL, D.DNAME, G.GRADE
FROM EMP E, SALGRADE G, DEPT D
WHERE E.DEPTNO = D.DEPTNO AND E.SAL BETWEEN G.LOSAL AND G.HISAL;
解释:连接 EMP 雇员表、 SALGRADE 工资等级表、 DEPT 部门表,通过部门编号关联 EMP 和 DEPT 表,通过工资范围判断雇员的工资等级。
查询目标:雇员姓名、雇员工资、部门名称、雇员工资等级、领导姓名、领导工资、领导工资等级
- SQL 示例
SELECT
E.ENAME AS 雇员姓名,
E.SAL AS 雇员工资,
D.DNAME AS 部门名称,
EG.GRADE AS 雇员工资等级,
M.ENAME AS 领导姓名,
M.SAL AS 领导工资,
MG.GRADE AS 领导工资等级
FROM
EMP E, DEPT D, EMP M, SALGRADE EG, SALGRADE MG
WHERE
E.DEPTNO = D.DEPTNO
AND E.MGR = M.EMPNO
AND E.SAL BETWEEN EG.LOSAL AND EG.HISAL
AND M.SAL BETWEEN MG.LOSAL AND MG.HISAL;
解释:多表复杂连接,关联多个表获取雇员及其领导的详细信息,包括工资等级等,通过各表间关联条件和工资范围判断来筛选数据。
SQL99 标准
- 简介:SQL99 标准,也称为 SQL1999 标准,制定于 1999 年 。主要分类为内连接、外连接 。
- 内连接语法
sql
SELECT 列名1 AS 别名1, 列名2 AS 别名2...
FROM 表名1 别名1
INNER JOIN 表名2 别名2 ON 连接条件
WHERE 过滤条件
ORDER BY 排序条件 ASC|DESC;
解释: INNER JOIN 用于连接两个或多个表, ON 关键字指定连接条件,通过指定列名获取数据,并可进行条件过滤和排序。
- 查询示例
- 查询目标:查询雇员编号、雇员姓名、雇员工资、部门名称
- 方法 1:内连接
SELECT E.EMPNO 雇员编号, E.ENAME 雇员姓名, E.SAL 雇员工资, D.DNAME 部门名称
FROM EMP E
INNER JOIN DEPT D ON E.DEPTNO = D.DEPTNO;
解释:使用 INNER JOIN 连接 EMP 表和 DEPT 表,连接条件是部门编号相等,获取所需的雇员和部门相关信息。
- 方法 2:自然连接
SELECT E.EMPNO 雇员编号, E.ENAME 雇员姓名, E.SAL 雇员工资, D.DNAME 部门名称
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO;
解释:通过在 WHERE 子句中指定相同的部门编号条件进行连接,实现类似内连接获取数据的效果。
- 查询目标:查询工资大于 1500 的雇员姓名、工资、部门名称、领导姓名
- 方法 1:内连接
SELECT
E.ENAME AS 雇员姓名,
E.SAL AS 雇员工资,
D.DNAME AS 部门名称,
M.ENAME AS 领导姓名
FROM
EMP E
INNER JOIN DEPT D ON E.DEPTNO = D.DEPTNO
INNER JOIN EMP M ON E.MGR = M.EMPNO
WHERE E.SAL > 1500;
解释:通过多次 INNER JOIN 连接 EMP 表(两次,分别代表雇员和领导)和 DEPT 表,连接条件分别是部门编号和领导编号,再通过 WHERE 子句筛选出工资大于 1500 的雇员相关信息。
- 方法 2
SELECT E.ENAME 雇员姓名, E.SAL 雇员工资, D.DNAME 部门名称, M.ENAME 领导姓名
FROM EMP E, DEPT D, EMP M
WHERE E.SAL > 1500 AND E.DEPTNO = D.DEPTNO AND E.MGR = M.EMPNO
解释:通过在 WHERE 子句中同时指定部门编号相等和领导编号相等的条件,以及工资大于 1500 的条件,实现多表连接获取数据。