1.关系数据库系统
数据库是按照一定的数据结构来组织 、存储和管理数据的仓库;数据库管理系统DBMS(Data Base Messagement System)是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库;而数据库系统(database system)由数据库、数据库管理系统以及应用程序组成。为了能够使用户访问和更新数据库,需要在DBMS之上建立应用程序。因此,可以把应用程序视为用户和数据库之间的接口。
目前,大多数数据库系统都是关系数据库系统。他们都是基于关系数据模型的,这种模型有三个要素:结构、完整性和语言。结构定义了数据的表示;完整性是一些对数据的约束,所谓约束就是当向数据库中输入数据时所必须遵守的规则,所以约束也称为限制条件;
1.1 数据库与数据库表
一个关系型数据库通常是有一个或多个二维数据库表组成,数据库中的二维数据表简称表。数据库中的所有数据和信息都被保存在这些表中。表中的每一列包括了字段名称、数据类型、宽度以及列的其他属性等信息,而每行则是包含这些字段的具体数据的记录。
1.2 完整性约束
完整性约束是对表强加了一个限制条件 ,表中的所有合法值都必须满足该条件。
一般来说,完整性约束有三种类型:域约束、主码约束和外码约束。域约束和主码约束只涉及一个表,而外码约束则涉及多个表。
1.域约束
域就是字段的取值范围,域约束就是规定一个表的字段的允许取值。
也可以指定一个字段的值能否为空值(NULL),空值是数据库中的特殊值,表示未知或不可用。
2.主码约束
主码也称为主键,是表中用于唯一确定一条记录的一个字段或最小的字段组。
说明:主码的值不能为NULL(空),否则无法区分和识别表中的记录。
3.外码约束
若一个表的某个字段(或字段组合)不是该表的主码,却是另一个表的主码,则称这样的字段为该表的外码或外键。外码是表与表之间的纽带。
注意:所有关系数据库系统都支持主码约束和外码约束。但不是所有数据库系统都支持域约束。
2.SQL
结构化查询语言(Structured Query Language,SQL)是用来定义表和完整性约束以及访问和操纵数据空的语言。
SQL可以用于SQL Server、MySQL、Oracle、Sybase、IBM DB2、MS Access或者任何其他关系数据库管理系统。本章使用MySQL为例来讲述SQL,并且使用它来进行JDBC程序设计。
在描述SQL有关语句格式是,常常用到一些符号,下面给出常见符号的含义。
● [ ]:表示可选项,即方括号中的内容可以根据需要惊醒选择;不选用时,则使用系统的默认值。方括号本身不是SQL语句的一部分,所以输入时不要输入方括号本身。
● { }:表示必选项,即大括号中的内容必须要提供。在实际操作时也不要输入大括号本身。
● < >:表示尖括号中的内容是用户必须提供的参数,输入时不要输入尖括号本身。
● | :表示只能选一项,竖线分隔多个选择项,用户必须选择其中之一。
● [,...n] :表示前面的项可重复n次,相互之间以逗号隔开。
说明:SQL 的关键字不区分大小写。但本节中采用如下的明明规则:SQL的关键字均采用大写;数据库和表的命名方式与Java类的命名方式相同;字段的命名与Java变量的命名方式相同。另外SQL种不区分字符型和字符串型量,而统一定义为字符串型量,字符串型量的定界符既可使用单引号也可使用双引号。
2.1 创建数据库
在MySQL中可以使用CREATE DATABASE 语句创建数据库。
命令格式:
CREATA DATABASE <数据库名>
参数说明:
<数据库名>--新数据库的名称,数据库名称在数据库系统中是唯一的。
EG: CREATE DATABASE StudentScore;
2.2 表操作
表是数据库中必不可少的对象。表的数据组织形式是行、列结构。表中每一行代表一条记录,每一列代表记录的一个字段。没有记录的表成为空表。
1.创建表
数据库中用于存储数据的是表,所以需要在数据库中先创建表。SQL提供创建表的语句为CREATE TABLE.
命令格式:
CREATE TABLE <表名>(<字段名><数据类型>[<字段级完整性约束>] [,<字段名><数据类型>[<字段级数据类型>]]...[,<表级数据类型>];
参数说明:
<表名>--要创建的表的名字,是合法的标识符。表名在同一数据库中不允许重名。
<字段名>--字段名称。
<数据类型>--指定字段的数据类型,对有些数据类型还需同时给出其长度、小数位数、。
<字段级完整性约束>--字段完整性约束条件。主要有:
●NULL 和NOT NULL--限制字段可以为NULL(空),或者不能为NULL。
●PRIMARY KEY--设置字段为主码。
●UNIQUE--设置字段值具有唯一性。
<表级完整性约束>--表完整性约束条件所使用的关键字与字段级完整性约束相似。
2. 删除表
命令格式:
DROP TABLE <表名>;
参数说明:
<表名>--要删除的表的名字。
说明:数据库中的表一旦被删除,表中的一切数据均不能再恢复,因此执行删除表操作时要特别小心。
3.修改表结构
命令格式:
ALTER TABLE<表名>[ALTER COLUMN<字段名><数据类型>]|[ADD COLUMN<字段名><数据类型>[<字段级完整性约束>]]|[DROP COLUM<字段名>]|[DROP CONSTRAINT<完整性约束>]
参数说明:
ALTER COLUMN子句--修改表中已有字段的定义。
ADD COLUMN子句--增加新字段及相应的完整性约束条件。
DROP COLUMN子句--在该表中删除该子句中给出的字段。
DROP CONSTRAINT子句--删除指定的完整性约束条件。
2.3 表数据操作
操作数据库中数据实际上就是使用表来管理数据的过程,这是创建表的根本目的。操作数据需要使用SQL的数据操作语言(Data Manipulation Language,DMI)功能,包括向表中插入数据、修改数据、删除数据和查询数据等,对应操作所使用的命令为INSERT(插入)、UPDATE(修改)、DELETE(删除)和SELECT(查询)等。
1.插入数据
使用CREATE TABLE命令所创建的数据表是一个只有结构的空表,因此想表中插入数据是在表结构创建之后首先需要执行的操作。SQL提供向表中插入数据的语句为INSERT。
命令格式:
INSERT INTO<表名>[(<字段名[,<字段名>]...>)]VALUES(<值>[,<值>]...);
参数说明:
<表名>--要添加新记录的表。
<字段名>--可选项,指定待添加数据的字段。
VALUES子句--指定待添加数据的具体值,当指定字段名时,VALUES子句中值的排列顺序必须和字段名的排列顺序一致;若不指定字段时,则VALUES子句中值的排列顺序必须与创建表字段时的排列顺序一致。
注意:在表定义时指定了NOT NULL约束的字段不能取空值,否则会出错。
2.修改数据
UPDATE语句用于更新表中的记录。
命令格式:
UPDATE <表名> SET <字段名>=<表达式>[,<字段名>=<表达式>[WHERE<条件>]];
参数说明:
<表名>--要修改记录的表。
SET子句--给出要修改的字段及其修改后的值。
WHERE 子句--指定待修改的记录应当满足的条件,WHERE子句省略时,则修改表中所有记录。
3.删除数据
DELETE语句用来从表中删除一条或多条记录。
命令格式:
DELETE FROM<表名>[WHERE<条件>];
参数说明:
<表名>--要删除记录的表。
WHERE子句--指定待删除的记录应当满足的条件,WHERE子句省略时,则省略表中所有记录。
2.4 数据查询
数据查询是指把数据库中存储的数据根据用户的需要提取出来,所提取出来的数据称为结果集。由于数据库查询语句SELECT是SQL的核心,所以在SQL命令中用得最多的就是SELECT语句。
命令格式:
SELECT [ALL|DISTINCT][TOP n [PERCENT]]{*|{<字段名>|<表达式>}
[[AS]<别名>]|<字段名>[[AS]<别名>]}[...n]
FROM<表名>[WHERE<查询条件表达式>]
[GROUP BY<字段名表>[HAVING<分组条件>]]
[ORDER BY<次序表达式>[ASC|DESC]];
参数说明:
ALL--指定在结果集中显示所有记录,包括重复行。ALL是默认设置。
DISTINCT--指定在结果集中显示所有记录,但不包括重复行。
TOP n [PERCENT]--指定从结果集中输出前n行,如果指定了PERCENT,表示从结果集中输出前百分之n行。
*--指定返回查询表中的所有字段。
<字段名>--指定要返回的字段。
<表达式>--返回有字段名、常量、函数以及运算符连接起来的表达式的值。
<别名>--指定在结果集中用“别名”来替换字段名或表达式进行显示。
FROM子句--用来指定查询的表或视图。
WHERE 子句--用于设置查询条件。
GROUP BY子句--指明按照<字段名表>中的值进行分组,该字段的值相同的记录为一个组。分组后每个组只返回一行结果。如果GROUP BY子句带HAVING子句,则只有满足HAVING指定条件的组才予输出。如果GROUP BY 后有多个字段名,则先按第一个字段分组,再按第二个字段分组,以此类推。
HAVING子句--HAVING子句用来指定每一个分组内应该满足的条件,即对每个分组内的记录进行再筛选,它通常与GROUP BY子句一起使用。HAVING 子句中的分组条件格式与WHERE子句中的条件格式类似。
说明:HAVING与WHERE 子句的区别是:WHERE子句是对整个表中的数据筛选出满足条件的记录;而HAVING子句是对GROUP BY 分组查询后产生的组设置的条件,所以是筛选出满足条件的组。另外在HAVING子句中可以使用统计函数,而在WHERE子句则不能。
ORDER BY子句--将查询结果按指定的次序表达式的值升序或 降序排列。次序表达式可以是字段名、字段的别名或表达式。ASC指定升序排列,DESC指定降序排列,默认排序方式为ASC。
注意:ORDER BY子句需放在SQL命令中的最后。
1.简单查询
使用SELECT语句可以选择查询表中任意字段,其中<字段名>指出要查询字段的名字,可以是一个或多个。当字段名为多个是,中间要用“,”分隔。如果要查询表中的所有字段,则用“*”替代字段名。
2.条件查询
当要在表中找出满足某些条件的记录时,则使用WHERE子句设置查询条件。WHERE子句的查询条件是一个逻辑表达式,它是由各种运算符链接构成,下表给出了WHERE常用的运算符以及相应的功能。
运算符
|
功能
|
=、>、<、>=、<=、!=、<>
|
比较大小
|
BETWEEN AND、NOT BETWEEN AND
|
确定范围
|
IN、NOT IN
|
确定集合
|
LIKE、NOT LIKE
|
字符匹配
|
IS NULL、IS NOT NULL
|
判断空值
|
AND、OR、NOT
|
逻辑运算(多重条件查询)
|
其中确定范围运算符的使用格式如下:
v BETWEEN v1 AND v2 等价于 v>= v1 AND v<=v2;
v NOT BETWEEN v1 AND v2 等价于v<v1 AND v>v2
3.多重条件查询
当查询需要制定一个以上的查询条件是,这种条件称为多重条件后复合条件,此时需要使用逻辑运算符AND、NOT或OR 将其连接成复合的逻辑表达式。逻辑运算符的优先级有高到低位:NOT、AND、OR,当然可以使用括号改变其优先级。
4.模糊查询
当查询条件不知道完全精确的值时,还可以使用LIKE或NOT LIKE进行模糊查询,模糊查询也称为匹配查询。模糊查询的一般格式为:
<字段名>[NOT] LIKE <匹配串>
其中,<字段名>必须是字符型的字段,<匹配串>可以是一个完整的字符串,也可以包含通配符的字符串,字符串中的通配符及其功能如下:
通配符
|
功 能
|
实例
|
%
|
代表0个或多个字符
|
ab%表示ab后可接任意字符串
|
_(下划线)
|
代表一个字符
|
a_b表示a与b之间可为任意单个字符
|
[ ]
|
表示在某一范围的字符
|
[0~9]表示-0~9之间的字符
|
[^]
|
表示不在某一范围的字符
|
[^0~9]表示不在0~9之间的字符
|
5.常用电统计函数及统计汇总查询
在SQL中除了可以使用算术运算符*、/、+ 和 -外,SQL还提供了一系列统计函数。通过使用这些函数可以实现对表中的数据进行汇总或求平均值等各种运算。常见的统计函数如下:
函数名称
|
功 能
|
AVG(<字段名>)
|
求字段名所在列的平均值(必须是数值型列)
|
SUM(<字段名>)
|
求字段名所在列的总和(必须是数值型列)
|
MAX(<字段名>)
|
求字段名所在列的最大值
|
MIN(<字段名>)
|
求字段名所在列的最小值
|
COUNT(*)
|
统计表中记录的个数
|
COUNT([DISTINCT]<字段名>)
|
统计字段名所在列非空值的个数,DISTINCT表示不包括字段的重复值
|
说明:上述函数中除COUNT(*)外,其他函数在计算过程中均忽略NULL值。
6.ORDER BY子句
ORDER BY是一个可选的子句,它允许根据指定字段的值按照升序或者降序的顺序显示查询结果。其中默认值为升序排列,用ASC表示,将序排列用DESC表示。
7.分组数据
统计函数只能产生单一的汇总数据,使用GROUP BY子句,则可以生成分组的汇总数据。GROUP BY子句可以按关键字段的值开组织数据,关键字段值相同的为一组。一般情况下,可以根据表中的某一字段进行分组,并且要求使用统计函数,这样每一个组只能产生一个记录。
3.JDBC
3.1 JDBC概述
JDBC是为在Java程序中访问数据库而设计的一组Java API,包含有一组类与接口,用于与数据库的链接,把SQL语句发送到数据库,处理SQL语句的结果以及获取数据库的元数据等。
3.2 使用JDBC开发数据库应用程序
使用Java开发任何数据库应用程序都需要4个接口:Driver、Connection、Statement和 ResultSet。这些接口定义了使用SQL语句访问数据库的方法。JDBC驱动程序开发商或第三方已实现了这些接口中的方法。
JDBC API主要位于Java的java.sql包与javax.sql包中,下表给出了其主要的类与接口(斜体代表接口)。
类 或 接 口
|
功 能 说 明
|
DriverManager
|
负责家在各种不同驱动程序(Driver),并根据不同的请求,向调用者返回相应的数据库连接(Connection)
|
Connection
|
数据库连接,负责与数据库进行通信,SQL执行以及事务处理都是在某个特定Connection环境中进行的。可以产生用以执行 SQL 的 Statement 对象
|
Statement
|
用来执行不含参数的静态 SQL 查询和更新,并返回执行结果
|
PreparedStatement
|
用来执行包含参数的动态 SQL 查询和更新(在服务器端编译,允许重复执行以提高效率)
|
CallableStatement
|
用来调用数据库中的存储过程
|
ResultSet
|
用来获得 SQL 查询结果
|
SOLException
|
代表在数据库连接的建立、关闭或 SQL 语句的执行过程中发生了异常
|
说明:JDBC驱动程序开发商已提供了对这些接口实现,所以使用这些接口中的方法实际上调用这些接口实现类中的方法。
使用JDBC访问数据库的一般步骤为:加载驱动程序、建立与数据库的连接、创建执行方式语句、执行SQL语句、处理返回结果和关闭创建的各种对象。
1.建立与数据库的连接
数据库连接的建立包括两个步骤:一是加载相应数据库的 JDBC 驱动程序;二是建立与数据库连接。
1)加载JDBC驱动程序
加载驱动程序的一种简单方法是使用Class.forName()方法显示加载,语句如下:
Java.lang.Class.forName("JDBCDriverClass");
该方法是Class类的静态方法,参数JDBCDriverClass是要加载的JDBC驱动程序类的名称,它是以字符串形式表达到类长名。该方法可能抛出ClassNotFoundException异常,所以在调用该方法是要注意进行异常处理。
MySQL的驱动程序类为com.mysql.jdbc.Driver
MySQL的JDBC驱动程序是mysql-connector-java.jar文件中的一个类;为了使用MySQL的驱动程序,还必须将他们的jar文件添加到类路径ClassPath中。
2)创建数据库连接
由于JDBC驱动程序与数据库的连接是以对象的形式表示的,所以创建数据库连接也称为数据库连接对象。要想将JDBC驱动程序连接到一个数据库,需要使用DriverManager类中的静态方法来创建连接。
方 法 名 称
|
功 能 说 明
|
public static Connection getConnection(String url,String user,String password)
|
建立JDBC驱动程序到指定数据库URL的连接。其中url提供了一种标识数据库的方法,user为用户名,password为密码
|
public static Driver getDriver(String url)
|
返回url所指定的数据库连接的驱动程序
|
MySQL的URL模式:jdbc:mysql://hostname/dbname (hostname:主机名 dbname:数据库名)
Connection是一个接口,表示与数据库的连接,并拥有创建SQL语句的方法,以完成对表的SQL操作,同时 还为数据库事务处理提供提交和回滚的方法。一个应用程序可与单个数据库建立一个或多个连接,也可以与多个数据库建立连接。下表列出了Connection接口的常用方法及使用说明。
方 法 名 称
|
功 能 说 明
|
public statement createStatement( )
|
创建一个Statement对象用来将SQL语句发送到数据库
|
public statement createStatement(int resultSetType,int resultSetConcurrency)
|
功能同上,参数resultSetType指定结果集类型,有三个取值:
TYPE_FORWORD_ONLY表示只可向前移动记录指针;
TYPE_SCROLL_INSENSITIVE表示可双向移动记录指针,但不及时更新;
TYPE_SCROLL_SENSITIBEb 表示可双向移动记录指针,并及时追踪数据库的更新,以便更改ResultSet中的数据。
参数resultSetConcurrency指定结果集的并发模式,有两个取值:
CONCUR_READ_ONLY表示不能用结果集更新数据库中的表;
CONCUR_UPDATABLE表示能用结构集更新数据库中的表
|
public PreparedStatement prepareStatement(String sql)
|
创建一个PreparedStatement对象来将具有参数的动态SQL语句发送到数据库
|
public CallableStatement prepareCall(String sql)
|
创建一个CallableStatement对象来调用数据库的存储过程
|
public void close( )
|
断开连接,释放此Connection对象的数据库和JDBC资源
|
public boolean isClosed( )
|
用于判断Connection对象是否已经被关闭
|
public void setAutoCommit(boolean autoCommit)
|
设置是否关闭自动提交模式
|
public void commit( )
|
提交SQL语句,使从上一次提交/回滚以来进行的所有更改生效
|
public void rollback()
|
取消SQL语句的执行,撤销在当前事务中进行的所有更改
|
2.执行SQL语句
执行SQL语句包括两个步骤:一是创建Statement对象;二是通过调用该队行的相应方法将SQL语句发送到所连接的数据库去执行。
1)创建Statement对象
创建完连接之后,在所建立的数据库连接上,必须创建一个Statement接口对象,该对象将各种SQL语句发送到所连接的数据库中执行。对于已创建的数据库连接对象,调用createStatement( )方法,就可以得到一个Statement对象。
2)执行SQL语句
创建了Statement对象后,就可以通过该对象发送SQL语句。如果SQL语句运行后产生结果集,Statement对象会将结果集封装成ResultSet对象并返回。下表给出了Statement接口的常用方法。
方 法 名 称
|
功 能 说 明
|
public ResultSet executeQuery(String sql)
|
执行给定的SQL语句,并将结果封装在结果集对象ResultSet中返回
|
public Int executeUpdate(String sql)
|
执行给定SQL语句,该语句可能是INSERT、UPDATE或DELETE,或是不返回任何内容的SQL语句(如DDL语句)。该语句的返回值是一个整数,表示受影响大行数(即更新计数) |
public boolean execute(String sql)
|
执行SQL语句并指示第一个结果的形式(在某些情形下,单个SQL语句可能返回多个结果集或更新计数)。然后,必须使用方法getResults()或getUpdateCount( )方法来获取结果,使用getMoreResults( ) 方法来移动后续结果。如果第一个结果为ResultSet对象,则返回true;如果其为更新计数或者不存在任何结果,则返回false |
public ResultSet getResultSet( )
|
以ResultSet对象的形式返回当前结果。如果结果是更新计数(即执行execteUpdate( )方法)或没有结果,则返回null |
public int getUpdateCount()
|
以更新计数的形式返回当前结果;如果结果为ResultSet对象或没有更多结果,则返回-1。每个结果只应调用一次该方法 |
public boolean getMoreResults()
|
移动到Statement对象的下一个结果,如果 其为ResultSet对象,则返回true,如果其为更新计数或不存在更多结果,则返回false |
public void close( )
|
释放此Statement对象的数据库和JDBC资源 |
说明:在executeQuery()与executeUpdate( )方法中的字符串参数sql,如果超过一行将出现编译错误,所以在构造sql参数时,需要将表达多行的字符串加上双引号并将各行用“+”连接起来。
3.处理返回结果
结果集是包含SQL的SELECT语句中符合条件的所有行,这些行的全体称为结果集,返回的结果集是一个表,而这个表就是ResultSet接口的对象。在结果集中通过记录指针(也称为游标)控制具体记录的访问,记录指针指向结果集的当前记录。在结果集中可以使用getXXX( ) 方法从当前行获取值。ResultSet接口的常用党风及使用说明如表。
方 法 名 称
|
功 能 说 明
|
public boolean absolute(int row)
|
将记录指针移动到结果集的第row条记录
|
public Boolean relative(int row)
|
按相对行数(或正或负)移动记录指针
|
public void beforFirst()
|
将记录指针移动到结果集的头(第一条记录之前)
|
public boolean first( )
|
将记录指针移动到结果集的第一条记录
|
public boolean previous()
|
将记录指针从结果集的当前位置移到上一条记录
|
public boolean next( )
|
将记录指针从结果集的当前位置移到下一条记录
|
public boolean last()
|
将记录指针移动到结果集的最后一条记录
|
public void aferLast( )
|
将记录指针移动到结果集的尾(最后一条记录之后)
|
public boolean isAfterLast( )
|
判断记录指针是否位于结果集的尾(最后一条记录之后)
|
public boolean isBeforeFirst( )
|
判断记录指针是否位于结果集的头(第一条记录之前)
|
public boolean isFirst( )
|
判断记录指针是否位于结果集的第一条记录
|
public boolean isLast( )
|
判断记录指针是否位于结果集的最后一条记录
|
public int getRow( )
|
返回当前记录的行号
|
public String getString(int columnIndex)
|
返回当前行第columnIndex列的值,类型为String
|
public int getInt(int columnIndex)
|
返回当前行第columnIndex列的值,类型为Int
|
public Statement getStatement()
|
返回生成结果集的Statement对象
|
public void close( )
|
释放此ResultSet对象的数据库和JDBC资源
|
public ResdtSetMetaData getMetaData()
|
返回结果集的列的编号、类型和属性
|
4.关闭创建的各种对象
当对数据库的操作执行完毕或推出应用程序前,需将数据库访问过程中建立的各个对象按顺序关闭,防止系统资源浪费。关闭次序是:第一,关闭结果集对象;第二,关闭Statement对象;第三,关闭连接对象。
3.3 数据库的进一步操作
JDBC中有三种SQL查询方式:不含参数的静态查询、含有参数的动态查询和存储过程调用三种方式。这三种方式分别对应Statement、PreparedStatement和CallableStatement接口。
3.4 获取元数据
所谓元数据(Meta Data)就是有关数据库和表结构的信息。如数据库中的表、表的字段、表的索引、数据类型、对SQL的支持程度等信息。JDBC提供DatabaseMetaData接口用来获取数据库范围的信息,还提供了ResultSetMetaData接口用来获取特定结果集ResultSet的信息,如字段名和字段个数等。
1.DatabaseMetaData 接口
DatabaseMetaData 接口主要是用来得到关于数据库的信息。
DatabaseMetaData对象是通过Connection接口的getMetaData() 方法创建的。如:
DatabaseMetaData dmd=conn.getMetaData( );
下表给出了DatabaseMetaData接口的常用方法。
方 法 名 称
|
功 能 说 明
|
public boolean supportsOuterJoins( )
|
判断数据库是否支持外部连接
|
public Boolean supportsStoredProcedures( )
|
判断数据库是否支持存储过程
|
public String getURL( )
|
返回用于连接数据库的URL地址
|
public String getUserName()
|
返回当前用户名
|
public String getDatabaseProductName( )
|
返回使用的数据库产品名
|
public String getDatabaseProductVersion( )
|
返回使用的数据库版本号
|
public String getDriverName( )
|
返回用以连接的驱动程序名称
|
public String getDriverVersion()
|
返回用以连接的驱动程序版本号
|
public String getTypeInfo()
|
返回当前数据看中支持的所有数据类型的描述
|
2.ResultSetMetaData 接口
ResultSetMetaData接口主要用来获取结果集的结构。
可以通过ResultSet的getMetaData()方法来获得对应的ResultSetMetaData对象。
ResultSetMetaData接口的常用方法及功能如表:
方 法 名 称
|
功 能 说 明
|
public int getColumnCount( )
|
返回此ResultSet对象中的字段数
|
public String getColumnName(int column)
|
返回指定列的名称
|
public int getColumnType(int column)
|
返回指定列的SQL类型
|
public int getColumnDisplaySize(int column)
|
以字符为单位返回指定字段的最大宽度
|
public boolean isAutoIncrement(Int column)
|
判断是否自动为指定字段进行编号
|
public int isNullable(int column)
|
判断给定字段是否可以为null,返回值是columnNoNulls、columnNullable或columnNullableUnknown之一
|
public boolean isSearchable(int columnm)
|
判断是否可以在WHERE子句使用指定的字段
|
public boolean isReadOnly(int column)
|
判断指定的字段是否为只读
|
3.5事务操作
事务是保证数据库中数据完整性与一致性的重要机制。事务由一组SQL语句组成,这组语句要么都执行,要么都不执行,因此事务具有原子性。已提交事务是指成功执行完毕的事务,未能成功执行完成的事务称为中止事务,对中止事务造成的变更需要撤销处理,称为事务回滚。
JDBC中实现事务操作,关键是Connection接口中的三个方法,分别为setAutoCommit()、commit() 和 rollback()。
JDBC默认的事务提交方式是自动提交,可以通过setAutoCommit()方法控制事务提交方式,使用rollback() 方法可实现事务回滚.
4.MySQL 基本操作
4.1 数据库操作。
4.1.1 创建数据库 create database
语法如下:
create database 数据库名;
在创建数据库时,数据库命名有以下几项规则:
◆不能与其他数据库重名,否则将发生错误。
◆名称可以由任意字母、阿拉伯数字、下划线(_)和“$”组成,可以使用上述的任意字符开头,但不能使用单独的数字,否则会造成它与数值想混淆。
◆名称最长可为64个字符,而别名最多可长达256个字符。
◆不能使用MySQL关键字作为数据库名、表名。
◆在默认情况下,Windows下数据库名、表名的大小写是不敏感的,而在Linux下数据库名、表名的大小写是敏感的。为了便于数据库在平台间进行移植,建议读者采用小写来定义数据库名和表名。
4.1.2 查看数据库show databases
语法如下:
show databases;
4.1.3 选择数据库 use database
语法如下:
use 数据库名;
4.2 数据表操作
在对MySQL数据表进行操作之前,必须首先使用use语句选择数据库,才可在指定的数据库中对数据表进行操作。
4.2.1 创建数据表create table
语法如下:
create [temporary] table [if not exists] 数据表名
[(create_definition,...)][table_options][select_statement]
create table语句的参数说明:
参数
|
说明
|
temporary
|
如果使用该关键字,表示创建一个临时表
|
if not exists
|
该关键字用于避免表存在时MySQL报告的错误
|
create_definition
|
这是表的列属性部分。MySQL要求在创建表时,表要至少包含一列
|
table_options
|
表的一些特性参数
|
select_statement
|
select语句描述部分,用它可以快速地创建表
|
下面介绍列属性create_definition部分,每一列定义的具体格式如下:
col_name type [not null | null] [default default_value] [auto_increment] [primary key][reference_definition]
属性create_definition参数说明如表所示:
参数
|
说明
|
col_name
|
字段名
|
type
|
字段类型
|
not null | null
|
支出该列是否允许是空值,系统一般默认允许为空值,所有党不允许为空值时,必须使用not null
|
default default_value
|
表示默认值
|
auto_increment
|
表示是否是自动编号,每个表只能有一个auto_increment列,并且必须被索引
|
primary key
|
表示是否为主键。一个表只能有一个primary key。如果表中没有一个primary key,而某些应用程序需要primary key,MySQL将返回第一个没有任何null列的UNIQUE键,作为primary key
|
reference_definition
|
为字段添加注释
|
在实际应用中使用最基本的格式创建数据表即可,格式如下:
create table table_name (列名1 属性,列名2 属性...);
4.2.2 查看表结构show columns 或 describe
1.show columns语句
语法:
show [full] columns from 数据表名 [from 数据库名];
或写成:
show [full] columns from 数据库名.数据表名;
2.describe语句
语法:
describe 数据表名 [列名];
describe 可简写成 desc。
4.2.3 修改表结构alter table
使用alter table语句修改表结构。修改表结构指增加或者删除字段、修改字段名称或者字段类型、设置取消主键外键、设置取消索引以及修改表的注释等。语法如下:
alter[ignore]table 数据表名 alter_spec[,alter_spec]...
注意:当指定ignore时,如果出现重复关键的行,则只执行一行,其他重复的行被删除。
alter_spec子句为要修改的内容。
4.2.4 重命名表rename table
语法格式:
rename table 数据表名1 to 数据表名2
4.2.5 删除表dorp table
语法:
drop table 数据表名;
4.3 MySQL语句操作
4.3.1 插入记录insert
语法如下:
insert into 数据表名(column_name,column_name2,...) values(value1 ,value2,...)
4.3.2 查询数据库记录select
语法如下:
select[distinct][concat(col 1":" col 2)as col] selection list //要查询的内容,选择那些列
from table_list //指定数据表
where primary_constraint //查询时需要满足的条件,行必须满足的条件
group by grouping_columns //如何对结果进行分组
order by sorting_columns //如何对结果进行排序
having secondary_constraint //查询时满足的第二条件
limit count //限定输出的查询结果
说明:
·distincct 在结果中去除重复行
· like 模糊查询:
like属于较常用的比较运算符,通过它可以实现模糊查询。它有两种通配符:“%”和下划线“_”。“%”可以匹配一个或多个字符,而“_”只匹配一个字符。
·使用concat函数可以联合多个字段,构成一个总的字符串。
·limt 限定结果行数
limit子句 可以对查询结果的记录条数进行限定,控制它输出的行数。
·带in 关键字的查询:in(a,b,..) 表示在集合内、not in()表示不在集合内满足条件。
·[ not ] between and
·is [not] null 。
·多条件查询 and 和 or.
·group by 关键字与 group_concat()函数一起使用,可以将每个组中的所有字段值都显示出来。
·使用聚合6
函数表达式:avg(字段名)、count(字段名)、min(字段名)、max(字段名)、sum(字段名)。
4.3.3 修改记录update
语法如下:
update 数据表名 set column_name=new_value1,column_name2=new_value2,...where condition
4.3.4 删除记录delete
语法如下:
delete from 数据表名 where condition
5 连接查询
5.1 内连接查询
内连接是最普遍的连接类型,而且是最匀称的,因为它们要求构成连接的每一部分的每个表都匹配,不匹配的行将被排除。
内连接的最常用的例子是相等连接,也就是连接后的表中的某个字段与每个表中的都相同。这种情况下,最后的结果集只包含参加连接的表中与指定字段相符的行。
5.2外连接查询
与内连接不同,外连接是指使用outer join 关键字将两个表连接起来。外连接生成的结果集不仅包含符合连接条件的行数据,而且还包含左表(左外连接时的表)、右表(右外连接时的表)或两边连接表(全外连接时的表)中所有的数据行。语法格式如下:
select 字段名称 from 表名1 left | right join 表名2 on 表名1.字段名=表名2.字段名;
外连接分为左外连接(left join)、右外连接(right join)和全外连接3中类型。
复合条件连接查询。
5.3 从外到内——子查询
子查询就是select查询中的另一个查询的附属。在外面一层的查询中使用里面一层查询产生的结果集。这样就不是执行两个(或者多个)独立的查询,而是执行包含一个(或者多个)子查询的单独查询。
当遇到这样的多层查询时MySQL从内层的查询开始,然后从它开始向外向上移动到外层(主)查询,在这个过程中每个查询产生的结果集都被赋给包围它的父查询,接着这个父查询被执行,它的 结果也被指定给它的父查询。
除了结果集经常由包含一个或多个值的一列组成外,子查询和常规select查询的执行方式一样。子查询可以用在任何可以使用表达式的地方,它必须由父查询包围,而且,如同常规的select查询,它必须包含一个字段列表(这是一个单列列表)、一个具有一个或者多个表名字的from子句以及可选的where、having和group by 子句。
5.3.1 带in关键字的子查询
只有子查询返回的结果列包含一个值时,比较运算符才适用。假如一个子查询返回的结果集是值的列表,这时比较运算符就必须用in运算符代替。
5.3.2 带比较运算符的子查询
子查询可以使用比较运算符。这些比较运算符包含=、!=、>、>=、<、<=等。比较运算符在子查询时使用的非常广泛。
5.3.3 带exists关键字的子查询
使用exits关键字时,内层查询语句不返回查询的记录。而是返回一个真假值。如果内层查询语句查询到满足条件的记录,就返回一个真值(true),否则,将返回一个假值(false)。当返回的值为true时,外层查询语句将进行查询;当返回的值为false时,外层查询语句不进行查询或者查询不出任何记录。
技巧:not exists 与 exists 的作用刚好相反,使用not exists关键字时,当返回的值是true时,外层查询语句不执行查询;当返回的值是false时,外层查询语句将执行查询。
5.3.4 带any 关键字的子查询
any关键字表示满足其中任意一个条件。使用any关键字时,只要满足内层查询语句返回的结果中的任意一个,就可以通过该条件来执行外层查询语句。
5.3.5 带all关键字的子查询
all关键字表示满足所有条件。使用all关键字时,只有满足内层查询语句返回的所有结果,才可以执行外层外层查询语句。
eg:
select books,row from tb_book where row>=all(select row from tb_row);
说明:any关键字和all关键字的使用方式是一样的,但是这两者有很大的区别。使用any关键字时,只要满足内层查询语句返回的结果中的任何一个,就可以通过该条件来执行外层查询语句。而all关键字则需要满足内层查询语句返回的所有结果,才可以执行外层查询语句。
5.4 合并查询结果
合并查询结果是将多个select语句的查询结果合并到一起。因为某种情况下,需要将几个select语句查询出来的结果合并起来显示。合并查询结果使用union 和 union all关键字。union 关键字是将所有的查询结果合并到一起,然后去除相同记录;而union all关键字则只是简单地将结果合并到一起。
5.5 字段昵称——定义表和字段的别名
5.5.1 为表取别名。eg:
select * from tb_program p where p.talk=‘php‘;
5.5.2 为字段取别名。eg:
select section as login_selection,name as login_name from tb_login;
5.6 正则表达式
基本形式:
字段名 regexp ‘匹配方式‘
·^ :匹配以特定字符或字符串开头的记录。
·$ 匹配以特定符或字符串结尾的记录。
·[字符集合] 和[ ^字符集合]
·S1 | S2| S3
·* 匹配多个该字符之前的字符,包括0和1个
·+ 匹配多个该字符之前的字符,包括1个
·字符串{n}匹配字符串出现n次
·字符串{M,N} 匹配字符串出现至少m次,最多n次。
6.范式
关系数据库:
一个关系模式应当是一个五元组。
R(U,D,DOM,F)
这里:
关系名R时符号化的元组语义
U为一组属性
D为属性组U中的属性所来自的域
DOM为属性到域的映射
F为属性组U上的一组数据依赖
第一范式(1NF):
作为一个二维表,关系要符合一个最基本的条件:每个分量必须是不可分的数据项。
第二范式(2NF):
若R∈1NF ,且每一个非主属性完全函数依赖于任何一个候选码,则 R∈2NF。
第三范式(3NF):
设关系模式R<U,F>∈1NF,若R中不存在这样的码X,属性组Y及非主属性Z(Z 不完全包含Y)使得X->Y,Y->Z成立,X不
函数依赖于Y,则称R<U,F>∈3NF.
BCNF:
设关系模式R<U,F>∈1NF,若X->Y且Y不完全包含于X时X必须有码,则R<U,F>∈BCNF.
也就是说,关系模式 R<U,F>中,若每一个决定因素都包含码,则R<U,F>∈BCNF.
由BCNF的定义可以得到结论,一个满足BCNF的关系模式有:
所有非主属性对每一个码都是完全函数依赖。
所有主属性对每一个不包含它的码也是完全函数依赖。
没有任何属性完全函数依赖于非码的任何一组属性。
第四范式(4NF):。
关系模式R<U,F>∈1NF,如果对于R的每个非平凡多值依赖X->->Y(Y 不完全包含于X),X都包含码,则称R<U,F>∈4NF.
4NF就是限制关系模式的属性之间不允许有非平凡且非函数依赖的多值依赖。
数据库(SQL)
原文:http://www.cnblogs.com/zhujinyue/p/5532746.html