SQL知识点汇总(一)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wstcjf/article/details/78014355

什么是表?

RDBMS 中的数据存储在被称作的数据库对象中。表是相互关联的数据记录的集合,由一系列的行和列组成。

谨记,表是关系型数据库中最常见也是最简单的数据存储形式。下面是一个客户信息表的例子:

    +----+----------+-----+-----------+----------+
    | ID | NAME     | AGE | ADDRESS   | SALARY   |  
    +----+----------+-----+-----------+----------+  
    |  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |  
    |  2 | Khilan   |  25 | Delhi     |  1500.00 |  
    |  3 | kaushik  |  23 | Kota      |  2000.00 |  
    |  4 | Chaitali |  25 | Mumbai    |  6500.00 |  
    |  5 | Hardik   |  27 | Bhopal    |  8500.00 |  
    |  6 | Komal    |  22 | MP        |  4500.00 |  
    |  7 | Muffy    |  24 | Indore    | 10000.00 |  
    +----+----------+-----+-----------+----------+  


什么是字段?

每张表都能够划分成更小的实体——字段。例如,上面的客户信息表中有 ID、NAME、AGE、ADDRESS 和 SALARY 五个字段。

一个字段限定了数据表中的列,被用来维护表中所有记录的特定信息。


什么是记录或者数据行?

记录或者说数据是存在于数据表中的独立条目。例如,上面的客户信息表中有 7 条记录。下面是客户信息表中的一条记录:

    +----+----------+-----+-----------+----------+  
    |  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |  
    +----+----------+-----+-----------+----------+  

记录就是表中水平排列的数据构成的实体。


什么是列?

是表中竖直排列的实体,它包含了表中与某一特定字段相关的所有信息。

例如,上面的客户信息表中有字段为 ADDRESS 的列,存储了客户的地址,其内容如下所示:

    +-----------+  
    | ADDRESS   |  
    +-----------+  
    | Ahmedabad |  
    | Delhi     |  
    | Kota      |  
    | Mumbai    |  
    | Bhopal    |  
    | MP        |  
    | Indore    |  
    +----+------+  


什么是 NULL 值?

NULL 值是表中以空白形式出现的值,表示该记录在此字段处没有设值。

一定要明白 NULL 值同 0 值或者包含空格的字段是不同的。值为 NULL 的字段是在记录创建的时候就被留空的字段。


SQL 约束

约束是表中的数据列必须遵守的规则,用于限制表中数据的类型。约束保证了数据库中数据的精确性和可靠性。

约束可以限制列或者表。列级的约束只限制单一的列,而表级的约束作用于整个表。

以下是 SQL 中常见的约束:

  • NOT NULL 约束:保证列中数据不能有 NULL 值
  • DEFAULT 约束:提供该列数据未指定时所采用的默认值
  • UNIQUE 约束:保证列中的所有数据各不相同
  • 主键:唯一标识数据表中的行/记录
  • 外键:唯一标识其他表中的一条行/记录
  • CHECK 约束:此约束保证列中的所有值满足某一条件
  • 索引:用于在数据库中快速创建或检索数据

NOT NULL 约束

默认情况下,数据表中的字段接受 NULL 值。如果你不想让某个字段接受 NULL 值,那么请为该字段定义此约束,以指明该字段不接受 NULL 值。

NULL 并不是指没有数据,而是指该字段数据未知

示例:

例如,下述 SQL 语句创建了一个新的数据表 CUSTOMERS,并添加了五个字段,其中三个字段——ID、NAME 和 AGE——被指定为 NOT NULL:

    CREATE TABLE CUSTOMERS(
           ID   INT              NOT NULL,
           NAME VARCHAR (20)     NOT NULL,
           AGE  INT              NOT NULL,
           ADDRESS  CHAR (25) ,
           SALARY   DECIMAL (18, 2),       
           PRIMARY KEY (ID)
    );

对于 Oracle 和 MySQL 来说,如果 CUSTOMERS 表已经存在,此时再要给 SALARY 字段添加 NOT NULL 约束的话,SQL 语句应当如下:

    ALTER TABLE CUSTOMERS
       MODIFY SALARY  DECIMAL (18, 2) NOT NULL;

DEFAULT 约束

DEFAULT 约束在 INSERT INTO 语句没有提供的情况下,为指定字段设置默认值。

示例:

