12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
ADADADADAD
mysql数据库 时间:2024-12-03 12:13:57
作者:文/会员上传
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
什么是多表查询?多表查询就是从多个表中获取数据。1、笛卡尔集笛卡尔集是集合中的一种。假设A和B都是集合,A和B的笛卡尔集用 A B来表示。即A B所形成的集合叫做笛卡尔集。下
以下为本文的正文内容,内容仅供参考!本站为公益性网站,复制本文以及下载DOC文档全部免费。
SQL> create table 部门表(deptno number primary key,dnamevarchar2(10));表已创建。SQL> create table 员工表(empno number primary key, ename varchar2(10), deptno number, foreign key(deptno) references 部门表(deptno));表已创建。SQL> insert into 部门表(deptno, dname) values(10,'销售部');已创建 1 行。SQL> insert into 部门表(deptno, dname) values(20,'人事部');已创建 1 行。SQL> insert into 员工表(empno,ename,deptno) values(1,'张三',10);已创建 1 行。SQL> insert into 员工表(empno,ename,deptno) values(2,'李四',20);已创建 1 行。SQL> insert into 员工表(empno,ename,deptno) values(3,'王五',10);已创建 1 行。
部门表和员工表的集合:SQL> select empno, ename, 员工表.deptno, 部门表.deptno, dname from 部门表, 员工表; EMPNO ENAMEDEPTNO DEPTNO DNAME 1 张三10 10销售部 2李四 20 10销售部 3王五 10 10销售部 1张三 10 20人事部 2李四 20 20人事部 3王五1020人事部已选择6行。
b、sql语句多表查询显示满足条件的表的集合SQL> select empno, ename, 员工表.empno, 部门表.deptno, dname from 部门表, 员工表 where 部门表.deptno = 员工表.deptno; EMPNO ENAME EMPNO DEPTNO DNAME 1 张三1 10 销售部 2李四220人事部 3王五310销售部
为了避免笛卡尔集,可以在where子句中加入有效的连接条件。连接条件至少有n-1个,n代表表的个数。在表中有相同列时,在列名之前加上表名前缀。2、等值与非等值连接等值连接:是指使用等值比较符(=)指定连接条件的查询。举例:查询员工信息,要求显示:员工号、姓名、职位、部门名称。使用表名前缀在多个表中区分相同的列:SQL> select empno, ename, job, dname from emp, dept where emp.deptno = dept.deptno; EMPNO ENAMEJOB DNAME7934 MILLER CLERK ACCOUNTING7782 CLARKMANAGER ACCOUNTING7839 KING PRESIDENT ACCOUNTING7566 JONESMANAGER RESEARCH7951 EASONANALYST RESEARCH7369 G_EASONCLERK RESEARCH7902 FORD ANALYST RESEARCH7876 ADAMSCLERK RESEARCH7788 SCOTTANALYST RESEARCH7499 ALLENSALESMANSALES7844 TURNER SALESMANSALES7900 JAMESCLERK SALES7521 WARD SALESMANSALES7698 BLAKEMANAGER SALES7654 MARTIN SALESMANSALES已选择15行。
使用表名前缀可以提高执行效率:SQL> select emp.empno, emp.ename, emp.job, dept.dname from emp, dept where emp.deptno = dept.deptno; EMPNO ENAMEJOB DNAME7934 MILLER CLERK ACCOUNTING7782 CLARKMANAGER ACCOUNTING7839 KING PRESIDENT ACCOUNTING7566 JONESMANAGER RESEARCH7951 EASONANALYST RESEARCH7369 G_EASONCLERK RESEARCH7902 FORD ANALYST RESEARCH7876 ADAMSCLERK RESEARCH7788 SCOTTANALYST RESEARCH7499 ALLENSALESMANSALES7844 TURNER SALESMANSALES7900 JAMESCLERK SALES7521 WARD SALESMANSALES7698 BLAKEMANAGER SALES7654 MARTIN SALESMANSALES已选择15行。
使用表的别名,可以简化连接查询并提高查询性能:SQL> select e.empno, e.ename, e.job, d.dname from emp e, dept d where e.deptno = d.deptno; EMPNO ENAMEJOB DNAME7934 MILLER CLERK ACCOUNTING7782 CLARKMANAGER ACCOUNTING7839 KING PRESIDENT ACCOUNTING7566 JONESMANAGER RESEARCH7951 EASONANALYST RESEARCH7369 G_EASONCLERK RESEARCH7902 FORD ANALYST RESEARCH7876 ADAMSCLERK RESEARCH7788 SCOTTANALYST RESEARCH7499 ALLENSALESMANSALES7844 TURNER SALESMANSALES7900 JAMESCLERK SALES7521 WARD SALESMANSALES7698 BLAKEMANAGER SALES7654 MARTIN SALESMANSALES已选择15行。
SQL> select e.empno, e.ename, e.job, d.dname from emp e, dept d where e.deptno = d.deptno and e.deptno = 10; EMPNO ENAMEJOB DNAME7782 CLARKMANAGER ACCOUNTING7839 KING PRESIDENT ACCOUNTING7934 MILLER CLERK ACCOUNTING
不等值连接:不等值连接是指使用除等值比较符之外的其他比较操作符执行连接查询。举例:显示所有员工的员工号、姓名、工资以及其工资的等级。SQL> select * from salgrade; GRADELOSALHISAL 1700 1200 2 1201 1400 3 1401 2000 4 2001 3000 5 3001 9999
SQL> select e.empno, e.ename, e.sal, s.grade from emp e, salgrade s where e.sal between losal and hisal; EMPNO ENAME SALGRADE7369 G_EASON 80017900 JAMES 95017876 ADAMS110017521 WARD 125027654 MARTIN 125027934 MILLER 130027844 TURNER 150037499 ALLEN160037782 CLARK245047698 BLAKE285047566 JONES297547951 EASON300047902 FORD 300047788 SCOTT300047839 KING 50005已选择15行。
3、Oracle外连接外连接是标准连接的扩展,它不仅会返回满足连接条件的所有记录,而且还会返回不满足连接条件的部分记录。举例:按照部门统计员工的人数,要求显示:部门号,部门名称,和人数。普通的表连接:(发现没有显示DEPTNO为40的记录,原因是该部门没有员工,但是本例中需要显示该记录。)SQL> select d.deptno, d.dname, count(e.empno) from dept d, emp e where d.deptno = e.deptno group by d.deptno, d.dname;DEPTNO DNAMECOUNT(E.EMPNO)10 ACCOUNTING320 RESEARCH630 SALES 6
SQL> select d.deptno, d.dname, count(e.empno) from dept d, emp e where d.deptno = e.deptno(+) group by d.deptno, d.dname;DEPTNO DNAMECOUNT(E.EMPNO)10 ACCOUNTING340 OPERATIONS020 RESEARCH630 SALES 6SQL>
4、Oracle自连接自连接的实质是:将同一张表看成是多张表。举例:查询所有员工的姓名以及其直属上级的姓名。SQL> select e.ename 员工名, m.ename 直属上级 from emp e, emp m where e.mgr = m.empno;员工名 直属上级FORD JONESSCOTTJONESEASONJONESJAMESBLAKETURNER BLAKEMARTIN BLAKEWARD BLAKEALLENBLAKEMILLER CLARKADAMSSCOTTCLARKKINGBLAKEKINGJONESKINGG_EASONFORD已选择14行。SQL>
5、SQL1999连接为了简化连接查询,使得连接查询更加直观、更容易编写。SQL:1999标准为连接查询提供新语法,如下所示:SELECT table1.column_name, table2.column_name FROM table1 [CROSS JOIN table2] | [NATURAL JOIN table2] | [JOIN table2 USING (column_name)] | [JOIN table2 ON (table1.column_name = table2.column_name)] | [LEFT | RIGHT | FULL OUTER JOIN table2 ON (table1.column_name = table2.column_name)];。a、交叉连接cross join(了解)返回笛卡尔集的操作:select d.dname, e.ename, d.deptno, e.deptno from dept d, emp e;crosss join连接也用于生成两张表的笛卡尔集(叉集)。即:select d.dname, e.ename, d.deptno, e.deptno from dept d cross join emp e;SQL> select d.dname, e.ename, d.deptno, e.deptno from dept d cross join emp e;DNAMEENAMEDEPTNO DEPTNOACCOUNTING EASON10 20ACCOUNTING G_EASON10 20ACCOUNTING ALLEN10 30ACCOUNTING WARD 10 30ACCOUNTING JONES10 20ACCOUNTING MARTIN 10 30ACCOUNTING BLAKE10 30ACCOUNTING CLARK10 10ACCOUNTING SCOTT10 20ACCOUNTING KING 10 10已选择60行。
b、自然连接NATURAL JOIN自然连接是一种特殊的等价连接,它将表中具有相同名称的列自动进行记录匹配。自然连接不必指定任何同等连接条件。语法格式为:SELECT table1.column_name, table2.column_name FROM table1 NATURAL JOIN table2;举例:查询员工名、工资以及所在部门名称SQL> select e.ename, e.sal, d.dname from dept d natural join emp e;ENAME SAL DNAMEMILLER 1300 ACCOUNTINGCLARK2450 ACCOUNTINGKING 5000 ACCOUNTINGJONES2975 RESEARCHEASON3000 RESEARCHG_EASON 800 RESEARCHFORD 3000 RESEARCHADAMS1100 RESEARCHSCOTT3000 RESEARCHALLEN1600 SALESTURNER 1500 SALESJAMES 950 SALESWARD 1250 SALESBLAKE2850 SALESMARTIN 1250 SALES已选择15行。
c、内连接返回两个表中相匹配的数据(只返回满足条件的数据)。等值连接、非等值连接、自然连接都数据内连接。使用USING子句建立相等连接。例如:SELECT e.ename, e.sal, d.dname from dept d join emp e using(deptno);SQL> SELECT e.ename, e.sal, d.dname from dept d join emp e using(deptno);ENAME SAL DNAMEMILLER 1300 ACCOUNTINGCLARK2450 ACCOUNTINGKING 5000 ACCOUNTINGJONES2975 RESEARCHEASON3000 RESEARCHG_EASON 800 RESEARCHFORD 3000 RESEARCHADAMS1100 RESEARCHSCOTT3000 RESEARCHALLEN1600 SALESTURNER 1500 SALESJAMES 950 SALESWARD 1250 SALESBLAKE2850 SALESMARTIN 1250 SALES已选择15行。
SQL> SELECT e.ename, e.sal, d.dname from dept d join emp e on e.deptno = d.deptno;ENAME SAL DNAMEMILLER 1300 ACCOUNTINGCLARK2450 ACCOUNTINGKING 5000 ACCOUNTINGJONES2975 RESEARCHEASON3000 RESEARCHG_EASON 800 RESEARCHFORD 3000 RESEARCHADAMS1100 RESEARCHSCOTT3000 RESEARCHALLEN1600 SALESTURNER 1500 SALESJAMES 950 SALESWARD 1250 SALESBLAKE2850 SALESMARTIN 1250 SALES已选择15行。
d、左(外)连接左连接用于返回满足连接条件的数据,以及不满足连接条件的左边表的其他数据。(即:左表的全部记录,右表满足条件的记录)在SQL:1999标准中,左连接是通过LEFT[OUTER] JOIN选项来实现的。如:select e.ename, e.sal, d.dname from dept d left join emp e on e.deptno = d.deptno;SQL> select e.ename, e.sal, d.dname from dept d left join emp e on e.deptno = d.deptno;ENAME SAL DNAMEMILLER 1300 ACCOUNTINGCLARK2450 ACCOUNTINGKING 5000 ACCOUNTINGJONES2975 RESEARCHEASON3000 RESEARCHG_EASON 800 RESEARCHFORD 3000 RESEARCHADAMS1100 RESEARCHSCOTT3000 RESEARCHALLEN1600 SALESTURNER 1500 SALESJAMES 950 SALESWARD 1250 SALESBLAKE2850 SALESMARTIN 1250 SALESOPERATIONS已选择16行。
e、右(外)连接右连接用于返回满足连接条件的左边表的数据,以及不满足连接条件的右边表的其他数据。(即:右表中的全部记录,左表满足条件的记录。)示例:select e.ename, e.sal, d.dname from dept d right join emp e on e.deptno = d.deptno;SQL> select e.ename, e.sal, d.dname from dept d right join emp e on e.deptno = d.deptno;ENAME SAL DNAMEMILLER 1300 ACCOUNTINGKING 5000 ACCOUNTINGCLARK2450 ACCOUNTINGFORD 3000 RESEARCHADAMS1100 RESEARCHSCOTT3000 RESEARCHJONES2975 RESEARCHG_EASON 800 RESEARCHEASON3000 RESEARCHJAMES 950 SALESTURNER 1500 SALESBLAKE2850 SALESMARTIN 1250 SALESWARD 1250 SALESALLEN 1600 SALES已选择15行。
f、完全(外)连接完全连接用于返回满足连接条件的数据,以及不满足链接条件的左表和右表中的其他数据。(即:左表和右表的全部记录。)在SQL:1999标准中,完全连接是通过制定FULL [OUTER] JOIN 选项来实现的。示例:select e.ename, e.sal, d.dname from dept d full join emp e on e.deptno = d.deptno;SQL> select e.ename, e.sal, d.dname from dept d full join emp e on e.deptno = d.deptno;ENAME SAL DNAMEEASON3000 RESEARCHG_EASON 800 RESEARCHALLEN1600 SALESWARD 1250 SALESJONES2975 RESEARCHMARTIN 1250 SALESBLAKE2850 SALESCLARK2450 ACCOUNTINGSCOTT3000 RESEARCHKING 5000 ACCOUNTINGTURNER 1500 SALESADAMS1100 RESEARCHJAMES 950 SALESFORD 3000 RESEARCHMILLER 1300 ACCOUNTINGOPERATIONS已选择16行。
6、set运算符set运算符,即集合运算符专门用于合并多条SELECT语句的结果,包括4种:UNION/UNION ALL 并集、INTERSECT 交集、MINUS 差集。例如有集合A和集合B,那么集合A有1、2、3,集合B有3、4。A UNION B有:1、2、3、4;A UNION ALL B有:1、2、3、3 、4;A INTERSECT B有:3;A MINUS B有:1、2;B MINUS A有:4;SQL> create table emp01 as select * from emp where deptno in(10,20);表已创建。SQL> create table emp02 as select * from emp where deptno in(20,30);表已创建。SQL> select deptno, empno, ename from emp01 union select deptno, empno, ename from emp02;DEPTNOEMPNO ENAME10 7782 CLARK10 7839 KING10 7934 MILLER20 7369 G_EASON20 7566 JONES20 7788 SCOTT20 7876 ADAMS20 7902 FORD20 7951 EASON30 7499 ALLEN30 7521 WARD30 7654 MARTIN30 7698 BLAKE30 7844 TURNER30 7900 JAMES已选择15行。
b、UNION ALLunion all 操作符用于取得两个结果集的并集,单与union操作符不同,该操作符不会取消重复行,并且不会对结果集数据进行排序。SQL> select deptno, empno, ename from emp01 union all select deptno, empno, ename from emp02;DEPTNOEMPNO ENAME20 7951 EASON20 7369 G_EASON20 7566 JONES......30 7844 TURNER20 7876 ADAMS30 7900 JAMES20 7902 FORD已选择21行。
c、INTERSECTintersect操作符用于取得两个结果集的交集,当使用该操作符时,只会显示同时存在于两个结果集中的数据,并且会以第一列的结果进行升序排序。SQL> select deptno, empno, ename from emp01 intersect select deptno, empno, ename from emp02;DEPTNOEMPNO ENAME20 7369 G_EASON20 7566 JONES20 7788 SCOTT20 7876 ADAMS20 7902 FORD20 7951 EASON已选择6行。
d、MINUSminus操作符用于取得两个结果集中的差集,当使用该操作符时,只会显示在第一个结果集中存在,在第二个结果集中不存在的数据,并且会以第一列的结果集进行升序排序。SQL> select deptno, empno, ename from emp01 minus select deptno, empno, ename from emp02;DEPTNOEMPNO ENAME10 7782 CLARK10 7839 KING10 7934 MILLER
e、控制结果排序当使用集合操作符UNION、INTERSECT和MINUS时,默认情况下会自动基于第一列进行升序排序;而当使用集合操作符UNION ALL时,不会进行排序,为了控制结果的排序顺序,可以使用ORDER BY子句。(如果两个表查询的结果中列名相同,则可以使用列名名称;如果两个表中的列名不同,则必须使用列位置,1表示基于第1列,2表示基于第2列)示例:select deptno, empno, ename from emp01 union all select deptno, empno, ename from emp02 order by 2;SQL> select deptno, empno, ename from emp01 union all select deptno, empno, ename from emp02 order by empnDEPTNOEMPNO ENAME20 7369 G_EASON20 7369 G_EASON30 7499 ALLEN30 7521 WARD20 7566 JONES......20 7902 FORD10 7934 MILLER20 7951 EASON20 7951 EASON已选择21行。SQL> select deptno, empno, ename from emp01 union all select deptno, empno, ename from emp02 order byDEPTNOEMPNO ENAME20 7369 G_EASON20 7369 G_EASON30 7499 ALLEN30 7521 WARD......20 7902 FORD10 7934 MILLER20 7951 EASON20 7951 EASON已选择21行。
f、使用set操作符的注意事项在SELECT列表中的列名和表达式在数量和数据类型上要相对应。
11-20
11-19
11-20
11-20
11-20
11-19
11-20
11-20
11-19
11-20
11-19
11-19
11-19
11-19
11-19
11-19