自学内容网 自学内容网

cmu 15-445学习笔记-2

Intermediate SQL

中级SQL语法

RELATIONAL LANGUAGE

用户使用数据库只关心怎样实现,不关心数据库具体的实现计划

高端的数据库一般都会有一个及其复杂的查询优化器,市面上的数据库是否优秀就是由查询优化器决定的。

SQL HISTORY

…了解一下

RELATIONAL LANGUAGEES

  • Data Manipulation Language(DML):数据操作语言(增删改查)
  • Data Definition Language(DDL):数据定义语言(表定义)
  • Data Control Language(DCL):数据控制语言(权限)

还有其他功能:

  • View definition:使用SQL定义视图
  • integrity & Referential constraints:定义限制
  • Transactions:事务

在说SQL的时候是说的bags(可以重复)而不是sets(不可重复),要知道SQL在查询的时候是可能重复的即可,他不是简单的增删改查

SQL语句

  • aggregations + group by:聚合函数

    • 通过聚合函数将想要的结果输出为一个结果(col:列),聚合函数一列的值有很多个,当使用聚合函数之后变成一个值了,如果只是单单查询聚合函数结果没有问题,如果带别的列就会给你报错(错误应该是聚合函数不包含XXX列),因为聚合函数聚合了就是一列了,但是对应的其他字段有很多个就没法输出(这是使用聚合函数的场见问题),如果需要将两个字段相同的(如相同id)进行一个聚合函数的取值,就需要使用group by.分组。这就是group by的作用,分组之后的数据再进行筛选就是用having

      →AVG(col) → 返回平均值

      →MIN(col) → 返回最小值

      →MAX(col) → 返回最大值

      →SUM(col) → 返回总和

      →COUNT(col) → 返回个数

  • string/date/time operations:字符串、时间、时间戳

    • string operations

      SQL/operationstring case(大小写敏感)string quotes(字段使用什么引号包含)
      SQL-92Sensitive(敏感)Single Only(仅单引号)
      PostgresSensitiveSingle Only
      MySQLInsensitive(不敏感的)Single/Double(单引号或双引号)
      SQLiteSensitiveSingle/Double
      DB2SensitiveSingle Only
      OracleSensitiveSingle Only
      WHERE UPPER(name) = UPPER('KaNyE');SQL-92
      WHERE name = "KaNyE";MySQL
      
      • LIKE模糊查询,%代表一个或者多个字符,_代表一个字符。如果数据库没有搜索引擎的话,需要尽可能少使用左模糊或者全模糊(%尽量不要放在前面/左面)使用右模糊,前面附带的已知字段可能包含索引(最左匹配原则),左模糊会导致索引失效(索引运算也会导致失效),这对数据库来说是难以优化的。

      • SUBSTRING(str, str.start, str.end):字符串切割

      • UPPER(str):字符串大写

      • LOWER(str):字符串小写

        SELECT name FROM student WHERE login = LOWER(name) || '@CS';SQL-92
        SELECT name FROM student WHERE login = LOWER(name) + '@CS';MySQL
        
      • CONACT(LOWER(str), ‘@cs’):字符串拼接

  • output control + redirection:输出控制

    • 输出控制ORDER BY <column*> [ ASC | DESC ]:升序和降序(有索引尽量按照索引的顺序,否则会导致索引失效)

      ORDER BY 1根据第一列排序
      
  • Nested Queries:子查询

    查询嵌套的意思,里面的SQL查询结果作为外面的SQL查询初始数据

    • ALL:子查询东西完全符合外部条件
    • ANY / IN:查询的字段再子查询的结果集的任何一行就可以
    • EXISTS:子查询只要有结果就可以
  • Common Table Expressions:CTE

    • 可以理解为一个临时的视图(在SQL内部定义一个视图,可以进行一些灵活的操作)仅在当前表中有用

      WITH cteName (col1, col2) AS (
      SELECT 1, 2
      )
      SELECT col1 + col2 FROM cteName;
      
    • CTE有一个很神奇的功能是可以递归(但是没必要,可读性差)

  • Window Function:窗口函数(MySQL8.0才支持)

    • FUNC-NAME( … ) OVER( … ):窗口函数函数名 在哪施加函数

      SELECT cid, sid
      ROW_NUMBER() OVER (PARTITION BY cid) 
      FROM enrolled
       ORDER BY cid;
      

      PARTITION BY是切分,通过那一列的数据进行切分

      • 按照cid切开,增加RANK列,然后根据grade进行排序
      SELECT * FROM (
        SELECT *, RANK() OVER (PARTITION BY cid 
                  ORDER BY grade ASC) AS rank
          FROM enrolled) AS ranking
      WHERE ranking.rank = 2
      
conclusion
  • SOL is not a dead language.:数据库和其他语言一样一直在发展
  • You should (almost) always strive to compute your answer as a single SOL statement.:对于用户来说尽可能的将想要实现的需求在一个SQL语句中表达出来(不管使用子查询还是说CTE等)因为这样的话数据库会想办法帮助你优化。(往往实际做业务,很大可能数据库引擎非常的弱,这时候需要使用简单查询然后在业务中拼接这些数据)

原文地址:https://blog.csdn.net/m0_51765675/article/details/142865908

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!