例如,下述 SQL 语句创建了一个名为 CUSTOMERS 的新表,并添加了五个字段。这里,SALARY 字段的默认值为 5000。因此,如果 INSERT INTO 没有为该字段提供值的话,该字段就为默认值 5000。

    CREATE TABLE CUSTOMERS(
           ID   INT              NOT NULL,
           NAME VARCHAR (20)     NOT NULL,
           AGE  INT              NOT NULL,
           ADDRESS  CHAR (25) ,
           SALARY   DECIMAL (18, 2) DEFAULT 5000.00,       
           PRIMARY KEY (ID)
    );

如果 CUSTOMERS 表已经存在,此时再要给 SALARY 字段添加 DEFAULT 约束的话,你需要类似下面的语句:

    ALTER TABLE CUSTOMERS
       MODIFY SALARY  DECIMAL (18, 2) DEFAULT 5000.00;


UNIQUE 约束

UNIQUE 约束使得某一字段对任意两条记录来说都不能相同。例如,在 CUSTOMERS 表中,你或许想让任何人的年龄(age)都不相同。

示例:

例如,下述 SQL 语句创建了一个名为 CUSTOMERS 的新表,并添加了五个字段,其中 AGE 字段被设为 UNIQUE,于是任意两条记录的 AGE 都不同:

    CREATE TABLE CUSTOMERS(
           ID   INT              NOT NULL,
           NAME VARCHAR (20)     NOT NULL,
           AGE  INT              NOT NULL UNIQUE,
           ADDRESS  CHAR (25) ,
           SALARY   DECIMAL (18, 2),       
           PRIMARY KEY (ID)
    );


主键

主键是数据表中唯一确定一条记录的字段。主键必须包含唯一值,并且不能为 NULL。

每张数据表只能有一个主键,不过一个主键可以包含一个或者多个字段。如果主键由多个字段组合而成,这些字段就被称作组合键

如果一个字段被定义为了某表的主键,则任意两条记录在该字段处不能相同。

注意:在创建数据表的时候,需要用到这些概念。

创建主键:

如下是将 ID 定义为 CUSTOMERS 表主键的语法:

    CREATE TABLE CUSTOMERS(
           ID   INT              NOT NULL,
           NAME VARCHAR (20)     NOT NULL,
           AGE  INT              NOT NULL,
           ADDRESS  CHAR (25) ,
           SALARY   DECIMAL (18, 2),       
           PRIMARY KEY (ID)
    );

如果 CUSTOMERS 表已经存在了,再要将 ID 定义为主键的话,请使用下面的语句:

    ALTER TABLE CUSTOMER ADD PRIMARY KEY (ID);

注意:如果你要使用 ALTER TABLE 语句来添加主键,那么主键所在的列必须已经被声明为 NOT NULL 了。

要用多个字段来定义主键的话,请使用如下 SQL 语法:

    CREATE TABLE CUSTOMERS(
           ID   INT              NOT NULL,
           NAME VARCHAR (20)     NOT NULL,
           AGE  INT              NOT NULL,
           ADDRESS  CHAR (25) ,
           SALARY   DECIMAL (18, 2),        
           PRIMARY KEY (ID, NAME)
    );

如果 CUSTOMERS 表已经存在,此时再要将 ID 和 NAMES 字段定义为主键的话,请使用如下 SQL 语法:

    ALTER TABLE CUSTOMERS 
       ADD CONSTRAINT PK_CUSTID PRIMARY KEY (ID, NAME);

删除主键

你可以将主键约束从数据表中删除,语法如下:

    ALTER TABLE CUSTOMERS DROP PRIMARY KEY ;


外键

外键用于将两个数据表连接在一起,有时候也被称作“参照键”。

外键为单一字段或者多个字段的组合,并与另外一个数据表的主键相匹配。

两个表之间的关系是:一个表的主键与另一个表的外键相匹配。

示例:

考虑如下两个表的结构:

CUSTOMERS 表:

    CREATE TABLE CUSTOMERS(
           ID   INT              NOT NULL,
           NAME VARCHAR (20)     NOT NULL,
           AGE  INT              NOT NULL,
           ADDRESS  CHAR (25) ,
           SALARY   DECIMAL (18, 2),       
           PRIMARY KEY (ID)
    );

ORDERS 表:

    CREATE TABLE ORDERS (
           ID          INT        NOT NULL,
           DATE        DATETIME, 
           CUSTOMER_ID INT references CUSTOMERS(ID),
           AMOUNT     double,
           PRIMARY KEY (ID)
    );

