关系模型和SQL
为了介绍关系模型, 以MySQL数据库为例.
安装
安装MariaDB
-
yum list | grep mariadb
在 yum 列表 模糊搜索有mariadb的 -
yum install mariadb-server
下载mariadb服务, yum会自动下载安装mariadb -
systemctl start mariadb.service (开启服务)
-
systemctl enable mariadb.service(开机自启)
-
mysql_secure_installation (为了安全设置Mysql服务)
登录
- mysql -u root -p (-u用户, 使用root用户; -p,使用密码)
常用命令
-
show databases; (查看所有库)
-
grant all on . to “gogs”@"%" identified by ‘test’;
-
flush privileges(刷新权限)
-
导入测试脚本
mysql -u root -p < test.sql
把test.sql内容重定向到数据库中
SQL语句
SQL是结构化查询语言Structured Query Language. 1987年被ISO组织标准化.
所有主流的关系型数据库都支持SQL, NoSQL也有很大一部分支持SQL.
SQL语句分为:
- DDL数据定义语言, 负责数据库定义, 数据库对象定义, 由CREATE, ALTER与DROP三种语言组成
- DML数据操作语言, 负责数据库对象的操作,CRUD增删改查
- DCL数据控制语言, 负责数据库权限访问控制, 有GRANT和REVOKE两个指令组成
- TCL事务控制语言, 负责处理ACID事务, 支持commit, rollback(回滚)指令(INNODB)
语言规范
- SQL语句大小写不敏感
- 一般建议, SQL的关键字, 函数等大写
- SQL语句末尾应该使用分号结束
- 注释
- 多行注释
/*注释内容*/
- 单行注释-- 注释内容
- MySQL注释可以使用#
- 使用空格或或缩进来提高可读性
- 命名规范
- 必须字母开头
- 可以使用数字,#, $ 和_
- 不可以使用关键字
DCL
GRANT授权, REVOKE撤销
Grant all ON empliyees.* TO "gogs"@"%" IDENTIFIED by "密码"
REVOKE ALL ON *.* FROM 用户 ##撤销权限
##*.* 第一个*basebases所有库, 第二个*匹配所有库内的所有表
*为通配符, 指代任一款或者任意表
*.*
所有库的所有表;
emloyees.*表示employess库下的所有表
% 为通配符, 它是SQL语句的通配符, 匹配任意长度字符串
注意是匹配字符的.
'_'指代一个字符
DDL
删除用户(慎用)
DROP USER gogs;
创建数据库
库的数据的集合, 所有数据按照数据模型组织在数据库中.
GREATE DATABASE IF NOT EXISTE test CHARACTER SET utf8mb64_general_ci;
GREATE DATABASE IF NOT EXISTE test CHARCTER SET utf8;
CHARACTER SET 指定字符集.
utfmb4是utf8的扩展, 支持4字节(一些特殊符号需要), 需要MYSQL5.5.3+.
COLLATE指定字符集的校对规则, 用来做字符串的比较. 例如a, A谁大
删除数据库
DROP DATABASE IF EXIST gogs;
创建表
表分为行和列, MySQL是行存数据库. 数据时一行行存的, 列必须固定多少列.
行Row, 也称为记录Record,元组.
列Column, 也称字段Field,属性.
字段的取值范围叫做域Domain. 例如gender字段的取值就是M或者F连个值
CREATE TABLE `employess`(
`emp_no` int(11) NOT NULL,
`birth date` date NOT NULL,
`first_name` varchar(14) NOT NULL,
`last_name` varchar(16) NOT NULL,
`gender` enum('M','F') NOT NULL,
`hire_date` date NOT NULL, PRIMARY KEY(`emp_no`)
) ENGINE=InnoDB DEFAULT CHARSET = utf8;
desc
查看列信息
{DESCRIBE | DESC} tbl_name[col_name | wild]
DESC employees;
DESC employees '%name'
关系
在关系型数据库中. 关系就是二维表, 由行和列组成.
行Row,也称记录Record, 元组.
列Column, 也称字段Field, 属性.
字段的取值范围叫做 域Domain. 例如gender字段的取值就是M或者F两个值
维数: 关系的维数指关系中属性的个数
基数: 元组的个数
注意在关系中, 属性的顺序并不重要. 理论上, 元组顺序也不重要, 但是由于元组顺序和存储相关, 会影响查询效率.
候选键
关系中, 能够唯一标识一条元组的属性或者属性集合, 称为候选键.
PRIMARY KEY主键
表中一列或者多列组成唯一的key, 也就是通过这一个或者多个列能够唯一标识一条记录, 即被选择的候选键.
主键的列不能包含空值null. 主键往往设置为整形, 长整型, 可以为自增AUTO_INCREMENT字段.
表中可以没有主键, 但是, 一般表设计中 ,往往都会有主键, 以避免记录重复.
Foreign KEY外键
严格来说, 当一个关系中的某个属性或者集合与另一个关系(也可以是自身)的候选键匹配是, 就乘坐这个属性或属性集合是外键.
索引Index
可以看做是一本字典的目录, 为了快速检索用. 空间换时间, 显著提高查询效率.
可以对一列或者多列字段设定索引.
主键索引, 主键会自动建立主键索引, 主键本身就是为了快速定位唯一记录的.
唯一索引, 表中的所用组成的索引必须唯一, 但可以为空, 非空值必须唯一
普通索引, 没有唯一性的要求, 就是建一个字典的目录而已.
约束Constraint
为了保证数据的完整争取, 数据模型还必须支持完整性约束.
-
"必须有值"约束: 某些列的值必须有值, 不许为空NULL
-
域约束Domain Constraint:限定了表中字段的取值范围
-
实体完整性Entity Integrity:
PRIMARY KEY约束定义了主键, 就定义了主键约束. 主键不重复且唯一, 不能为空.
引用完整性Referential Integrity
外键定义中, 可以不是引用另一张表的主键, 但是, 往往实际只会关注引用主键.
外键: 在表B中的列, 引用了表A中的主键, 表B中的列就是外键.
A表称为主表, B表称为从表
- 插入规则
不需要指定.
如果在表B插入一条记录, B的外键列插入一个值,这个值必须是表A中存的主键值.