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/operation string case(大小写敏感) string quotes(字段使用什么引号包含) SQL-92 Sensitive(敏感) Single Only(仅单引号) Postgres Sensitive Single Only MySQL Insensitive(不敏感的) Single/Double(单引号或双引号) SQLite Sensitive Single/Double DB2 Sensitive Single Only Oracle Sensitive Single 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)!