如果 ORDERS 表已经存在,并且没有设置外键,那么可以使用下面的语法来修改数据表以指定外键。

    ALTER TABLE ORDERS 
       ADD FOREIGN KEY (Customer_ID) REFERENCES CUSTOMERS (ID);

删除外键约束:

要删除外键约束的话,语法如下所示:

    ALTER TABLE ORDERS
       DROP FOREIGN KEY;


CHECK 约束

CHECK 约束使用某一条件来对记录中的值进行检查。如果条件最终为假(false),即约束条件不能得到满足,则该记录不能写入数据表中。

示例:

例如,下述 SQL 语句创建了一个名为 CUSTOMERS 的新表,并为其添加了五个字段。在此,我们为 AGE 字段设置了 CHECK 约束,以拒绝任何年龄低于 18 的顾客:

    CREATE TABLE CUSTOMERS(
           ID   INT              NOT NULL,
           NAME VARCHAR (20)     NOT NULL,
           AGE  INT              NOT NULL CHECK (AGE >= 18),
           ADDRESS  CHAR (25) ,
           SALARY   DECIMAL (18, 2),       
           PRIMARY KEY (ID)
    );

如果 CUSTOMERS 表已经存在,再要为 AGE 字段设置 CHECK 约束的话,就需要像下面这样写 SQL 语句:

    ALTER TABLE CUSTOMERS
       MODIFY AGE INT NOT NULL CHECK (AGE >= 18 );

或者也可以使用下面的语法,该语法还支持对作用于多个字段的约束命名:

    ALTER TABLE CUSTOMERS
       ADD CONSTRAINT myCheckConstraint CHECK(AGE >= 18);

删除 CHECK 约束:

要删除 CHECK 约束的话,请使用下面的 SQL 语句,不过该语句在 MySQL 中不起作用:

    ALTER TABLE CUSTOMERS
       DROP CONSTRAINT myCheckConstraint;


数据库规范化

数据库规范化指的是对数据库中的数据进行有效组织的过程。对数据库进行规范化主要有两个目的:

  • 消除冗余数据,例如相同数据出现在不同的表中。
  • 保证数据依赖性合理。

这两个目标都值得我们努力,因为它们可以减少数据的空间占用,并确保了数据的逻辑完备。规范化包含一系列的指导方针,以帮助你创建出优良的数据库结构。

规范化指导方针分为几种范式(form),你可以把范式想做是数据库的格式或者其结构的布局方式。使用范式的目标是对数据库结构进行整理,从而使其遵循第一范式,接着是第二范式,最终遵循第三范式。

要不要更进一步到达第四范式、第五范式甚至更高的范式取决于你。一般来说,第三范式足矣。

第一范式(1NF)

第一范式设定了对数据库进行组织的最基本的规范:

  • 定义需要的数据项,因为这些项将会成为数据表中的字段。将相关的数据项放在一个表中。
  • 保证不存在重复的数据。第一范式要求字段的数据具有原子性: 不可再分!
  • 保证有一个主键。


第二范式(2NF)

第二范式规定,数据表必须符合第一范式,并且所有字段与主键之间不存在部分依赖关系。


第三范式(3NF)

一个数据表符合第三范式,当其满足:

  • 符合第二范式;
  • 所有的非主键字段都依赖于主键;

移除传递相关性可以起到事半功倍的效果。首先是数据冗余度降低了,数据库体积因此缩小。第二个好处是保证数据完整性。当重复数据改变的时候,很有可能只更新部分数据,尤其是当其分布在数据库的各个地方的情况下。例如,如果地址和邮政编码分别存储在三个或者四个不同的数据表中,那么任何对邮编的改变,都需要对这三个或者四个表同时进行更改。


SQL 连接类型

SQL 中有多种不同的连接:

内连接: inner join, 从左表中取出每一条记录,去右表中与所有的记录进行匹配:匹配必须是某个条件表中与右表中相同最终才会保留结果,否则不保留.


外连接: outer join,以某张表为主,取出里面的所有记录, 然后每条与另外一张表进行连接:不管能不能匹配上条件,最终都会保留: 能比配,正确保留; 不能匹配,其他表的字段都置空NULL.

外连接分为两种: 是以某张表为主: 有主表

Left join: 左外连接(左连接), 以左表为主表

Right join: 右外连接(右连接), 以右表为主表

虽然左连接和右连接有主表差异, 但是显示的结果: 左表的数据在左边,右表数据在右边.左连接和右连接可以互转.


全连接:全连接将左连接和右连接的结果组合在一起。


