数据库基础
1 什么是数据库数据库:database,存储数据的仓库
数据库:高效的存储和处理数据的介质(介质主要是两种:磁盘和内存)
2 数据库的分类
数据库基于存储介质的不同:进行了分类,分类为两种:关系型数据库(SQL)
和非关系型数据库(NoSQL:Not Only SQL,不是关系型的数据库都叫做关系型数据库)
3 不同的数据库阵营中的产品有哪些
关系型数据库
大型:Oracle,DB2
中型:SQL.SERVER,Mysql 等
小型:access 等
非关系型数据库:memcached,mongodb,redis(同步到磁盘)
4 两种数据库的区别
关系型数据库:安全(保存磁盘基本不可能丢失),容易理解,比较浪费空间(二维表)
非关系型数据库:效率高(断电丢失)
关系型数据库
1 什么是关系型数据库
关系型数据库:是一种建立在关系模型(数学模型)上的数据库
关系模型:一种所谓建立在关系上的模型,关系模型包括三分方面
数据结构:数据存储的问题,二维表(有行和列)
操作指令集合:所有SQL语句
完整性的约束:表内数据约束(字段与字段),表与表之间约束(外键)
2 关系型数据库的设计
关系型数据库:从需要存储的数据需求中分析,如果是一类数据(实体)应该设计成一张二维表
表是由表头(字段名:用来规定数据的名字)和数据部分组成(实际存储的数据单元)
二维表:行和列
表头 字段名1 字段名2
数据单元 数据1 数据2
以实际案例来进行处理:分析一个数学系统,讲师负责教学,教学生,在教室教学生
1 找出系统中存在的实体:讲师表,学生表,班级表
讲师:姓名,性别,年龄,工资
学生:姓名,性别,学号,学科
班级:班级名字,教室编号
关系型数据库:维护实体内部,实体与实体之间的联系
实体内部联系:每个学生都有姓名,性别,学号,学科信息
姓名 性别 学号 学科 年龄
张三 男 00001 PHP 20
李四 男 00002 PHP
王五 00003 UI
第二行的所有字段,都是在描述张三这个学生(内部联系),第二列只能放性别(内部约束)
关系型数据库的特点之一:如果表中对应的某个字段没有值(数据),但是系统依然要分配
空间,关系型数据库比较浪费空间
实体与实体之间的联系:每个学生肯定属于某个班级,每个班级一定有多个学生(一对多)
学生表
姓名 性别 学号 学科 年龄
张三 男 00001 PHP 20
李四 男 00002 PHP
王五 00003 UI
班级表
班级名称 班级编号
PHP021 06
PHP021 05
解决方案:在学生表中增加一个班级字段来指向班级(必须能够唯一的找到一个班级信息)
姓名 性别 学号 学科 年龄 班级名称
张三 男 00001 PHP 20 PHP021
李四 男 00002 PHP PHP021
王五 00003 UI UI031
学生实体与班级实体的关联关系:实体与实体之间的关系
关键字说明
数据库:database
数据库系统:DBS(Database System):是一种虚拟系统,将多种内容关联起来的称呼
DBS = DBMS + DB
DBMS:Database Management System,数据库管理系统,专门管理数据库
DBA:Database Administrator,数据库管理员
行/记录:row /record,本质是一个东西:都是指表中的一行(一条记录),行是从结构角度出发,
记录是从数据角度出发
列/字段:column/field,本质是一个东西
SQL
SQL:Struchured Query Language,结构化查询语言(数据以查询为主:99%是在进行查询操作)
SQL 分为三个部分
DDL:Data Definition Language,数据定义语言,用来维护存储数据的结构(数据库,表),
代表指令:create,drop,alter 等
DML:Data Manupulation Language,数据操作语言,用来对数据进行操作(数据表中的内
容),代表指令:inscrt,delete,update 等,其中DML内部又单独进行了一个分类,DQL(Data
Query Language,数据查询语言,如:selcet)
DCL:Data Control Language,数据控制语言,主要是负责权限管理(用户),代表指令:
grant,revoke 等
SQL 是关系型数据库的操作指令,SQL是一种约束,但不强制(类似W3C),不同的数据库产品
(如 Oraele,mysql)可能内部会有一些细腻的区别
Mysql 数据库
Mysql数据库是一种c/s结构的软件:客户端/服务端,若想访问服务器必须通过客户端(服务
器一直运行,客户端在需要使用时候运行)
交互方式
1 客户单连接认证:连接服务器,认证身份:mysql.exe -hPup
2 客户端发生SQL指令
3 服务器接收SQL指令:处理SQL指令,返回操作结果
4 客户端接收结果:显示结果
5 端开连接(释放资源,服务器并发限制)
Mysql 服务器对象
没有办法完全了解服务器内部的内容,只能粗略的去分析数据库服务器的内部的结构
将mysql服务器内部对象分成四层,系统(DBMS)> 数据库(DB)>数据表(Table)>
字段(field)
SQL 基本操作
基本操作:CRUD
将SQL的基本操作根据操作对象进行分类,分为三类,库操作,表操作(字段),数据操作
库操作
对数据库的增删改查
基本语法:Create database 数据库名[库选项];
库选项:用来约束数据库,分为两个选项
字符集设定;charset/character set具体字符集(数据存储的编码格式),常用字符集:GBK
和UTFS
校对集设定:collate具体校对集(数据比较的规则)
创建数据库:
CREATE DATABASE myfei;
其中:数据库名字不能用关键字(已经被使用的字符)或者保留字(将来可能被用到的)
如果要使用关键字或者保留字,那么必须使用反引号(ESC键下面的键在英文状态下的输出:`)
中文数据库是利用的,但是前提条件;保证服务器能够识别(建议不用)
当创建数据库的SQL语句执行之后发生了什么
1 在数据库系统中增加了对应的数据库信息
2 会在保存数据的文件夹下:data目录创建一个对应数据库名字的文件夹
3 每个数据库下都有一个opt文件:保存了库选项
查看数据库
1 查看所有数据库:show databases;
2 查看指定部分的数据库:模糊查询:
show databases like pattem --pattem是匹配模式
%:表示匹配多个字符
_:表示匹配单个字符
比如查看information_开始的数据库:_需要被转义(\_)
SHOW DATABASES LIKE 'information\_%';
如果不转义相当于information%
SHOW DATABASES LIKE 'information_%';
3 查看数据库的创建语句:SHOW CREATE DATABASE 数据库名字;
SHOW CREATE DATABASE myfei;
更新数据库
数据库名字不能修改
数据库的修改仅限库选择:字符集和校对集(校对集依赖字符集)
alter database 数据库名字 [库选项];
Charset/character set字符集
如:ALTER DATABASE myfei CHARSET GBK;
Collate 校对集
删除数据库
所有的操作中:删除是最简单
Drop database 数据库名字;
如:DROP DATABASE myfei;
当删除数据库语句执行之后,发生了什么
1 在数据库内部看不到对应的数据库
2 在对应的数据库存储的文件内,数据库名字对应的文件夹也被删除(级联删除,
里面的数据表全部删除)
注意:数据库的删除不的闹着玩的,应该先进行备份操作,(删除不可逆)
表操作
表和字段是密不可分的
新增数据表
Create table [if not exists] 表名(
字段名字 数据类型,
字段名字 数据类型 -- 最后一行不需要逗号
)[表选项];
if not exists; 如果表名不存在,那么就创建,否则不执行创建代码;起到检查功能
表选项:控制表的表现
字符集:charset/chharacter 具体字符集:--保证表中数据存储的字符集
校对集:collate 具体校对集;
存储引擎:engine 具体的存储引擎(innodb 和 myisam)
CREATE TABLE IF NOT EXISTS strdent(
nname VARCHAR(10),
gender VARCHAR(10),
number VARCHAR(10),
age INT
)CHARSET utf8;
任何一个表的设计都必须指定数据库
方案1 显示的指定表所属的数据库
Create table 数据库名.表名();将创建的表放到表明的数据库里
CREATE TABLE IF NOT EXISTS myfei.strdent( --将strdent表放到myfei数据库里
nname VARCHAR(10),
gender VARCHAR(10),
number VARCHAR(10),
age INT
)CHARSET utf8;
方案2 隐式的指定所属数据库;先进入到某个数据库环境,然后这样的表自动归属到
某个指定的数据库
进入数据库环境:USE 数据库名字;
USE myfei;
CREATE TABLE class(
nname VARCHAR(10),
room VARCHAR(10)
)CHARSET utf8;
当创建数据表的SQL指令执行之后,到底发生了什么
1 指定数据库下已经存在对应的表
2 在数据库对应的文件夹下,会产生应表的结构文件(跟存储引擎有关系)
查看数据表
数据库查看的方式,表都可以查看
1 查看所有表;show tables;
如:SHOW TABLES;
2 查看部分表:模糊匹配:show tables like 'pattem';
如:SHOW TABLES LIKE '%s';
3 查看表的创建语句:show create table 表名;
如:SHOW CREATE TABLE strdent;
4 查看表结构:查看表中的字段信息
Desc/describe/show columns from 表名;
如:DESC class;
DESCRIBE class;
SHOW COLUMNS FROM strdent;
修改数据表
表本身存在,还包含字段,表的修改分为两部分,修改本身和修改字段
修改表本身
表本身可以修改,表名和表选项
修改表名:rename table 旧表名 to 新表名;
如:RENAME TABLE strdent TO my_strdent;
修改表选项:字符集,校对集和存储引擎
Alter table 表名 表选项 值;
如:ALTER TABLE my_strdent CHARSET GBK;
修改字段
字段操作很多,新增,修改,重名,删除
新增字段
Alter table 表名 add 字段名 数据类型 [列属性][位置];
位置:字段名可以存放表中的任意位置
First:第一个位置
After:在那个字段之后:after 字段名;默认的是最后一个字段之后
如:ALTER TABLE my_strdent --给学生表增加ID放到第一位置
ADD COLUMN id INT
FIRST; --mysql会自动寻找分号;语句结束符
修改字段:修改通常是修改属性或者数据类型
alter table 表名 modify 字段名 数据类型 [列属性][位置];
如:ALTER TABLE my_strdent 将学生表中的number学号字段变成固定长度,且放到第二位置(id之后)
MODIFY number CHAR(10) AFTER id;
重命名字段
Alter table 表名 change 旧字段名 数据类型 [列属性][位置];
如:ALTER TABLE my_strdent -- 修改学生表中的gender字段为SEX
CHANGE gender sex VARCHAR(10);
删除字段
Alter table 表名 drop 字段名;
如:ALTER TABLE my_strdent DROP age; --删除学生表中的年龄字段(age)
小心:如果表中已经存在数据,那么删除字段会清空该字段的所有数据(不可逆)