現在是數據時代,數據不隨程序的結束而消失,數據也可以被多個應用程序所共享,我們稱之為大數據時代,數據起着這么大的作用,那么管理數據庫的方式也在不斷的發生變化,由起先的文件管理系統帶來數據冗余,不支持並發訪問,無安全控制功能一步步進化到如今的數據庫管理系統,不僅減少了數據的冗余,還提高了數據的完整正確性以及並發一致性,打的提高了人們對數據的利用性,那么就讓我們一起來認識一下所謂的數據庫管理系統吧!
一、數據庫管理系統的基本功能以及分類
數據庫系統是一個實際可運行的存儲、維護和應用系統提供數據的軟件系統,是存儲介質、處理對象和管理系統的集合體。它通常由軟件、數據庫和數據管理員組成。其軟件主要包括操作系統、各種宿主語言、實用程序以及數據庫管理系統。
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 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
然后敲一系列命令將匿名用戶刪掉,保持可以遠程登錄等;接下來就可以進入數據庫進行一些命令的操作了。
三、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;
后續內容下篇博客繼續更新。
MariaDB [m33student]> alter table student add phone char(11) after name; 在name列后再加一個phone列
Query OK, 0 rows affected (0.05 sec)