现在是数据时代,数据不随程序的结束而消失,数据也可以被多个应用程序所共享,我们称之为大数据时代,数据起着这么大的作用,那么管理数据库的方式也在不断的发生变化,由起先的文件管理系统带来数据冗余,不支持并发访问,无安全控制功能一步步进化到如今的数据库管理系统,不仅减少了数据的冗余,还提高了数据的完整正确性以及并发一致性,打的提高了人们对数据的利用性,那么就让我们一起来认识一下所谓的数据库管理系统吧!
一、数据库管理系统的基本功能以及分类
数据库系统是一个实际可运行的存储、维护和应用系统提供数据的软件系统,是存储介质、处理对象和管理系统的集合体。它通常由软件、数据库和数据管理员组成。其软件主要包括操作系统、各种宿主语言、实用程序以及数据库管理系统。
1、数据定义
DBMS提供相应数据语言来定义(DDL)数据库结构,它们是刻画数据库框架,并被保存在数据字典中。
2、数据处理
DBMS提供数据操纵语言(DML),实现对数据库数据的基本存取操作:检索,插入,修改和删除。
3、数据安全
包括数据库初始数据的装入,数据库的转储、恢复、重组织,系统性能监视、分析等功能。
4、数据备份
即是数据的安全性、完整性和并发控制等对数据库运行进行有效地控制和管理,以确保数据正确有效。
接下来我们再来认识一下数据库的类型,主要有关系型数据库
5、关系型数据库
• 关系 :关系就是二维表。并满足如下性质: 表中的行、列次序并不重要
• 行row:表中的每一行,又称为一条记录
• 列column:表中的每一列,称为属性,字段
• 主键(Primary key):用于惟一确定一个记录的字段
• 域domain:属性的取值范围,如,性别只能是‘男’和‘女’两个
• RDBMS: MySQL: MySQL, MariaDB, Percona Server PostgreSQL: 简称为pgsql,EnterpriseDB Oracle: MSSQL: DB2:
• 事务transaction:多个操作被当作一个整体对待
ACID:
A: 原子性
C:一致性
I: 隔离性
D:持久性值
6、数据的三要素
数据结构:
• 包括两类,一类是与数据类型、内容、性质有关的对象,比如关系模型中的域、属性和关系等;另 一类是与数据之间联系有关的对象,它从数据组织层表达数据记录与字段的结构
数据的操作:
• 数据提取:在数据集合中提取感兴趣的内容。(SELECT)
• 数据更新:变更数据库中的数据。(INSERT、DELETE、UPDATE
数据的约束条件 :是一组完整性规则的集合
• 实体(行)完整性 Entity integrity
• 域(列)完整性 Domain Integrity
• 参考完整性 Referential Integrity
7、数据的正规化分析
目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴德斯科 范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。满足最低要求的范式是第一 范式(1NF)。在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以 次类推。一般说来,数据库只需满足第三范式(3NF)即可
• 1NF:每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多 个值或者不能有重复的属性。除去同类型的字段,就是无重复的列
• 2NF:第二范式必须先满足第一范式,要求表中的每个行必须可以被唯一地区分。通常为表加上一 个列,以存储各个实例的唯一标识PK。非PK的字段需要与整个PK有直接相关性
• 3NF:满足第三范式必须先满足第二范式。第三范式要求一个数据库表中不包含已在其它表中已包 含的非主关键字信息,非PK的字段间不能有从属关系
• 约束:constraint,表中的数据要遵守的限制
• 主键:一个或多个字段的组合,填入的数据必须能在本表中唯一标识本行;必须提供数据,即NOT NULL,一个表只能存在一个
• 惟一键:一个或多个字段的组合,填入的数据必须能在本表中唯一标识本行;允许为NULL,一个表 可以存在多个
• 外键:一个表中的某字段可填入的数据取决于另一个表的主键或唯一键已有的数据
• 检查:字段值在一定范围内
• 索引:将表中的一个或多个字段中的数据复制一份另存,并且此些需要按特定次序排序存储
• 关系运算:
选择:挑选出符合条件的行
投影:挑选出需要的字段
连接:表间字段的关联
认识了以上这些关于数据库管理系统的基本介绍,接下来我们就来详细的认识一下MySQL体系的相关历史发展。
二、MySQL介绍
1、MySQL历史
MariaDB:
1979年:TcX公司 Monty Widenius,Unireg
1996年:发布MySQL1.0,Solaris版本,Linux版本
1999年:MySQL AB公司,瑞典
2003年:MySQL 5.0版本,提供视图、存储过程等功能
2008年:sun 收购
2009年:oracle
2、安装MySQL
• 安装方式:
• 1、源代码:编译安装
• 2、二进制格式的程序包:展开至特定路径,并经过简单配置后即可使用
• 3、程序包管理器管理的程序包(在配置好yum仓库后,直接使用 yum -y install mysql-server mysql)
CentOS安装光盘 项目官方: https://downloads.mariadb.org/mariadb/repositories/
• 4、安装和使用MariaDB
CentOS 7直接提供
CentOS 6可以进行编译安装,接下来就描述一下centos6的mariadb安装吧!
(1)在服务器上下载mariadb的二进制包mariadb-10.2.14-linux-x86_64.tar.gz
[root@centos6 ~]# lftp 172.18.0.1
lftp 172.18.0.1:~> ls
drwxr-xr-x 10 0 0 4096 Aug 24 07:54 pub
lftp 172.18.0.1:/> user thirty-three
Password:
lftp [email protected]:~> cd files/
lftp [email protected]:/files> get mariadb-10.2.14-linux-x86_64.tar.gz
(2)创建所需用户及组
[root@centos6 ~]# groupadd -g 36 -r mysql
[root@centos6 ~]# useradd -u 36 -r -g mysql -m -d /app/dbdata -s /sbin/nologin mysql
(3)准备dbdata
[root@centos6 ~]# fdisk /dev/sda 对sda进行分区
[root@centos6 ~]# partx -a /dev/sda 同步sda设,备
[root@centos6 ~]# pvcreate /dev/sda6 在sda6上建立物理卷
[root@centos6 ~]# vgcreate vgmysql /dev/sda6 建立名为vgmysql的卷组
[root@centos6 ~]# lvcreate -l +100%FREE -n lvmysql vgmysql 创建逻辑卷使其沾满整个空间
[root@centos6 ~]# mkfs.ext4 /dev/vgmysql/lvmysql 格式化文件系统
[root@centos6 ~]# vim /etc/fstab 对逻辑卷进行挂载,并且开机自挂
/dev/vgmysql/lvmysql /app/dbdata ext4 defaults 0 0
[root@centos6 ~]# mount –a 重新挂载设备
[root@centos6 ~]# chown mysql.mysql /app/dbdata 由于挂载原因,目录的所属人所属组都发生了变化,所以重新修改一下所属人及所属组
[root@centos6 ~]# chmod 700 /app/dbdata 修改权限
(4)解压二进制目录
[root@centos6 ~]#tar -xvf mariadb-10.2.14-linux-x86_64.tar.gz -C /usr/local/
[root@centos6 ~]# cd /usr/local/
[root@centos6 local]# ln -sv mariadb-10.2.14-linux-x86_64 mysql 由于目录比较长,所以建立一个软链接。
`mysql' -> `mariadb-10.2.14-linux-x86_64'
(5)创建配置文件
[root@centos6 local]# cd /usr/local/mysql/
[root@centos6 mysql]# mkdir /etc/mysql
[root@centos6 mysql]# cp support-files/my-huge.cnf /etc/mysql/my.cnf
[root@centos6 mysql]# vim /etc/mysql/my.cnf
[mysqld]
……
datadir = /app/dbdata
innodb_file_per_table = on
skip_name_resolve = on
……
(6)创建数据库
[root@centos6 mysql]# scripts/mysql_install_db --datadir=/app/dbdata --user=mysql
(7)配置启动脚本
[root@centos6 mysql]# cp support-files/mysql.server /etc/init.d/mysqld
[root@centos6 mysql]# chkconfig --add mysqld
[root@centos6 mysql]# chkconfig mysqld on
[root@centos6 mysql]# service mysqld restart
MariaDB server PID file could not be found! [FAILED]
Starting MariaDB.180710 18:00:14 mysqld_safe Logging to '/var/log/mysqld.log'.
180710 18:00:14 mysqld_safe Starting mysqld daemon with databases from /app/dbdata
[ OK ]
(8)配置环境变量PATH
[root@centos6 ~]# vim /etc/profile.d/mage.sh
export PATH=/usr/local/mysql/bin:$PATH
[root@centos6 ~]# source /etc/profile.d/mage.sh 这样执行命令时就可以少敲/usr/local/mysql/bin命令
(9)初始化mysql
[root@centos6(nanyibo) ~]# mysql_secure_installation
然后敲一系列命令将匿名用户删掉,保持可以远程登录等;接下来就可以进入数据库进行一些命令的操作了。
三、MySQL的使用
1、进入MySQL
[root@centos6 ~]# mysql -uroot -pcentos
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 18
Server version: 10.2.14-MariaDB-log MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]>
2、基本语句
(1)查看当前用户名
MariaDB [(none)]> select user();
(2)查看当前版本号
MariaDB [(none)]> select version();
(3)查看当前系统有哪些databases
MariaDB [(none)]> show databases;
+--------------------- +
| Database |
+--------------------- +
| #mysql50#lost+found |
| information_schema |
| m33student |
| mysql |
| performance_schema |
+-------------------------------+
5 rows in set (0.00 sec)
(4)创建数据库
MariaDB [test]> create database magedb;
Query OK, 1 row affected (0.01 sec)
(5)删除数据库
MariaDB [(none)]> drop database m33student;
Query OK, 3 rows affected (0.06 sec)
3、在数据库中添加表
(1)数据库的切换
MariaDB [(none)]> use mysql;
Database changed
(2)数据库中添加表并设置其属性
MariaDB [m33studdent]> create table student (id tinyint unsigned primary key,name varchar(20) not null,age tinyint unsigned,sex char(1) default "m");
使用查询语句创建表 as可以省略
MariaDB [m33student]> create table emp as select * from student;
借此例子我在介绍一下数据的类型
A、数字型 (整型和数值型)
• tinyint(m) 1个字节 范围(-128~127)
• smallint(m) 2个字节 范围(-32768~32767)
• mediumint(m)3个字节 范围(-8388608~8388607)
• int(m) 4个字节 范围(-2147483648~2147483647)
• bigint(m) 8个字节 范围(+-9.22*10的18次方) 取值范围如果加了unsigned,则最大值翻倍,如tinyint unsigned的取值范围为(0~255) int(m)里的m是表示SELECT查询结果集中的显示宽度,并不影响实际的取值范围 MySQL可以为整型类型指定宽度,例如Int(11),对绝大多数应用这是没有意义的:它不会限制值的 合法范围,只是规定了MySQL的一些交互工具(例如MySQL命令行客户端)用来显示字符的个数。对 于存储和计算来说,Int(1)和Int(20)是相同的
• 浮点型(float和double)近似值
• float(m,d) 单精度浮点型 8位精度(4字节) m总个数,d小数位
• double(m,d) 双精度浮点型 16位精度(8字节) m总个数,d小数位
• 设一个字段定义为float(6,3),如果插入一个数123.45678,实际数据库里存的 是123.457,但总个数还以实际为准,即6位
B、字符型(定义字符类型时需要加‘’引起来)
•字符串(char,varchar,_text)
• char(n) 固定长度,最多255个字符
• varchar(n)可变长度,最多65535个字符
• tinytext 可变长度,最多255个字符
• text 可变长度,最多65535个字符
• mediumtext 可变长度,最多2的24次方-1个字符
• longtext 可变长度,最多2的32次方-1个字符
• BINARY(M) 固定长度,可存二进制或字符,允许长度为0-M字节,
• VARBINARY(M) 可变长度,可存二进制或字符,允许长度为0-M字节
• 内建类型:ENUM枚举, SET集合
C、日期类型
• date 日期 '2008-12-2'
• time 时间 '12:25:36'
• datetime 日期时间 '2008-12-2 22:06:44'
• timestamp 自动存储记录修改时间
• YEAR(2), YEAR(4):年份
D、修饰符
• 所有类型:
• NULL 数据列可包含NULL值
• NOT NULL 数据列不允许包含NULL值
• DEFAULT 默认值
• PRIMARY KEY 主键
• UNIQUE KEY 唯一键
• CHARACTER SET name 指定一个字符集
• 数值型
• AUTO_INCREMENT 自动递增,适用于整数类型
• UNSIGNED 无符号
(3)删除一个表
MariaDB [m33student]> drop table student;
(4)修改表中内容
MariaDB [m33student]> alter table student add phone char(11) after name; 在name列后再加一个phone列
Query OK, 0 rows affected (0.05 sec)
(5)增加索引
MariaDB [m33student]> create index age_index on student(phone);
MariaDB [m33student]> ALTER TABLE students ADD INDEX(age);
(6)删除索引
MariaDB [m33student]> DROP INDEX index_name ON m33student;
MariaDB [m33student]> alter table student drop phone;
(7)增加唯一性的约束
MariaDB [m33student]> alter table student add unique key (phone);
4、表中添加数据
(1)单行添加
MariaDB [m33student]> insert into student values (1,’mwj’,22,’f’);
(2)指定属性对应参加
MariaDB [m33student]> insert into student (id,name) values (2,’wsy');
(3)一次性添加多条记录
MariaDB [m33student]> insert into student (id,name,sex) values (4,'mun','f'),(5,'cyan','f'),(6,'fng',default);
5、删除表中数据
MariaDB [m33student]> delete from lady; 删除整个表中内容
Query OK, 4 rows affected (0.01 sec)
MariaDB [m33student]> delete from emp where id=1; 删除符合条件的列
Query OK, 1 row affected (0.02 sec)
6、更新表中数据
MariaDB [m33student]> update student set phone='18438613802' where id=2;
Query OK, 1 row affected (0.03 sec)
Rows matched: 1 Changed: 1 Warnings: 0
MariaDB [m33student]> update emp set phone='18438613802' ;
Query OK, 6 rows affected (0.02 sec)
Rows matched: 6 Changed: 6 Warnings: 0
MariaDB [m33student]> select id,score+10 score from lesson;
7、函数的调用
在MySQL的使用中,分为多行函数和单行函数,单行函数中又包括了字符串类型,数字型和日期型以及一些其他的函数,多行函数中又分为聚合函数和组合函数。接下来简单的介绍几种比较常见的函数。
(1)单行函数
* concat 连接函数
mysql> select concat(name,' age is ',age) name_age from students where name='zhou yu';
+------------------------+
| name_age |
+------------------------+
| Zhou Yu age is 20 |
+-------------------+
1 row in set (0.00 sec)
* insert 插入函数
mysql>select name,insert(phone,4,4,'****') phone from students;
+----------------+--------------------+
| name | phone |
+----------------+--------------------+
| Hou Yi | 151****2972 |
| Ya Se | 151****2972 |
| An Qila | 135****9929 |
| Da Ji | 135****9929 |
| Sun Sha | 135****9929 |
* substr 截取字段
substr(phone,5,3) 从第5位开始取,往后一共取3位
mysql> select substr(phone,5,3) from students where name='kai’;
+-------------------------+
| substr(phone,5,3) |
+-------------------------+
| 179 |
+-------------------------+
* abs 取绝对值
mysql> select abs(-20);
+--------------------------+
| abs(-20) |
+--------------------------+
| 20 |
+--------------------------+
* mod(10,3); 取模
* ceil(9.2);取不小于X的最小整数
* floor(3.6) 取不大于X的最大整数
* round 四舍五入
round(3.41111) 得3
round(3.41111,2) 得3.41
* truncate 截断
truncate(3.111111,0) 得3
truncate(113.119911,3) 得113.119
truncate(113.119911,-1) 得110
* 日期型
select now(); 显示当前的时间
select curdate(); 显示当前的日期
select curtime(); 显示当前的时间
select year(birthday); 显示指定日期的年
select month(birthday); 显示指定日期的月
select day(birthday); 显示指定日期是几号
select dayname(now()); 显示指定日期是周几
字符转日期
str_to_date('24-11-1700','%d-%m-%Y') 字符转日期
mysql> select str_to_date('24-11-1700','%d-%m-%Y') from students;
1700-11-24
日期转字符
mysql> select date_format(birthday,'%Y年%m月%d日') 生日 from students;
1700年11月24日
* null函数 将null值设为0
ifnull(score,0)
coalesce(score,0)
(2)多行函数
* count() 返回表中满足where条件的行的数量
mysql> select count(distinct classid) from students;
+------------------------------+
| count(distinct classid) |
+------------------------------+
| 7 |
+------------------------------+
1 row in set (0.00 sec)
max() 最大值函数
min() 最小值
avg() 平均数
sum() 求和函数
mysql>select avg(ifnull(score,0)) from scores;
+--------------------------+
| avg(ifnull(score,0)) |
+--------------------------+
| 73.0588 |
+--------------------------+
1 row in set (0.00 sec)
mysql>select courseid,avg(nullif(score,0)) as avg from scores group by courseid having avg>60;
+----------+----------+
| courseid | avg |
+----------+----------+
| 1 | 73.6667 |
| 2 | 75.2500 |
| 3 | 93.0000 |
| 5 | 84.0000 |
| 6 | 84.0000 |
| 7 | 73.0000 |
+----------+----------+
练习
导入hellodb.sql生成数据库
(1)在students表中,查询年龄大于25岁,且为男性的同学的名字和年龄
mysql> select Name,age from students where age>25 and gender='m';
(2)以ClassID为分组依据,显示每组的平均年龄
mysql> select classid ,avg(age) age from students group by classid having classid is not null;
(3)显示第2题中平均年龄大于30的分组及平均年龄
mysql> select classid ,avg(age) age from students group by classid having age>30 and classid is not null;
(4)显示以L开头的名字的同学的信息
mysql> select * from students where name like 'L%';
(5)显示TeacherID非空的同学的相关信息
mysql> select * from students where TeacherID is NOT NULL;
(6)以年龄排序后,显示年龄最大的前10位同学的信息
mysql> select * from students order by age desc limit 10;
(7)查询年龄大于等于20岁,小于等于25岁的同学的信息
mysql> select * from students where age >= 20 and age <=25;
mysql> select * from students where age between 20 and 25;
后续内容下篇博客继续更新。