1. 程式人生 > >數據庫管理系統

數據庫管理系統

就是 指定端口號 官方下載 cati 則表達式 不同的 16bit brush show

數據庫結構:

層次模型

網狀模型

關系模型

關系模型,是我們最常用的數據庫管理系統類型;他的主要組成部分是表(表:由記錄(行),和字段(列)組成)

關系型數據管理系統:

範式:是關系模式的集合,構造關系數據庫需要遵守一定的規則,而這些規則就是範式

目前數據庫有六種範式:第一範式,第二範式,第三範式,巴德斯科範式(BCNF),第四範式,第五範式;

滿足最低要求的範式是第一範式,在第一範式的基礎上再滿足一些要求形成第二範式,以此類推,因此,範式等級越高越難實現數據存儲;

表(二維表):包括行和列,一個表可以沒有行(記錄),但必須有一個列(字段)

數據庫:

數據庫包括的內容:表,索引,視圖(虛表),SQL_interface,存儲過程,存儲函數,觸發器,事件調度器;

約束:(約束的是字段(列))
主鍵約束:數據唯一不能為空;一個表中只能有一個主鍵
唯一鍵約束:數據唯一,可以為空,唯一鍵可以有多個也可以沒有;
外鍵約束:引用性約束或參考性約束;即:如果某表中頻繁出現冗余信息,應該將此類信息存儲於其他的表中,而此表中該字段的數據為另一張表的主鍵中所包含的值;
檢查性約束:表達式約束;

MySQL 和 MariaDB

客戶端/服務器架構

客戶端程序:mysql、mysqladmin、mysqldump.......

服務器端程序:msyqld_safe、msyqld、mysqld_multi

MySQL的安裝:在CentOS Base源下有rpm包,也可以去官方下載二進制包或者源代碼包;

MySQL的配置文件:/etc/my.cnf /etc/my.cnf.d ~/.my.cnf

通常在啟動服務時按照如上的順序去讀取配置文件裏面的參數,若配置文件內有相同的參數,則以最後的為準;

也可以使用mysqld_safe服務器端程序啟動服務,-c + 文件,或-e +文件 使用指定的文件內的參數,-c 和 -e 一定要放在首位;-c 是只讀指定文件內參數,而-e則是把指定文件附加到最後用來讀取參數

mysql命令:

選項:

-u :指定用戶

-h:指定主機

-p:指定密碼

-P:指定端口號

-D:指定使用哪個數據庫

[root@bogon ~]# mysql -p111111 -D wang4 -e 'create table wang2(ID char primary key);'
MariaDB [wang4]> show tables;
+-----------------+
| Tables_in_wang4 |
+-----------------+
| wang2           |
+-----------------+


mysql下的交互式命令(可以使用\?)查看:

\c,clear :停止當前輸入的命令,返回提示符

MariaDB [mysql]> select User from user;
+------------+
| User       |
+------------+
MariaDB [mysql]> select User from user \c
MariaDB [mysql]>

\d,delimiter:設置語句的結束標記,默認是;

MariaDB [mysql]> \d .
MariaDB [mysql]> select User from user.
+------------+
| User       |
+------------+

\G,ego :讓返回的結果縱向顯示

MariaDB [mysql]> select User from user\G
*************************** 1. row ***************************
User: root

\g,go:不需要輸入結束標記,直接送到mysql服務器

\q,quit、exit:退出mysql交互模式

\s,status:獲取mysql的狀態信息

\u,use:使用指定的數據庫

MariaDB [mysql]> use hellodb;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
MariaDB [hellodb]>

\.,source:在mysql交互模式執行SQL腳本文件,

\?,help:尋找命令幫助

mysqladmin:客戶端命令

選項:-u, -h, -p, -P, -D, 和mysql命令一樣

常用子命令:
create db_name:創建數據庫;

[root@bogon ~]# mysqladmin -p111111 create db1;

drop db_name:刪除數據庫;

[root@bogon ~]# mysqladmin -p111111 drop db1;
Dropping the database is potentially a very bad thing to do.
Any data stored in the database will be destroyed.

Do you really want to drop the 'db1' database [y/N] y
Database "db1" dropped

