SQL:查
简单总结
Linux 命令——选项——文件
SQL 语句——子句——表
数据结构:
行结构: 平行结构的各个成员
表:结构体实例的集合(这个不确切:列的高效访问)
联结表:虚拟表:建立表间关系,结构体保存指针成员?
游标:限制权限的随机访问(指针?const?)
增删改查:
查询操作:降维,映射,聚集/过滤(嵌套过滤,联结过滤)。结果为一维集合:用于成员判定;表
修改操作:语法上表现为SELECT外添加前缀(与新选项),或缺省SELECT(更具体的语义)
抽象:
结果抽象:保存查询结果(视图?),别名
过程抽象:查询(视图?);修改(存储过程);打包保证原子性(事务处理)
第四维度:时间
事务处理&回滚
三种过滤方法:
1.where+逻辑表达式
2.union+select
3.嵌套
扩充:正则,相近音
联结表:虚拟表:建立表间关系
内联:主键为公共key
自联
外联:允许缺省
其他语言特征:复制引用,复制值
生成器?
表操作迟绑定
表数据结构:结构体
如何保证原子操作的高效性?存储所用的数据结构(B+-)
哪些操作影响效率?
如何识别效率效益的边缘?
预计算:加载缓存
计算间独立(条件判断独立)?并发
查询相关语句如下:
SELECT
select 列名 from 表
结果无序
排序保证稳定性?增加行号为关键字,作为第二排序key
select:选列的子集,降维
from:表:实例集合(列维度全集x实例个数)
select目标:
1.指定考察维度,打包一部分列——新的结构体
2.得到新表,改列名:别名,对列完成值到值映射:计算字段
3.得到一个集合(是否可以是笛卡尔积?),通过过滤,取原定义域的子集
检索
SELECT* 通配符表示所有列(原结构体保持不变)
是否存在其他取子集操作:
1.*作为列名的通配符,其他通配符?以列名为匹配对象?
2.是否存在列名索引切片?
明确需求,不列出所有列
1.减少中间结果的存储空间需求
2.语义准确
DISTINCT:指定一列,对该列各个行结果去重
:多列——笛卡尔积非重
结果切片:取头/尾k个,指定起始位置与偏移(区间)
其他切片方式?python切片
--注释:用于测试一部分
子句:不可单独使用
排序
选列的方式:key,index
默认顺序:无序:底层存储顺序
过滤
SELECT
WHERE condition 过滤/搜索
指定各个列的条件,
效果:1.每列的原定义域缩减为子界
2.减少行数(实例过滤)
条件判断:NULL比较,其他比较
WHERE 用逻辑运算符组合过滤条件
计算顺序:
0.子句?
1.运算符优先级(语法默认),括号提升优先级(显式指定)
2.结合律
3.运算对象的求值顺序(应该无副作用:select只用于查询,不做修改)
存疑:
1.是否为短路操作?
2.编译时是否将嵌套的过滤条件展开进行优化?
IN
与给定域比较:
连续:区间?
离散:集合
可嵌套select
快于连续OR
OR线性(短路?)搜索:多次映射(判断)——检查匹配
IN:并查集?:成员关系
NOT 语法:整体取反
+IN BETWEEN EXISTS
存疑:语法结构一致性:条件前?WHERE后?
Like 通配符(字符串)
谓词?操作符?
通配个数
1
0-1
0-
1-
[^ ]
^取补,取反
其他正则?
空格被认为是有效字符
类型转换&重新格式化
字符串——去格式化——对象——操作——格式化
AS 别名
计算字段:映射(一对一)
允许表达式?
计算字段所用函数
字符串提取
类型转换
日期(成分转换)
缺点:不可移植,性能
底层实现?
文本函数:前缀,长度
大小写,空格
soundex:(聚类?距离判定?)
数值函数:math
聚集函数:列(组?)——数映射
汇总(只限一维?)
统计量:行数,和,max,min,Average
优化?预计算——更新,按需计算
其他map-reduce?(划分可指定粒度,可并行计算,随机,规整要求?)
分组数据
行聚类
相同聚类
映射后聚类(过滤条件完成映射)
子选项间独立
GROUP BY
HAVING
按列:集合——划分——子集
select表达式——group by表达式一致
不允许用别名?
where过滤行,having过滤分组
分组前过滤,分组后过滤:实现中是否保持这一顺序?
实现:独立?并行?
SELECT子句顺序
select降维度,映射,别名
from维度超集x实例个数
where根据属性筛选实例
group by分组,聚集值/not
having
order by
子查询 IN (select:单列)
完全限定列名:表.列,去歧义
从语言特性
关系表:信息分解到多个表,一类数据一个表,各表之间用共同值(主键)关联
保证信息不冗余,减小修改量
可伸缩性:适应于不断增加的工作量
联结:一条select语句中关联表,列来自于多个表
对表的修改:需保证不破坏联结关系
select
from 表1,2
where 表1key=表2key(完全限定名,避免歧义)保证配对
on——where?
完全限定名,避免歧义(如果不发生歧义是否可以省略?限定语义更明确)
以上内联结
联结表取代嵌套查询
联结多个表:两两联结
表别名:减少重复
SQL是否识别公共子表达式?
其他别名:select列表,order by子句
内联结:等值联结 INNER JOIN
自联结 自然联结 ,外联结
自联结:使用多个别名 AS A AS B,将表与自身联结
替代子查询:效率
自然联结
去重复列
表一列:通配符(加限定名);表二列:列出
外联结:包含没有关联的行 OUT JOIN ON
ON WHERE
带聚集函数的联结
组合查询:多条Select
如何保证行一致性
Union
相同列集合,重复过滤。自动删除重复行(加关键字ALL——不删)
或相同表达式(使用别名?),聚集值
必须相同?为何不直接省略?不同的场景?
过滤子集而非全集
Union作为分隔
order by
最后一条select后