多表查询:
就是在一条查询语句中,从多张表中一起取出所需要的数据,如果要想进行多表查询,直接在FROM字句之后跟上多个表即可,此时的句法:
SELECT[DISTINCT]*|列名称[AS][列别名],列名称[AS][列别名]。。。。。FROM 表名称1[表别名],表名称2[表别名2]。。。
[WHERE 条件]
[ORDERBY排序的字段1 AS ASC|DESC, 排序的字段2 AS ASC|DESC];
在多表查询中先确定数据量:使用函数COUNT()函数来统计:SELECT COUNT(*) FROM emp;
笛卡尔积:进行多表查询的时候,由于数据库内部的处理机制,会产生无用的数据,这些数据被称为笛卡尔积;
消除笛卡尔积:消除笛卡尔积使用的是关联字段。虽然可以消除掉所有显示的笛卡尔积,但是数据库的原理机制就表示笛卡尔积会永远存在。
如何切换到sh用户:
1. 打开sqlplus:sqlplus/nolog
2. 连接到超级管理员数据库:conn sys/change_on_install AS SYSDBA
3. 切换到pdbmldn数据库:ALTER SESSION CONTAINER=pdbmldn;
4. 打开pdbmldn数据库:ALTER DATEBASE pdbmldn OPEN
注:由于有多张表,可能会有重名字段,所以在进行重名字段查询的时候,前面需要加上表名称,采用“表名.字段”的方式;
范例:
1. 查询所有雇员和部门的全部信息:
SELECT *
FROM emp,dept;
2. 消除笛卡尔积:
SELECT *
FROMemp,dept
WHERE emp.deptno = dept.deptno;
3. 查询每个雇员的编号,姓名,职位,基本工资,部门名称,部门位置信息:
SELECTemp.empno,emp.ename,emp.job,emp.sal,dept.dname,dept.loc
FROM emp,dept
WHERE emp.deptno=dept.deptno;
第一步:确定需要的数据表;
第二步:确定关联的字段
编写按照:FROMWHER SELECT .
注:在多表查询的时候为了方便,为数据表定义别名;
4. 查询出每个雇员的编号,姓名,雇拥日期,基本工资,工资等级
分析:基本工资和工资等级字段关联;
SELECTe.empno,e.ename,e.hiredate,e.sal,s.grade
FROM empe, salgrade s
WHERE e.sal BETWEEN s.losal AND s.hisal;
为了更加清楚的显示出工资等级的信息,现在希望可以按ABCDE的格式显示:
SELECTe.empno,e.ename,e.hiredate,e.sal,
DECODE(s.grade,1,'E等工资',2,'D等工资',3,'C等工资',4,'B等工资',5,'A等工资')
FROM emp e, salgrade s
WHERE e.sal BETWEEN s.losal AND s.hisal;
5. 查询出每个雇员的姓名,职位,基本工资,部门名称,工资所在公司的工资等级:
SELECTe.ename,e.job,e.sal,d.dname,
DECODE(s.grade,1,'E等工资',2,'D等工资',3,'C等工资',4,'B等工资',5,'A等工资') 工资等级
FROM empe, salgrade s,dept d
WHERE e.deptno = d.deptno AND e.sal BETWEEN s.losal ANDs.hisal;
注:如果出现多个消除笛卡尔积的条件,那么往往使用and将这些条件连接起来;每当增加一个关联表都需要设置消除笛卡尔积的条件;