flush-hosts:清除服務器緩存中所有信息;
flush-logs:清除日誌,讓日誌滾動;
flush-privileges:刷新授權表;
flush-tables:為表加鎖;
password new-password:為指定的用戶設置新密碼;
start-slave:在msyql的集群服務中的從節點啟動用於實施復制功能的線程;
stop-slave:在msyql的集群服務中的從節點關閉用於實施復制功能的線程;
shutdown:停止服務;

mysqld_safe服務器端命令:用於啟動mysql服務,定義mysql的工作特性;

這裏定義工作特性是指定參數;

指定參數可以在mysql交互式命令裏面使用如下方法查看

show [global | session] variables like '參數名稱' (參數名稱可以支持mysql的通配符) ,若不寫global或session默認是global

或者

select @@[global|session].'參數名稱'若不寫global或session默認是global

MariaDB [(none)]> show variables like '%file' 
    -> ;
+-------------------------+------------------------------+
| Variable_name           | Value                        |
+-------------------------+------------------------------+
| ft_stopword_file        | (built-in)      
MariaDB [(none)]> select @@ft_stopword_file
    -> ;
+--------------------+
| @@ft_stopword_file |
+--------------------+
| (built-in)         |
+--------------------+

查看與狀態及統計信息相關的參數/變量的值;
show [global | session] status like '參數名稱' (參數名稱可以支持mysql的通配符) ,若不寫global或session默認是global

修改服務器變量的方法:

set '參數名稱' = 參數值

set @@參數名稱 = 參數值


set global innodb_file_per_table=1;
set @@global.innodb_file_per_table=0;

MariaDB與MySQL模式

ANSI:寬松模式,當插入的數據不符合類型,或長度不匹配,則會發出warning警告

TRADITIONAL:嚴格模式。對於插入的數據進行校驗,如果該數據不符合字段定義的數據類型或長度要求,報告Error錯誤警告,且錯誤數據不會被寫入;

該模式用於事務時,此前可能已經進行了一系列的數據插入和修改操作,而一旦發送上述錯誤,此前所有的INSERT/UPDATE等操作均會被立即放棄並回滾。

該模式用於非事務時,一旦發送上述錯誤,則此前所有的INSERT/UPDATE等操作均不會回滾

(事務:包括事務開始條件和事務結束條件;一般包含一個或多個SQL語句)

STRICT_TRANS_TABLES:嚴格模式。對於插入的數據進行校驗,如果該數據不符合字段定義的數據類型或長度要求,報告Error錯誤警告,且錯誤數據不會被寫入;

STRICT_ALL_TABLES:嚴格模式。對於事務型操作,與STRICT_TRANS_TABLES模式效果一樣;對於非事務操作,與TRADITIONAL模式效果一樣。


數據庫的數據類型:

數值型:
精確數值型:
TINYINT(3):8bits,0~255,-128~+127
SMALLINT(5):16bits,0~65535,-32768~+32767
MEDIUMINT(8):24bits,0~16777735
INT(10):32bits,
INTEGER:48bits,
BIGINT:64bits

近似數值型:
REAL
DOUBLE
FLOAT

字符串型:
變長字符型:
VARCHAR(length):字符不區分大小寫;65536個字符;
VARCHAR(30)
qhdlink$ -- 8字節存儲空間;
VARBINARY(length):字符區分大小寫;65536個字符;

定長字符型
CHAR(length):字符不區分大小寫;256個字符;
CHAR(30)
qhdlink -- 30字節空間;
BINARY(length):字符區分大小寫;256個字符;

對象存儲類型:
TEXT:存儲大量的純文本信息;
TINYTEXT
TEXT
MEDIUMTEXT
LONGTEXT

BLOB:存儲非純文本信息經過流式化處理之後的二進制數據;
TINYBLOB
BLOB
MEDIUMBLOB
LONGBLOB

日期時間型:
DATE:日期型,3字節;
TIME:時間型,3字節;
TIMESTAMP:時間戳類型,4字節;
DATETIME:日期時間型,8字節;
YEAR:年份,YEAR(2),YEAR(4)

內置特殊類型:
集合類型:
SET:集合,插入的數據可以是集合中各個元素的任意組合;
SET('a','b','c','d')
a
aa
aab
abdc

枚舉類型:
ENUM:枚舉,只能存放列舉出來的固定的字符或字符串;
ENUM('F','M')
F
M

