会使不如乐知,乐知不如好问

很多人应该都熟用基本的SQL语句了吧,比如insert、update、delete、select等等。但是在前一段时间的学习中,让我对SQL语句有了新的理解,包括在学习一些其他相数据库技术都有帮助。

关系型数据库

在关系型数据库中,一切皆关系。正如java一切皆对象一样。关系就是关系型数据库的基本单元。
最能体现这种关系的东西就是----。表有行关系、列关系、主键等等。包括视图,虽然不是表,但是在体现上依旧是表关系,只是没有存储在实际的磁盘中。

实例理解
  • select

比如select * from test_table;,其实返回的查询结果就是一张表----虚拟表,没有磁盘中实际的存储。所以,可以对返回的虚拟表再进行操作,比如子查询,就是对虚拟表再进行了查询操作,最后再返回一张虚拟表。

SELECT
    *
FROM
    (
        SELECT
            test_column1,
            test_column2,
            test_column3
        FROM
            test_table
    );
  • insert

最常用的操作应该有两种:

INSERT INTO test_table VALUES('test_column1','test_column2','test_column3');
--或者
INSERT INTO test_table
VALUES
    ('11', '22', '33'),
    ('44', '55', '66'),
    ('77', '88', '99');

在此之前,一直以为insert一直是按行插入,一行一行的向表插数据。其实是错误的,VALUES会返回一张虚拟表,例如第一个insert语句返回一张只有一行数据的三列表,而第二个insert是有三行数据的三列表。所以INSERTSELECT可以结合使用。
INSERT INTO test_table_two SELECT test_column1,test_column2,test_column3,... FROM test_table;

深层理解

通过select和insert,可以理解DELETEUPDATEJOINUNION等等,其实都是对表操作或者返回一个表。
甚至在有些关系型数据库中使用函数返回的也是一个表,比如PostgreSQL数据库,可以试一下执行以下SQL语句
SELECT * FROM right('sql',2);