sql基础入门,SQL实战新手入门:SQL标准
sql基础入门,SQL实战新手入门:SQL标准详细介绍
本文目录一览: SQL实战新手入门:基本安全机制
基本安全机制
数据库安全是一个庞大的话题 如果详细地介绍主流数据库厂商在数据库安全问题上的方方面面 内容将过于庞杂 安全问题并不是自关系型数据库出现才产生的 密码验证 锁定 审计以及其他一些安全概念与人类的历史一样久远 SQL仅仅是这些安全概念的一个新应用 在SQL标准的指导(以及客户的要求)下 所有RDBMS都建立了安全规程 对于RDBMS来说 通常可以划分为几个不同的安全层次 各种RDBMS的差异在于这些安全层次上的具体实现不同
识别与身份验证
身份验证是数据库安全的第一道防线 在可以访问RDBMS之前 用户必须提交足够的信息以供验证 可以由RDBMS自身来执行验证 也可以由安装了数据库的操作系统来执行验证 一旦通过了身份验证 才可以继续访问数据库的资源 对象和数据
授权和访问控制
一旦用户通过了验证并被授予了访问数据库的权限 RDBMS将为特定的数据库对象启用一个复杂的 精细的特权(权限)系统 这些特权包括允许创建 访问 修改 销毁或执行相关的数据库对象 也包括添加 修改和删除数据
加密
加密提供了另外一个保护层 可以保护数据避免未经授权的查看 在数据加密的情况下 即使获得了对数据库的访问 如果不在特殊客户端软件或密码的协助下 也很难将加密过的数据解密为人类可读的信息
完整性和一致性
尽管安全性主要是基于验证和授权的过程而言 但在保护数据避免无意或恶意的操作时 数据的完整性扮演了一个重要的角色 例如 即使一个用户获得了访问数据库的权限(例如通过盗取密码) 但他在操作数据时仍然必须遵循关系规则 即不允许出现孤立记录 在没有理解数据库关系的情况下 用户将无法从父表中删除记录(然而一些RDBMS已经实现了CASCADE特性 可以利用这一特性指示RDBMS根据父记录删除与之关联的子记录) 也无法将重复的记录插入到具有UNIQUE约束保护的列 或者向表中插入违反CHECK约束的无效数据
审计
审计提供了监视数据库活动的功能 包括合法的活动和未经授权的活动 它保存了试图访问数据库时留下的痕迹 无论成功和失败 以及删除和插入操作等(以便在需要时找出发生了什么操作) 从安全认证的角度考虑 审计功能是数据库中一个必要的组件 这将在本章后面进行讨论
返回目录 SQL实战新手入门
编辑推荐
Oracle索引技术
高性能MySQL
lishixinzhi/Article/program/SQL/201311/16444
SQL实战新手入门:创建数据库
创建数据库
在可以向RDBMS提交SQL语句之前 还有一些准备工作需要完成 如果读者已经按照附录B中的操作指南以及本书配套网站( wrox 或 agilitator )上补充的幻灯片完成了相应的安装操作 那么应该已经具有一个(或多个)已经安装完成并且处于运行状态的RDBMS 本书将使用到读者安装的RDBMS 或者 读者应该安装Microsoft Access或OpenOffice BASE 请参考附录B 其中详细列出了安装RDBMS的步骤 另外请参考附录A中关于如何安装Library示例数据库的操作指南
对于下面的示例 只需要少量修改就可以在多种RDBMS服务器上运行 Oracle IBM DB Microsoft SQL Server PostgreSQL和MySQL 在MicrosoftAccess和OpenOffice BASE/HSQLDB中 需要创建一个项目
数据库的概念 从逻辑上可以定义为受某个程序管理的数据存储(例如现在已经很少使用的数据银行) 当使用一个桌面型数据库(例如Microsoft Access)时 Access数据库就是一个文件 对于新启动的每一个项目 Access都会创建这样一个数据库文件 基于服务器的RDBMS也使用类似的概念 但实现的细节要复杂许多 幸运的是 SQL语言是一种声明性语言 它隐藏了数据库实现上的复杂性 SQL语言只需要说明需要做什么 而无须说明如何做
在使用数据库之前 必须创建一个数据库 本书中使用的数据库包含了笔者书柜上所有的书 它可以跟踪图书名称 ISBN号 作者 价格等信息 这些信息有助于弄清楚书柜中图书的情况
下面的语句将在RDBMS中创建一个名为LIBRARY的数据库(只要RDBMS是Microsoft SQLServer IBM DB PostgreSQL和MySQL即可 对于Oracle数据库情况则略有不同 它对于什么是数据库具有不同的表述 请参考附录A中的详细介绍)
CREATE DATABASE library;
在RDBMS实例中 如果具有足够的权限 上面的语句将创建一个数据库 它是容纳数据的一个逻辑结构 同时还包含了所有的支撑结构 文件和数据库操作所需的许多其他对象 我们并不需要知道这些幕后的内容 所有的空白都会被默认值填充 这就是声明性语言的强大威力!
Oracle将采用如下所示的语法
CREATE USER library IDENTIFIED BY discover;
该语句中的USER粗略地等价于其他RDBMS中的DATABASE 但在本书中 将不会详细地讨论这两者之间的相似和差异
当然 在一个产品级的RDBMS环境中 创建一个具有足够功能的数据库还有大量的工作要做 还可以使用许多选项并权衡利弊 但是只需要执行上面的语句 就可以创建一个可用的基本数据存储
在创建了一个数据库之后 也可以使用SQL的DROP语句轻而易举地销毁它 在使用DROP语句时 不能销毁并不存在的对象(如果试图执行这样的操作 RDBMS将发出警告)
DROP DATABASE library;
在Oracle中 删除操作就是删除一个USER
执行DROP语句之后 LIBRARY数据库就从服务器上消失了 在Microsoft Access和OpenOfficeBASE中 删除数据库的操作等价于删除对应的文件
由于各个RDBMS之间使用的术语存在着某些差别 因此在不同的专有数据库之间 数据库的概念也存在差异 例如 在SQL Server中定义为数据库的东西在某种程度上类似于Oracle中的SCHEMA和USER 但在本书介绍的内容中 这些差别并不是特别重要
返回目录 SQL实战新手入门
编辑推荐
Oracle索引技术
高性能MySQL
lishixinzhi/Article/program/SQL/201311/16487
SQL实战新手入门:优点和缺点
优点和缺点
当权衡到底是使用底层的表还是使用视图来抽取数据时 我们总是想在性能与抽取的复杂性之间取得一个平衡 读者需要理解这两种方式的各种后果 并在两者之间找到一个最佳的平衡点
视图具有下列优点
抽象了数据模型的复杂性 这是对于终端用户而言的
代码重用 除非将SQL查询持久化在客户端的代码中(嵌入式SQL) 或者持久化在存储过程或视图中 否则它只是一个暂态的结果
增强的安全性 可以使用视图来限制用户对数据的访问
个性化 可以基于同一个数据集来创建多个不同的视图 这些视图可以暴露不同的字段 对于不同的用户将某些字段重命名等
使用视图的主要缺点如下
性能损失 视图顶多与用于创建它的查询执行得一样快 对于数据访问 无法以对表执行的同样的方式对视图进行优化
代码的可移植性 不同RDBMS的实现存在着显著的差异
复杂性 视图对终端用户隐藏了复杂性 但视图自身的复杂性依然存在 视图也需要维护 由于向普通用户隐藏了源代码 因此也增加了维护的成本
读者可能想知道 在执行CREATE VIEW语句之后 视图的SQL源代码将会怎样 与其他DDL语句一样 视图将被存储在数据库中 可以通过RDBMS的系统目录 系统存储过程或者INFORMATION_SCHEMA视图检索它 更多信息请参见第 章的内容
返回目录 SQL实战新手入门
编辑推荐
Oracle索引技术
高性能MySQL
lishixinzhi/Article/program/SQL/201311/16456
SQL实战新手入门:SQL标准
SQL标准
为了在各个数据库厂商之间取得更大的统一性 美国国家标准学会(American NationalStandards Institute ANSI)于 年发布了第一个SQL标准 并于 年发布了第二个版本 该版本已经被广泛地采用 ANSI在 年更新了SQL标准的版本 即SQL 和SQL 并于 年再次更新为SQL 和SQL 标准 在每一次更新中 ANSI都在SQL中添加了新特性 并在语言中集成了新的命令和功能
对于各种数据库产品 ANSI标准规范化了很多SQL行为和语法结构 随着开源数据库产品(例如MySQL mSQL和PostgreSQL)日渐流行并由虚拟团队而不是大型公司开发 这些标准变得更加重要
现在 SQL标准由ANSI和国际标准化组织(International Standards Organization ISO)作为ISO/IEC 标准维护 最新发布的SQL标准是SQL: 下一版本的发布工作已经在进行之中 它将包含RDBMS在收集或分发数据方式上的新发展
返回目录 SQL实战新手入门
编辑推荐
Oracle索引技术
高性能MySQL
lishixinzhi/Article/program/SQL/201311/16490
零基础学sql大约需要多长时间?
零基础学sql大约需要3-5个月的时间。SQL全称是 Structured Query Language,翻译后就是结构化查询语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。那么什么是数据库呢?简而言之就是存储数据的仓库,Excel为什么不算数据库呢,因其能够存储的数据量真的太小了,Excel2016最多存储104万条数据。现在大数据时代数据动辄百万、千万,所以需要数据库来帮忙。SQL的能力分为入门,实战两个阶段,具体看面试的岗位要求的水平。一般SQL分为增,删,改,查四大能力。很多人都以为按这个顺序应该先写增,删,改,但其实往往工作中真正用到的是查。SQL很通用,随便找一本教程都会讲这东西,网上也很多,根本不用挑选。学习的重点要放在理解结构化数据的概念和运算,而不是SQL的语法。理解那些基础知识后,语法本身就不是个事。想了解更多sql相关详情,推荐咨询达内教育。达内教育具有丰厚的师资力量,优秀的教学体系,教学质量突出。理论知识+学习思维+实战操作,打造完整学习闭环。实战讲师,经验丰富。达内教育独创TTS8.0教学系统,并设有企业双选会。达内的OMO教学模式,全新升级,线上线下交互学习,直播学,随时学,随时问,反复学,学习安排更便捷。【想要了解更多信息,欢迎点击咨询达内教育!】
sql入门新手教程
1、打开电脑浏览器,在百度搜索框中输入:w3cschool,然后点击百度按钮,如图所示。
2、然后点击进入w3cshool官方网站。
3、进入之后,在搜索框输入:SQL Server,然后点击搜索按钮。
4、找到SQL Server数据库教程。
5、然后按照目录安装SQL Server数据库软件,进行学习就完成了。
SQL实战新手入门:事务(4)
事务( )
在上面的例子中 在发出了MIT语句之后 只有UPDATE操作会提交到数据库 所有的DELETE操作都被回滚 保存点first_delete将被清除 该查询所占用的所有资源也被释放
在当前事务中 保存点的名称必须是唯一的 如果使用相同的名称声明了一个新的保存点 则之前的保存点将被销毁
Microsoft SQL Server 在定义保存点的语法中添加了TRAN关键字 它建立保存点的语法如下所示
SAVE TRAN[SACTION]
要使前面的代码能在Microsoft SQL Server中正常运行 只需要将SAVEPOINT关键字替换为SAVE TRANSACTION关键字即可
涉及多个数据库的事务称为分布式事务 分布式事务本身就非常复杂 要求许多高级的技术和知识 分布式事务涉及使用两阶段提交 它允许在一个事务中使用多种混杂的数据源 万一网络连接中断 分布式事务必须尽可能地减少数据丢失的风险 分布式事务使用的是两阶段提交协议 各个RDBMS对此的具体实现上存在一定的差异 但通常都遵循相同的两阶段原则
事务的隔离级别
SQL标准定义了多种事务隔离级别 隔离级别指的是事务在自己的作用域内查看外部世界(即被任何其他事务修改了的数据)的能力 表 列出了SQL标准定义的几种隔离级别
表 SQL标准定义的事务隔离级别
Oracle g/ g已经实现了 种事务隔离级别 SERIALIZABLE READ MITTED和READ ONLY
DB 定义事务隔离级别的术语与SQL标准的术语存在一定的混淆 SQL标准中定义的SERIALIZABLE隔离级别在DB 中名为REPEATABLEREAD(RR) 这是DB 中最高的隔离级别 DB 也支持使用SQL标准的关键字作为RR的同义词 SQL标准中的REPEATABLEREAD在DB 中是READSTABILITY(RS) 另外DB 还引入了一个新的隔离级别
CURSORSTABILITY
最后一个隔离级别 CURSORSTABILITY(CS) 是IBM DB 中默认的事务隔离级别 它类似于SQL标准中的READ MITTED隔离级别(实际上 它确保一行数据保持不变)
UNMITTEDREAD(UR)隔离级别与SQL标准中的定义相同 不获取任何锁 因此可能发生脏读(脏读指的是一个事务在读取数据时 另外一个事务正在修改这些数据 因此可能产生不确定的结果)
Microsoft SQL Server 不但支持SQL标准定义的所有 种隔离级别 它还添加了一个SNAPSHOT隔离级别 用于保证在事务期间读取的数据与在事务一开始时的数据保持一致 隔离级别是为整个会话设置的 而不是为会话中的单个事务设置的
表 列出了SQL标准中定义的 种隔离级别 以及在每一种隔离级别下的行为 脏读指的是读取了还未提交到数据库的数据 不可重复读指的是在事务访问数据期间 数据可能发生改变 幻读则与不可重复读有关 它描述了这样一种情形 对一个相同的数据集执行同样的查询 每次返回的查询结果不相同
表 SQL中的事务隔离级别
返回目录 SQL实战新手入门
编辑推荐
Oracle索引技术
高性能MySQL
lishixinzhi/Article/program/SQL/201311/16447
SQL实战新手入门:获取数据-SELECT语句(2)
获取数据 SELECT语句( )
只要确保列表中值的顺序与表中列的结构精确地匹配 就可以在INSERT语句中省略列的列表 列列表实际上是数据的占位符 但是如果列表中值的顺序与列列表中的顺序不同 或者要插入的列不是记录中的全部列(例如 只插入 个列中的 个列) 那么就必须在INSERT语句中列出匹配的列列表 例如下面的例子
INSERT INTO myLibrary (
title
author
book_language
publisher
pages
author
publish_date
i *** n
)VALUES (
SQL Bible
Alex Kriegel
English
Wiley
Boris M Trukhnov
April
)
对于书架上的每一本书使用相应的数据重复运行上面这个INSERT语句(当然 某些数据录入员可能会讨厌这项工作) 另外 读者也可以从本书的支持网站中下载一个已经编写好的脚本 并按照附录A中的指南安装该脚本 这样 就可以获得所需的结构化的图书信息 并为执行SQL查询做好准备
INSERT INTO myLibrary(title author book_language publisher pages publish_date
i *** n) VALUES ( Microsoft SQL Server Weekend Crash Course Alex Kriegel
English Wiley October )
INSERT INTO myLibrary(title author book_language publisher pages publish_date
i *** n) VALUES ( Mindswap Robert Sheckley English Orb Books May
)
INSERT INTO myLibrary(title author book_language publisher pages publish_date
i *** n) VALUES ( Jonathan Livingston Seagull Richard Bach English MacMillan
)
INSERT INTO myLibrary(title author book_language publisher pages publish_date
i *** n) VALUES ( A Short History of Nearly Everything Bill Bryson
English Broadway October )
在INSERT语句中 如果同时省略了某个列的列名和列值 会产生什么样的结果呢?在INSERT语句中指定的列将会填充数据 而省略掉的列则保持为空 为了表示空值的含义 SQL使用NULL值来标识
在上面的例子中 AUTHOR 列的值将填充为NULL 第 章还将介绍 在数据库中NULL值具有特殊的含义 它的行为具有特殊的规则
为了减少输入负担 读者可以从网站 wrox 或 agilitator 下载本章的SQL脚本 附录A描述了脚本的安装过程
下面是一个SELECT查询 它返回已经输入到MYLIBRARY表中的所有图书记录
SELECT title
author
author
publisher
pages
publish_date
i *** n
book_language
) FROM myLibrary;
除了列出所有的列之外 还可以使用SQL提供的一个方便的快捷方式 即用一个星号(*)来指示RDBMS获取所有列的信息
SELECT * FROM myLibrary;
该查询的结果看起来与之前舍弃的非结构化数据的结果类似 但两者存在一个小小的差别 该查询返回的数据按照不同的列分别进行显示 这就是根本的不同!
首先 可以改变SELECT语句中列的顺序 按照任意顺序显示数据 另外还可以只查询特定的列 例如 如果只需要生成一个作者和图书名称的列表 可以执行下面这个查询
SELECT title
author
author
) FROM myLibrary;
返回目录 SQL实战新手入门
编辑推荐
Oracle索引技术
高性能MySQL
lishixinzhi/Article/program/SQL/201311/16483
SQL实战新手入门:获取数据-SELECT语句(1)
获取数据 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( )
i *** n 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
lishixinzhi/Article/program/SQL/201311/16484