數據類型相關的修飾符:
與整數類型相關的:
UNSIGNED,無符號整數;
註意:UNSIGNED修飾符必須緊跟在精確數值類型標識符之後;
AUTO_INCREMENT [=] Value:
整型數據的遞增或遞減;

通用修飾符:
NOT NULL:非空約束;一般是為主鍵做約束;
DEFAULT Value:為字段設置默認值;

數據庫語言

DDL:數據庫定義語言

創建數據庫:CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [DEFAULT] [CHARACTER SET [=] charset_name | [DEFAULT] COLLATE [=] collation_name]

IF NOT EXISTS:
如果指定要創建的數據庫已經存在,則不報錯也不執行創建操作;

db_name:
要創建的數據庫的名稱

CHARACTER SET [=] charset_name:

查看mysql服務器所支持的所有字符集及默認排序規則;

COLLATE [=] collation_name:
為新創建的數據庫指定字符集的排序規則;

MariaDB [(none)]> create database lilei character set = 'utf8';
Query OK, 1 row affected (0.01 sec)
MariaDB [(none)]> create database if not exists lilei character set = 'utf8';
Query OK, 1 row affected, 1 warning (0.00 sec)

修改數據庫的字符集或排序規則:ALTER {DATABASE | SCHEMA} [db_name] [DEFAULT] [CHARACTER SET [=] charset_name | [DEFAULT] COLLATE [=] collation_name]

註意:如果數據庫中已經有表,且表中已經插入數據時,更改數據庫的字符集和排序規則可能會導致已存數據的亂碼;

刪除數據庫:DROP {DATABASE | SCHEMA} [IF EXISTS] db_name

MariaDB [(none)]> drop database lilei;
Query OK, 0 rows affected (0.01 sec)

創建表:

CREATE TABLE [IF NOT EXISTS] tbl_name (create_definition,...) [table_options]

MariaDB [lilei]> create table han×××1(ID tinyint unsigned not null auto_increment primary key,Name varchar(30));
Query OK, 0 rows affected (0.03 sec)

顯示表的結構:
mysql> desc stu_info;

顯示創建表的SQL語句:
mysql> show create table stu_info;

刪除表:
DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ...

修改表:修改表的各個字段的屬性和定義的內容;
ALTER TABLE tbl_name [alter_specification [, alter_specification] ...]

增加表的字段:
ADD [COLUMN] col_name column_definition [FIRST | AFTER col_name ]

MariaDB [lilei]> alter table han××× add (Age tinyint not null);
Query OK, 0 rows affected (0.04 sec)               
Records: 0  Duplicates: 0  Warnings: 0


MariaDB [lilei]> alter table han××× add SAge tinyint not null after Age;
Query OK, 0 rows affected (0.04 sec)               
Records: 0  Duplicates: 0  Warnings: 0

修改表的字段屬性
CHANGE [COLUMN] old_col_name new_col_name column_definition [FIRST|AFTER col_name]
MODIFY [COLUMN] col_name column_definition [FIRST | AFTER col_name]

modify和change不同的是 modify不能修改字段名稱;

MariaDB [lilei]> alter table han××× change SAge sex tinyint not null after Age;
Query OK, 0 rows affected (0.03 sec)               
Records: 0  Duplicates: 0  Warnings: 0

刪除表的字段:
DROP [COLUMN] col_name

註意:刪除字段的操作可能會引起數據的變化,所以,刪除字段時要慎重;

DML:數據庫管理語言

向表中添加數據:
INSERT [INTO] tbl_name [(col_name,...)] {VALUES | VALUE} ({expr | DEFAULT},...),(...),...
Or:
INSERT [INTO] tbl_name SET col_name={expr | DEFAULT}, ...

MariaDB [lilei]> insert into han××× values(2,'wang',1,2);
MariaDB [lilei]> insert into han××× (Name) values ('zhao'),('yuan');
MariaDB [lilei]> insert into han××× set ID=6,Name='yuan';


註意:
1.如果向表中插入的value是字符串,則value必須使用引號引用;
2.如果向表中插入的value是數字,則value一定不能用引號引用;

查看表中的數據內容:
SELECT select_expr [, select_expr ...] [FROM table_references] [WHERE where_condition]

1.顯示整張表:
SELECT * FROM tbl_name;

2.投影:顯示指定的或符合要求的列;
SELECT col_name AS con_alias[,col_name AS con_alias,...] FROM tbl_name;

