首页 > 移动开发 > Android > 正文
2.1.4 SQL语言
2015-04-21 16:40:07     我来说两句      
收藏    我要投稿

SQL确实是一种相当简单的语言。然而,正如前面所指出的,它是整本书的主题。完整地介绍它超出本书的范围了。因为移动应用程序前后端的开发人员——移动端和服务器后端——都将很可能使用SQL,所以在使用具体的SQLite之前,花一些时间回顾一些它的主要功能是值得的。
 
SQL语言语句可分为三个大的类别:数据定义语言(DDL)、数据操作语言(DML)和查询。

1. 数据定义语言

数据定义语言(DDL)描述了数据库包含的数据结构。最常见的DDL语句用来定义一个表——包含的列数、这些列的名称以及列中数据的类型。通过CREATE TABLE和DROP TABLE语句实现,如代码清单2-1所示。
 

代码清单2-1:CREATE TABLE语句
DROP TABLE contacts;
CREATE TABLE contacts (
    _id INTEGER PRIMARY KEY AUTOINCREMENT,
    name_raw_contact_id INTEGER REFERENCES raw_contacts(_id),
    photo_id INTEGER REFERENCES data(_id),
    photo_file_id INTEGER REFERENCES photo_files(_id),
    custom_ringtone TEXT,
    send_to_voicemail INTEGER NOT NULL DEFAULT 0,
    times_contacted INTEGER NOT NULL DEFAULT 0,
    last_time_contacted INTEGER,
    starred INTEGER NOT NULL DEFAULT 0,
    has_phone_number INTEGER NOT NULL DEFAULT 0,
    lookup TEXT,
    status_update_id INTEGER REFERENCES data(_id)
);

代码清单2-1是一个中等复杂的表的示例,命名为contacts。具体而言,这里虽然是SQL的SQLite的版本,但其定义和大多数其他版本几乎相同。该代码创建一个表,该表拥有12个列,每一行代码定义一列。表的名称在数据库中必须是唯一的,往往是一个复数名词,用于命名表中行的对象:EMPLOYEES、NOSES以及HIPPOPOTUMUSES等。

注意:在SQL社区问题就使用单数或复数名词来命名表有过十分激烈的争论。最近的讨论似乎偏向于使用单数。虽然本书有明确而强烈的约定,但是无论你选择什么方案,都应该前后保持一致。

列名在同一个表中必须唯一。在该示例中,_id列是整数值,并且是表的主键。_id列的ANTOINCREMENT约束使得数据库引擎为每行创建一个唯一的整数,并且自动递加。

该表中的其他列使用两种基本数据类型——text和integer。使用了PEFERENCES关键字的其中几列——拥有使用外键在其他表中定义的复杂类型。例如,photo_file_id列是对photo_files表的引用。

注意:表中定义的有些列有其他数据约束—— NOT NULL、DEFAULT 0等。有关这些约束的更多信息以及它们的工作原理,请参考下面的标准SQL参考文档:

http://dev.mysql.com/doc/refman/5.0/en/language-structure.html

http://msdn.microsoft.com/en-us/library/ms166026(v=sql.90).aspx

http://docs.oracle.com/cd/B19306_01/server.102/b14200/toc.htm

除了能够创建表之外,SQL DDL允许创建其他标准RDBMS的数据结构,如视图、触发器和索引。一个典型的数据库可能包含数个表,可能包含一个或两个索引(这取决于设计师的偏好),以及一些触发器或视图。定义一个给定数据库中的所有对象的DDL语句集合称为它的模式(schema)。

2. 数据操作语言

数据操作语言(DML)语句用于添加、删除和修改数据库中的数据。有三种DML语句——INSERT、UPDATE和DELETE。它们如代码清单2-2所示。

 

代码清单2-2: 数据操作语言语句
INSERT INTO contacts(
    name_raw_contact_id, photo_id, photo_file_id,
    last_time_contacted, status_update_id)
    VALUES(null, null, null, 1339365417, null);
UPDATE contacts SET starred=1, has_phone_number=1 WHERE _id = 3;
DELETE FROM contacts where _id = 2;

INSERT语句为表添加新行,并定义一些列的值——在本例中,不是全部列。插入操作将成功,因为所有必须有值的列(NOT NULL约束)都有指定的值或有默认值(DEFAULT约束)。由该语句插入的行的主键将由数据库引擎自动创建一个整数值,并和目前在_id列中的整数值都不同。

再看代码清单2-2中的下一条语句,UPDATE语句改变contacts表中不多于一行的两列的值。它改变主键等于3的那一行的值。因为选择标准是主键,所以最多只会有一行。

代码清单中的最后一条语句是DELETE语句,它从数据库中最多删除一行(在本例中)。同样,因为选择标准是主键,所以最多只有一个记录的主键是2。这条语句执行之后,contacts表中就不存在主键是2的行了。

3. 查询

查询可能是所有SQL语句中使用最频繁的语句。在关系术语中,查询创建一个新的关系——一个虚拟表——即一个或更多个表的叉积的投影的约束。代码清单2-3中的查询示例演示了INNER JOIN。

代码清单2-3:使用INNER JOIN的查询
SELECT rc.display_name, c.starred
    FROM contacts c INNER JOIN raw_contacts rc
        ON c.name_raw_contact_id = rc._id
    WHERE NOT rc.display_name IS NULL
    ORDER BY rc.display_name ASC;

如前所述,连接是两个表叉积的一个重要限制。如图2-4所示,两个表的一个完整叉积把第1个表中的每一行与第2个表中的每一行进行结合。在代码清单2-3的查询中, contacts表与raw_contacts表进行连接。叉积的结果将有C(contacts) * C(raw_contacts)行,其中,C(t)是表t中的行数。完整的叉积可能不是非常有用。在查询中,ON子句限制只有列name_raw_contact_id列的值和raw_contacts表中_id列的值相同的行进行叉积。连接所产生的新的关系包含contacts表中的行,每行附加上raw_contacts表中的相应信息。这就非常用了!图2-4的底部表格显示了类似的连接。


 

推而广之,可以构建多个表的连接。在RDBMS系统中,连接就如同面向对象系统中的继承,是一个重要的功能。

SQL语言的这一简要回顾,完成了通用关系型数据存储概述。到目前为止,本章的所有讨论都适用于分布式移动应用程序的客户端和服务器端。这里的信息可能是移动开发人员比其后端的同行不太熟悉的方面。这样一个高层次的讨论,目的不仅是帮助移动开发人员了解一个重要的本地工具,而且有助于理解支持移动应用程序的后台技术。现在是时候转向Android的结构化数据管理工具SQLite的细节了。



 

 

 



 

点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:2.1.3 DBMS的其他功能
下一篇:2.2 SQLite入门
相关文章
图文推荐
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站