自然连接: natural join, 自然连接,就是自动匹配连接条件: 系统以字段名字作为匹配模式(同名字段就作为条件,多个同名字段都作为条件).

  • 笛卡尔连接(CARTESIAN JOIN):返回两个或者更多的表中记录集的笛卡尔积。

内连接

最常用也最重要的连接形式是内连接,有时候也被称作“EQUIJOIN”(等值连接)。

内连接根据连接谓词来组合两个表中的字段,以创建一个新的结果表。SQL 查询会比较逐个比较表 1 和表 2 中的每一条记录,来寻找满足连接谓词的所有记录对。当连接谓词得以满足时,所有满足条件的记录对的字段将会结合在一起构成结果表。

语法:

内连接的基本语法如下所示:

SELECT table1.column1, table2.column2...
FROM table1
INNER JOIN table2
ON table1.common_field = table2.common_field;

示例:

考虑如下两个表格,(a)CUSTOMERS 表:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

(b)ORDERS 表:

+-----+---------------------+-------------+--------+
| OID | DATE                |          ID | AMOUNT |
+-----+---------------------+-------------+--------+
| 102 | 2009-10-08 00:00:00 |           3 |   3000 |
| 100 | 2009-10-08 00:00:00 |           3 |   1500 |
| 101 | 2009-11-20 00:00:00 |           2 |   1560 |
| 103 | 2008-05-20 00:00:00 |           4 |   2060 |
+-----+---------------------+-------------+--------+

现在,让我们用内连接将这两个表连接在一起:

SQL> SELECT  ID, NAME, AMOUNT, DATE
     FROM CUSTOMERS
     INNER JOIN ORDERS
     ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;

上述语句将会产生如下结果:

+----+----------+--------+---------------------+
| ID | NAME     | AMOUNT | DATE                |
+----+----------+--------+---------------------+
|  3 | kaushik  |   3000 | 2009-10-08 00:00:00 |
|  3 | kaushik  |   1500 | 2009-10-08 00:00:00 |
|  2 | Khilan   |   1560 | 2009-11-20 00:00:00 |
|  4 | Chaitali |   2060 | 2008-05-20 00:00:00 |
+----+----------+--------+---------------------+

左连接

左链接返回左表中的所有记录,即是右表中没有任何满足匹配条件的记录。这意味着,如果 ON 子句在右表中匹配到了 0 条记录,该连接仍然会返回至少一条记录,不过返回的记录中所有来自右表的字段都为 NULL。

这就意味着,左连接会返回左表中的所有记录,加上右表中匹配到的记录,或者是 NULL (如果连接谓词无法匹配到任何记录的话)。

语法:

左连接的基本语法如下所示:

SELECT table1.column1, table2.column2...
FROM table1
LEFT JOIN table2
ON table1.common_field = table2.common_field;

这里,给出的条件可以是任何根据你的需要写出的条件。

示例:

考虑如下两个表格,(a)CUSTOMERS 表:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

(b)ORDERS 表:

+-----+---------------------+-------------+--------+
| OID | DATE                |          ID | AMOUNT |
+-----+---------------------+-------------+--------+
| 102 | 2009-10-08 00:00:00 |           3 |   3000 |
| 100 | 2009-10-08 00:00:00 |           3 |   1500 |
| 101 | 2009-11-20 00:00:00 |           2 |   1560 |
| 103 | 2008-05-20 00:00:00 |           4 |   2060 |
+-----+---------------------+-------------+--------+

现在,让我们用左连接将这两个表连接在一起:

SQL> SELECT  ID, NAME, AMOUNT, DATE
     FROM CUSTOMERS
     LEFT JOIN ORDERS
     ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;

上述语句将会产生如下结果:

+----+----------+--------+---------------------+
| ID | NAME     | AMOUNT | DATE                |
+----+----------+--------+---------------------+
|  1 | Ramesh   |   NULL | NULL                |
|  2 | Khilan   |   1560 | 2009-11-20 00:00:00 |
|  3 | kaushik  |   3000 | 2009-10-08 00:00:00 |
|  3 | kaushik  |   1500 | 2009-10-08 00:00:00 |
|  4 | Chaitali |   2060 | 2008-05-20 00:00:00 |
|  5 | Hardik   |   NULL | NULL                |
|  6 | Komal    |   NULL | NULL                |
|  7 | Muffy    |   NULL | NULL                |
+----+----------+--------+---------------------+

右连接

