一、数据库理解
数据库怎么来的?以前的数据主要是以文件存储的方式存储,由于数据的日益庞大,文件存储难以查询并且造成巨大的数据冗余,因此,数据库就被创造出来。
数据库的特点:
(1)数据结构化
(2)数据的共享性高,冗余度低且易扩充
(3)数据独立性高
(4)数据由数据库管理系统统一管理和控制
数据库的发展经历层次模型、网状模型和关系模型,现在主要是以关系模型为主。
层次模式下的
优点
层次模型的数据结构比较简单清晰
查询效率高,性能优于关系模型,不低于网状模型
层次数据模型提供了良好的完整性支持
缺点
结点之间的多对多联系表示不自然
对插入和删除操作的限制多,应用程序的编写比较复杂
查询子女结点必须通过双亲结点
层次数据库的命令(语言)趋于程序化
网状模型下的,采用网状结构来表示各类实体以及实体间的联系
优点
能够更为直接地描述现实世界,如一个结点可以有多个双亲;
具有良好的性能,存取效率较高。
缺点
结构比较复杂,而且随着应用环境的扩大,数据库的结构就变得越来越
复杂,不利于最终用户掌握;
DDL、DML语言复杂,用户不容易使用;
记录之间联系是通过存取路径实现的,应用程序必须选择存取路径,
加重了程序员的负担。
关系模型下的
关系(Relation)—— 一个关系对应通常说的一张表
元组(Tuple)—— 表中的一行即为一个元组
属性(Attribute)——表中的一列即为一个属性,给每一个属性起一个名称即属
性名
主码(Key)——也称码键。表中的某个属性组,它可以唯一确定一个元组
域(Domain)——是一组具有相同数据类型的值的集合。
属性的取值范围来自某个域。
例:学生年龄属性的域(15~45岁),
性别的域是(男,女),
系名的域是一个学校所有系名的集合;
分量——元组中的一个属性值。
关系模式——对关系的描述
关系名(属性1,属性2,…,属性n)
学生(学号,姓名,年龄,性别,系名,年级)
优点
建立在严格的数学概念的基础上
概念单一
实体和各类联系都用关系来表示
对数据的检索结果也是关系
关系模型的存取路径对用户透明
具有更高的数据独立性,更好的安全保密性
简化了程序员的工作和数据库开发建立的工作
缺点
存取路径对用户透明,查询效率往往不如格式化数据模型
为提高性能,必须对用户的查询请求进行优化,增加了开发数据库管理系统
的难度
二、数据库模式
数据库的结构分为三层结构,依次为内模式、模式、外模式,内模式指的是数据的物理存储方式,是以树、堆等结构存储的,模式指的是数据库中全体数据的逻辑结构和特征的描述,一般指的是表以及表的数据项,而外模式则指的是数据库用户的数据视图,是与某一应用有关的数据的逻辑表示,一般指的是视图。
一个模式可以有多个外模式,一个数据库只能有一个内模式和一个模式,正是由于数据库的模式结构以及数据库的二级映像功能,保证了数据的独立性和稳定性。
二、常见的数据类型
三、数据库语句
3.1 表操作
创建表
CREATE TABLE students(
std_id INT NOT NULL,
std_name VARCHAR(100),
std_age INT,
std_sex INT,
std_class VARCHAR(100),
std_date DATE,
PRIMARY KEY(std_id)
);
更新表
1、增加一列
ALTER TABLE students ADD bz VARCHAR(30);
2、修改列类型
ALTER TABLE students change bz bz VARCHAR(3); 【Oracle用不了】
或者
ALTER TABLE students modify bz VARCHAR(2);
3、修改列名
ALTER TABLE students CHANGE COLUMN bz bz1 VARCHAR(30);【Oracle用不了】
或者
修改(列名)project表的complete_number为complete_number1
ALTER TABLE "PROJECT" RENAME COLUMN complete_number TO complete_number1;
【Oracle专用】
4、删除列
ALTER TABLE students DROP COLUMN bz
3.2 数据语句
以两个表city和 county为例子
单表查询
1、DISTINCT 去重
SELECT DISTINCT * FROM country WHERE country = 'china'
2、查询项作为别名
SELECT country 国家 FROM country
3、BETWEEN AND 和 NOT BETWEEN AND的用法,这个效率会比LIMIT高
SELECT country_id,country FROM country
WHERE country_id BETWEEN 30 AND 60
表示从第30条数据到第60条数据
4、LIMIT
SELECT country_id,country FROM country WHERE country_id LIMIT 30,60
表示从第30起后的60条数据,所以这里的范围是31-90的数据
4、IN 和NOT IN
SELECT country_id,country FROM country WHERE country_id IN(20,30,60)
同时IN的括号内也可以是一个select语句
SELECT country_id,country FROM country
WHERE country_id IN(
SELECT country_id FROM country WHERE country_id>90
)
5、LIKE '匹配串'和NOT LIKE '匹配串'
匹配字符的区别
% (百分号) 代表任意长度(长度可以为0)的字符串
例如a%b表示以a开头,以b结尾的任意长度的字符串
_ (下横线) 代表任意单个字符。
例如a_b表示以a开头,以b结尾的长度为3的任意字符串,两个下划线代表一个汉字
匹配串为固定字符串,‘ab’,匹配为ab
使用换码字符将通配符转义为普通字符,如 LIKE '/_China' ESCAPE '/ '
转义在这里和直接LIKE '_China'的效果是一致的
6、IS NULL 和 IS NOT NULL
SELECT country_id,country FROM country
WHERE country LIKE '_China' IS NOT NULL
表示country LIKE '_China' IS NOT NULL的结果为真,那么就执行前面的SELECT country_id,country FROM country 语句,查出来就是有所有的结果,如果为假,
那么不执行结果为空,注意如果在多表时的情况的返回结果
7、AND 和 OR
这个就不说了,比较常用,自己领会
8、聚集函数
SELECT COUNT(*) FROM country
SELECT COUNT(country_id) FROM country
SELECT SUM(country_id) FROM country
SELECT AVG(DISTINCT country_id) FROM country
9、分组查询GROUP BY .... HAVING
分组查询,就是把某一数据列抽取查询出来
SELECT country,country_id FROM country
GROUP BY country ORDER BY country_id
而 HAVING后面接上条件完成查询
SELECT country,country_id FROM country
GROUP BY country HAVING country LIKE '_china'
ORDER BY country_id
参考:数据库系统概论 王删