SQL:Structured Query Language(结构化查询语言);
数据模型:对于数据的描述方式;比如关系数据模型是用二维表来描述,层次数据模型用树来描述数据。
数据模型由三部分组成:
(1)数据结构:定义数据的结构;
(2)数据操作:CRUD;
(3)数据约束:比如键约束、完整性约束等;
数据模型介绍
1.关系数据模型
将数据描述成二维表的形式,例如:
关系模型的特点:
(1)建模方便,操作简单(SQL);
(2)高效性(访问快速)、易用性;
(3)描述数据单一,即用表来表述数据;
2.半结构化数据模型
将数据描述成类似于XML的形式,例如:
3.对象关系模型
关系的属性不仅仅是基本数据类型,并且每个关系都有相关的方法;
4.层次模型
基于树结构的模型,在物理层次进行操作,很不方便;
5.网状模型
基于图结构的模型,也是在物理层次进行操作,很不方便;
关系模型术语
关系模型约定:属性具有原子性,即每个属性都是基本的数据类型;
关系:二维表;
属性:每列为一个属性;
元组:每一行为一个元组,即记录;
分量(component):元组的每个属性值就是一个分量;
表模式:由表名、表的属性、属性的数据类型组成;
数据库模式:多个表的模式;
域:属性的数据类型;
实例:表就是关系的实例,当然,如果随着时间的改变,表发生改变,但是他仍然是关系的实例;
超键:能够确定一个元组的属性集;
候选键:最小的超键;
主键:设计者选定的候选键;
主属性:包含于候选码的一个属性;比如如果候选码为AB,则主属性可以是A,B,只要包含于候选码的单个属性即可;
就上图来说,
关系:account;
属性:account_number、balance;
元组:(A-101,500),....;
第一个元组的第一个分量:A-101;
表模式:account(account_number,balance);
数据库模式未知;
account_number的域:string,balance的域为int;
实例为现在account的这张表;
超键可以为(account_number,balance)、(account_number);
候选键为(account_number);
主键根据设计者自行选定;
问:比较以下两个关系,是否为同一个关系?
SQL初步
SQL是专门用于关系模式的查询语言,他是高度抽象化的;
SQL的版本有最早的 ANSI SQL-->SQL92-->SQL99-->SQL2003
现在的各大商业数据库都是有各自版本的SQL,比如SQL Server对应T-SQL,而Oracle对应PL/SQL;
SQL中存在DDL和DML;
SQL默认是基于包的数据库,即允许一个表中存在重复的元组;
SQL不区分大小写,包括关键字,表名,属性名等都是,但是字符串是大小写敏感的;比如:FROM 和 from是一样的,表明Table和tablE是一样的,属性名Attr和attR是一样的;
SQL中的比较运算符:需要注意的是两个运算符,=和<>分别表示相等和不等,不能使用!=来表示不等;
字符串连接运算符:+,即'xiaz'+'dong';
字符串是用单引号括起来的;
DDL语句
(1)CREATE TABLE创建表模式;
(2)ALTER TABLE 修改表模式,比如:
ALTER TABLE t1 ADD age int;
ALTER TABLE t1 DROP age;
(3)DROP TABLE 删除表模式,比如:
DROP TABLE t1;
小知识点:如果想要为某个属性定义默认值,可以在属性声明后面加上 DEFAULT 值;
比如:age int DEFAULT 0;
基本数据类型
(1) INT;
(2)DECIMAL,指定小数点位数,DECIMAL(n,d) 表示一共n位有效数字,d个小数位;
(3)VARCHAR;变长的字符串,比如VARCHAR(5)表示最多长度为5的字符串;
(4)CHAR:固定长度的字符串,比如 CHAR(5)表示长度为5的字符串;
(5)DATE,DATE'2010-02-03'
(6)TIME:时间,由时、分、秒、微秒组成,TIME '14:00:20' 表示 14时00分20秒;
(7)TIMESTAMP:由DATE和TIME组成;
(5)BOOLEAN:TRUE、FALSE、UNKNOWN;
(6)位串BIT;B'0010'
问:CHAR(3)和VARCHAR(3)有什么区别?
答:如下图所示: 虽然这两种数据类型的存储方式不同,但是如果char(3)类型的'a'和varchar(3)类型的'a'是相等的;
注意:SQL中string是用单引号括起来的;
问:数据库和表的关系?
答:数据库中含有多个表,不能单纯的创建表;
问:PRIMARY KEY和UNIQUE有什么区别?
答:PRIMARY KEY 和UNIQUE都表示属性能够区别所有元组,但是PRIMARY KEY 不能存在NULL值,而UNIQUE允许NULL值;
问:类似PRIMARY KEY这种约束声明在哪?
答:可以声明在两个地方,
CREATE TABLE person(
id INT PRIMARY KEY,
name VARCHAR(20),
ismale boolean DEFAULT TRUE,
birth DATE,
salary DECIMAL(6,2)
);
或者
CREATE TABLE person(
id INT,
name VARCHAR(20),
ismale boolean DEFAULT TRUE,
birth DATE,
salary DECIMAL(6,2),
PRIMARY KEY(id)
);
示例:
SQL查询
原始Person表有如下数据:
规范:
SELECT attr1,attr2....attrn
FROM table1
WHERE predicate;
执行顺序:先FROM,再where后SELECT;
AS 可用来重命名属性或关系,比如:
SELECT id AS 学号,name AS 姓名,age AS 年龄,'ECNU' AS 学校 FROM Person |
运行结果如下所示:
从上图中可以看出,列被重命名,而且还多加了一个“学校”的属性,因此在SELECT 中可以用AS重命名,而且还可以添加新的列;
字符串的操作
1.字符串的连接:+
2.字符串的额比较:<,>,<>,=,<=,>=;
3.字符串的模式匹配:%和 _ 分别表示任意多个字符和单个任意字符;比如'xiazdong'匹配'xia%','xia_ _ _ _ _';
S LIKE P:S匹配模式P时返回true;
S NOT LIKE P: S不匹配模式P时返回true;
字符串中两个连续的单引号表示一个单引号,比如'a''a'表示字符串a'a;
我们可以通过ESCAPE '字符'定义转义字符,比如ESCAPE '\'就表名定义\为转义字符,即\%表示真实的%,而不是模式匹配的%;
比如:name LIKE 'xia\%\_%' ESCAPE '\'表示\作为转义字符,并且名字是以xia%_开头的字符串;
举例:
如果Person表存在以下数据:
可以通过如下语句进行查找
SELECT *
FROM Person
WHERE name LIKE 'xia!%!_%' ESCAPE '!'
就可以查找到此记录;
SQL日期操作
SQL日期分为:
(1)DATE:由年月日组成,标准格式为'yyyy-MM-dd