打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
轻松学SQL(1)
1、数据库的结构学习重点
● RDBMS通常使用客户端/服务器这样的系统结构。
● 通过从客户端向服务器端发送SQL语句来实现数据库的读写操作。
● 关系数据库采用被称为数据库表的二维表来管理数据。
● 数据库表由表示数据项目的列(字段)和表示一条数据的行(记录)所组成,以记录为单位进行数据读写。
● 本书将行和列交汇的方格称为单元格,每个单元格只能输入一个数据。RDBMS的常见系统结构使用RDBMS时,最常见的系统结构就是客户端/服务器类型(C/S类型)这种结构
图1-3 使用RDBMS时的系统结构
服务器指的是用来接收其他程序发出的请求,并对该请求进行相应处理的程序(软件),或者是安装了此类程序的设备(计算机)。在计算机上持续执行处理,并等待接收下一条请求。RDBMS也是一种服务器,它能够从保存在硬盘上的数据库中读取数据并返回,还可以把数据变更为指定内容。与之相对,向服务器发出请求的程序(软件),或者是安装了该程序的设备(计算机)称为客户端。访问由RDBMS管理的数据库,进行数据读写的程序称为RDBMS客户端。RDBMS客户端将想要获取什么样的数据,或者想对哪些数据进行何种变更等信息通过SQL语句发送给RDBMS服务器。RDBMS根据该语句的内容返回所请求的数据,或者对存储在数据库中的数据进行更新。客户端就如同委托方,而服务器就像是受托方。由于两者关系类似受托方执行委托方发出的指令,故而得名。这样就可以使用SQL语句来实现关系数据库的读写操作了。本书为了给大家讲解SQL,使用了可以显示如何将SQL语句发送到RDBMS,以及接收返回信息(数据)的客户端。具体内容请参考第0章。另外,RDBMS既可以和其客户端安装在同一台计算机上,也可以分别安装在不同的计算机上。这样一来,不仅可以通过网络使二者相互关联,还可以实现多个客户端访问同一个RDBMS。
图1-4 通过网络可以实现多个客户端访问同一个数据库
客户端没有必要使用同样的程序,只要能将SQL发送给RDBMS,就可以操作数据库了。并且,多个客户端还可以同时对同一个数据库进行读写操作。另外,RDBMS除了需要同时接收多个客户端的请求之外,还需要操作存有大量数据的数据库,因此通常都会安装在比客户端性能更优越的计算机上。操作数据量特别巨大的数据库时,还可以将多台计算机组合使用。虽然RDBMS的系统结构多种多样,但是从客户端发来的SQL语句基本上都是一样的。表的结构让我们再具体了解一下RDBMS的结构。上一节我们讲到了关系数据库通过类似Excel工作表那样的、由行和列组成的二维表来管理数据。用来管理数据的二维表在关系数据库中简称为表。表存储在由RDBMS管理的数据库中,如图1-5所示。一个数据库中可以存储多个表。
图1-5 数据库和表的关系
根据SQL语句的内容返回的数据同样必须是二维表的形式,这也是关系数据库的特征之一。返回结果如果不是二维表的SQL语句则无法执行。另外,图1-5中只有一个数据库,我们还可以创建多个数据库分别用于不同用途。图1-6所示为1-3节之后的学习中实际用到的商品表的内容。
图1-6 表的示例(商品表)
表的列(垂直方向)称为字段,它代表了保存在表中的数据项目。在表1-2的商品表中,从商品编号到登记日期一共有6列。对于列的约束比Excel更加严格,定义为数字的列只能输入数字,定义为日期的列只能输入日期(将在1-4节详细介绍)。
表1-2 商品表
与之相对,表的行(水平方向)称为记录,它相当于一条数据。商品表中总共有8行数据。关系数据库必须以行为单位进行数据读写,请大家牢记。
法则1-1
关系数据库以行为单位读写数据。
一个单元格中只能输入一个数据。像图1-7那样,在一个单元格中输入2个或2个以上的数据是不允许的,请大家牢记。
图1-7 一个单元格中只能输入一个数据
单元格是本书特有的表述方式。实际上关系数据库对于行和列交汇的方格并没有专门的称谓。但就像图1-6那样,这个方格通过类似Excel单元格的方式管理数据,因此把它称为单元格似乎也很恰当。
法则1-2
一个单元格中只能输入一个数据。
专栏
RDBMS的用户管理为了防止重要数据被窃读或篡改,RDBMS只允许注册用户接触数据库。这里的用户并不是指Windows等操作系统的注册用户,而是只能用于RDBMS的用户。RDBMS允许注册多个用户。
注册用户的时候除了设定用户名(账号),还需要设定密码。虽然密码并不是必需的,但为了防止重要信息的泄露,还是希望大家能够设定密码。
学习要点
● SQL是为操作数据库而开发的语言。
● 虽然SQL也有标准,但实际上根据RDBMS的不同SQL也不尽相同。
● SQL通过一条语句来描述想要进行的操作,发送给RDBMS。
● 原则上SQL语句都会使用分号结尾。
● SQL根据操作目的可以分为DDL、DML和DCL。
标准SQL如前所述,所要学习的SQL是用来操作关系数据库的语言。它原本是为了提高数据库查询效率而开发的语言,但是现在不仅可以进行数据查询,就连数据的插入和删除等操作也基本上都可以通过SQL来完成了。
国际标准化组织(ISO)为SQL制定了相应的标准,以此为基准的SQL称为标准SQL(相关信息请参考专栏——标准SQL和特定的SQL)。以前,完全基于标准SQL的RDBMS很少,通常需要根据不同的RDBMS来编写特定的SQL语句。这样一来,就会造成能够在Oracle中使用的SQL语句却无法在SQL Server中使用,反之亦然。近来,对标准SQL的支持取得了一些进展,因此希望准备学习SQL的读者们能够从现在开始就牢记标准SQL的书写方式。
原则上,介绍的都是标准SQL[插图]的书写方式,但是根据RDBMS的不同也会存在一些特殊的SQL语句。如果遇到这种情况,将会通过其他途径对其进行说明。
法则1-3
学会标准SQL就可以在各种RDBMS中写SQL语句了。
SQL语句及其种类SQL用关键字、表名、列名等组合而成的一条语句(SQL语句)来描述操作的内容。关键字是指那些含义或使用方法已事先定义好的英语单词,存在包含“对表进行查询”或者“参考这个表”等各种意义的关键字。
根据对RDBMS赋予的指令种类的不同,SQL语句可以分为以下三类。
● DDL
DDL(Data Definition Language,数据定义语言)用来创建或者删除存储数据用的数据库以及数据库中的表等对象。DDL包含以下几种指令。
CREATE:创建数据库和表等对象
DROP:删除数据库和表等对象
ALTER:修改数据库和表等对象的结构
● DML
DML(Data Manipulation Language,数据操纵语言)用来查询或者变更表中的记录。DML包含以下几种指令。
SELECT:查询表中的数据
INSERT:向表中插入新数据
UPDATE:更新表中的数据
DELETE:删除表中的数据
● DCLDCL(Data Control Language,数据控制语言)用来确认或者取消对数据库中的数据进行的变更。除此之外,还可以对RDBMS的用户是否有权限操作数据库中的对象(数据库表等)进行设定。DCL包含以下几种指令。
COMMIT:确认对数据库中的数据进行的变更
ROLLBACK:取消对数据库中的数据进行的变更
GRANT:赋予用户操作权限
REVOKE:取消用户的操作权限
实际使用的SQL语句当中有90%属于DML,同样会以DML为中心进行讲解。
法则1-4
SQL根据功能不同可以分为三类,其中使用最多的是DML。
SQL的基本书写规则书写SQL语句时必须要遵守一些规则。
这些规则都非常简单,接下来就让我们逐一认识一下吧。
■ SQL语句要以分号(;)
结尾一条SQL语句可以描述一个数据库操作。在RDBMS当中,SQL语句也是逐条执行的。
众所周知,我们在句子的句尾加注标点表示结束,中文句子以句号(。)结尾,英文以点号(.)结尾,而SQL语句则使用分号(;)结尾。
法则1-5
SQL语句以分号(;)结尾。
■ SQL语句不区分大小写
SQL 不区分关键字的大小写。例如,不管写成SELECT还是select,解释都是一样的。表名和列名也是如此。
虽然可以根据个人喜好选择大写还是小写(或大小写混杂),但为了理解起来更加容易,本书使用以下规则来书写SQL语句。
● 关键字大写
● 表名的首字母大写
● 其余(列名等)小写
法则1-6
关键字不区分大小写。
但是插入到表中的数据是区分大小写的。例如,在操作过程中,数据Computer、COMPUTER或computer,三者是不一样的。
■ 常数的书写方式是固定的SQL语句常常需要直接书写字符串、日期或者数字。例如,书写向表中插入字符串、日期或者数字等数据的SQL语句。
在SQL语句中直接书写的字符串、日期或者数字等称为常数。常数的书写方式如下所示。
SQL语句中含有字符串的时候,需要像’abc’这样,使用单引号(')将字符串括起来,用来标识这是一个字符串。
SQL语句中含有日期的时候,同样需要使用单引号将其括起来。日期的格式有很多种('26 Jan 2010’或者’10/01/26’等),我们统一使用’2010-01-26’这种’年-月-日’的格式。
在SQL语句中书写数字的时候,不需要使用任何符号标识,直接写成1000这样的数字即可。
法则1-7
字符串和日期常数需要使用单引号(')括起来。
数字常数无需加注单引号(直接书写数字即可)。
■ 单词需要用半角空格或者换行来分隔
SQL语句的单词之间需使用半角空格或换行符来进行分隔。如下这种未加分隔的语句会发生错误,无法正常执行。
由程序不匹配、故障、输入错误等多种原因造成的系统或者程序未按照预定处理执行或者无法执行的状况。通常出错时,处理会被强制终止,并显示错误信息。
○ CREATE TABLE Product
× CREATETABLE Product
× CREATE TABLEProduct
但是不能使用全角空格作为单词的分隔符,否则会发生错误,出现无法预期的结果。
法则1-8
单词之间需要使用半角空格或者换行符进行分隔。
专栏
标准SQL和特定的SQL
每隔几年,ANSI(美国国家标准协会)或ISO(国际标准化组织)等便会修订SQL的标准,进行语法的修订并追加新功能。
1986年,ANSI首次制定了SQL的标准,之后又进行了数次修订。
但是,SQL的标准并不强制“每种RDBMS都必须使用”。虽然支持标准SQL的RDBMS越来越多,但还是存在标准SQL无法执行的情况。这时就需要使用只能在特定RDBMS中使用的特殊SQL语句。
其实,这也是没有办法的事情,起初(大约在20世纪80年代到90年代),标准SQL能够实现的功能非常有限,无法完全满足实际需要。RDBMS的供应商为了弥补这些不足,不得不再单独追加所需要的功能。
尽管如此,这些特定的SQL所带来的并不都是负面的影响。标准SQL将一些独特的功能收录其中,对其自身的发展起到了积极的推进作用。过去,各个供应商为了展现本公司的优势和独特性,也曾不遗余力地开发各自特定的SQL。
2、表的创建
学习要点
● 表通过CREATE TABLE语句创建而成。
● 表和列的命名要使用有意义的文字。
● 指定列的数据类型(整数型、字符型和日期型等)。
● 可以在表中设置约束(主键约束和NOT NULL约束等)。
表的内容的创建
表1-2是1-2节举例时使用的商品表。
该表是某家小商店销售商品的一览表。商品的数量不多,不过我们可以把它想象成大量数据中的一部分(毕竟这只是为了学习SQL而创建的表)。像0003号商品的登记日期以及0006号商品的进货单价这样的空白内容,我们可以认为是由于店主疏忽而忘记输入了。
大家可以看到表1-2由6列8行所组成。最上面一行是数据的项目名,真正的数据是从第2行开始的。
数据库的创建(CREATE DATABASE语句)
前面提到,在创建表之前,一定要先创建用来存储表的数据库。运行CREATE DATABASE语句就可以在RDBMS上创建数据库了。CREATE DATABASE语句的语法如下所示。
创建数据库的CREATE DATABASE语句
create database 数据库名称;
创建数据库shop的CREATE DATABASE语句
create database shop;
此外,数据库名称、表名以及列名都要使用半角字符(英文字母、数字、符号),具体内容随后会进行介绍。
表的创建(CREATE TABLE语句)
创建好数据库之后,接下来我们使用CREATE TABLE语句在其中创建表。CREATE TABLE语句的语法如下所示。
创建表的CREATE TABLE语句
create table 表名(列名1 数据类型 该列所需约束,列名2 数据类型 该列所需的约束列名3 数据类型 该列所需的约束列名4 数据类型  该列所需的约束.......该表的约束1,该表的约束2,....);
该语法清楚地描述了我们要创建一个包含<列名1>、<列名2>、……的名称为<表名>的表,非常容易理解。每一列的数据类型(后述)是必须要指定的,还要为需要的列设置约束(后述)。约束可以在定义列的时候进行设置,也可以在语句的末尾进行设置。
在数据库中创建表1-2中的商品表(Product表)的CREATETABLE语句,如代码清单1-2所示。
代码清单1-2 创建Product表的CREATE TABLE语句
create table student(id char(4) not null,name varchar(100) not null,type varchar(32) not null,sale_price integer,purchase_price integer, regist_date date,primary key(product_id));
备忘
创建出Product表等学习中用到的一些示例表。创建这些表的SQL语句保存在本书示例程序\Sample\CreateTable\<RDBMS名>文件夹下的CreateTable<表名>.sql文件中。
命名规则
我们只能使用半角英文字母、数字、下划线(_)作为数据库、表和列的名称。例如,不能将product_id写成product-id,因为标准SQL并不允许使用连字符作为列名等名称。$、#、?这样的符号同样不能作为名称使用。
尽管有些RDBMS允许使用上述符号作为列的名称,但这也仅限于在该RDBMS中使用,并不能保证在其他RDBMS中也能使用。虽然大家可能会觉得限制有点太多了,但还是请遵守规则使用半角英文字母、数字和下划线(_)吧。
法则1-9
数据库名称、表名和列名等可以使用以下三种字符。
● 半角英文字母 ● 半角数字 ● 下划线(_)
此外,名称必须以半角英文字母开头。以符号开头的名称并不多见,但有时会碰到类似1product或者2009_sales这样以数字开头的名称。虽然可以理解,但这在标准SQL中是被禁止的。请大家使用product1或者sales_2009这样符合规则的名称。
法则1-10
名称必须以半角英文字母作为开头。
最后还有一点,在同一个数据库中不能创建两个相同名称的表,在同一个表中也不能创建两个名称相同的列。如果出现这样的情况,RDBMS会返回错误信息。
法则1-11
名称不能重复。
接下来我们根据上述规则,使用代码清单1-2中的CREATETABLE语句来创建表1-2中的商品表。表名为Product,表中的列名如表1-3所示。
表1-3 商品表和Product表列名的对应关系
数据类型的指定
Product表所包含的列,定义在CREATE TABLE Product( )的括号中。列名右边的INTEGER或者CHAR等关键字,是用来声明该列的数据类型的,所有的列都必须指定数据类型。
数据类型表示数据的种类,包括数字型、字符型和日期型等。每一列都不能存储与该列数据类型不符的数据。声明为整数型的列中不能存储’abc’这样的字符串,声明为字符型的列中也不能存储1234这样的数字。
数据类型的种类很多,各个RDBMS之间也存在很大差异。根据业务需要实际创建数据库时,一定要根据不同的RDBMS选用最恰当的数据类型。在学习SQL的时候,使用最基本的数据类型就足够了。下面我们就来介绍四种基本的数据类型。
● INTEGER型
用来指定存储整数的列的数据类型(数字型),不能存储小数。
● CHAR型
CHAR是CHARACTER(字符)的缩写,是用来指定存储字符串的列的数据类型(字符型)。可以像CHAR(10)或者CHAR(200)这样,在括号中指定该列可以存储的字符串的长度(最大长度)。字符串超出最大长度的部分是无法输入到该列中的。RDBMS不同,长度单位也不一样,既存在使用字符个数的情况,也存在使用字节长度的情况。
字符串以定长字符串的形式存储在被指定为CHAR型的列中。所谓定长字符串,就是当列中存储的字符串长度达不到最大长度的时候,使用半角空格进行补足。例如,我们向CHAR(8)类型的列中输入’abc’的时候,会以’abc(abc后面有5个半角空格)的形式保存起来。
另外,虽然之前我们说过SQL不区分英文字母的大小写,但是表中存储的字符串却是区分大小写的。也就是说,'ABC’和’abc’代表了两个不同意义的字符串。
● VARCHAR型
同CHAR类型一样,VARCHAR型也是用来指定存储字符串的列的数据类型(字符串类型),也可以通过括号内的数字来指定字符串的长度(最大长度)。但该类型的列是以可变长字符串的形式来保存字符串的[插图]。定长字符串在字符数未达到最大长度时会用半角空格补足,但可变长字符串不同,即使字符数未达到最大长度,也不会用半角空格补足。例如,我们向VARCHAR(8)类型的列中输入字符串’abc’的时候,保存的就是字符串’abc'。
该类型的列中存储的字符串也和CHAR类型一样,是区分大小写的。
特定的SQL
OracIe中使用VARCHAR2型(OracIe中也有VARCHAR这种数据类型,但并不推荐使用)。
● DATE型
用来指定存储日期(年月日)的列的数据类型(日期型)。
特定的SQL
除了年月日之外,OracIe中使用的DATE型还包含时分秒,但在本书中我们只学习日期部分。
约束的设置
约束是除了数据类型之外,对列中存储的数据进行限制或者追加条件的功能。Product表中设置了两种约束。
Product表的product_id列、product_name列和product_type列的定义如下所示。
product_id char(4) not null,product_name varchar(100) not null,product_varchar(32) not null.
数据类型的右侧设置了NOT NULL约束。NULL是代表空白(无记录)的关键字[插图]。在NULL之前加上了表示否定的NOT,就是给该列设置了不能输入空白,也就是必须输入数据的约束(如果什么都不输入就会出错)。这样一来,Product表的product_id(商品编号)列、product_name(商品名称)列和product_type(商品种类)列就都成了必须输入的项目。
另外,在创建Product表的CREATE TABLE语句的后面,还有下面这样的记述。
primary key(product_id)
这是用来给product_id列设置主键约束的。所谓键,就是在指定特定数据时使用的列的组合。键种类多样,主键(primarykey)就是可以特定一行数据的列。也就是说,如果把product_id列指定为主键,就可以通过该列取出特定的商品数据了。
反之,如果向product_id列中输入了重复数据,就无法取出唯一的特定数据了(因为无法确定唯一的一行数据)。这样就可以为某一列设置主键约束了。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
SQL系统学习笔记之数据库概述与SQL简介
mysql和oracle的区别是什么
浅谈Oracle数据库的封锁机制
SQL 简介
详细解说关系型数据库
Oracle数据库的类型LONG功能的介绍
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服