右链接返回左表中的所有记录,即是左表中没有任何满足匹配条件的记录。这意味着,如果 ON 子句在左表中匹配到了 0 条记录,该连接仍然会返回至少一条记录,不过返回的记录中所有来自左表的字段都为 NULL。

这就意味着,右连接会返回右表中的所有记录,加上左表中匹配到的记录,或者是 NULL (如果连接谓词无法匹配到任何记录的话)。

语法:

右连接的基本语法如下所示:

SELECT table1.column1, table2.column2...
FROM table1
RIGHT JOIN table2
ON table1.common_field = table2.common_field;

这里,给出的条件可以是任何根据你的需要写出的条件。

示例:

考虑如下两个表格,(a)CUSTOMERS 表:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

(b)ORDERS 表:

+-----+---------------------+-------------+--------+
| OID | DATE                |          ID | AMOUNT |
+-----+---------------------+-------------+--------+
| 102 | 2009-10-08 00:00:00 |           3 |   3000 |
| 100 | 2009-10-08 00:00:00 |           3 |   1500 |
| 101 | 2009-11-20 00:00:00 |           2 |   1560 |
| 103 | 2008-05-20 00:00:00 |           4 |   2060 |
+-----+---------------------+-------------+--------+

现在,让我们用右连接将这两个表连接在一起:

SQL> SELECT  ID, NAME, AMOUNT, DATE
     FROM CUSTOMERS
     RIGHT JOIN ORDERS
     ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;

上述语句将会产生如下结果:

+------+----------+--------+---------------------+
| ID   | NAME     | AMOUNT | DATE                |
+------+----------+--------+---------------------+
|    3 | kaushik  |   3000 | 2009-10-08 00:00:00 |
|    3 | kaushik  |   1500 | 2009-10-08 00:00:00 |
|    2 | Khilan   |   1560 | 2009-11-20 00:00:00 |
|    4 | Chaitali |   2060 | 2008-05-20 00:00:00 |
+------+----------+--------+---------------------+

全连接

全连接将左连接和右连接的结果组合在一起。

语法:

全连接的基本语法如下所受:

SELECT table1.column1, table2.column2...
FROM table1
FULL JOIN table2
ON table1.common_field = table2.common_field;

这里,给出的条件可以是任何根据你的需要写出的条件。

示例:

考虑如下两个表格,(a)CUSTOMERS 表:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

(b)ORDERS 表:

+-----+---------------------+-------------+--------+
| OID | DATE                |          ID | AMOUNT |
+-----+---------------------+-------------+--------+
| 102 | 2009-10-08 00:00:00 |           3 |   3000 |
| 100 | 2009-10-08 00:00:00 |           3 |   1500 |
| 101 | 2009-11-20 00:00:00 |           2 |   1560 |
| 103 | 2008-05-20 00:00:00 |           4 |   2060 |
+-----+---------------------+-------------+--------+

现在让我们用全连接将两个表连接在一起:

SQL> SELECT  ID, NAME, AMOUNT, DATE
     FROM CUSTOMERS
     FULL JOIN ORDERS
     ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;

上述语句将会产生如下结果:

+------+----------+--------+---------------------+
| ID   | NAME     | AMOUNT | DATE                |
+------+----------+--------+---------------------+
|    1 | Ramesh   |   NULL | NULL                |
|    2 | Khilan   |   1560 | 2009-11-20 00:00:00 |
|    3 | kaushik  |   3000 | 2009-10-08 00:00:00 |
|    3 | kaushik  |   1500 | 2009-10-08 00:00:00 |
|    4 | Chaitali |   2060 | 2008-05-20 00:00:00 |
|    5 | Hardik   |   NULL | NULL                |
|    6 | Komal    |   NULL | NULL                |
|    7 | Muffy    |   NULL | NULL                |
|    3 | kaushik  |   3000 | 2009-10-08 00:00:00 |
|    3 | kaushik  |   1500 | 2009-10-08 00:00:00 |
|    2 | Khilan   |   1560 | 2009-11-20 00:00:00 |
|    4 | Chaitali |   2060 | 2008-05-20 00:00:00 |
+------+----------+--------+---------------------+

如果你所用的数据库不支持全连接,比如 MySQL,那么你可以使用 UNION ALL子句来将左连接和右连接结果组合在一起:

SQL> SELECT  ID, NAME, AMOUNT, DATE
     FROM CUSTOMERS
     LEFT JOIN ORDERS
     ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID
