第一部分 数据库基础
一、基本概念
1.什么是SQL?
SQL即结构化查询语言,是用于关系数据库通迅的标准语言,通过SQL用户可向数据库表达自已的需求。
2.什么是客户机/服务器技术?
在客户机/服务器中,主机叫作服务器,网络通常是局域网(LAN)或是广域网(WAN).服务器通常被个人计算机或是其他的服务器或个人计算机而不是终端访问.每一台PC机都叫做一个客户机,都有访问网络的功能,允许在客户机和服务器之间通信因此叫客户机/服务器技术.
二、数据处理的发展阶段
1、手工处理阶段:
50年代中期,计算机内存、外存容量都很小,外存只有磁带,没有磁盘,硬件性能很差;软件中也没有数据管理部分,因而主要限于科学计算;这一阶段主要是用手工进行数据处理。
2、文件系统阶段:数据和程序的分离导致了文件系统的诞生。
顺序与随机文件组织并用;
批量与实时处理并存;
物理和逻辑结构有了简单变换;
软件提供存取方法;
数据冗余较多,数据不能共享;
文件或数据属于一个用户;
数据独立性差,数据结构和程序合为一体;
无集中管理,无法用全局观点而只能面向局部应用进行数据结构设计。
3、数据库系统阶段:
数据库技术的目标就是克服文件系统的弊病,解决冗余和数据独立性问题,并通过一软件系统(DBMS)来集中管理所有文件,从而实现数据共享,其本质是通过分层,第一层面向用户,第二层面向全局,第三层面向物理存贮,层和层这间通过两级变换,这样将用户应用文件与物理文件完全分离,分别实现了数据的逻辑和物理独立性。
模型:为把数据和程序完全分离,分为三种模型:
内模型或物理模型:面向计算机物理存贮;
概念模型:面向系统整体;(DBMS)
外模型:面向用户。
模式:用DDL精确定义数据模型的程序;
内模式:定义内模型的模式;
概念模式:定义概念模型的模式;
外模式:定义外模型(面向用户)的模式。
数据模型:表示实体(ENTITY)以及实体间联系(RELATIONSHIP)的模型;有四种形式:
E-R模型:最直观的描述方式,实体集用长方形表示,属性用椭圆表示,联系用菱形表示;
层次模型:可表示1-m关系,有唯一根(和父)结点;
网状模型:可表示m-m关系;
关系模型:以表来表示数据间的联系,通过表格数据而不是通过指针链接来表示和实现两实体间的关系。
三、ORACLE简介
自1970年CODD发表关系理论后,关系型数据库得到了飞速的发展,如INFORMIX、DB2等;
起初ORACLE是一发展较完善的关系型数据库,已由单一的数据库发展到多种服务,多种产品的;ORACLE RDBMS是ORACLE系统的核心,它由数据库管理的核心模块以及帮助用户和数据库管理员DBA维护、监视和使用数据库的一些实用程序组成。RDBMS的核心模块就是SQL的实现模块,它是所有实用程序的基础。
问:在三种模式(内、概念、外模式)中ORACLE是对应于哪种模式;
在四种数据模型(E-R、层次、网状、关系型)中ORACLE相应于哪种?
四、SQL命令简介
1、DDL数据定义语言.
CREATE TABLE; ALTER TABLE; DROP TABLE;
CREATE VIEW; ALTER VIEW; DROP VIEW;
CREATE INDEX; ALTER INDEX; DROP INDEX;
2、 DML数据操纵语言.
INSERT 向表中插入新数据行;
UPDATE 更新表中现有的数据;
DELETE 从表中删除几行数据;
3、 DQL数据查询语言.
SELECT 从一张或多张表中返回数据;
4、 DCL数据控制语言.
ALTER PASSWORD 更改用户密码;
GRANT 为用户赋予特权;
REVOKE 收回用户特权;
CREATE SYNONYM 创建同义词
5、 数据管理命令.
START AUDIT
STOP AUDIT
6、 事务性控制命令.
COMMIT 将事务保存到数据库;
ROLLBACK 撤消一个数据库事务;
SAVEPOINT 创建在必要时可以撤消事务的保存点;
SET TRANSACTION 设置事务。
第二部分 建立数据库
一、基本概念
1、数据库和数据库对象?
数据库是数据的集合体;
数据库对象可以是数据库中定义的任何对象,用于存储和参照数据,表是关系数据库最简单的存储形式,还有视图、索引等。
2、什么是模式?
模式数据库对象的集合,并有一个与之相关连着的特定的用户名,一个模式可以包括一张表和没有数量限制的对象.
3、数据结构
定长字符串CHAR 变长字符串VARCHAR2 数字值NUMBER
小数点数值DECIMAL 整型INTEGER 浮点小数FLOAT
日期和时间DATE 文字串 STRING NULL型数据.
二、表及其基本操作
在关系数据库中,表是数据的主要存储对象,表包含了行和列,存放着实体及其联系,表在数据库中占有的物理空间可以是永久性的,也可是暂时的。
1、创建表的基本语法为:
CREATE TABLE table_name
(field1 datatype [ not null ]
field2 datatype [ not null ]
field3 datatype [ not null ])
storage
(INITIAL x 初始空间
NEXT x 附加空间);
例:
CREATE TABLE EMPLOYEE_TBL
(EMP_ID CHAR(9) NOT NULL ,
EMP_NAME VARCHAR(40) NOT NULL ,
EMP_ZIP NUMBER(6) NULL ,
EMP_PHONE NUMBER(10) NULL)
STORAGE
( INITIAL 3K
NEXT 2K);
2、修改表的语法为:
ALTER TABLE table_name
[MODIFY][column column_name] [datatype not null | null)] [restrict | cascade]
[DROP] [constraint constraint_name]
[ADD] [column ] column definition;
例:
ALTER TABLE EMPLOYEE_TBL
MODIFY (EMP_PHONE NUMBER(11) NULL);
3、从现有表中创建一新表
CREATE TABLE NEW_TABLE_NAME AS
SELECT [* | COLUMN1 COLUM2]
FROM TABLE_NAME
[WHERE condition]
例:
CREATE TABLE PHONE_TBL AS
SELECT ( EMP_ID, EMP_PHONE)
FROM EMPLOYEE_TBL;
4、删除表的语法为:
DROP TABLE table_name
例:
DROP TABLE PHONE_TBL ;
5、ORCALE补:
DESCRIBE 显示表的结构及所有表列的概要;
三、完整性约束.
在关系数据库中,完整性约束用于确保数据的准确性和一致性,是通过参照完整性实现的。
1、主键约束:PRIMARY KEY 在表中标识一列或多个列,来使一行数据保持唯一性,用于查询参考,表的联合;
例:
ALTER TABLE EMPLOYEE_TBL
MODIFY (EMP_ID CHAR(9) NOT NULL PRIMARY KEY);
2、唯一性约束:UNIQUE 对应列不存在相同的数值;
例:
ALTER TABLE EMPLOYEE_TBL
MODIFY (EMP_PHONE NUMBER(11) NULL UNIQUE);
3、外键约束:
FOREIGN KEY KEY_NAME_FK(KEY_NAME)
FEFERENCES TBL_NAME(KEY_NAME)
例:
CREATE TABLE EMPLOYEE_PAY_TBL
(EMP_ID CHAR(9) NOT NULL ,
POSITION VARCHAR2(15) NOT NULL ,
PAY_RATE NUMBER(4,2) NOT NULL )
FOREIGN KEY EMP_ID_FK(EMP_ID)
REFERENCES EMPLOYEE_TBL(EMP_ID));
注:要在子表中插入值,必须在父表中KEY_NAME首先存在对应的值;
4、NOT NULL约束:不允许有NULL值;
注:改变表属性时,NOT NULL ->NULL可,
而NULL->NOT NULL值时,要看是否有NUL值;
5、使用Check约束:用来检查数据有效性;
例:
CREATE TABLE CUSTOMER_TBL
(CUST_ID CHAR(9) NOT NULL ,
CUST_NAME VARCHAR2 NOT NULL ,
CUST_CITY VARCHAR2 NOT NULL ,
CUST_ZIP NUMBER(5) NULL ,
CUST_PHONE NUMBER(11) ),
PRIMARY KEY (CUST_ID),
CONSTRAINT CHK_EMP_ZIP CHECK( EMP_ZIP=‘430079’);
四、规范化过程.
1、什么是规范化?
规范化是数据库中减少数据冗余的过程. 除了数据库中,名称,对象名称和形式都需要规范化.
2、将数据库规范化
在数据库规范的过程中,三个常用的范式为:
第一范式:将基本数据按主键分成称为表的逻辑单元;
第二范式:使用仅仅部分依赖于主键的数据输入到其他表中;
第三范式:从表中将不依赖于主键的数据除去;
例:
COMPANY_DATABASE
( emp_id last_name first_name middle_name
address city zip phone
position position_desc date_hire pay_rate
date_last_raise cust_id cust_name cust_address
cust_city cust_zip cust_fax qty
ord_num ord_date prod_id prod_desc
cost )
按第一范式的要求可分为三个表:
EMPLOYEE_TBL
( emp_id last_name first_name middle_name
address city zip phone
position date_hire pay_rate date_last_raise)
CUSTOMER_TBL
( cust_id cust_name cust_address cust_city
cust_zip cust_phone cust_fax qty
ord_num ord_date )
PRODUCTS_TBL
( prod_id prod_desc cost )
按第二范式的要求EMPLOYEE_TBL可分为两张表:
EMPLOYEE_TBL
( emp_id last_name first_name middle_name
address city zip phone )
EMPLOYEE_PAY_TBL
( emp_id position position_desc date_hire
pay_rate date_last_raise )
根据第三范式EMPLOYEE_PAY_TBL可分为两个表:
EMPLOYEE_PAY_TBL
( emp_id position date_hisre pay_rate
date_last_raise )
POSITION_TBL
( position position_desc )
3、规范式的好处和弊端
大型的总体数据库组织,
减少数据冗余,
数据库中的数据一致性,
更加灵活的数据库设计,
更好的数据库安全处理;
其主要弊端是降低了数据库的可操作性,因而要进行适当的非规范化。
第三部分.操纵数据.
一、数据操纵综述.
数据操纵语言(DML)是SQL的一部分,它允许数据库用户在关系型数据库中进行数据的改变.
在SQL中有三种基本的DML命令
1、INSERT(插入)
2、UPDATE(更新)
3. DELETE (删除)
二、给表中填充数据.
1、 往表中插入新数据
INSERT INTO table_name
VALUES(‘values1’,’values2’)
例:
INSERT INTO EMPLOYEE_TBL
VALUES ( ‘1’,‘武建军’,‘430079’,‘027111’)
2、往表中有限列中插入数据.
INSERT INTO table_name (‘column1’,’column2’)
VALUES(‘values1’,’values2’)
例:
INSERT INTO EMPLOYEE_TBL(‘emp_id’,’emp_name’)
VALUES ( ‘2’,‘大刘’);
3、插入另一张表中的数据
INSERT INTO table_name
SELECT [* | (‘column1’,’column2’)]
from table_name [where conditions(s)];
例:
INSERT INTO CUSTOMER_TBL
SELECT (‘emp_id’,’emp_name’,’emp_zip’,’emp_phone’)
from EMPLOYEE_TBL
where emp_zip=’430079’;
4、插入NULL值.
基本语法为: Insert into table_name (‘column1’, NULL,’column3’)
思考:
插入时,值列表中多值、少值行吗?
NULL和‘NULL’是否一样?
, ,和,‘’,行吗?
三、更新已存在的数据.
1、只更新单独一列的数据
UPDATE table_name
SET column_name = ‘value’
[where condition];
2、在一行或多行记录中更新多个列
UPDATE table_name
SET column1 =‘value’,
[column2 = ‘vlaue’];
4.从表中删除数据
从表中删除一条单独的记录或是被选的多条记录
DELETE from table_name
where [condition];
第四部分.数据库事务管理.
一、事务控制命令
事务控制是对在关系数据库中可能发生的不同事务的管理能力.
用于事务控制的命令:
1、COMMIT 命令
COMMIT 命令是一条事务命令,用于保存数据库中由事务引起的改变.COMMIT 命令保存自从上一条COMMIT或ROLLBACK 命令以来的所有事务.
语法为:COMMIT [word];
2、ROLLBACK 命令
COMMIT 命令是用于撤消那些还没有保存到数据库中由事务的事务控制命令.ROLLBACK 命令只能用于撤消上一条COMMIT命令或ROLLBACK命令执行后的事务。
语法为: ROLLBACK [word];
3、SAVEPOINT 命令
SAVEPOINT 命令保存点是在事务中,能够进行事务滚回的点,而不需要滚回整个事务
语法为: SAVEPOINT point_name;
ROLLBACK to point_name;
二、事务控制和数据库的性能
糟糕的事务控制会破坏数据库的性能,甚至给数据库带来危害。数据库反复的低性能可能是因为在大量插入,更新或删除操作中缺乏事务控制;当执行大量事务工作时,应频繁使用COMMIT和ROLLBACK命令来释放数据库空间。
第五部分 数据查询语言DQL
一、基本的Select语句
SELECT [all | * | [distinct] column1,column2…]
From table1 [,table2…]
[WHERE conditons ]
[GROUP BY column1, column2,……
[HAVING conditions ]
[ORDER BY column1 ,colunm2…]
二、使用操作符给数据分类
1、 比较操作符(= ,<>, <, >)
例:
SELECT *
FROM EMPLOYEE_TBL
WHERE EMP_ZIP=’430079’;
2、 逻辑操作符(IS NULL , BETWEEN , IN , LIKE , EXISTS , UNIQUE , ALL ,ANY)
IS NULL:用于比较带有NULL值的值;
BETWEEN:用于在一个范围中取值;
IN :用于返回在一系列指定的值中的结果;
LIKE :取同指定值相似的值(%代表任意个字符,而_代表一个);
EXISTS :查询是否存在一行符合某条件的数据;
UNIQUE :测试是否有重复数据;
ALL :指数据集中的每一个值;
ANY :指数据集中的任一个值;
例:
SELECT *
FROM EMPLOYEE_TBL
WHERE EMP_SALARY >ALL
(SELECT EMP_SALARY
FROM EMP_SALARY
WHERE EMP_CITY=’武汉’);
3、 连接符(AND , OR)
例:
SELECT *
FROM EMPLOYEE_TBL
WHERE EMP_ZIP=’430079’
OR EMP_ZIP=’430074’;
4、 数学运算符的组合
例:
SELECT EMP_SALARY*12
FROM EMPLOYEE_TBL;
三、统计查询结果数据
1、COUNT:用于统计行数;
例:
SELECT COUNT(EMP_ID)
FROM EMPLOYEE_TBL;
2、SUM:用于返回一组数据行中某列值的总和;
例:
SELECT SUM(EMP_SALARY)
FROM EMPLOYEE_TBL;
3、AVG:用于确定一组数据的平均值;
例:
SELECT AVG(EMP_SALARY)
FROM EMPLOYEE_TBL;
4、MAX:用于返回一组数据的最大值;
例:
SELECT MAX(EMP_SALARY)
FROM EMPLOYEE_TBL;
5、MIN:用于返回一组数据的最小值;
例:
SELECT MIN(EMP_SALARY)
FROM EMPLOYEE_TBL;
四、排序和分组
1、 分组:GROUP BY
例:
SELECT EMPLOYEE_NAME ,EMP_CITY
FROM EMPLOYEE_TBL
GROUP BY EMP_CITY,EMPLOYEE_NAME;
注:如果在SELECT子句中引用的是列名,列名一定也会用于GROUP BY的中;
不能像ORDER BY一样通过使用整数列名来进行排序,除非便用了UNION,并且列名都各自不同。
2、 排序:ORDER BY
例:
SELECT EMP_CITY, COUNT(*)
FROM EMPLOYEE_TBL
GROUP BY EMP_CITY
ORDER BY 2,1;
3、 HAVING子句:跟在GROUP BY之后,ORDER BY 之前,设置条件;
例:
SELECT EMP_CITY,AVG(PAY_RATE),AVG(EMP_SALARY)
FROM EMP_PAY_TBL
WHERE CITY <>‘武汉‘
GROUP BY EMP_CITY
HAVING AVG(EMP_SALARY)>2000;
第六部分 实习题
1请问SQL命令可分为哪六类,每一类都有哪些具体的命令?
2 请建立以下五个表格,并用DESC命令检查它们的结构。
表employee_tbl结构
emp_id varchar2(9) not null,
last_name varchar2(15) not null,
first_name varchar2(15) not null,
middle_name varchar2(15),
address varchar2(30) not null,
city varchar2(15) not null,
state char(2) not null,
zip number(5) not null,
phone char(10),
pager char(10),
constraint emp_pk primary key(emp_id)
表employee_pay_tbl结构
emp_id varchar2(9) not null,
position varchar2(15) not null,
date_hire date,
pay_rate number(4,2),
date_last_raise date,
salary number(8,2),
bonus number(6,2),
constraint emp_fk foreign key(emp_id) references employee_tbl(emp_id)
表customer_tbl结构
cust_id varchar2(10) not null primary key,
cust_name varchar2(30) not null,
cust_address varchar(20) not null,
cust_city varchar2(15) not null,
cust_state char(2) not null,
cust_zip number(5) not null,
cust_phone number(10),
cust_fax number(10)
表orders_tbl结构
ord_num varchar2(10) not null primary key,
cust_id varchar2(10) not null,
prod_id varchar2(10) not null,
qty number(6) not null,
ord_date date
表products_tbl结构
prod_id varchar2(10) not null primary key,
prod_desc varchar2(40) not null,
cost number(6,2) not null