大二没好好学呜呜呜
SQL 备忘录
- 基本语句格式
- select
- from
- where
- group by 按照一定规则分组,可以有多个参数
多参数时,若两参数的参照关系完全相同,会归为一类
多参数时,会按照设置的参数项目对结果进行分类
必须与聚合函数(count()\sum()等)搭配使用,否则会报错 - order by 按照一定规则排序
order by colomn [asc|desc]
asc:Ascend 升序 desc:Descend 降序
- 关键字
- distinct 保证结果(根据某一列/多列)严格不相同
- join 连接 见6
- as 为某项数据设置别名,一般在存在复杂子查询时使用
- exists 后接内层子查询,返回结果为Yes或No,若外层查询到的数据在内层中满足条件的出现过,则返回Yes
- limit
- 用在from后:可以设置搜索的偏移量,提升搜索效率,select * from table limit 起始行,向后偏移量(-1则搜索到表结尾)
- 用在where后:限制结果数量,搜索到指定数量的记录后即停止搜索,避免搜索全表 select * from table where colomn=? limit 1
- union 用在两个select整体之间,用来连接搜索结果,要求被连接的两个表拥有严格相似的结构
- in/not in 用于限制条件,可以限制搜索目标in(ans1,ans2,ans3……)
- like && ilike 见7
- having 过滤搜索结果,见8
- 内置函数
- generate_series(start, stop, step),可以用于数字/时间的序列生成,step可以为除了0以外的任何实数
- row_number() over (order by colomn [asc|desc]) 对于某列的数据按照[升序|降序]生成序列,遇到相同数据不会生成重复序号
- rank() over (order by colomn [asc|desc]) 对于某列的数据按照[升序|降序]生成序列,遇到相同数据会生成重复序号,相同的数据只占用一个名次
- dense_rank() over (order by colomn [asc|desc]) 对于某列的数据按照[升序|降序]生成序列,遇到相同数据会生成重复序号,相同的数据占用多个名次
- NTILE(number) over (order by colomn [asc|desc]) 对于某列的数据按照[升序|降序]生成序列,每个数字项出现number次
- 聚合函数
- count
- sum
- 范式
- 1NF 数据是不可再分的
- 解决方法:拆数据项
- 2NF 在1NF的基础上,消除了非主属性对于码的部分函数依赖,即保证通过主键可以唯一确定该项每一列的值
- 解决方法:拆表
- 3NF 在2NF的基础上,消除了传递依赖,一个表中不可以存在任何非主属性可以被另一项非主属性唯一确定
- 解决方法:进一步拆表
- 1NF 数据是不可再分的
- 表达式
- case表达式
- 简单case表达式
1 | case colomn |
* 搜索case表达式
1 | case when condition1 then ans1 |
- 连接
- inner join
- left (outer) join
- right (outer) join
- full outer join
粗浅的理解:
先发生表结构拼接
join | 中文 | 粗浅的理解 | 备注 |
---|---|---|---|
inner join | 内连接 | A交B | |
left (outer) join | 左(外)连接 | A并(A交B) | B表中没有的内容留空 |
right (outer) join | 右(外)连接 | (A交B)并A | A表中没有的内容留空 |
full outer join | 全外连接 | A并(A交B)并B | AB中互相没有的留空,然后补齐在总表下方 |
A join B
on 匹配条件
仅保存符合匹配条件的数据库记录
- 通配符与模糊搜索
like && ilike
- like在搜索时区分大小写
- 但ilike不区分
两个通配符
- _ 占位通配符,该通配符出现的次数严格匹配目标的格式,如_0,则目标字串的第二位一定为0
- % 不占位通配符,该通配符出现的地方不限制字符数字,可以为0-n个字符填充,如%0,此时目标串含有0则会被选中
语句示例:select * from table where colomn like ‘%_00’
like可以用于复制一张表的结构 (不包含数据)
create table table2(like table1)
- having的用法
- 区分having和where:
- where是直接在搜索的时候进行筛选,having是过滤搜索结果
- 执行顺序:where-→聚合函数-→having
- having后面可以使用聚合函数,但where不可以