SQL语言包括
数据定义:Create Table,Alter Table,Drop Table, Craete/Drop Index等
数据操纵:Select ,insert,update,delete,
数据控制:grant,revoke
实体完整性、参照完整性、用户定义完整性
1NF:每个属性是不可分的。
2NF:若关系R是1NF,且每个非主属性都完全函数依赖于R的键。
3NF:若R是2NF,且它的任何非键属性都不传递依赖于任何候选键。
事务:是一系列的数据库操作,是数据库应用的基本逻辑单位。
事务性质:
原子性。即不可分割性,事务要么全部被执行,要么就全部不被执行。
一致性或可串性。事务的执行使得数据库从一种正确状态转换成另一种正确状态
隔离性。在事务正确提交之前,不允许把该事务对数据的任何改变提供给任何其他事务,
持久性。事务正确提交后,其结果将永久保存在数据库中,即使在事务提交后有了其他故障,事务的处理结果也会得到保存。
1.重复使用。存储过程可以重复使用,从而可以减少数据库开发人员的工作量。
2.提高性能。存储过程在创建的时候在进行了编译,将来使用的时候不再重新翻译。一般的SQL语句每执行一次就需要编译一次,所以使用存储过程提高了效率。
3.减少网络流量。存储过程位于服务器上,调用的时候只需要传递存储过程的名称以及参数就可以了,因此降低了网络传输的数据量。
4.安全性。参数化的存储过程可以防止SQL注入式攻击,而且可以将Grant、Deny以及Revoke权限应用于存储过程。
触发时间:有before,after.
触发事件:有insert,update,delete三种。
触发类型:有行触发、语句触发
内联接,外联接:
内连接是保证两个表中所有的行都要满足连接条件。
外连接分左连接、右连接、全连接三种。
INNER JOIN 在表中存在至少一个匹配时。
LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。
RIGHT JOIN 关键字会右表 (table_name2) 那里返回所有的行,即使在左表 (table_name1) 中没有匹配的行。
FULL JOIN 只要其中某个表存在匹配,FULL JOIN 关键字就会返回行。
当sql语句在执行查询操作的时候,有两种搜索方式。第一种搜索信息方式是全表搜索,第二种根据索引,找到符合查询条件的索引值,再通过保存在索引中的ROWID(相当于页码)快速找到表中对应的记录。
建立索引的优点
1.大大加快数据的检索速度;
2.创建唯一性索引,保证数据库表中每一行数据的唯一性;
3.加速表和表之间的连接;
4.在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。
索引的缺点
1.索引需要占物理空间。
2.当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。
索引的设计原则:
提高查询语句的效率,减慢了DML语句的速度。
在全表扫描和索引之间权衡。
能够使用组合索引的则尽量使用组合索引。
对于大表,尽量利用local的分区索引。
索引使用的一些具体规则:
在哪些列上建立索引:
Where字局中引用的列
Join中利用的列
在子表的FK上建立索引(防止对父表操作时锁住子表)
在哪些列上不要建立索引:
经常有DML操作
排它性小
不建议表上索引超过5个
索引不起作用的情况:
存在数据类型隐形转换
列上有数学运算
使用不等于(< >)运算
使用substr字符串函数
%通配符在第一个字符
字符串连接(||)
删除不使用的索引
定期重建大量删除操作的索引
建表时的优化:
1、只要能满足你的需求,应尽可能使用更小的数据类型:例如使用MEDIUMINT代替INT
2、尽量把所有的列设置为NOT NULL,如果你要保存NULL,手动去设置它,而不是把它设为默认值。
3、尽量少用VARCHAR、TEXT、BLOB类型
4、如果你的数据只有你所知的少量的几个。最好使用ENUM类型
5、建立索引。
查询语句的优化:
编写原则:
对于任何sql语句,一定要考虑其性能。
避免使用复杂的sql语句
避免不必要的排序
使用表的别名
Select语句避免使用*
具体细节规则:
Where条件中等号左边不用引用函数
Where条件中对于不同的数据类型,要做显示转换。
使用not exists 替代not in,exists替代in,exists语句可以有效的利用索引。
使用>=、<=,避免使用not命令
使用union,替代or
原文:http://my.oschina.net/huangcongcong/blog/513165