• 对SQL语言的相关学习


    SQL语句的分类

      SQL的中文名称为结构化查询语言(Structured Query Language,SQL),它是关系数据库的标准语言。其功能不仅仅是查询,而是集数据查询、数据操纵、数据定义、数据控制功能于一体。

      所以,SQL语句可以分为如下四大类:

        数据查询语言(Data Query Language,DQL);

        数据操纵语言(Data Manipulation Language,DML);

        数据定义语言(Data Definition Language,DDL);

        数据控制语言(Data Control Language,DCL);

      在SQL标准中,DQL包括select动词,用于检索数据;DML包括insert、update和delete动词,用于数据的操纵,改变数据库中的数据,例如增加或删除一些数据等;DDL包括动词create、drop和alter,用于定义模式、表、视图和索引;DCL包括动词grant和revoke,用于授予或回收用户的权限。

      在MySQL中,没有DQL,它将select也归为DML,所以DML包括select、insert、update和delete,此外还有call(调用存储过程)、load(导入数据)、replace(替代)等动词;DDL除了create、drop和alter外还有truncate(删除表数据)和rename(重命名表)。

    子查询的分类

    1、带有IN或NOT IN谓词的子查询

      这类查询是最常见的子查询,此时子查询的返回值可以是同列的一个或者多个值。

    2、带有比较运算符的子查询

      这类子查询是指父查询与子查询之间用比较运算符进行连接,因此子查询的返回值应当为单个值。常用到的比较运算符有<、>、=、>=、<=、!=或<>等

    3、带有ANY或ALL谓词的子查询

      当子查询的返回值为多个时,父查询与子查询之间用ANY或ALL谓词进行连接,使用ANY或ALL谓词时则必须同时使用比较运算符。语义如下:

        >ANY   大于子查询结果中的某个值(即大于最小的值)

        >ALL   大于子查询结果中的所有值(即大于最大的值)

        <ANY   小于子查询结果中的某个值(即小于最大的值)

        <ALL   小于子查询结果中的所有值(即小于最小的值)

        =ANY   等于子查询结果中的某个值

        =ALL   等于子查询结果中的所有值

        !=ANY  不等于子查询结果中的某个值

        !=ALL  不等于子查询结果中的任何一个值

    4、带有exists或not exists谓词的子查询

      带有exists谓词的子查询不返回任何数据,只产生逻辑真值或逻辑假值。带有exists或not exists谓词的子查询都是相关子查询。

      含有exists谓词的语句执行时,对外表采用遍历方式逐条查询,每次查询都会比较exists的条件语句(即子查询中的where条件),当exists里的条件语句成立时,则返回外表中的这条记录,反之当条件语句不成立时,则不返回外表中的这条记录。对not exists来说,与exists相反,当子查询中的条件语句不成立时则返回外表中这条记录。

    5、基于派生表的子查询

      子查询出现在查询语句的from子句中,这时子查询生成的临时派生表成为主查询的查询对象。

    注:

      1、SQL语言允许多层嵌套查询,即一个子查询中还可以嵌套其他子查询;

      2、子查询中不能使用order by子句,因为order by子句只能对最终的结果进行排序;

      3、从另一个角度来说,子查询可以分为相关子查询和非相关子查询。如果子查询中的查询条件不依赖与父查询,这类子查询为不相关子查询;如果子查询中的查询条件依赖于父查询,这类子查询为相关子查询。

    JOIN的分类

    1、内连接(inner join)

      ·等值连接与非等值连接:

        当连接条件中连接运算符为“=”时,称为等值连接,使用其他运算符的称为非等值连接。

      ·自然连接(natural join):

        是一种特殊的等值连接,它要求两个表中进行连接操作的字段必须是同名的,并且在结果中把重复的属性列去掉。

    2、外连接(outer join)

      当两个表连接时,将悬浮元组也保存在结果集中,而在其他字段上填NULL值,这种连接方式称为外连接。分为左外连接和右外连接:

        左外连接(left join),保存left join左边表的悬浮元组;

        右外连接(right join),保存right join右边的表的悬浮元组;

    Where和having的区别

      Where子句与having短语的区别在于作用对象不同。Where子句作用于基本表或视图,having短语作用于组。所以where子句中是不能用聚集函数作为条件表达式的。

      在MySQL数据库中,having短语也可以作用于表和视图。如下所示:

     

     

    但是在习惯上,还是让having作用于组,即和group by搭配使用。

    DISTINCT和GROUP BY的区别

    DISTINCT是对查询语句的最终结果集去掉重复的数据行;而GROUP BY是对指定的列进行分组,一般会在查询语句的select后面用到聚合函数。

    DISTINCT只能进行去重,GROUP BY更侧重于对数据分组后再聚合,但也可以实现去重。例如我们想知道有哪些学生选了课,通过DISTINCT和GROUP BY都可以实现(表sc上没有索引):

     

    仔细观察后两条SQL输出的结果,发现数据的排序是不一样的。有DISTINCT的SQL在执行时,直接取出sc表的sid列放到内存中,然后去掉重复值;而带有GROUP BY的SQL执行时,对sid进行了排序分组,故输出的结果是有序的。

  • 相关阅读:
    Convert MSTest to Nunit
    ASP.NET MVC RenderPartial to String
    RailsCasts批量下载地址之Ruby代码
    合并CSS和JavaScript(转载)
    删除Windows Service
    WCF和IIS宿主的ASP.NET 共享会话
    远程桌面常用快捷键
    ColdFusion 9 Installation on IIS7
    Ruby正则表达式实践非贪婪量词
    发布时和调试时使用不同的JS
  • 原文地址:https://www.cnblogs.com/jiang-jt/p/7654810.html
Copyright © 2020-2023  润新知