UNION ALL
     SELECT  ID, NAME, AMOUNT, DATE
     FROM CUSTOMERS
     RIGHT JOIN ORDERS
     ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID

笛卡尔连接(交叉连接)

笛卡尔连接或者交叉连接返回两个或者更多的连接表中记录的笛卡尔乘积。也就是说,它相当于连接谓词总是为真或者缺少连接谓词的内连接。

语法:

笛卡尔连接或者说交叉连接的基本语法如下所示:

SELECT table1.column1, table2.column2...
FROM  table1, table2 [, table3 ]

示例:

考虑如下两个表格,(a)CUSTOMERS 表:

    +----+----------+-----+-----------+----------+
    | ID | NAME     | AGE | ADDRESS   | SALARY   |
    +----+----------+-----+-----------+----------+
    |  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
    |  2 | Khilan   |  25 | Delhi     |  1500.00 |
    |  3 | kaushik  |  23 | Kota      |  2000.00 |
    |  4 | Chaitali |  25 | Mumbai    |  6500.00 |
    |  5 | Hardik   |  27 | Bhopal    |  8500.00 |
    |  6 | Komal    |  22 | MP        |  4500.00 |
    |  7 | Muffy    |  24 | Indore    | 10000.00 |
    +----+----------+-----+-----------+----------+

(b)ORDERS 表:

    +-----+---------------------+-------------+--------+
    | OID | DATE                |          ID | AMOUNT |
    +-----+---------------------+-------------+--------+
    | 102 | 2009-10-08 00:00:00 |           3 |   3000 |
    | 100 | 2009-10-08 00:00:00 |           3 |   1500 |
    | 101 | 2009-11-20 00:00:00 |           2 |   1560 |
    | 103 | 2008-05-20 00:00:00 |           4 |   2060 |
    +-----+---------------------+-------------+--------+

现在,让我用内连接将这两个表连接在一起:

SQL> SELECT  ID, NAME, AMOUNT, DATE
     FROM CUSTOMERS, ORDERS;

上述语句将会产生如下结果:

+----+----------+--------+---------------------+
| ID | NAME     | AMOUNT | DATE                |
+----+----------+--------+---------------------+
|  1 | Ramesh   |   3000 | 2009-10-08 00:00:00 |
|  1 | Ramesh   |   1500 | 2009-10-08 00:00:00 |
|  1 | Ramesh   |   1560 | 2009-11-20 00:00:00 |
|  1 | Ramesh   |   2060 | 2008-05-20 00:00:00 |
|  2 | Khilan   |   3000 | 2009-10-08 00:00:00 |
|  2 | Khilan   |   1500 | 2009-10-08 00:00:00 |
|  2 | Khilan   |   1560 | 2009-11-20 00:00:00 |
|  2 | Khilan   |   2060 | 2008-05-20 00:00:00 |
|  3 | kaushik  |   3000 | 2009-10-08 00:00:00 |
|  3 | kaushik  |   1500 | 2009-10-08 00:00:00 |
|  3 | kaushik  |   1560 | 2009-11-20 00:00:00 |
|  3 | kaushik  |   2060 | 2008-05-20 00:00:00 |
|  4 | Chaitali |   3000 | 2009-10-08 00:00:00 |
|  4 | Chaitali |   1500 | 2009-10-08 00:00:00 |
|  4 | Chaitali |   1560 | 2009-11-20 00:00:00 |
|  4 | Chaitali |   2060 | 2008-05-20 00:00:00 |
|  5 | Hardik   |   3000 | 2009-10-08 00:00:00 |
|  5 | Hardik   |   1500 | 2009-10-08 00:00:00 |
|  5 | Hardik   |   1560 | 2009-11-20 00:00:00 |
|  5 | Hardik   |   2060 | 2008-05-20 00:00:00 |
|  6 | Komal    |   3000 | 2009-10-08 00:00:00 |
|  6 | Komal    |   1500 | 2009-10-08 00:00:00 |
|  6 | Komal    |   1560 | 2009-11-20 00:00:00 |
|  6 | Komal    |   2060 | 2008-05-20 00:00:00 |
|  7 | Muffy    |   3000 | 2009-10-08 00:00:00 |
|  7 | Muffy    |   1500 | 2009-10-08 00:00:00 |
|  7 | Muffy    |   1560 | 2009-11-20 00:00:00 |
|  7 | Muffy    |   2060 | 2008-05-20 00:00:00 |
+----+----------+--------+---------------------+


猜你喜欢

转载自blog.csdn.net/wstcjf/article/details/78014355