數據庫結構:mysql
層次模型正則表達式
網狀模型sql
關係模型數據庫
關係模型,是咱們最經常使用的數據庫管理系統類型;他的主要組成部分是表(表:由記錄(行),和字段(列)組成)緩存
關係型數據管理系統:bash
範式:是關係模式的集合,構造關係數據庫須要遵照必定的規則,而這些規則就是範式服務器
目前數據庫有六種範式:第一範式,第二範式,第三範式,巴德斯科範式(BCNF),第四範式,第五範式;session
知足最低要求的範式是第一範式,在第一範式的基礎上再知足一些要求造成第二範式,以此類推,所以,範式等級越高越難實現數據存儲;架構
表(二維表):包括行和列,一個表能夠沒有行(記錄),但必須有一個列(字段)ide
數據庫:
數據庫包括的內容:表,索引,視圖(虛表),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]
注意:之因此建立視圖,是爲了隱藏某些字段的信息,因此咱們查詢視圖的時候 顯示的只是基表的一部分,當咱們去給視圖內添加數據時,若基表沒顯示的字段部分要求數據不能爲空,則添加失敗, 除非數據庫模式爲寬鬆模式;