如今是數據時代,數據不隨程序的結束而消失,數據也能夠被多個應用程序所共享,咱們稱之爲大數據時代,數據起着這麼大的做用,那麼管理數據庫的方式也在不斷的發生變化,由起先的文件管理系統帶來數據冗餘,不支持併發訪問,無安全控制功能一步步進化到現在的數據庫管理系統,不只減小了數據的冗餘,還提升了數據的完整正確性以及併發一致性,打的提升了人們對數據的利用性,那麼就讓咱們一塊兒來認識一下所謂的數據庫管理系統吧!mysql
1、數據庫管理系統的基本功能以及分類linux
數據庫系統是一個實際可運行的存儲、維護和應用系統提供數據的軟件系統,是存儲介質、處理對象和管理系統的集合體。它一般由軟件、數據庫和數據管理員組成。其軟件主要包括操做系統、各類宿主語言、實用程序以及數據庫管理系統。sql
一、數據定義數據庫
DBMS提供相應數據語言來定義(DDL)數據庫結構,它們是刻畫數據庫框架,並被保存在數據字典中。vim
二、數據處理centos
DBMS提供數據操縱語言(DML),實現對數據庫數據的基本存取操做:檢索,插入,修改和刪除。安全
三、數據安全服務器
包括數據庫初始數據的裝入,數據庫的轉儲、恢復、重組織,系統性能監視、分析等功能。數據結構
四、數據備份併發
便是數據的安全性、完整性和併發控制等對數據庫運行進行有效地控制和管理,以確保數據正確有效。
接下來咱們再來認識一下數據庫的類型,主要有關係型數據庫
五、關係型數據庫
• 關係 :關係就是二維表。並知足以下性質: 表中的行、列次序並不重要
• 行row:表中的每一行,又稱爲一條記錄
• 列column:表中的每一列,稱爲屬性,字段
• 主鍵(Primary key):用於唯一肯定一個記錄的字段
• 域domain:屬性的取值範圍,如,性別只能是‘男’和‘女’兩個
• RDBMS: MySQL: MySQL, MariaDB, Percona Server PostgreSQL: 簡稱爲pgsql,EnterpriseDB Oracle: MSSQL: DB2:
• 事務transaction:多個操做被看成一個總體對待
ACID:
A: 原子性
C:一致性
I: 隔離性
D:持久性值
六、數據的三要素
數據結構:
• 包括兩類,一類是與數據類型、內容、性質有關的對象,好比關係模型中的域、屬性和關係等;另 一類是與數據之間聯繫有關的對象,它從數據組織層表達數據記錄與字段的結構
數據的操做:
• 數據提取:在數據集合中提取感興趣的內容。(SELECT)
• 數據更新:變動數據庫中的數據。(INSERT、DELETE、UPDATE
數據的約束條件 :是一組完整性規則的集合
• 實體(行)完整性 Entity integrity
• 域(列)完整性 Domain Integrity
• 參考完整性 Referential Integrity
七、數據的正規化分析
目前關係數據庫有六種範式:第一範式(1NF)、第二範式(2NF)、第三範式(3NF)、巴德斯科 範式(BCNF)、第四範式(4NF)和第五範式(5NF,又稱完美範式)。知足最低要求的範式是第一 範式(1NF)。在第一範式的基礎上進一步知足更多規範要求的稱爲第二範式(2NF),其他範式以 次類推。通常說來,數據庫只需知足第三範式(3NF)便可
• 1NF:每一列都是不可分割的基本數據項,同一列中不能有多個值,即實體中的某個屬性不能有多 個值或者不能有重複的屬性。除去同類型的字段,就是無重複的列
• 2NF:第二範式必須先知足第一範式,要求表中的每一個行必須能夠被惟一地區分。一般爲表加上一 個列,以存儲各個實例的惟一標識PK。非PK的字段須要與整個PK有直接相關性
• 3NF:知足第三範式必須先知足第二範式。第三範式要求一個數據庫表中不包含已在其它表中已包 含的非主關鍵字信息,非PK的字段間不能有從屬關係
• 約束:constraint,表中的數據要遵照的限制
• 主鍵:一個或多個字段的組合,填入的數據必須能在本表中惟一標識本行;必須提供數據,即NOT NULL,一個表只能存在一個
• 唯一鍵:一個或多個字段的組合,填入的數據必須能在本表中惟一標識本行;容許爲NULL,一個表 能夠存在多個
• 外鍵:一個表中的某字段可填入的數據取決於另外一個表的主鍵或惟一鍵已有的數據
• 檢查:字段值在必定範圍內
• 索引:將表中的一個或多個字段中的數據複製一份另存,而且此些須要按特定次序排序存儲
• 關係運算:
選擇:挑選出符合條件的行
投影:挑選出須要的字段
鏈接:表間字段的關聯
認識了以上這些關於數據庫管理系統的基本介紹,接下來咱們就來詳細的認識一下MySQL體系的相關歷史發展。
2、MySQL介紹
一、MySQL歷史
MariaDB:
1979年:TcX公司 Monty Widenius,Unireg
1996年:發佈MySQL1.0,Solaris版本,Linux版本
1999年:MySQL AB公司,瑞典
2003年:MySQL 5.0版本,提供視圖、存儲過程等功能
2008年:sun 收購
2009年:oracle
二、安裝MySQL
• 安裝方式:
• 一、源代碼:編譯安裝
• 二、二進制格式的程序包:展開至特定路徑,並通過簡單配置後便可使用
• 三、程序包管理器管理的程序包(在配置好yum倉庫後,直接使用 yum -y install mysql-server mysql)
CentOS安裝光盤 項目官方: https://downloads.mariadb.org/mariadb/repositories/
• 四、安裝和使用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 thirty-three@172.18.0.1:~> cd files/ lftp thirty-three@172.18.0.1:/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
而後敲一系列命令將匿名用戶刪掉,保持能夠遠程登陸等;接下來就能夠進入數據庫進行一些命令的操做了。
3、MySQL的使用
一、進入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)]>
二、基本語句
(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)
三、在數據庫中添加表
(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);
四、表中添加數據
(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);
五、刪除表中數據
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)
六、更新表中數據
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;
七、內置函數的調用
在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;
後續內容下篇博客繼續更新。
MariaDB [m33student]> alter table student add phone char(11) after name; 在name列後再加一個phone列Query OK, 0 rows affected (0.05 sec)