`
fyd222
  • 浏览: 104038 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

SQL基础-->多表查询

 
阅读更多

--==========================

--SQL基础-->多表查询

--==========================

/*

一、多表查询

简言之,根据特定的连接条件从不同的表中获取所需的数据

笛卡尔集的产生条件:

省略连接条件

连接条件无效

第一个表中的所有行与第二个表中的所有行相连接

二、多表查询语法:*/

SELECT table1.column, table2.column

FROM table1, table2

WHERE table1.column1 = table2.column2;

/*

但要注意where 不要省了,省略where 即为笛卡尔集,而且where 条件要有效,

两张表间有一个相同的字段,才好进行有效的多表查询

查询时列名前,加表名或表别名前辍(如果字段在两个表中是唯一的可以不加)

为了简化SQL书写,可为表名定义别名,格式:from 表名别名

如:from emp e,dept d

建议使用表的别名及表前缀,使用表别名可以简化查询,而使用表前缀则可以提高查询性能

例:查询每个员工的工号,姓名,工资,部门名和工作地点*/

select empno,ename,sal,dname,loc from emp,dept

where emp.deptno=dept.deptno;

/*

三、多表连接类型:

从数据显示方式来讲有:内连接和外连接。

内连接:只返回满足连接条件的数据。

外连接:除了返回满足连接条的行以外,还返回左(右)表中,不满足条件的行,

称为左(右)连接

内连接*/

select empno,ename,sal,dname,loc from emp,dept

where emp.deptno=dept.deptno; --(Oracle 8i 及以前的写法)

--内连接的另一种写法:

select empno,ename,job,sal,dept.deptno,dname,loc

from emp join dept on (emp.deptno=dept.deptno); -- (SQL 99的写法)

/*

外连接:

两个表的查询中,使用外连接可以查询另一个表或者两个中不满足连接条件的数据。

外连接的符号是(+),(+)要放在字段名后。(+)对面的那个表,会全部显示。

外连接语法*/

SELECT table1.column, table2.column --右外连接

FROM table1, table2

WHERE table1.column(+) = table2.column;

SELECT table1.column, table2.column --左外连接

FROM table1, table2

WHERE table1.column = table2.column(+);

--例:

select empno,ename,job,sal,dept.deptno,dname,loc

from emp,dept

where emp.deptno(+)=dept.deptno; -- (Oracle 8i 及以前的写法)

--另一种写法(右连接): -- (SQL 99的写法)

select empno,ename,job,sal,dept.deptno,dname,loc

from emp right join dept on (emp.deptno=dept.deptno);

--左连接: (SQL 99的写法)

select empno,ename,job,sal,dept.deptno,dname,loc

from emp left join dept on (emp.deptno=dept.deptno);

--全连接(满连接) (SQL 99的写法)

select empno,ename,job,sal,d.deptno,dname,loc

from emp e full join dept d on (e.deptno=d.deptno);

/*

自然连接 (SQL 99的写法)

以两个表具有相同的字段的所有列为基础,可采用自然连接(natural join)

它将选择两个表中那些在所有匹配的列中值相等的行。

如果列具有相同的名称,但数据类型能够不同,则会报错*/

select empno,ename,job,sal,deptno,dname,loc

from emp natural join dept;

/*

自连接:

将自身表的一个镜像当另一个表来对待。*/

select ... from emp e,emp d ...

--下面列出SQL 99的语法供参考

SELECT table1.column, table2.column

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)];

--在下面的语法中

table1.column --指明从中检索数据的表和列

CROSS JOIN --返回两个表的笛卡尔集

NATURAL JOIN --根据相同的列名连接两个表

JOIN table

USING column_name --根据列名执行等值连接

JOIN table ON

table1.column_name --根据ON 子句中的条件执行等值连接

= table2.column_name

LEFT/RIGHT/FULL OUTER

/*

使用using子句创建连接

如果几个列具有相同的名称,但是数据类型不匹配,那么可以使用using子句来修改natural join

子句以指定要用于等值连接的列

在多个列匹配时,使用using 子句只匹配一个列

在引用列中不要使用表名或别名

natural join using 子句是互不相容的 */

--例:

SELECT l.city, d.department_name

FROM locations l JOIN departments d USING (location_id)

WHERE location_id = 1400;

--下面的语句无效,因为where 子句中限定了location_id

SELECT l.city, d.department_name

FROM locations l JOIN departments d USING (location_id)

WHERE d.location_id = 1400;

ORA-25154: column part of USING clause cannot have qualifier

--注意:

-- 两个表中名称相同的列在使用时不能有任何限定符,这一限制同样适用于natural join

/*

四、演示: */

--笛卡尔集

SQL> select empno,ename,dname from emp,dept;

EMPNO ENAME DNAME

---------- ---------- --------------

7369 SMITH ACCOUNTING

7499 ALLEN ACCOUNTING

7521 WARD ACCOUNTING

7566 JONES ACCOUNTING

7654 MARTIN ACCOUNTING

7698 BLAKE ACCOUNTING

7782 CLARK ACCOUNTING

7788 SCOTT ACCOUNTING

7839 KING ACCOUNTING

7844 TURNER ACCOUNTING

7876 ADAMS ACCOUNTING

--中间结果省略

56 rows selected.

--使用cross join 实现交叉连接,即笛卡尔集

SQL> select empno,ename,dname from emp

2 cross join dept;

EMPNO ENAME DNAME

---------- ---------- --------------

7369 SMITH ACCOUNTING

7499 ALLEN ACCOUNTING

7521 WARD ACCOUNTING

7566 JONES ACCOUNTING

7654 MARTIN ACCOUNTING

7698 BLAKE ACCOUNTING

7782 CLARK ACCOUNTING

7788 SCOTT ACCOUNTING

7839 KING ACCOUNTING

7844 TURNER ACCOUNTING

7876 ADAMS ACCOUNTING

--等值连接(Oracle 写法)

SQL> select empno,ename,dname from emp,dept where emp.deptno = dept.deptno;

EMPNO ENAME DNAME

---------- ---------- --------------

7369 SMITH RESEARCH

7499 ALLEN SALES

7876 ADAMS RESEARCH

--部分结果省略

7902 FORD RESEARCH

7934 MILLER ACCOUNTING

14 rows selected.

--等值连接(SQL 99 写法)

SQL> select e.empno,e.ename,d.dname from emp e

2 inner join dept d

3 on e.deptno = d.deptno;

EMPNO ENAME DNAME

---------- ---------- --------------

7369 SMITH RESEARCH

7499 ALLEN SALES

7876 ADAMS RESEARCH

--部分结果省略

7902 FORD RESEARCH

7934 MILLER ACCOUNTING

14 rows selected.

--注意:表别名不支持as 用法

SQL> select e.empno,e.ename,d.dname from emp as e

2 inner join dept d

3 on e.deptno = d.deptno;

select e.empno,e.ename,d.dname from emp as e

*

ERROR at line 1:

ORA-00933: SQL command not properly ended

--等值连接并增加条件

SQL> select e.empno,e.ename,d.dname from emp e,

2 dept d

3 where d.deptno = e.deptno

4 and e.ename = 'SCOTT';

EMPNO ENAME DNAME

---------- ---------- --------------

7788 SCOTT RESEARCH

--非等值连接

--查询雇员的姓名、薪水、级别且部门为的记录

SQL> select ename,sal,grade

2 from emp,salgrade

3 where sal between losal and hisal

4 and emp.deptno = 20;

ENAME SAL GRADE

---------- ---------- ----------

SCOTT 3000 4

FORD 3000 4

JONES 2975 4

ADAMS 1100 1

SMITH 800 1

--使用SQL 99写法实现上述功能

SQL> select e.ename,e.sal,s.grade

2 from emp e

3 join salgrade s

4 on e.sal between losal and hisal

5 and e.deptno = 20;

ENAME SAL GRADE

---------- ---------- ----------

SCOTT 3000 4

FORD 3000 4

JONES 2975 4

ADAMS 1100 1

SMITH 800 1

--右外连接

--注意:右外连接时,加号在等号的左边

--可以看到,左表emp中的列有为空值的

SQL> select e.ename,e.deptno,d.dname

2 from emp e,dept d

3 where e.deptno(+) = d.deptno;

ENAME DEPTNO DNAME

---------- ---------- --------------

CLARK 10 ACCOUNTING

KING 10 ACCOUNTING

MILLER 10 ACCOUNTING

JONES 20 RESEARCH

FORD 20 RESEARCH

ADAMS 20 RESEARCH

SMITH 20 RESEARCH

SCOTT 20 RESEARCH

WARD 30 SALES

TURNER 30 SALES

ALLEN 30 SALES

ENAME DEPTNO DNAME

---------- ---------- --------------

JAMES 30 SALES

BLAKE 30 SALES

MARTIN 30 SALES

OPERATIONS

15 rows selected.

--使用SQL 99写法实现右外连接

SQL> select e.ename,e.deptno,d.dname

2 from emp e

3 right join dept d

4 on e.deptno = d.deptno ;

ENAME DEPTNO DNAME

---------- ---------- --------------

CLARK 10 ACCOUNTING

KING 10 ACCOUNTING

MILLER 10 ACCOUNTING

JONES 20 RESEARCH

FORD 20 RESEARCH

ADAMS 20 RESEARCH

SMITH 20 RESEARCH

SCOTT 20 RESEARCH

WARD 30 SALES

TURNER 30 SALES

ALLEN 30 SALES

ENAME DEPTNO DNAME

---------- ---------- --------------

JAMES 30 SALES

BLAKE 30 SALES

MARTIN 30 SALES

OPERATIONS

--左外连接

--注意:左外连接时,加号在等号的右边

SQL> select d.dname,e.ename,e.deptno

2 from dept d,emp e

3 where d.deptno = e.deptno(+)

4 order by d.deptno;

DNAME ENAME DEPTNO

-------------- ---------- ----------

ACCOUNTING CLARK 10

ACCOUNTING KING 10

ACCOUNTING MILLER 10

RESEARCH JONES 20

RESEARCH FORD 20

RESEARCH ADAMS 20

RESEARCH SMITH 20

RESEARCH SCOTT 20

SALES WARD 30

SALES TURNER 30

SALES ALLEN 30

DNAME ENAME DEPTNO

-------------- ---------- ----------

SALES JAMES 30

SALES BLAKE 30

SALES MARTIN 30

OPERATIONS

15 rows selected.

--使用SQL 99写法实现左外连接

SQL> select d.dname,e.ename,e.deptno

2 from dept d

3 left join emp e

4 on d.deptno = e.deptno

5 order by d.deptno;

DNAME ENAME DEPTNO

-------------- ---------- ----------

ACCOUNTING CLARK 10

ACCOUNTING KING 10

ACCOUNTING MILLER 10

RESEARCH JONES 20

RESEARCH FORD 20

RESEARCH ADAMS 20

RESEARCH SMITH 20

RESEARCH SCOTT 20

SALES WARD 30

SALES TURNER 30

SALES ALLEN 30

DNAME ENAME DEPTNO

-------------- ---------- ----------

SALES JAMES 30

SALES BLAKE 30

SALES MARTIN 30

OPERATIONS

15 rows selected.

--自连接

SQL> select e.ename || ' works for ' || m.ename

2 from emp e,emp m

3 where e.empno = m.mgr;

E.ENAME||'WORKSFOR'||M.ENAME

-------------------------------

FORD works for SMITH

BLAKE works for ALLEN

BLAKE works for WARD

KING works for JONES

BLAKE works for MARTIN

KING works for BLAKE

KING works for CLARK

JONES works for SCOTT

BLAKE works for TURNER

SCOTT works for ADAMS

BLAKE works for JAMES

E.ENAME||'WORKSFOR'||M.ENAME

-------------------------------

JONES works for FORD

CLARK works for MILLER

13 rows selected.

--自然连接

SQL> select empno,ename,job,deptno,dname,loc

2 from emp

3 natural join dept;

EMPNO ENAME JOB DEPTNO DNAME LOC

---------- ---------- --------- ---------- -------------- -------------

7369 SMITH CLERK 20 RESEARCH DALLAS

7499 ALLEN SALESMAN 30 SALES CHICAGO

7521 WARD SALESMAN 30 SALES CHICAGO

7566 JONES MANAGER 20 RESEARCH DALLAS

7654 MARTIN SALESMAN 30 SALES CHICAGO

7698 BLAKE MANAGER 30 SALES CHICAGO

7782 CLARK MANAGER 10 ACCOUNTING NEW YORK

7788 SCOTT ANALYST 20 RESEARCH DALLAS

7839 KING PRESIDENT 10 ACCOUNTING NEW YORK

7844 TURNER SALESMAN 30 SALES CHICAGO

7876 ADAMS CLERK 20 RESEARCH DALLAS

EMPNO ENAME JOB DEPTNO DNAME LOC

---------- ---------- --------- ---------- -------------- -------------

7900 JAMES CLERK 30 SALES CHICAGO

7902 FORD ANALYST 20 RESEARCH DALLAS

7934 MILLER CLERK 10 ACCOUNTING NEW YORK

14 rows selected.

--使用using 子句创建连接

SQL> select e.empno,e.ename,d.dname,d.loc

2 from emp e

3 join dept d

4 using (deptno)

5 where deptno in (20,40);

EMPNO ENAME DNAME LOC

---------- ---------- -------------- -------------

7369 SMITH RESEARCH DALLAS

7566 JONES RESEARCH DALLAS

7788 SCOTT RESEARCH DALLAS

7876 ADAMS RESEARCH DALLAS

7902 FORD RESEARCH DALLAS

/*

五、更多*/

Oracle 数据库实例启动关闭过程

Oracle 10g SGA 的自动化管理

使用OEM,SQL*Plus,iSQL*Plus 管理Oracle实例

Oracle实例和Oracle数据库(Oracle体系结构)

SQL 基础-->常用函数

SQL基础-->过滤和排序

SQL 基础-->SELECT 查询

分享到:
评论

相关推荐

    sql-map-2.dtd和sql-map-config-2.dtd

    例如,`<sqlMap>`元素用于包含具体的SQL语句,`<select>`、`<insert>`、`<update>`和`<delete>`元素则分别用于定义查询、插入、更新和删除操作。通过引入sql-map-2.dtd,XML编辑器可以提供代码补全和错误检查,提高...

    01.sql基础-简单查询.sql

    01.sql基础-简单查询.sql

    sql server 2012 T-SQl基础教程 源码和示例数据库

    2. **Chapter 03 - Joins - Solutions**:在这个章节,你将学习如何连接两个或更多表以获取跨表的数据,包括内连接(INNER JOIN)、外连接(LEFT JOIN, RIGHT JOIN, FULL JOIN)和自连接(SELF JOIN)的概念和实践。...

    flume-ng-sql-source-1.5.2

    Flume-ng-sql-source的核心功能在于,它能够定期查询指定的SQL数据库,并将查询结果作为事件流传输到Flume的数据通道中,进一步处理或存储。这一特性使得Flume可以方便地整合各种结构化数据源,如MySQL、PostgreSQL...

    SQLServer-sql查询入门

    #### 二、SQL基础知识 - **SQL的重要性**:对于从事网站开发或维护数据库的人来说,熟练掌握SQL是至关重要的技能之一。无论是在ActiveServerPages中还是其他环境中,都需要使用SQL来访问和操作数据库。 - **数据存储...

    SQL基础教程-Mick-示例程序&习题答案

    Mick的教程可能包含各种实际操作示例,如创建数据库模型、导入数据、执行复杂的多表查询、进行数据统计分析等。这些示例能帮助初学者理解SQL在实际工作中的应用。 4. 习题解答: 习题部分涵盖各种SQL概念和操作,...

    SQL基础--基础语句应用

    了解并熟练掌握这些SQL基础语句和应用,对于进行有效的数据库管理和数据分析至关重要。无论是简单的数据查询,还是复杂的业务逻辑处理,SQL都能提供强大而灵活的支持。在实际工作中,根据具体需求选择合适的SQL命令...

    learn-sql-the-hard-way-笨方法学sql

    - 使用子查询进行多表操作 5. **插入、更新与删除**(learn-sql-the-hard-waych13.html) - INSERT语句添加新记录 - UPDATE语句修改现有记录 - DELETE语句删除记录 - 对这些操作的回滚和事务管理 6. **创建与...

    Microsoft SQL Server 2008技术内幕:T-SQL查询

    主要内容包括SQL的基础理论、查询优化、查询算法及复杂度,以及在使用子查询、表表达式、排名函数、数据聚合和透视转换、TOP和APPLY、数据修改、分区表、特殊数据结构等实际应用时会遇到的各种高级查询问题和解决...

    精通SQL--结构化查询语言详解

    第1章 数据库与sql基础 1 1.1 数据库的基本概念 1 1.1.1 数据库的由来 1 1.1.2 数据库系统的概念 3 1.2 数据库系统的结构、组成及工作流程 3 1.2.1 数据库的体系结构 3 1.2.2 数据库系统的组成 4 1.2.3 ...

    Microsoft SQL Server 2008技术内幕:T-SQL查询.pdf

    1. **基础查询语法**:包括SELECT语句的基本结构,用于从一个或多个表中检索数据。学习如何使用WHERE子句进行条件过滤,GROUP BY用于分组数据,HAVING来过滤分组后的结果,以及ORDER BY对结果进行排序。 2. **联接...

    计算机后端-PHP视频教程. php与mysql基础-sql6-获取查询结果.wmv

    计算机后端-PHP视频教程. php与mysql基础-sql6-获取查询结果.wmv

    Microsoft SQL Server 2008技术内幕:T-SQL查询_源代码及附录.zip

    这些操作用于合并来自两个或更多表的数据,根据指定的匹配条件。 3. **子查询**: 子查询是嵌套在其他查询中的查询,用于提供临时的结果集。它们可以出现在FROM、WHERE和HAVING子句中,用于复杂查询逻辑的构建。 ...

    计算机后端-PHP视频教程. php与mysql基础-sql8-while查询所有行.wmv

    计算机后端-PHP视频教程. php与mysql基础-sql8-while查询所有行.wmv

    Sql2008技术内幕-T-Sql查询

    2. **子查询与联接**:深入讲解嵌套查询的使用,以及各种类型的联接(内连接、外连接、交叉连接)和自连接,帮助读者处理多表数据。 3. **集函数**:如COUNT、SUM、AVG、MIN和MAX等,用于对一组值进行统计计算。 4...

    sql 基础--思维导图

    用百度脑图做的一个知识框架,里面大部分内容来源于网络

    SERVER SQL学习教程

    SQL Server不仅提供了标准的SQL功能,还包含了许多特有的工具和特性,使得数据存储、查询、分析和管理更为高效。 1. **SQL Server基础** - **安装与配置**:了解如何在Windows环境中安装SQL Server,设置服务,...

    Microsoft SQL Server 2005技术内幕:T-SQL查询的源代码

    2. **JOIN操作**:T-SQL支持INNER JOIN、LEFT JOIN、RIGHT JOIN和FULL OUTER JOIN等不同类型的连接,用于合并来自两个或更多表的数据。 3. **子查询**:嵌套在其他查询中的查询,可以作为表达式的一部分或者在WHERE...

    SQL语句基础教程

    SQL语句基础教程旨在帮助新手和需要复习SQL的资料仓储业界老将,学习SQL基础知识和语法。 SQL指令 -------- SQL指令是SQL语言的基础,用于储存、读取、处理数据库中的资料。常用的SQL指令包括: * SELECT:从...

Global site tag (gtag.js) - Google Analytics