3.選擇:顯示符合要求或匹配條件的行;
SELECT col_name AS con_alias[,col_name AS con_alias,...] FROM tbl_name WHERE condition;

WHERE子句用於指明選擇時依據的條件:
col_name 操作符 value

MariaDB [lilei]> select ID from han××× where ID=6;
+----+
| ID |
+----+
|  6 |
+----+

WHERE條件子句:
通過指明特定的過濾條件或表達式來實現"選擇"運算;過濾條件有下列幾種:
1.算術表達式:Age+10,
算術操作符:+, -, *, /, %;
2.比較表達式:Age+10<20;
比較操作符:=, <=>, <>, !=, >, >=, <, <=;
3.邏輯表達式:
邏輯操作符:AND, OR, NOT, XOR;
4.其他表達式:
空值判斷:IS NULL, IS NOT NULL;
連續區間判斷:BETWEEN ... AND ...

MariaDB [lilei]> select * from han××× where ID between 3 and 5;
+----+------+-----+-----+
| ID | Name | Age | sex |
+----+------+-----+-----+
|  3 | li   |   0 |   0 |
|  4 | zhao |   0 |   0 |
|  5 | yuan |   0 |   0 |
+----+------+-----+-----+

列表從屬關系判斷:IN (LIST);
模糊值判斷:
LIKE:可以支持通配符,%和_;如果想要使用索引實現加速檢索,則最左側字符不能使用通配符;
RLIKE或REGEXP:可以支持正則表達式元字符;只要在查詢條件中包含正則表達式元字符,則一定無法使用索引進行檢索;功能很強大,但檢索性能可能變差;

GROUP BY子句:
根據指定的字段將查詢結果進行分組歸類,以方便進行聚合運算;
常用的聚合運算函數:
avg():取平均值運算;
max():取最大值運算;
min():取最小值運算;
sum():做和運算;
count():做次數統計;

MariaDB [lilei]> select Name,count(Name) from han××× group by Name;
+------+-------------+
| Name | count(Name) |
+------+-------------+
| 10   |           1 |
| li   |           1 |
| wang |           1 |
| yuan |           2 |
| zhao |           1 |
+------+-------------+

(若同時使用GROUP BY 和where) where 放在group by之前
HAVING子句:對於經過分組歸類並進行了聚合運算以後的結果進行條件過濾;
其條件表達式的書寫格式與WHERE子句相同;

ORDER BY子句:根據指定的字段將查詢結果進行排序,可以使用升序或降序,默認是升序;
升序:ASC
降序:DESC

LIMIT子句:
對於查詢的結果進行限定行數的輸出;

1.LIMIT [offset,] row_count offset是一個數:偏移量 row_count :是一個數,顯示幾行

MariaDB [lilei]> select * from han××× limit 1,2;   偏移一行,顯示倆行,也就是從首行開始,略過一行,顯示接下來倆行
+----+------+-----+-----+
| ID | Name | Age | sex |
+----+------+-----+-----+
|  2 | wang |   1 |   2 |
|  3 | li   |   0 |   0 |
+----+------+-----+-----+

2.LIMIT row_count OFFSET offset

MariaDB [lilei]> select * from han××× limit 2 offset 1;
+----+------+-----+-----+
| ID | Name | Age | sex |
+----+------+-----+-----+
|  2 | wang |   1 |   2 |
|  3 | li   |   0 |   0 |
+----+------+-----+-----+

視圖: 實際上是一個虛表,使用select查詢語句的結果

創建視圖:CREATE VIEW view_name [(column_list)] AS SELECT clause;

MariaDB [lilei]> create view han as select ID,Name from han×××;
Query OK, 0 rows affected (0.00 sec)

MariaDB [lilei]> select * from han;
+----+------+
| ID | Name |
+----+------+
|  1 | 10   |
|  2 | wang |
|  3 | li   |
|  4 | zhao |
|  5 | yuan |
|  6 | yuan |
+----+------+

刪除視圖:DROP VIEW [IF EXISTS] view_name [, view_name] ... [RESTRICT | CASCADE]


註意:之所以創建視圖,是為了隱藏某些字段的信息,所以我們查詢視圖的時候 顯示的只是基表的一部分,當我們去給視圖內添加數據時,若基表沒顯示的字段部分要求數據不能為空,則添加失敗, 除非數據庫模式為寬松模式;




數據庫管理系統