目录
前言
21世纪,人类迈入了“信息爆炸时代”,大量的数据、信息在不断产生,伴随而来的就是如何安全。有效的储存、检索和管理他们,对数据库的有效储存,高校访问,方便共享和控制已经成为信息时代亟待解决的问题。
一、数据库介绍
(1)使用数据库的必要性
使用数据库可以高效且分明的存储数据,是人们能够更加迅速,方便的管理数据。
数据库的特点:
可以结构化存储大量的数据信息,方便用户进行有效的索引和访问。
可以有效的保持数据信息的一致性,完整性,降低数据冗余。
可以满足应用的共享和安全方面的要求。
数据库工作原理
过程:
1)DDBMS 接受应月程序的数据请求和处理请求
2)将用户的数据请求(高级指令) 转换为复杂机器代码(底层指令)
3)实现对数据库DB的操作
4)DBMS从数据库的提作中接受查询结果SDBMS对查询结果进行处理(格式转换)
5)应用查询 将处理结果返回给用户
(2)数据库的基本概念
1.数据
数据不仅仅包括数字,文字、图形、图像、声音、档案记录等都是数据。
数据是以“记录”的形式按统一的格式进行存储的。
数据的分类
结构化的数据: 即有固定格式和有限长度的数据。例如填的表格就是结构化的数据,国籍:中华人民共和国,民族:汉,性别:男,这都叫结构化数据
非结构化的数据: 非结构化的数据越来越多,就是不定长、无固定格式的数据,例如网页,有时候
非常长,有时候几句话就没了;例如语音,视频都是非结构化的数据
半结构化数据: 比如:XML或者HTML的格式的数据
2.数据库和数据库表
数据库:
数据库是就是表的集合,他是以一定的组织方式存储的相互有关的数据集合。
数据库表就是用来储存具体数据的集合。
3.数据库管理系统和和数据库系统
数据库管理系统:是实现对数据库资源有效组织,管理和存储的系统软件。
DBMS主要包括功能:
数据库的建立和维护功能: 包括建立数据库的结构和数据的录入与转换、数据库的 转储与恢复、数据库的重组与性能监视等功能。
数据定义功能:包括定义全局数据结构、局部逻辑数据结构、存储结构、保密模式 及信息格式等功能。保证存储在数据库中的数据正确、有效和相容,以防止不合语 义的错误数据被输入或输出。
数据操作功能:包括数据查询统计和数据更新两个方面。
数据库的运行管理功能:这是数据库管理系统的核心部分,包括并发控制、存取控 制、数据库内部维护等功能。
通信功能:DBMS 与其他软件系统之间的通信,如 Access 能与其他 Office 组件进行 数据交换。
数据库系统
是一人一机系统,一般由硬件、操作系统、数据库、DBMS、应用软件和数据库用户组成
(3)数据库的发展
1.数据库系统发展史
(1)初级阶段----第一代数据库
- 自20世纪60年代起,第一代数据库系统问世
- 是层次模型与网状模型的数据库系统
- 为统一管理和共享数据提供了有力的支撑
(2)中级阶段----第二代数据库
- 20世纪70年代初,第二代数据库——关系数据库开始出现
- 20世纪80年代初,IBM公司的关系数据库系统DB2问世,开始逐步取代层次与网状模型的数据库,成为行业主流
- 到目前为止,关系数据库系统仍占领数据库应用的主要地位
(3)高级阶段----第三代数据库
- 自20世纪80年代开始,适应不同领域的新型数据库系统不断涌现
- 面向对象的数据库系统,实用性强、适应面广
- 20世纪90年代后期,形成了多种数据库系统共同支撑应用的局面
- —些新的元素被添加进主流数据库系统中:例如,Oracle支持的(“关系-对象”数据库模型
2.当今主流数据库(关系数据库)
1)SQL server(微软公司产品)
- 面向Windows操作系统
- 简单、易用
2)Oreacle(甲骨文公司产品)
- 面向所有主流平台
- 安全、完善,操作复杂
3)DB2(IBM公司产品)
- 面向所有主流平台
- 大型、安全、完善
4)MYSQL(甲骨文公司收购)
- 免费、开源、体积小
3.经典数据模型
数据是实现世界中“量”的抽象,而数据模型是数据特征的抽象
(1)网状数据模型(多对多、多对一)
1)数据结构。在网状数据中,数据记录组织成图的形式,使用“数据结构”进行抽象的分析和表示。
2)数据操作。网状装模型的数据操作是建立在关系链基础上的导航式操作。
3)数据约束。网状模型的数据约束是零散孤立的,或者分散各个节点,或者集中成为一种关系链,容易导致不一致性或降低效率。
(2)层次模型。(禁止多对多、多对一)
1)数据结构。在层次模型中,数据记录组织的形式使用“树状构图”进行抽象的分析和表示,适合一对多的关系模型。
2)数据操作。在层次模型上的数据操作不可避免的具体网状模型的特点-----导航性
3)数据约束。层次模型和网状模型数据约束相同,层次模型。(禁止多对多、多对一)。数据据约束处理的复杂性按级数下降。
(3)关系模型。
1)数据结构。关系模型建立在关系代数的理论基础上,数据结构使用简单易懂的二维数据表。可以用简单的“实体--关系”图(E-R)表示。
(E-R)图中包含(实体(数据对象)、关系、属性)
实体Entity: 客观存在并可以相互区分的客观事物或抽象事件称为实体,在E-R图中用矩形框表示实体,把实体名写在框内。
属性: 实体所具有的特征或性质,用 椭圆形 表示属性。
联系: 联系是数据之间的关联集合,是客观存在的应用语义链。
• 实体内部的联系:指组成实体的各属性之间的联系。如职工实体中,职工号和部门经理号之间有一种关联关系
• 实体之间的联系:指不同实体之间联系。例:学生选课实体和学生基本信息实体之间
2)数据操作。关系模型使用从关系代数上抽象出来的数据库操作语言(DML)进行操作。
3)数据约束。关系模型的数据约束可以针对实体,也可以针对实体的属性,还可以针对关系,并可以在定义书体、实体属性、关系时全面实现。
4.数据库的分类
关系型数据库介绍
- 关系数据库系统是基于关系模型的数据库系统
- 关系模型的数据结构使用简单易懂的二维数据表
- 关系模型可用简单的“实体-关系”(E-R)图来表示
- E-R图中包含了实体(数据对象)、关系和属性三个要素
关系型数据库的优点和缺点
优点:
1)易于维护:使用表结构,格式一致
2)使用方便:SQL语言通用,可用于复查查询
3)复查操作[支持SQL,可用于单表和多表之间的复杂查询
缺点:
1)读写性能比较差,尤其是海量数据的高效率读写
2)固定的表结构,灵活度欠缺
3)高并发读写需求,对传统关系型数据库来说,硬点1/0是一个很大的瓶颈
(3)非关系数据库
非数据库NoSQL(Not Only SQL),储存数据不以关系模型为依据不需要固定的表格式。
优点:
1)速度快: nosql用硬盘或者随机存储器作为载体,数据库可以高并发读写 vs 关系型数据库只能使用硬盘
2)格式灵活:对海量数据高效率存和访问
3)数据库具有高扩展性与高可用性
4)成本低: nosgl数据库部男简单,基本都是开源软件
缺点:
1)不提供sql支持,学习和使用成本较高
2)无事物处理
3)数据结构相对复查,复杂查询方面稍欠
4)好多数据写在内存中
(4)关系型数据库和非关系型数据库的区别 关系数据库:
关系数据库结构是二维数据库表,二维表当中每个字段(列)用来描述对象的一个属性, 每个记录(行)用来描述一个对象的信息(完整信息),关系数据库写到哪里也就是存储在硬盘当中 读写系统就会受到的IO限制或者瓶颈。
其他 关系型数据库最典型的数据结构是表,由二维表及其之间的联系所组成的一个数据组织
二、mysql服务基础
mysql数据库介绍
(1)MySQL数据库介绍
1、MySQL是一款深受欢迎的开源关系型数据库。
2、是Oracle旗下的产品。
3、遵守GPL协议,可以免费使用与修改。
4、特点:
- 性能卓越、服务稳定
- 开源、无版权限制、成本低
- 多线程、多用户
- 基于C/S(客户端/服务器)架构
- 安全可靠
(2)MySQL商业版与社区版
1、MySQL商业版是由MySQL AB公司负责开发与维护,需要付费才能使用。
2、MySQL社区版是由分散在世界各地的MySQL开发者、爱好者一起开发与维护,可以免费使用。
3、两者区别:
- 商业版组织管理与测试环节更加严格,会比社区版更稳定。
- 商业版不遵守GPL,社区版遵从GPL可以免费使用。
- 商业版可获得7*24小时的服务,社区版则没有。
(3)MySQL 组成
客户端程序:
- mysql: 交互式的CLI工具
- mysqladmin:基于mysql协议管理mysqld
- mysqlimport:数据导入工具
- MyISAM:存储引擎的管理工具
- myisamchk:检查MyISAM库
- myisampack:打包MyISAM表,只读
服务器端程序:
- mysqld_safe
- mysqld
- mysqld_multi 多实例
方法一
基于安装包安装
1. #安装环境依赖包
[root@localhost ~]# yum -y install gcc gcc-c++ make ncurses ncurses-devel bison cmake libaio-devel
#各程序作用解释如下:
gcc #C语言的编译器
gcc-c++ #C++的编译器
ncurses #字符终端下图形互动功能的动态库
ncurses-devel #ncurses开发包
bison #语法分析器
cmake #mysql需要用cmake编译安装
libaio-devel #支持同步I/O的软件包
2. #创建mysql用户并加入到mysql组,创建mysql的安装路径
[root@localhost ~]# useradd -s /sbin/nologin mysql
[root@localhost ~]# mkdir -p /usr/local/mysql
3. #解压mysql安装包,配置软件模块
[root@localhost ~]# cd /opt/
[root@localhost ~]# tar zxf mysql-5.6.36.tar.gz
[root@localhost ~]# cd mysql-5.6.36/
###配置软件模块,cmake自定义配置###
[root@localhost mysql-5.6.36]# cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ #指定mysql的安装路径
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \ #指定mysql进程监听套接字文件(数据库连接文件)的存储路径
-DDEFAULT_CHARSET=utf8 \ #指定默认使用的字符集编码,如 utf8
-DDEFAULT_COLLATION=utf8_general_ci \ #指定默认使用的字符集校对规则
-DWITH_EXTRA_CHARSETS=all \ #扩展性的字符集,支持其他字符集编码
-DWITH_MYISAM_STORAGE_ENGINE=1 \ #开启各种功能的存储引擎机
-DWITH_INNOBASE_STORAGE_ENGINE=1 \ #安装INNOBASE存储引擎
-DWITH_MEMORY_STORAGE_ENGINE=1 \ #安装MEMORY存储引擎
-DWITH_READLINE=1 \ #支持readline程序平台,读取数据按行读取,一行是一个对象
-DENABLED_LOCAL_INFILE=1 \ #本地写入文件,方便导入导出
-DMYSQL_DATADIR=/home/mysql \ #指定数据库的家目录,数据库文件的存储路径
-DMYSQL_USER=mysql \ #指定管理用户
-DMYSQL_TCP_PORT=3306 #指定端口号
4. #编译安装
[root@localhost mysql-5.6.36]# make && make install -j4 #开4核编译安装
——————如果报错,需要清空缓存文件后重新编译-------
find -name CMakeCache.txt
rm -f ./CMakeCache.txt
-------------------------------------------
5. #将配置文件拷贝到/etc/目录下,并改名为my.cnf
[root@localhost mysql-5.6.36]# cp support-files/my-default.cnf /etc/my.cnf
6.#添加mysqld系统服务,将mysql添加进系统服务管理中
[root@localhost mysql-5.6.36]# cp support-files/mysql.server /etc/init.d/mysqld
[root@localhost mysql-5.6.36]# chmod 755 /etc/init.d/mysqld
[root@localhost mysql-5.6.36]# chkconfig --add /etc/init.d/mysqld
[root@localhost mysql-5.6.36]# chkconfig mysqld --level 35 on #在3和5运行级别下启动
7. #设置环境变量,申明/宣告mysql命令,便于系统识别
[root@localhosti mysql-5.6.36]# echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
[root@localhost mysql-5.6.36]# source /etc/profile //刷新文件,使立即生效
[root@localhost mysql-5.6.36]# echo $PATH
8. #更改mysql安装目录和配置文件的属主属组
[root@localhost mysql-5.6.36]# chown -R mysql:mysql /usr/local/mysql/
[root@localhost mysql-5.6.36]# chown mysql:mysql /etc/my.cnf
9. #初始化初始化数据库
[root@localhost mysql-5.6.36]# /usr/local/mysql/scripts/mysql_install_db \
--user=mysql \ #指定管理用户
--ldata=/var/lib/mysql \ #与--datadir同义
--basedir=/usr/local/mysql \ #指定数据库的安装目录
--datadir=/home/mysql #指定数据库文件的存储路径
10. #修改系统服务的脚本文件
[root@localhost mysql-5.6.36]# ln -s /var/lib/mysql/mysql.sock /home/mysql/mysql.sock //做一个软链接
[root@localhost mysql-5.6.36]# vim /etc/init.d/mysqld //修改脚本文件
##修改46,47行
basedir=/usr/local/mysql
datadir=/home/mysql
11. #启动mysql
[root@localhost mysql-5.6.36]# service mysqld start
[root@localhost mysql-5.6.36]# ss -ntap|grep "3306"
12. #登录
[root@localhost mysql-5.6.36]# mysql #登录mysql
##授予root用户可以在所有终端远程登录,使用的密码是abc123,并对所有数据库和所有表有操作权限。
mysql> grant all privileges on *.* to 'root'@'%' identified by 'abc123';
13.#登出mysql
mysql> exit
Bye
方法二
基于yum源安装
1. #创建mysql安装包的在线源
cd /etc/yum.repos.d/
vim mysql.repo
[mysql]
name=mysql5.7
baseurl=https://mirrors.tuna.tsinghua.edu.cn/mysql/yum/mysql-5.7-community-el7-x86_64/
gpgcheck=0
2. #安装服务mysql-community-server
yum -y install mysql-community-server
3. #启动服务
systemctl start mysqld
ss -ntap |grep 3306
4. #此时无法使用mysql命令直接登入数据库。需要查看本地root用户的默认密码,使用密码登录。
grep password /var/log/mysqld.log #查看默认密码
mysql -u root -p'34/Jeoiq0' #使用密码登录,特殊符号用单引号引起来
5. #登入数据库后必须修改密码。
mysql> alter user root@'localhost' identified by '自己定义密码';
#为保证安全,密码的复杂性要足够,需要包含英文字母大小写、数字和特殊字符。
#可以使用"\h;"查看帮助
三、使用mysql数据库
常用的数据类型
类型 :含义 | |
int:整型 | 4个字节(32个比特位),整数型 |
float:单精度浮点 | 8位精度,4字节32位 |
double:双精度浮点 | 16位精度,8字节64位 |
char:固定长度的字符类型 | |
varchar:可变长度的字符类型 | |
text:文本 | |
image:图片 | |
decimal(5,2):5个有效长度数字,小数点后面有2位 |
注:
#Char如果存入数据的实际长度比指定长度要小,会补空格至指定长度,如果存入的数据的实际长度大于指定长度,低版本会被截取,高版本会报错
CHAR和VARCHAR类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。
字节大小:
- char无论是否有值,都会占用固定长度的字节大小,保存在磁盘上都是4字节。
- varchar在保存字符时,默认会加一个隐藏的结束符,因此结束符会多算一个字节。
优劣比较:
- varchar比char节省磁盘空间。
- 但varchar类型的数据读写速度比char慢,因为char是连续的磁盘空间,e而varchar在多次增删改查中会产生一些磁盘空间碎片。
数据库规范:
- 在数据库系统中,SQL 语句不区分大小写,建议用大写
- SQL语句可单行或多行书写,默认以 " ; " 结尾
- 关键词不能跨多行或简写
- 用空格和TAB 缩进来提高语句的可读性
- 子句通常位于独立行,便于编辑,提高可读性
SQL语句分类
- DDL:Data Defination Language 数据定义语言,用于创建数据库对象,如库、表、索引等。eg:create、drop、alter。
- DML:Data Manipulation Language 数据操纵语言,用于对表中的数据进行管理,用来插入、删除、修改数据库中的数据。eg:insert、delete、update。
- DQL:数据查询语言,用于从数据表中查找符合条件的数据记录。eg:select。
- DCL:数据控制语言,用于设置或者更改数据库用户或角色权限(数据控制语句,用于控制语句,用于控制不同数据段直接的许可和访问级别的语句,这些 语句定义了数据库、表、字段、用户的访问权限和安全级别,如commit、follback、grant、revoke)
查看数据库结构
(1)查看当前数据库包含的库
SHOW DATABASES语句;用于查看当前MySql服务器中包含的库。
SHOW DATABASES;
(2)查看当前使用库中包含的表
SHOW TABLES语句;用于查看当前所在库中包含的表。
方法一:
USE 数据库名; #切换库
SHOW TABLES; #查看库中的表
方法二:
show tables from 数据库名; #直接查看某个库中的表
MySql数据库文件存放在/usr/local/mysql/data目录下。
(3)查看表结构
DESCRIBE语句;用于显示表的结构,即组成表的各字段(列)的信息。
#USE语句切换到所使用的库中
USE mysql;
#用于显示表的结构
DESCRIBE user;
注:
Field:字段名称
type:数据类型
Null :是否允许为空
Key :主键
Type:数据类型
Null :是否允许为空key :主键
Default :默认值
Extra :扩展属性,例如:标志符列(标识了种子,增量/步长)1 2
id:1 3 5 7
查看帮助信息
mysql> help create
#help 后面跟上具体命令可以查看帮助
创建及删除数据库和表
CREATE DATABASE语句;用于建立新的数据库
#创建数据库
CREATE DATABASE 库名;
CREATE TABLE语句;用于创建一个新表格
#创建表
类型1:CREATE TABLE 表名 (字段名称1 类型 ,字段名称2 类型,字段名称3 类型,PRIMARY KEY(主键名));
类型2:CREATE TABLE 表名 (字段名称1 类型 PRIMARY KEY,字段名称2 类型,字段名称3 类型);
#扩展内容
use school;
create table if not exists info (
id int(4) zerofill primary key auto_increment, #指定主键的第二种方式
name varchar(10) not null,
cardid int(18) not null unique key,
hobby varchar(50));
#if not exists:表示检测要创建的表是否已存在,如果不存在就继续创建
#int(4) zerofill:表示若数值不满4位数,则前面用"0"填充,例0001
#auto_increment:表示此字段为自增长字段,即每条记录自动递增1,默认从1开始递增;
自增长字段数据不可以重复;自增长字段必须是主键;如添加的记录数据没有指定此字段的值且
添加失败也会自动递增一次
#unique key:表示此字段唯一键约束,此字段数据不可以重复:一张表中只能有一个主键,但是一张表中可以有多个唯一键
#not null:表示此字段不允许为NULL
举例:
例:create database school;
use school;
create table CLASS1 (id int not null,name char(10) not null,sex char(1),primary key (id));
DROP TABLE语句;用于删除库中的表
#删除表
DROP TABLE 表名;
DROP DATABASE语句;删除指定的数据库
#删库
DROP DATABASE 库名;
管理表中的数据记录
插入数据
例:create database school;
use school;
create table CLASS (id int NOT NULL,name char(10) NOT NULL, score decimal(5,2), passwd char(48) DEFAULT'',PRIMARY KEY (id));
insert into CLASS (id,name,score,passwd) values(1,'lichen',99,PASSWORD('123456'));
insert into CLASS (id,name,score,passwd) values(2,'zhangsan',59,123456);
#PASSWORD('123456'):查询数据记录时,密码字串以加密形式显示:若不使用PASSWORD(),查询时以明文显示。
查询数据
#格式:
SELECT * FROM 表名; #查询表中所有记录
#按条件查找数据记录,且只显示指定字段的值
SELECT 字段名1,字段名2[,...] FROM 表名 [WHERE 条件表达式];
#表中的记录默认是横向展示的,当字段很多时显示很乱,可以将";"换成"\G",改成纵向展示每条记录。
select * from 表名\G
修改数据
#修改、更新数据表中的数据记录
格式:
UPDATE 表名 SET 字段名1=字段值1[,字段名2=字段值2] [WHERE 条件表达式];
例:insert into CLASS (id,name,score,passwd) values(4,'liyong',77,123456);
insert into CLASS (id,name,score,passwd) values(5,'zhaoliu',66,123456);
select * from CLASS;
update CLASS set id=6 where name='zhangsan';
select * from CLASS;
update CLASS set name='zhangbin',score=100 where id=3;
select * from CLASS;
注意:不要忘记SET
修改表名和表结构
ALTER TABLE 旧表名 RENAME 新表名;
示例:
ALTER TABLE zzz RENAME yyy;
ALTER TABLE yyy RENAME zzz;
删除数据
在数据表中删除指定的数据记录
格式:
DELETE FROM 表名 [WHERE 条件表达式];
示例:
delete from CLASS where id=5;
select * from CLASS;
删除字段
格式:
ALTER TABLE 表名 DROP 字段名;
示例:
ALTER TABLE yyy DROP passwd;
总结
理解数据库基本概念、
掌握mysql的编译安装
会操作nysql数据库