标准SQL与数据库技术
2012年10月28日


SQL是Structured Query Language简写

Data Definition Language(DDL数据定义语言) (create、alter、drop)
Data Manipulation Language(DML数据操作语言) (select、insert等)
Data Control Language(DCL数据控制语言) (commit、rollback、savepoint)
Transaction Language(TL数据事务语言) (grant、revoke)


关系模式的范式
    主要有4种范式,1NF,2NF,3NF,BCNF,按从左至右的顺序一种比一种要求更严格。要符合某一种范式必须也满足它前边的所有范式。一般项目的数据库设计达到3NF就可以了,而且可根据具体情况适当增加冗余。


第一范式(1NF):在关系模式R中的每一个具体关系r中,如果每个属性值 都是不可再分的最小数据单位,则称R是第一范式的关系。
第二范式(2NF): 如果关系模式R为1NF,并且R中的每一个非主属性都完全依赖于R的某个候选关键字,则称R是第二范式的。
关系的第三范式(3NF): 如果关系模式R为2NF,并且R中的每一个非主属性都不传递依赖于R的某个候选关键字,则称R是第三范式的。
关系的Boyce-Codd范式(BCNF)定义: 如果关系模式R为1NF,并且R中的每一个函数依赖X→Y(Y?X),必有X是R的超关键字,则称R是Boyce-Codd范式的,简记为BCNF。


常用 标准SQL 语句

查找重复的数据
select id, count(*) from  A group by A.id having count(*)>1;


select distinct column A from tableA where [condition] Group by ..having ..oderby..



单列索引,多列索引(合并索引),组合索引的区别和效果


多列索引的效果,比起单列索引好不了多少,但是与组合索引比起来就差多了。


举例,如果分别在 vc_Name,vc_City,i_Age 上建立单列索引,让该表有 3 个单列索引,查询时和上述的组合索引效率一样吗?大不一样,远远低于我们的组合索引。虽然此时有了三个索引,但 MySQL 只能用到其中的那个它认为似乎是最有效率的单列索引。

建立这样的组合索引,其实是相当于分别建立了

vc_Name,vc_City,i_Age

vc_Name,vc_City

vc_Name

这样的三个组合索引!为什么没有 vc_City,i_Age 等这样的组合索引呢?这是因为 mysql 组合索引“最左前缀”的结果。简单的理解就是只从最左面的开始组合。

同理可以得出结论:

针对组合索引 id1 id2

相当于两个索引:

id1 id2

id2

而id2不会单独生效。