`
csbison
  • 浏览: 154919 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

SQL学习笔记

阅读更多

* 外键的作用:保证数据的完整性和一致性。

  

  * 什么是DMLDDL      

    DML(Data Manipulation Language)数据操纵语言命令使用户能够查询数据库以及操作已有数据库中的数据。

    insert,delete,update,select等都是DML.

    DDL语句用语定义和管理数据库中的对象,如Create,AlterDrop.

    DDL操作是隐性提交的!不能rollback

 

 

What are DDL and DML?

   What are DDL and DML and their commands?DML statements are SQL statements that manipulate data. DML stands for Data Manipulation Language. The SQL statements that are in the DML class are INSERT, UPDATE and DELETE. Some people also lump the SELECT statement in the DML classification. Data Definition Languages (DDL) are used to define the database structure. Any CREATE, DROP and ALTER commands are examples of DDL SQL statements.

    数据定义语言DDL(Data Definition Language),数据处理语言DML(Data Manipulation Language),事务控制语言TCL(Transaction Control Language)

    DDL:CREATE/ALTER/DROP Schema/Table/Index/View

    DML:INSERT,UPDATE,DELETE,SELECT

    TCL:Begin,Commit,Rollback

 

注意,SELECT语句是Query Language,不是DML的一种。

 

                    

    * 数据字典

    数据字典(Data dictionary)是一种用户可以访问的记录数据库和应用程序元数据的目录。主动数据字典是指在对数据库或应用程序结构进行修改时,其内容可以由DBMS自动更新的数据字典。被动数据字典是指修改时必须手工更新其内容的数据字典。

    例如OracleUSER_TABLES 就是数据字典。

    

 

    * 使用子查询,最好用 别名。

 

    * 事务的ACID原则:

     数据库事务必须具备ACID特性,具体的含义如下:

 

     ----- Atomic(原子性):只整个数据库事务是不可分割的工作单元。只有事务中所有的操作执行成功,才算整个事务成功;事务中任何一个SQL语句执行失败,那么已经执行成功的SQL语句也必须撤销,数据库状态应该退回到执行事务前的状态。通过上面的例子我们已经看得很清楚了。

 

     ----- Consistency(一致性):指数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。例如,不管上面的例子里面QQ币转账的事务成功还是失败,都应该保证事务结束后qq_account表中billtomQQ币总额为1000点。

 

     ----- Isolation(隔离性):指的是在并发的环境之中,当不同的事务同时操作相同的数据时,每个事务都有各自的完整数据空间,这里涉及的事情就多了,我想在后面单独总结成一篇文章。

 

     ----- Durability(持久性):指的是只有事务成功结束,它对数据库所做的更新就必须永久保存下来。即使发生系统崩溃,重新启动数据库后,数据库还能恢复到事务成功结束时的状态。          

 

事务的ACID只是一个抽象的概念,具体是由RDBMS来实现的。数据库管理系统用日志来保证事务的原子性、一致性和持久性。日志记录了事务 对数据库所做的更新,如果某个事务在执行过程中发生了错误,就可以根据日志,撤销事务对数据库已经做的更新,使数据库回退到执行事务前的初始状态。所以不 论讲到什么数据库,都会有专门的一章来讲日志,呵呵,终于从本质上明白了日志的作用。

 

     至于事务的隔离性,RDBMS则是采用锁机制来实现的。当多个事务同时更新数据库中的临界数据时,只允许持有锁的事务才能更新该数据,其他事务必须等待, 直到前一个数据释放了锁,其他事务才可能有机会来进行更新,这和我们在OS中学的进程的并发时所谈到的锁机制原理差不多。

 

    上面提到了数据库事务的ACID特性,那么谁来保证数据库事务具有ACID呢?其实,只要向数据库系统声明一个事务,数据库系统就会自动保证事务的ACID特性的。那么下面从抽象的概念上来看看怎么声明事务:

     -- BEGIN 事务的开始边界

     -- COMMIT 事务的正常结束边界,提交事务,永久保存被事务更新后的数据库状态。

     -- ROLLBACK 事务的异常结束边界,撤销事务,使数据退回到执行事务前的初始状态。

 

   常用的DBMS通过日志和锁机制来保证事务具有ACID特性。而对于开发人员,只需要通过数据库系统提供的接口,就可以控制事务。

 

* 事务的隔离级别:    

事务的隔离级别:

TRANSACTION_NONE

TRANSACTION_READ_UNCOMMITTED

TRANSACTION_READ_COMMITTED

TRANSACTION_REPEATABLE_READ

TRANSACTION_SERIALIZABLE

·Update表的一列字段:

    update MVP_DEVICE_INSTANCE a set a.DESCRIPTION=(select PHONE_NUMBER from  TEMPPD b where a.DEVICE_INSTANCE_ID=b.DEVICE_INSTANCE_ID)

     update时,对TMEMPD建索引和没有建索引的差别非常大,相差可能上千倍。

 

·连接查询(join query)   

join query 是属于 SQL/92的语法。而传统的查询是属于 SQL/86的语法。

连接查询一个有5种:

   内连接         inner join = join

   交叉连接。     cross join 其实就是表关联。所以一般不会专门用上 cross join.

 

   全外连接       full (outer) join

   ()连接     left (outer) join

   ()连接     right (outer) join

  

1) 还有另外一种特殊的连接,叫自连接。自连接是指在同一张表之间的连接查询。

2) 内连接跟表关联(交叉连接)意义上是一样的,只是写法不同。用于返回满足连接条件的所有记录。

3) 外连接不仅返回满足连接条件的记录,而且还另外返回部分不满足连接条件的记录。

4) 因为join连接查询的写法不同,所以特殊的场合可以用上;例如对同一表进行各种维度的查询时,可以通过join结合子查询的方式(当然也可以select语句查询多个视图)。

 

进行连接查询时,必须指定有效的连接条件(在不同表的列之间进行连接)。如果不指定连接条件,或者指定了无效的连接条件,则会导致生成笛卡尔积(叉乘运算)

 

·交叉连接=表关联

多余的表关联,会产生笛卡尔乘积(叉乘)的结果集;例如:

select t1.id from t_student t1,t_student2 t2;

本来t1表只有两行数据,t2表有两行数据。但这个结果集却显示4行数据。

 

这是因为select t1.id from t_student t1,t_student2 t2;相等于

select t1.id from t_student t1 cross join t_student2 t2;

 

 

在表关联的WHERE条件中,可以使用(+) 表示外连接。该操作符应放在显示较少行(完全满足连接条件行)的一端。

(+) 操作符只能出现在WHERE子句中,不能和Outer Join同时使用;

(+) 操作符执行外连接时,如果WHERE子句有多个条件,则必须所有条件均包含 (+)操作符;

(+) 操作符不能和OR IN一起使用。

(+) 操作符只能进行左连接或右连接,而不能进行全外连接。

 

分享到:
评论
Global site tag (gtag.js) - Google Analytics