获取数据SELECT语句()
现在MYLIBRARY表中已经有了数据可以对该表执行查询以精确地查找所具有的图书SELECT语句用于从表中获取数据要使用SELECT语句获取数据只需要告诉它表名和列名
SELECT all_my_books FROM myLibrary;
尽管该查询可以产生一个图书信息的列表但它还不是特别有用该图书信息是一大堆的数据将其存储在一个关系型数据库中的唯一好处就是可以轻而易举地重新获取或打印这些信息如果要搜索数据呢?要查找是否有某一本特定的图书必须获取所有的记录然后人工地逐一遍历每一条记录!这并不是我们期望从一个复杂的RDBMS软件获得的结果
需要采用某种办法来标识存储在表中的记录的特殊关键词例如图书名称或ISBN号对于该问题一个标准的程序设计方式的答案就是对记录进行解析将记录切分为多个片段并在一个循环中遍历查找特定的目标词汇对于表中的每一条记录重复执行这一过程如果没有特定于厂商的过程化扩展SQL无法执行任何类似的操作这种方式违背了SQL语言是一种声明性语言的本质并要求深刻地理解数据结构下面让我们再看一看输入到MYLIBRARY表中的第一条记录
SQL Bible by Alex Kriegel Boris M Trukhnov Paperback: pages
Publisher: Wiley; edition (April ) Language: English
ISBN:
如何才能将记录切分为不同的信息片段呢?每一个片段之间的标记是什么呢?如何区分图书的名称和作者呢?如果使用空格符作为分隔符那么SQL和Bible将被切分为不同的片段但在逻辑上SQL和Bible属于同一个信息片段如何才能知道by是一个介词而不是作者姓名中的一部分?解决的办法来自SQL结构化的本性毕竟SQL是一种结构化的查询语言要解决这一问题需要更多的列来存储不同片段的信息将一个笨重的字符串拆分为多个语义上有着密切联系的数据片段就可以独立地标识每一个数据片段因为每一个片段都成为一个单独的列回到CREATE TABLE语句(首先删除现有的表)
DROP TABLE myLibrary;
根据上面的讨论创建一个新表
CREATE TABLE myLibrary
(
title VARCHAR()
author VARCHAR()
author VARCHAR()
publisher VARCHAR()
pages INTEGER
publish_date VARCHAR()
isbn VARCHAR()
book_language VARCHAR()
)
在新表的结构中将原来的单个列拆分为个列另外还可以添加第个列将作者的名和姓拆分到两个单独的列中(这就是将在第章中讨论的数据建模过程)就目前而言除了将PAGES列的数据类型设置为INTEGER类型以表示图书包含多少页之外对于其他所有的列都使用了相同的数据类型并缩短了每一个列中所能包含的字符数量本章后面将进一步解释将PAGES列设置为INTEGER类型的原因读者或许还会考虑到修改PUBLISH_DATE列的数据类型通常情况下日期数据的行为与字符数据不同DBMS提供了专门用于日期和时间的数据类型
现在无须将所有的数据都保存在同一个桶中对于各个列的数据类型可以有更多的选择可以将不同的列定义为不同的数据类型当插入或更新各个列中的数据(本章后面将对此进行介绍)时建议不要将数据类型搞混
本章后面还将重新审视数据类型第章也将详细地介绍数据类型
读者可能已经注意到在新的MYLIBRARY表中有两个作者列这是为了适应一本图书有两个作者的情形这也提出了另外一个问题当一本图书只有一个作者或者一本图书有个作者时该如何处理呢?该问题将在第章和第章的数据建模小节中进行深入的探讨这里读者只需要注意对于未使用的列将自动使用默认值进行填充如果读者发现经常需要在表中添加新的列那么最好花时间阅读一下关于数据库规范化方面的内容(请参见第章)
接下来将向新表中插入数据这一步骤与之前介绍的插入操作完全相同唯一的差别在于VALUES列表变得更长因为原来只包含一个列而现在包含了个列在VALUES列表中除了PAGES列的值之外所提供的所有其他数据都必须用单引号括起来引号表明了这些数据是字符数据没有引号则表示数值数据
INSERT INTO myLibrary VALUES (
SQL Bible
Alex Kriegel
Boris M Trukhnov
Wiley
April
English)
返回目录SQL实战新手入门
编辑推荐
Oracle索引技术
高性能MySQL
数据仓库与数据挖掘培训视频教程