码迷,mamicode.com
首页 > 数据库 > 详细

数据库练习笔记

时间:2016-08-09 16:16:34      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:sql   数据库   基础   

应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:     select id from t where num=10 or num=20  

可以这样查询:  

    select id from t where num=10  

    union all  

    select id from t where num=20

union和union all的区别是,union会自动压缩多个结果集合中的重复结果,而union all则将所有的结果全部显示出来,不管是不是重复。


DECLARE @count

SELECT @count=1

解释如下:

DECLARE 用于声明变量,

SELECT 用于变量赋值。


在mysql中,与语句SELECT * FROM book b WHERE b.book_num NOT BETWEEN 200 AND 300;

SELECT * FROM book b WHERE b.book_num < 200 OR b.book_num > 300;


A INNER JOIN B:返回A和B中符合on条件式的记录

A LEFT JOIN B:返回A中的所有记录和B中符合on条件式的记录

A RIGHT JOIN B:返回B中的所有记录和A中符合on条件式的记录


约束主要有一下几种:

NOT NULL : 用于控制字段的内容一定不能为空(NULL)。 

UNIQUE : 控制字段内容不能重复,一个表允许有多个 Unique 约束。

PRIMARY KEY: 也是用于控制字段内容不能重复,但它在一个表只允许出现一个。

FOREIGN KEY: FOREIGN KEY 约束用于预防破坏表之间连接的动作,FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。

CHECK: 用于控制字段的值范围。

DEFAULT: 用于设置新记录的默认值。


有关ibatis 中的#与$的区别

1.#是把传入的数据当作字符串,如#user_id_list#传入的是1,2,则sql语句生成是这样,in (‘1,2‘) ,

2.$传入的数据直接生成在sql里,如$user_id_list$传入的是1,2,则sql语句生成是这样,in(1,2). 

3.#方式能够很大程度防止sql注入. 

4.$方式无法方式sql注入. 

5.$方式一般用于传入数据库对象.例如传入表名. 

6.一般能用#的就别用$.

举例:

#str# 出来的效果是  ‘str‘ 

$str$ 出来的效果是  str 


在Ibatis中我们使用SqlMap进行Sql查询时需要引用参数,在参数引用中遇到的符号#和$之间的区分为,#可以进行与编译,进行类型匹配,而$不进行数据类型匹配。

例如: select * from table where id = #id# ,其中如果字段id为字符型,那么#id#表示的就是’id’类型,如果id为整型,那么#id#就是id类型。 select * from table where id = $id$ ,如果字段id为整型,Sql语句就不会出错,但是如果字段id为字符型,那么Sql语句应该写成 select * from table where id = ‘$id$‘


在archivelog mode只要其归档日志文件不丢失,就可以有效地防止数据丢失。


逻辑查询处理阶段简介

FROM:对FROM子句中的前两个表执行笛卡尔积(Cartesian product)(交叉联接),生成虚拟表VT1

ON:对VT1应用ON筛选器。只有那些使<join_condition>为真的行才被插入VT2。

OUTER(JOIN):如 果指定了OUTER JOIN(相对于CROSS JOIN 或(INNER JOIN),保留表(preserved table:左外部联接把左表标记为保留表,右外部联接把右表标记为保留表,完全外部联接把两个表都标记为保留表)中未找到匹配的行将作为外部行添加到 VT2,生成VT3.如果FROM子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤1到步骤3,直到处理完所有的表为止。

WHERE:对VT3应用WHERE筛选器。只有使<where_condition>为true的行才被插入VT4.

GROUP BY:按GROUP BY子句中的列列表对VT4中的行分组,生成VT5.

CUBE|ROLLUP:把超组(Suppergroups)插入VT5,生成VT6.

HAVING:对VT6应用HAVING筛选器。只有使<having_condition>为true的组才会被插入VT7.

SELECT:处理SELECT列表,产生VT8.

DISTINCT:将重复的行从VT8中移除,产生VT9.

ORDER BY:将VT9中的行按ORDER BY 子句中的列列表排序,生成游标(VC10).

TOP:从VC10的开始处选择指定数量或比例的行,生成表VT11,并返回调用者。

注:步骤10,按ORDER BY子句中的列列表排序上步返回的行,返回游标VC10.这一步是第一步也是唯一一步可以使用SELECT列表中的列别名的步骤。这一步不同于其它步骤的 是,它不返回有效的表,而是返回一个游标。SQL是基于集合理论的。集合不会预先对它的行排序,它只是成员的逻辑集合,成员的顺序无关紧要。对表进行排序 的查询可以返回一个对象,包含按特定物理顺序组织的行。ANSI把这种对象称为游标。理解这一步是正确理解SQL的基础。


造成数据不一致的原因主要有:

数据冗余

如果数据库中存在冗余数据,比如两张表中都存储了用户的地址,在用户的地址发生改变时,如果只更新了一张表中的数据,那么这两张表中就有了不一致的数据。

并发控制不当

比如某个订票系统中,两个用户在同一时间订同一张票,如果并发控制不当,可能会导致一张票被两个用户预订的情况。当然这也与元数据的设计有关。

故障和错误

如果软硬件发生故障造成数据丢失等情况,也可能引起数据不一致的情况。因此我们需要提供数据库维护和数据恢复的一些措施。


数据库练习笔记

标签:sql   数据库   基础   

原文地址:http://sdqdwc.blog.51cto.com/11678553/1836146

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!