讲Java数据库程序设计,首先要了解一点数据库系统。
数据库系统包含三个方面:
1、存放数据的数据库
2、处理数据的DBMS(data basic management system)即数据库管理系统
3、提供数据的应用程序
目前,多数数据库系统都是基于关系数据模型的关系数据库系统,即数据以若干二维表的形式储存,这种模型又有三个要素:结构(数据的表示)、完整性(约束条件)和语言(处理数据方式)。
关系数据库中,每个二维表名称唯一,其中行叫“记录”,列叫“字段”,举例学生信息如下以助理解记录与字段的含义:
Student
No. | Name | Age | Sex |
1605001 | Li 4 | 18 | M |
1605002 | Zh 3 | 19 | W |
Score
No. | Subject | Score |
1605001 | Java | 88 |
1605001 | Math | 92 |
1605002 | Math | 91 |
1605002 | English | 85 |
完整性约束
完整性约束有三种类型:域约束,主码约束,外码约束。
1、域约束。指对字段的取值范围进行约束,比如Score值设置在0~100;也可指定是否允许字段值为null
2、主码约束。主码也被称为主键,是一个表中用于唯一确定一条记录的一个字段或最小字段的字段组,由数据库设计者在设计时指定。主码可由一个字段组成,也可由多个字段组成(复合主码),若一张表有多个可被作为主码的字段,则称它们为候选码(键)。
3、外码约束。外码是表与表之间的纽带,指某表中字段不是该表的主码,却是另一表的主码,则称它为该表的外码。比如Score表中,No.并不是Score的主码(不能唯一确定一个记录),却是Student表的主码,因此称No.为Score表的一个外码,通过它将两表建起联系。
有一点值得注意的是,虽然所有数据库系统都支持主外码,但并非所有数据库都支持域约束
SQL
SQL感觉对初学者来说要比DBMS更熟悉(至少对我来说是这样),以致估计不少人就直接把SQL当数据库了。其实,SQL的全称是Structured Query Language,结构化查询语言,也就是操作数据库的程序语言。用它就可以在任何关系数据库管理系统(SQL Server, MySQL,Oracle,Sybase,IBM DB2,MS Access等)中对数据库进行操作了。但是,SQL虽对关系数据库管理系统通用,但一些DBMS在基础的SQL上进行了扩展,这些扩展特性在另一个DBMS中未必也是可用的。
注:
①SQL中的关键字不区分大小写
②SQL中不区分Char和String且两者界定符单双引号皆可用。
③下文所用的几个符号规范介绍:关键字大写;数据库与表名与Java的类一样;字段名与Java的变量一样;[]表可选,{}表必选,<>表用户必须提供,|表单选,[,2,...n]表可重复n次
下面以MySQL为例介绍一下数据库的基本操作
1.创建数据库:
CREAT DATABASE<Name>
2.创建表:
CREAT TABLE<Name>(<字段名><数据类型>[<字段级完整性约束>][,2,...n][,<表级完整性约束>]);
完整性约束主要有NULL&NOT NULL是否可为空, PRIMARY KEY主码, UNIQUE值具有唯一性
3.删除表:
DROP DATABASE<Name>
4.修改表结构:
ALTER TABLE<Name>
[ALTER COLUMN<字段名><数据类型>]
[ADD COLUMN<字段名><数据类型>[<字段级完整性约束>] |
[DROP COLUMN<字段名>] | [DROP CONSTRAINT<完整性约束>]
5.表数据操作:包括增删查改四部分,对应命令INSERT, DELETE, SELECT, UPDATE
INSERT INTO<Name>[ (<字段名[,...,n]>) ] VALUES (<值>[,...,n]);
若不指定字段,则数据排列顺序应和创建表时字段顺序一致。
UPDATE<Name> SET<字段名>=<表达式>[,<字段名>=<表达式> WHERE<条件>];
DELETE FROM<Name>[WHERE<条件>];
WHERE省略则对整个表中数据进行操作
SELECT [ALL|DISTINCT][TOP n [PERCENT]] {*| {<字段名>|<表达式>}
[ [AS]<别名>|<字段名>[AS]<别名>]}[,...,n] ]
FROM<表名>[WHERE<查询条件表达式>]
字段名表>[HAVING<分组条件>] ]
[ORDER BY<次序表达式>[ASC|DESC]]
参数说明:ALL|DISTINCT表示是否显示重复记录,TOP表示在结果中输出前多少条,*表示全部字段,AS<别名>表示结果中用别名替换字段名显示,GROUPED BY表示按照<字段名表>的值以HAVING的条件将记录进行分组,每组只返回一个结果,ASC|DESC表示升降序
数据库的表达式类似其它语言,也有很多对应运算符,列举常用如下:
WHERE常用运算符表
=,<,>,>=,<=,!= | 比较大小 |
BETWEEN AND,NOT BETWEEN AND | 确定范围 |
IN,NOT IN | 确定集合 |
LIKE,NOT LIKE | 字符匹配 |
IS NULL,IS NOT NULL | 判断空值 |
AND,OR,NOT | 逻辑表示(多重条件) |
LIKE&NOT LIKE的匹配串中通配符
通配符 | 功能 | 举例 |
% | 代表0~n个字符 | '李%' |
下划线 | 代表单个字符 | '李_蛋' |
[] | 在某一范围内的字符 | [0-9] |
[^] | 不在某一范围内的字符 | [^0-9] |
常用函数(详见百度,嘻嘻)
AVG(expression) | 按列计算平均值 |
SUM(expression) | 按列计算值的总和 |
MAX(expression) | 求一列中的最大值 |
MIN(expression) | 求一列中的最小值 |
COUNT(expression) | (*)统计记录总数,([DISTINCT]<字段名>)统计相应字段非空值数,[]表示不包括重复值 |
STDEV(expression) | 返回表达式中所有数据的标准差 |
创建学生信息数据库举例:CREATE DATABASE StudentScore;
CREATE TABLE Student(sNo CHAR(9) NOT NULL PRIMARY KEY,sName CHAR(10) NOT NULL,sAge CHAR(7),sSex CHAR(2));
CREATE TABLE Teacher(tNo CHAR(9) NOT NULL PRIMARY KEY,tName CHAR(10) NOT NULL,tAge INT,tSex char(2));
DROP TABLE Teacher;
ALTER TABLE Student CHANGE COLUMN sAge INT;
INSERT INTO Student(sNo,sName,sAge,sSex) VALUES('1605001','大狗',18,'M');
INSERT INTO Student(sNo,sName,sAge,sSex) VALUES('1605002','铁蛋',19,'M');
INSERT INTO Student(sNo,sName,sAge,sSex) VALUES('1605003','小花',18,'W');
INSERT INTO Student(sNo,sName,sAge,sSex) VALUES('1605004','丽丽',20,'W');
INSERT INTO Student(sNo,sName,sAge,sSex) VALUES('1605005','李大',21,'M');
INSERT INTO Student(sNo,sName,sAge,sSex) VALUES('1605006','李二',19,'M');
INSERT INTO Student(sNo,sName,sAge,sSex) VALUES('1605007','小明',18,'W');
INSERT INTO Student(sNo,sName,sAge,sSex) VALUES('1605008','大宝',18,'W');
UPDATE Student SET sAge=19 WHERE sNo='1605001';
DELETE FROM Student WHERE sNo='1605002';
SELECT * FROM Student GROUPED BY SUBSTRING(sName,1,1); //查询Student表中所有信息并按sName中第一个字分组显示
其实,安装并配置好MySQL后,建表等一系列操作都可以无需打代码,只要输入名称之类参数,按下Apply,程序就会自动生成代码。(关于如何安装与配置MySQL,推荐文章:初学者使用MySQL_Workbench 6.0CE创建数据库和表,以及在表中插入数据。)
此外,当然也可以用Mysql的控制台输入指令:
本篇暂时介绍到这里,下篇介绍如何用Java程序访问数据库,感谢阅读!