SQL之母网站学习
刷完30关,总结以下注意点:
两个表中出现同样的列名才需要加前缀做区分
select unique_id, name from employees left join employeeuni on employees.id = employeeuni.id
NULL 是一个特殊的值,表示缺少具体的数据或未知的值,它与其他任何值(包括它自身)进行比较都会返回未知的结果。在 SQL 中,我们不能使用标准的相等运算符 = 来判断列是否为 NULL。
- 各语句前后顺序
1 2 3 4 5 6 7 8
SELECT columns FROM table1 WHERE conditions1 LEFT JOIN table2 ON join_condition WHERE conditions2 --分组前过滤 GROUP BY columns HAVING conditions3 --分组后过滤 ORDER BY column_name [ASC|DESC]; --排序语句放在所有查询语句之后,排除开窗函数内包含的order by
INNER JOIN
表顺序交换不影响结果1 2 3
SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id;
CROSS JOIN
表顺序交换不影响结果1 2 3
SELECT * FROM table1 CROSS JOIN table2;
OUTER JOIN
是一种关联查询方式,它根据指定的关联条件,将两个表中满足条件的行组合在一起,并 【包含没有匹配的行】 在OUTER JOIN
中,包括LEFT OUTER JOIN
和RIGHT OUTER JOIN
两种类型,它们分别表示查询左表和右表的所有行(即使没有被匹配),再加上满足条件的交集部分。子查询EXISTS
SELECT name, age, class_id FROM student
WHERE NOT EXISTS (SELECT 1 FROM class WHERE class.id = student.class_id);
或WHERE NOT EXISTS (SELECT class_id FROM class WHERE class.id = student.class_id);
返回常量值1和返回表中的一列没区别,只要子查询返回值,说明存在,
NOT EXISTS
的结果为假 只要子查询没有返回任何结果,NOT EXISTS
的结果都将为真,从而使得外层查询的条件满足。select avg(score) as class_avg_score from student group by class_id
和select avg(score) over (partition by class_id) as class_avg_score from student
什么区别?开窗函数
sum() over (partition by ...)
分组计算后能同时保留原始行的详细信息, 一般聚合函数分组计算完后每组只保留一行、行数减少。开窗函数
rank() /sum() over(partition by...order by .. asc) as order by score asc
是指在partition by class_id
每个班里的分数 递增排序。rank的排名是指在
partition by class_id
每个班里按分数排名,若asc
分小排名高;若desc
分大排名高。Rank
开窗函数对查询结果集中的行进行 排名 的开窗函数。它可以根据指定的列或表达式对结果集中的行进行排序,并为每一行分配一个排名。在排名过程中,相同的值将被赋予相同的排名,而不同的值将被赋予不同的排名。当存在并列(相同排序值)时,
Rank
会跳过后续排名,并保留相同的排名。Row_Number
开窗函数为查询结果集中的每一行 分配唯一连续排名 的开窗函数。相比
Rank
函数,Row_Number
为每一行都分配一个唯一的整数值,不管是否存在并列(相同排序值)的情况。每一行都有一个唯一的行号,从 1 开始连续递增。
Comments powered by Disqus.