1. 数据库原理
1.1. 数据库简介
1.1.1. 文件存储
对数据的存储需求一直存在。保存数据的方式,经历了手工管理、文件管理等阶段,直至数据库管理阶段。
文件存储方式保存数据的弊端:
- 缺乏对数据的整体管理,数据不便修改;
- 不利于数据分析和共享;
- 数据量急剧增长,大量数据不可能长期保存在文件中。
数据库应运而生,是人们存放数据、访问数据、操作数据的存储仓库。
1.1.2. DB和DBMS
数据库(Database,简称DB)是按照数据结构来组织、存储和管理数据的仓库。
数据库管理系统(Database Management System,简称DBMS):管理数据库的软件。
数据库建立了数据之间的联系,使用结构化的方式组织和处理数据,能够统一、集中及独立的管理数据,使数据的存取独立于使用数据的程序,实现了数据共享。
数据库的典型特征包括:数据的结构化,数据间的共享,减少数据的冗余度,以及数据的独立性。
数据库成为数据的知识仓库,并对这些数据的存储、访问、安全、数据一致性、并发操作及备份恢复负责。
图-1 DB和DBMS
1.1.3. 关系数据库简介
关系是一个数学概念,描述两个元素间的关联或对应关系。所以关系型数据库,即是使用关系模型把数据组织到数据表(Table)中。现实世界可以用数据来描述。
主流数据库产品:
- Oracle(Oracle)
- DB2(IBM)
- SQL Server(MS)
- MySQL(Oracle)
1.1.4. 表的概念
在关系数据库中,数据被存放于二维数据表(Table)中。
一个关系数据库由多个数据表组成,数据表是关系数据库的基本存储结构,由行和列组成,行(Row)也就是横排数据,也经常被称作记录(Record),列(Column)就是纵列数据,也被称作字段(Field)。表和表之间是存在关联关系的。
1.2. 主流关系型数据库
1.2.1. Oracle数据库概述
Oracle是当今著名的Oracle(甲骨文)公司的数据库产品,它是世界上第一个商品化的关系型数据库管理系统,也是第一个推出和数据库结合的第四代语言开发工具的数据库产品。
Oracle采用标准的SQL结构化查询语言,支持多种数据类型,提供面向对象的数据支持,具有第四代语言开发工具,支持UNIX、WINDOWS、OS/2等多种平台。Oracle公司的软件产品丰富,包括Oracle服务器产品,Oracle开发工具和Oracle应用软件。其中最著名的就是Oracle数据库,目前最新的版本是Oracle 12c。
1.2.2. DB2数据库概述
DB2是IBM的关系型数据库管理系统,DB2有很多不同的版本,可以运行在从掌上产品到大型机不同的终端机器上。DB2 Universal Database Personal Edition和DB2 Universal Database Workgroup Edition分别是为OS/2和Windows系统的单用户和多用户提供的数据库管理系统。
DB2在高端数据库的主要竞争对手是Oracle。
1.2.3. Sybase数据库
Sybase是美国Sybase公司研制的一种关系型数据库系统,是较早采用C/S技术的数据库厂商,是一种典型的UNIX或Windows NT平台上客户机/服务器环境下的大型数据库系统。 Sybase通常与Sybase SQL Anywhere用于客户机/服务器环境,前者作为服务器数据库,后者为客户机数据库,采用该公司研制的PowerBuilder为开发工具,在国内大中型系统中具有广泛的应用。
SYBASE主要有三种版本,一是UNIX操作系统下运行的版本,二是Novell Netware环境下运行的版本,三是Windows NT环境下运行的版本。对UNIX操作系统目前广泛应用的为SYBASE 10 及SYABSE 11 for SCO UNIX。
2010年Sybase被SAP收购。
1.2.4. SQL Server数据库概述
Microsoft SQL Server是运行在Windows NT服务器上,支持C/S结构的数据库管理系统。它采用标准SQL语言,微软公司对它进行了部分扩充而成为事务SQL(Transact-SQL)。
SQL Server最早是微软为了要和IBM竞争时,与Sybase合作所产生的,其最早的发展者是Sybase,和Sybase数据库完全兼容。在与Sybase终止合作关系后,微软自主开发出SQL Server 6.0版,往后的SQL Server即均由微软自行研发。最新的版本是SQL Server 2012,上一版本是2008。
Microsoft SQL Server几个初始版本适用于中小企业的数据库管理,但是后来它的应用范围有所扩展,已经触及到大型、跨国企业的数据库管理。
1.2.5. MySQL数据库概述
MySQL是一个开放源码的小型关系型数据库管理系统,开发者为瑞典MySQL AB公司。目前MySQL被广泛地应用在Internet上的中小型网站中。
与其它的大型数据库例如Oracle、IBM DB2等相比,MySQL自有它的不足之处,如规模小、功能有限等,但对于一般个人使用者和中小型企业来说,MySQL提供的功能已经绰绰有余,而且由于MySQL是开放源码软件,因此可以大大降低总体拥有成本,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库。
2008年1月16日,Sun正式收购MySQL。2009年4月20日,SUN被Oracle公司收购。目前的最新版本是MySQL5.6.
1.3. SQL概述
1.3.1. 结构化查询语言
SQL(Structured Query Language) 是结构化查询语言的缩写。
SQL是在关系数据库上执行数据操作、检索及维护所使用的标准语言,可以用来查询数据,操纵数据,定义数据,控制数据,所有数据库都使用相同或者相似的语言。
SQL可分为:
- 数据定义语言(DDL) : Data Definition Language
- 数据操纵语言(DML) : Data Manipulation Language
- 事务控制语言(TCL):Transaction Control Language)
- 数据查询语言(DQL):Data Query Language
- 数据控制语言(DCL) : Data Control Language
执行SQL语句时,用户只需要知道其逻辑含义,而不需要知道SQL语句的具体执行步骤。
1.3.2. 数据定义语言(DDL)
用于建立、修改、删除数据库对象,包括创建语句(CREATE)、修改语句(ALTER)、删除语句(DROP),比如使用CREATE TABLE创建表,使用ALTER TABLE修改表,使用DROPTABLE删除表等动作。这类语言不需要事务的参与,自动提交。
1.3.3. 数据操作语言(DML)
用于改变数据库数据,包括INSERT、UPDATE、DELETE三条语句。其中,INSERT语句用于将数据插入到数据库中,UPDATE语句用于更新数据库中已存在的数据,DELETE用于删除数据库中已存在的数据。DML语言和事务是相关的,执行完DML操作后必须经过事务控制语句提交后才真正的将改变应用到数据库中。
1.3.4. 事务控制语言(TCL)
用来维护数据一致性的语句,包括提交(COMMIT)、回滚(ROLLBACK)、保存点(SAVEPOINT)三条语句,其中COMMIT用来确认已经进行的数据库改变, ROLLBACK语句用来取消已经进行的数据库改变,当执行DML操作后(也就是上面说的增加、修改、删除等动作),可以使用COMMIT语句来确认这种改变,或者使用ROLLBACK取消这种改变。SAVEPOINT语句用来设置保存点,使当前的事务可以回退到指定的保存点,便于取消部分改变。
1.3.5. 数据查询语言(DQL)
用来查询所需要的数据。使用最广泛,语法灵活复杂。
1.3.6. 数据控制语言(DCL)
用于执行权限的授予和收回操作、创建用户等,包括授予(GRANT)语句,收回(REVOKE)语句,CREATE USER语句,其中GRANT用于给用户或角色授予权限, REVOKE用于收回用户或角色已有的权限。DCL语句也不需要事务的参与,是自动提交的。
1.4. Oracle数据库安装和访问
1.4.1. Oracle数据库安装(Windows)
打开Oracle首页http://www.oracle/,通过Downloads进入Oracle数据库的下载页面。
安装过程(以本地安装为例):
步骤1:解压,双击setup.exe,启动安装向导;
图-2 Oracle数据库的安装页面
在此步骤的设置如下:
- 选择基本安装,指定要安装的Oracle数据库的基位置和主目录位置;
- 安装类型为企业版;
- 创建启动数据库(在安装数据库软件同时创建数据库,也可以在安装完毕后单独创建,此处选择默认值同时创建);
- 指定全局数据库名称为orcl,以及口令,需要记住自己的密码,这里设置为oracle。
然后点击“下一步”按钮,
步骤2:进入检查安装环境的步骤,用来检查软硬件环境是否符合Oracle11g的安装要求,如图-3。如果满足安装要求,点击“下一步”按钮。
图-3 Oracle数据库的安装环境检查
步骤3:检查通过后,进入安装概要页面,如图-4。在这步可以检查之前的设置,包括安装类型和要安装的组件,如果有问题,点击“上一步”按钮回去修改,如果确认没问题,点击“安装”按钮,进入安装阶段。
图-4 Oracle数据库的安装概要
步骤4:提示正在安装。根据机器的软硬件配置不同,这个步骤可能耗费不同的时间。图略。
步骤5:进入配置助手步骤,这个过程不需要用户干涉。图略。
步骤6:创建数据库,图略。
步骤7:数据库创建完成后,提示配置助手界面,显示数据库的初始信息。图略。
在此步骤中可以点击“口令管理”按钮进行数据库初始用户的口令管理,这个步骤此时可以忽略,待安装完成后再进行口令管理。完成后,点击“确定”按钮离开口令管理界面。
步骤8:弹出安装成功窗口,图略。
步骤9:在安装成功界面上点击“下一步”按钮,提示安装结束。如图-5。
图-5 Oracle数据库安装结束
1.4.2. Oracle数据库安装(Linux)
在Oracle官网下载所需的软件包,检查软硬件环境是否符合要求,规划空间和目录结构,安装数据库并创建配置。
安装过程略。
1.4.3. 远程登录数据库服务器
Oracle数据库作为市场以及技术上领先的数据库产品,提供了丰富和简单易用的数据库开发和管理工具。有两种主要工具,一是命令行工具,Oracle自带的SQL*PLUS,二是Oracle提供的图形界面工具:SQL Developer。
这些工具可能和数据库在同一台服务器上,也可能安装在另一台机器中。
图-6 数据库和客户端
1.4.4. 使用SQL*PLUS
SQL*Plus是Oracle数据库提供的和数据库进行交互的工具,是被系统管理员和开发人员广泛使用的开发和管理工具,功能强大,使用简单,可以运行在任何Oracle运行的平台上,默认和数据库一起安装。SQL*Plus是一个基于传统的C/S结构的SQL开发工具,客户端和服务器端可以在同一台主机或不同主机上。
在图-6中,我们主要使用最上面那种访问方式。
首先,远程登录到数据库所在的机器上,输入远程机器操作系统的帐号和密码:
图-7 远程登录数据库服务器
然后在%提示符下,输入SQLPlus命令,并输入数据库的帐号和密码:
图-8 运行sqlplus,登录数据库
如果出现SQL提示符,则表示登录成功:
图-9登录数据库成功
退出时,在SQL>后输入exit即可:
图-10退出SQL*Plus
再输入exit,即退出远程服务器。
1.4.5. 使用Oracle SQL Developer
Oracle SQL Developer是Oracle官方出品的免费图形化开发工具,相对SQL*Plus来说,图形化的界面便于操作,不必记忆大量的命令,输出结果美观。它的基本功能包括结果的格式化输出,编辑器自动提示,代码美化,显示SQL的执行计划,监控会话,编写以及调试存储过程等。官方和免费两个特征让这个工具极具吸引力。
SQL Developer工具的主界面,如图-11所示。
图-11SQL Developer打开后的界面
第一次进入SQL Developer,需要设置连接参数。首先在窗口左边的Connection上按右键,开启一个新的连接,输入远程数据库的参数,界面如图-12。
图-12在SQL Developer中设置连接用户信息
成功建立了连接之后,在连接上按右键点击Connect,将打开对应用户方案中的数据库对象。如图-13。
图-13在SQL Developer中打开用户scott
在这个界面中,即可操作SQL语句了。
2. SQL(DDL、DML)
2.1. Oracle数据类型
2.1.1. NUMBER
NUMBER表示数字类型,经常被定义成NUMBER(P,S)形式,其中:
- P表示数字的总位数
- S表示小数点后面的位数
例如在表Emp中的Sal列的定义如下:
- Sal NUMBER(6,2)
表示Sal列中的数据,整数位最大为4位,小数位最大位数是2位,也就是最大取值:9999.99。
2.1.2. CHAR
CHAR表示固定长度的字符类型,经常被定义成CHAR(N)形式, N表示占用的字节数,N的最大取值是2000。
例如在表Emp中的Ename列的定义如下:
- Ename CHAR(20);
表示Ename列中最多可存储20个字节的字符串,并且占用的空间是固定的20个字节。
2.1.3. VARCHAR2
VARCHAR2表示变长的字符类型,定义格式是VARCHAR2(N), N表示最多可占用的字节数,最大长度是4000字节。
例如在表Emp中的JOB列的定义如下:
- JOB VARCHAR2(100);
表示JOB列中最多可存储长度为100个字节的字符串。根据其中保存的数据长度,占用的空间是变化的,最大占用空间为100个字节。
2.1.4. DATE
DATE用于定义日期时间的数据,长度是7个字节,默认格式是:DD-MON-RR, 例如:“11-APR-71”。如果是中文环境,是“11-4月-71”这种形式。
例如在表Emp中的Hiredate列的定义如下:
- Hiredate DATE;
表示Hiredate列中存放的是日期数据。
2.2. 创建表
2.2.1. CREATE语句
创建表的语法是:
- CREATE TABLE [schema.]table_name(
- column_name datatype[DEFAULT expr][,…]
- );
创建职员表的例子:
- --创建表emp
- CREATE TABLE emp(
- id NUMBER(10),
- name VARCHAR2(20),
- gender CHAR(1),
- birth DATE,
- salary NUMBER(6,2),
- job VARCHAR2(30),
- deptid NUMBER(2)
- );
2.2.2. DESC语句
DESC是查看表的数据结构,语法是:
- DESC table_name;
查看emp表的结构,将会得到的结果如图-14所示:
图-14查看数据表的结构
2.2.3. DEFAULT
可以通过DEFAULT子句给列指定默认值,例如,在emp表中给gender列赋默认值‘M’,如果插入数据时没有指定性别的员工,则默认是男性。
创建表emp1:
- CREATE TABLE emp1(
- id NUMBER(10),
- name VARCHAR2(20),
- gender CHAR(1) DEFAULT ‘M’,
- birth DATE,
- salary NUMBER(6,2),
- job VARCHAR2(30),
- deptid NUMBER(2)
- );
2.2.4. NOT NULL
默认情况下,任何列都允许有空值。非空(Not Null)是一种约束条件,用于确保字段值不为空,当某个字段被设置了非空约束条件,这个字段中必须存在有效值,也就是说,当执行插入数据的操作时,必须提供这个列的数据,当执行更新操作时,不能给这个列的值设置为NULL。
创建表emp2,设置name字段为非空,也即是表emp2中的每条记录,name列都必须有值。
- CREATE TABLE emp2(
- id NUMBER(10),
- name VARCHAR2(20) NOT NULL,
- gender CHAR(1),
- birth DATE,
- salary NUMBER(6,2),
- job VARCHAR2(30),
- deptid NUMBER(2)
- );
2.3. 修改表
2.3.1. 修改表名
在建表后如果希望修改表名,可以使用RENAME语句实现,语法如下,将改变表名old_name为new_name:
- RENAME old_name TO new_name;
举例说明,如果要将表名emp修改为employee,使用如下语法:
- RENAME emp TO employee;
2.3.2. 增加列
在建表之后,要给表增加列可以使用ALTER TABLE的ADD子句实现。语法如下:
- ALTER TABLE table_name ADD
- (column datatype [DEFAULT expr] [, column datatype…])
注意一点,列只能增加在最后,不能插入到现有的列中。下例给表employee增加一列hiredate,并设置默认值为当前日期。
- ALTER TABLE employee ADD (hiredate DATE DEFAULT sysdate);
2.3.3. 删除列
在建表之后,使用ALTER TABLE的DROP子句删除不需要的列。语法如下:
- ALTER TABLE table_name DROP (column);
删除字段需要从每行中删掉该字段占据的长度和数据,并释放在数据块中占据的空间,如果表记录比较大,删除字段可能需要比较长的时间。
下例删除表employee的列hiredate:
- ALTER TABLE employee DROP (hiredate);
2.3.4. 修改列
建表之后,可以改变表中列的数据类型、长度和默认值,注意这种修改仅对以后插入的数据有效,另外如果表中已经有数据的情况下,把长度由大改小,有可能不成功,比如原来的类型是VARCHAR2(100),其中已经存放了100个字节长度的数据,如果要改为VARCHAR2(80),则不会修改成功。
语法如下:
- ALTER TABLE table_name MODIFY
- (column datatype [DEFAULT expr] [, column datatype…])
下例修改表employee的列job,并增加默认值的设置:
- ALTER TABLE employee
- MODIFY(job VARCHAR2(40) DEFAULT 'CLERK' );
2.4. DML语句
在做后续练习之前,先熟悉本部分使用的样例表emp和dept的结构和数据:
- DROP TABLE dept;
- CREATE TABLE dept
- (deptno NUMBER(2) CONSTRAINT PK_DEPT PRIMARY KEY,
- dname VARCHAR2(14) ,
- loc VARCHAR2(13) ) ;
- DROP TABLE emp;
- CREATE TABLE emp
- (empno NUMBER(4) CONSTRAINT PK_EMP PRIMARY KEY,
- ename VARCHAR2(10),
- job VARCHAR2(15),
- mgr NUMBER(4),
- hiredate DATE,
- sal NUMBER(7,2),
- comm NUMBER(7,2),
- deptno NUMBER(2) CONSTRAINT FK_DEPTNO REFERENCES DEPT);
- INSERT INTO dept VALUES
- (10,'ACCOUNTING','NEW YORK');
- INSERT INTO dept VALUES
- (20,'RESEARCH','DALLAS');
- INSERT INTO dept VALUES
- (30,'SALES','CHICAGO');
- INSERT INTO dept VALUES
- (40,'OPERATIONS','BOSTON');
- SELECT * FROM dept;
- INSERT INTO emp VALUES(7369,'SMITH','CLERK',7902,to_date('17-12-1980','dd-mm-yyyy'),800,NULL,20);
- INSERT INTO emp VALUES(7499,'ALLEN','SALESMAN',7698,to_date('20-2-1981','dd-mm-yyyy'),1600,300,30);
- INSERT INTO emp VALUES(7521,'WARD','SALESMAN',7698,to_date('22-2-1981','dd-mm-yyyy'),1250,500,30);
- INSERT INTO emp VALUES(7566,'JONES','MANAGER',7839,to_date('2-4-1981','dd-mm-yyyy'),2975,NULL,20);
- INSERT INTO emp VALUES(7654,'MARTIN','SALESMAN',7698,to_date('28-9-1981','dd-mm-yyyy'),1250,1400,30);
- INSERT INTO emp VALUES(7698,'BLAKE','MANAGER',7839,to_date('1-5-1981','dd-mm-yyyy'),2850,NULL,30);
- INSERT INTO emp VALUES(7782,'CLARK','MANAGER',7839,to_date('9-6-1981','dd-mm-yyyy'),2450,NULL,10);
- INSERT INTO emp VALUES(7788,'SCOTT','ANALYST',7566,to_date('19-4-87','dd-mm-yyyy'),3000,NULL,20);
- INSERT INTO emp VALUES(7839,'KING','PRESIDENT',NULL,to_date('17-11-1981','dd-mm-yyyy'),5000,NULL,10);
- INSERT INTO emp VALUES(7844,'TURNER','SALESMAN',7698,to_date('8-9-1981','dd-mm-yyyy'),1500,0,30);
- INSERT INTO emp VALUES(7876,'ADAMS','CLERK',7788,to_date('23-5-87','dd-mm-yyyy'),1100,NULL,20);
- INSERT INTO emp VALUES(7900,'JAMES','CLERK',7698,to_date('3-12-1981','dd-mm-yyyy'),950,NULL,30);
- INSERT INTO emp VALUES(7902,'FORD','ANALYST',7566,to_date('3-12-1981','dd-mm-yyyy'),3000,NULL,20);
- INSERT INTO emp VALUES(7934,'MILLER','CLERK',7782,to_date('23-1-1982','dd-mm-yyyy'),1300,NULL,10);
2.4.1. INSERT语句
INSERT语句用来给数据表增加记录,每次增加一条记录。语法如下:
- INSERT INTO table_name[(column[, column…])]
- VALUES(value[, value…]);
需要注意的一点,所有的DML操作,都需要再执行事务提交语句commit,才算真正确认了此操作。
向employee表插入一条记录的例子如下:
- INSERT INTO employee(id, name, job, salary)
- VALUES(1001, 'rose', 'PROGRAMMER', 5500);
Oracle中的日期数据比较特殊,如果插入的列有日期字段,需要考虑日期的格式。Oracle的默认的日期格式‘DD-MON-RR,你或者按照默认格式插入数据,或者自定义日期格式,用TO_DATE函数转换为日期类型的数据。
- --使用默认日期格式插入记录
- INSERT INTO employee(id, name, job,birth)
- VALUES(1002, 'martha', 'ANALYST', '01-9月-89');
- --使用自定义日期格式插入记录
- INSERT INTO employee(id, name, job, birth)
- VALUES(1003, 'donna', 'MANAGER',
- TO_DATE('1978-09-01', 'YYYY-MM-DD'));
2.4.2. UPDATE语句
UPDATE语句用来更新表中的记录,语法如下:
- UPDATE table_name
- SET column = value [, column = value]…
- [WHERE condition];
其中WHERE子句是可选的,但是如果没有WHERE子句,则全表的数据都会被更新,务必小心。
下例更改职员ROSE的薪水为8500:
- UPDATE employee SET salary = 8500 WHERE name = 'ROSE';
2.4.3. DELETE语句
DELETE语句用来删除表中的记录,语法如下:
- DELETE [FROM] table_name [WHERE condition];
和UPDATE语句一样,WHERE子句是可选的,但是如果没有WHERE子句,则全表的数据都会被删除,务必确认后再予以删除。
下例将删除职位是空的员工记录:
- DELETE FROM employee WHERE job is null;