多表连接查询与子查询

时间:2022-09-02 15:07:10

多表连接查询和子查询

一、连接查询

1.1使用无连接规则连接两表

所谓无连接规则连接,就是指两个表的SELECT语句中不设置任何连接条件,这样的到的链接结果是第一个表的每一行都会和第二个表的所有行进行连接,即得到一个笛卡尔积。

SELECT *

FROM STU_INFO,SCORE

多表连接查询与子查询

      1.2 使用有连接规则连接两表

           有连接规则连接,其实就是在无连接规则上,加上WHERE子句指定连接规则的连接方法。

        SELECT *

        FROM STU_INFO,SCORE

        WHERE STU_INFO.SNO=SCORE.SNO

        多表连接查询与子查询

       1.3 使用多表连接查询数据

            SELECTSTU_INFO.SNO,STU_INFO.SNAME,STU_INFO.DEPART,SCORE.ENGLISH,TEACHER.TNAME

FROM STU_INFO,SCORE,TEACHER

WHERE STU_INFO.SNO=SCORE.SNO

              AND  STU_INFO.SNAME='张三'

多表连接查询与子查询

1.4 使用INNER JOIN 连接查询

在WHERE子句中设置连接规则,有时会是整个条件表达式变得非常臃肿,而且不容易让人理解。因此ANSI SQL规范中建议使用INNER JOIN进行多表连接。这样一来WHERE 子句中就不在放置连接规则了,而只放置查询条件就可以了。

INNER JOIN 的语法格式如下:

SELECT *

FROM 表名1

INNER JOIN 表名2

ON 连接规则1

INNER JOIN 表名3

ON 连接规则 2

……

INNER JOIN 表名n

ON 连接规则 n

例子:

SELECT ST.SNO,ST.SNAME,S.ENGLISH

FROM  STU_INFO AS ST

      INNER JOIN SCORE AS S

      ON  ST.SNO=S.SNO

WHERE ST.SNAME='张三'

多表连接查询与子查询

二、高级连接查询

2.1自连接查询

在多表连接查询中,比较有意思的查询是自连接查询,即表自身与自身连接。

例子:

SELECT DEPART

FROM STU_INFO

WHERE SNAME=’张三’

多表连接查询与子查询

2.2内连接查询

   前面介绍过的有连接规则的连接都属于内连接。内连接包括等值连接、自然连接和不等值连接三种。内连接最大的特点是只返回两个表中相会匹配的记录。而那些不能匹配的记录就被自动去除了。所以使用内连接时,应考虑到查询结果中可能丢掉了某些数据的问题。

1.等值连接

使用‘=’连接,如:STU_INFO.SNO=SCORE.SNO

2.自然连接

在等值连接的基础上稍加改动即可得到自然连接,等值连接将两个表中所有字段全部显示,而自然连接则不将相同的字段显示两次,即在SELECT 子句中列出需要显示的字段列表

3.不等值连接

不等值连接的连接规则由等于号以外的运算符组成,例如:

>、>=、<、<=、<>等。

2.3左外连接查询

   左外连接运算符(LEFT OUTER JOIN)

   左外连接将左侧表的所有记录都包含进来,而只将右边匹配的记录包含进来。

例子:

SELECT *

FROM STU_INFO

 LEFT OUTER JOIN SCORE

ON STU_INFO.SNO=SCORE.SNO

多表连接查询与子查询

2.4右外连接

右外连接运算符(RIGHT OUTER JOIN)

   右外连接将右侧表的所有记录都包含进来,而只将左边匹配的记录包含进来。

例子:

SELECT *

FROM STU_INFO

RIGHT OUTER JOIN SCORE

ON STU_INFO.SNO=SCORE.SNO

多表连接查询与子查询

2.5全外连接

这种连接规则是将两个表的所有记录都包含到结果集中。

运算符(FULL OUTER JOIN)

SELECT *

FROM STU_INFO

FULL OUTER JOIN SCORE

ON STU_INFO.SNO=SCORE.SNO

2.6交叉连接查询

交叉连接其实就是前面介绍的无连接规则连接,实际上这种连接规则有两种表示方法。

1.用逗号隔开表名

SELECT *

FROM STU_INFO,SCORE

2.用CROSS JOIN 关键字连接表名

SELECT *

FROM STU_INFO CROSS JOIN SCORE

2.7连接查询中使用聚合函数

例如:

SELECT COUNT(*) AS 没有考试总人数

FROM STU_INFO

 LEFT OUTER JOIN SCORE

ON STU_INFO.SNO=SCORE.SNO

WHERE SCORE.SNO IS NULL

多表连接查询与子查询

三、组合查询

除连接查询外,SQL中还有一种组合查询,这种查询使用UNION关键字将多个SELECT语句组合起来,将多个SELECT语句的查询结果显示到一个结果集中。组合查询与连接查询不同的是,前者将多个表的查询结果,竖着组合,而后者是将查询结果和这连接。

3.1使用组合查询

有时,需要将多个查询结果放到一起,以一个查询结果及的形式显示出来。这时候就可以实用组合查询,组合查询是使用UNION关键字将多个SELECT

查询语句结合起来查询的一种查询方法。

语法格式:

SELECT 语句1

UNION

SELECT 语句2

UNION

SELECT 语句3

……

UNION

SELECT 语句n

例子:

SELECT *

FROM STU_INFO

WHERE DEPART=’外语系’

UNION

SELECT *

FROM STU_INFO

WHERE YEAR>21

多表连接查询与子查询

3.2使用UNION的规则

1.每个查询语句应该有相同数量的字段

   在使用UNION查询语句时,一定要注意每个单独的SELECT查询子句内的字段个数一定要相同,如果不同则会出错。

3.每个查询语句中相应的字段的类型必须相互兼容

在每个查询语句字段个数相同的情况下,相应的字段的类型应当相互兼容,否则会出错。

3.3使用UNION得到复杂的统计总样式

到目前为止,UNION好像是多余的,因为他可能被OR代替,其实不然。联合UNION、GROUP BY和聚合函数三者会得到具有很棒的统计汇总样式的查询结果,这就是OR所不能替代的一个例子。

例子:

SELECT ENGLISH

FROM SCORE

UNION

SELECT SUM(ENGLISH)

多表连接查询与子查询

四、子查询

嵌入到另一个SELECT语句中的SELECT语句被称为子查询。

4.1使用返回单值的子查询

如果子查询返回单值,则可以使用关系运算符,例如,等于(=)、

不等于(<>)等,将其与主查询结合起来。

实例:

SELECT *

FROM STU_INFO

WHERE SNO=(SELECT SNO

          FROM SCORE

          WHERE ENGLISH=78)

多表连接查询与子查询

4.2子查询与聚合函数的配合使用

例子:

SELECT *

FROM STU_INFO

WHERE YEAR=(SELECT MIN(YEAR)

            FROM STU_INFO)

多表连接查询与子查询