您好,登錄后才能下訂單哦!
內容:
1、數據庫簡介以及mysql/mariadb背景介紹
2、數據庫的一些名詞
3、mysql的服務結構
4、mysql客戶端的使用
5、數據類型
6、SQL語句介紹
7、mysql的事務機制
一、數據庫簡介以及mysql/mariadb背景介紹
數據可以存放在多種位置,如普通文件、專門的數據庫中,而兩者有什么區別,而為什么選擇數據庫存儲?我們知道,假如數據存在普通文件中,當我們要查找其中的一個數據時,要把整個文件加載到內存中,再進行檢索,這樣速度慢不說,一旦文件較大,直接把內存撐爆了,而數據庫的查詢可以只加載符合條件的內容。
數據庫常見的有三種模型:
網狀模型
層次模型
關系模型
關系模型是一個二維關系:表
行:row
列:column
索引:數據結構,輔助完成數據查找的;
mysql是一個廣泛使用的關系型數據庫:
1、MySQL由瑞典MySQL AB 公司開發,目前屬于 Oracle(被收購)
2、MySQL是目前最流行的關系型數據庫管理系統,在 WEB 應用方面MySQL是最好的 RDBMS (Relational DatabaseManagement System,關系數據庫管理系統) 應用軟件之一。
3、MySQL是一種關聯數據庫管理系統,關聯數據庫將數據保存在不同的表中,而不是將所有數據放在一個大倉庫內,這樣就增加了速度并提高了靈活性。
4、MySQL所使用的 SQL 語言是用于訪問數據庫的最常用標準化語言。
5、MySQL 軟件采用了雙授權政策:它分為社區版和商業版。由于其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點,一般中小型網站的開發都選擇MySQL作為網站數據庫。由于其社區版的性能卓越,搭配 PHP 和 Apache(nginx) 可組成良好的開發環境
mysql與MariaDB的關系:
(1)因為mysql被sun公司給收購了,而sun公司又被oracle公司給收購了,而oracle是一個商業數據庫公司,創始人擔心MySQL會存在閉源風險,因此用mysql的源代碼創立了MariaDB。
(2)MariaDB名字來源于創始人的三女兒,而MysDB則是源于創始人的大女兒。
(3)目前centos7的base源中MariaDB已經替代了mysql稱為默認的數據庫類型。
二、數據庫的一些名詞:
名詞:
數據庫:database
表:table
索引:index
視圖:view
行:row
列:column
主鍵:primary key
外鍵:foreign key
唯一鍵:unique key
字符集:character
排序:collate
三、mysql的服務結構:
MySQL是單進程,多線程的工作方式
mysql是一個C/S的架構:
C:client
mysql:CLI交互式客戶端程序
mysqldump:備份工具
mysqladmin:管理工具
S:server
可以監聽三類套接字地址:
ipv4
ipv6
unix sock:只監聽本機的客戶端響應
其服務端的結構可以簡單分為三個層次:
第一層,即最上一層,它們都是服務于C/S程序或者是這些程序所需要的 :接受用戶請求,身份驗證,安全性等等。
第二層,這是MySQL的核心部分。通常叫做 SQL Layer。在 MySQL據庫系統處理底層數據之前的所有工作都是在這一層完成的,包括權限判斷, sql解析,行計劃優化, query cache 的處理以及所有內置的函數(如日期,時間,數學運算,加密)等等。各個存儲引擎提供的功能都集中在這一層,如存儲過程,觸發器,視 圖等。
第三層,包括了存儲引擎。通常叫做StorEngine Layer ,也就是底層數據存取操作實現部分,由多種存儲引擎共同組成。它們負責存儲和獲取所有存儲在MySQL中的數據。就像Linux眾多的文件系統 一樣。每個存儲引擎都有自己的優點和缺陷。服務器是通過存儲引擎API來與它們交互的。這個接口隱藏 了各個存儲引擎不同的地方。對于查詢層盡可能的透明。這個API包含了很多底層的操作。如開始一個事物,或者取出有特定主鍵的行。存儲引擎不能解析SQL,互相之間也不能通信。僅僅是簡單的響應服務器的請求。
四、mysql客戶端的使用:
命令行交互式客戶端程序:mysql
連接數據庫:mysql [OPTIONS] [database]
常用選項:
-uUSERNAME
-hHOST
-p[PASSWORD]
-Ddb_name:連接并使用指定的數據庫作為默認數據庫
--socket=path, -S path:指定套接字方式
--port=port_num, -P port_num:指定端口
--execute=statement, -e statement:無需登錄到mysql而是把一些執行的結果返回
命令:
客戶端命令
mysql> help
\u db_name:設定默認數據庫;
\q:退出客戶端;
\d CHAR:自定義語句結束符,默認為分號;
\g:語句結束標記,將命令發往服務端運行;
\G:語句結束標記,將命令發往服務 端運行,行數據縱向顯示;
\! SHELL_COMMAND:可以執行shell的命令
\s:連接狀態及服務器運行狀態
\. /path/to/some_sql_script:運行SQL腳本
...
服務端命令:發往服務器端執行的SQL語句
(1) 語句結束符,默認是分號(;)
(2) 建立了與某服務器有效通信連接;
五、數據類型:
表:由行和列組成,定義列時需要選定合適的數據類型,同時需要滿足符合范式設計的要求;
字符型:
定義字符型:CHAR(#),BINARY(#)
變長字符型:VARCHAR(#) ,VARBINARY(#)
對象存儲:TEXT,BLOB
內建:ENUM,SET
注意:所有字符型數據要使用引號;
數值型:
精確數值:INT
近似數值:FLOAT,DOUBLE
注意:不能使用引號;
日期時間型:
DATE,TIME,DATETIME,TIMESTAMP,YEAR
六、SQL語句:
DDL:數據定義語言,主要用于管理庫組件,例如數據庫、表、索引、視圖、用戶、存儲過程、存儲函數、觸發器、……
CREATE,ALTER,DROP
DML:數據操縱語言,主要用于管理表中數據,實現數據CRUD操作
DCL:管理授權
獲取幫助:
mysql> help KEYWORD
數據庫管理:
創建:
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [DEFAULT] CHARACTER SET [=] charset_name
修改:
ALTER DATABASE
刪除:
DROP {DATABASE | SCHEMA} [IF EXISTS] db_name
表管理:
表創建:
CREATE TABLE [IF NOT EXISTS] tbl_name (create_defination) [table options]
create_defination:由逗號分隔的列表
字段定義:
colume_name COLUMN DEFINATION
約束:
PRIMARY KEY
UNIQUE KEY
FOREIGN KEY
CHECK(expr)
索引:
{INDEX|KEY}
{FULLTEXT|SPATIAL}
column_definition:
data_type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY]
[table options]
ENGINE [=] engine_name
……
查看數據庫所支持所有存儲引擎類型:
mysql> SHOW ENGINES;
查看表的屬性信息:
SHOW TABLE STATUS [WHERE Name='tbl_name'][LIKE PATTERN]
修改:
ALTER TABLE tbl_name [alter_specification [, alter_specification] ...]
alter_specification:
(1) 表選項
table_options
(2)表組成
字段:
ADD col_name DATA_TYPE [FIRST|AFTER col_name]
DORP [COLUMN] col_name
CHANGE
MODIFY
索引:
ADD INDEX(col1, col2, ...)
DROP INDEX index_name;
鍵:
ADD {PRIMARY|UNIQUE|FOREIGN} key (col1, col2, ...)
DROP {PRIMARY|UNIQUE|FOREIGN} KEY key_name
刪除:
DROP TABLE [IF EXISTS] tbl_name [, tbl_name]
索引管理:
創建:
CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name ON tbl_name (index_col_name,...)
index_col_name:
col_name [(length)] [ASC | DESC]
刪除:
DROP INDEX index_name ON tbl_name
查看:
SHOW {INDEX | INDEXES | KEYS} {FROM | IN} tbl_name [{FROM | IN} db_name] [WHERE expr]
DML:INSERT, DELETE, UPDATE,SELECT
INSERT INTO:
INSERT [INTO] tbl_name [(col_name,...)] {VALUES | VALUE} ({expr | DEFAULT},...),(...),...
SELECT:
(1) SELECT * FROM tbl_name;
(2) SELECT col1, col2, ... FROM tbl_name;
字段:column_name [AS Alias]
(3) SELECT col1, col2, ... FROM tbl_name WHERE CLUASE;
WHERE CLAUSE:過濾條件
col_name 操作符 value|col_name;
操作符:
>, <, >=, <=, =, !=
組合多個條件:
and, or, not
操作符(2):
BETWEEN ... AND ...
LIKE 'PATTERN':
通配符:
_:
%:
RLIKE 'PATTERN'
正則表達式模式;
IS NULL
IS NOT NULL
(4) SELECT col1, ... FROM tbl_name [WHERE CLAUSE] ORDER BY col1, col2, ... [ASC|DESC];
DELETE:
DELETE FROM tbl_name [WHERE where_condition] [ORDER BY ...] [LIMIT row_count]
UPDATE:
UPDATE table_reference SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]
演示:
A、DDL定義語言命令包含如下:
1、CREATE
2、ALTER
3、DROP
1、CREATE:
1.1:創建數據庫
MariaDB [(none)]> SHOW DATABASES; #查看所有數據庫(需要有指定權限) +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | +--------------------+ 4 rows in set (0.01 sec) MariaDB [(none)]> CREATE DATABASE nihao; Query OK, 1 row affected (0.00 sec) MariaDB [(none)]> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | nihao | | performance_schema | | test | +--------------------+ 5 rows in set (0.00 sec)
1.2、創建表
MariaDB [(none)]> SELECT DATABASE(); #內建函數,查看當前的數據庫 +------------+ | DATABASE() | +------------+ | NULL | +------------+ 1 row in set (0.00 sec) MariaDB [(none)]> USE nihao; #切換默認的數據庫 Database changed MariaDB [nihao]> CREATE TABLE users(id INT UNSIGNED NOT NULL PRIMARY KEY,name CHAR(50) NOT NULL,gender ENUM('F','M')); Query OK, 0 rows affected (0.31 sec) MariaDB [nihao]> SHOW TABLES; +-----------------+ | Tables_in_nihao | +-----------------+ | users | +-----------------+ 1 row in set (0.00 sec) MariaDB [nihao]> DESC users; #查看表的詳細信息 +--------+------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+------------------+------+-----+---------+-------+ | id | int(10) unsigned | NO | PRI | NULL | | | name | char(50) | NO | | NULL | | | gender | enum('F','M') | YES | | NULL | | +--------+------------------+------+-----+---------+-------+ 3 rows in set (0.00 sec) MariaDB [nihao]> SHOW TABLE STATUS FROM nihao\G #查看數據庫的詳細信息 *************************** 1. row *************************** Name: users Engine: InnoDB Version: 10 Row_format: Compact Rows: 0 Avg_row_length: 0 Data_length: 16384 Max_data_length: 0 Index_length: 0 Data_free: 10485760 Auto_increment: NULL Create_time: 2016-10-14 11:22:12 Update_time: NULL Check_time: NULL Collation: latin1_swedish_ci Checksum: NULL Create_options: Comment: 1 row in set (0.00 sec)
2、ALTER 修改表
MariaDB [nihao]> ALTER TABLE users RENAME user; Query OK, 0 rows affected (0.29 sec) MariaDB [nihao]> SHOW TABLES; +-----------------+ | Tables_in_nihao | +-----------------+ | user | +-----------------+ 1 row in set (0.01 sec)
3、DROP
3.1刪除表:
MariaDB [nihao]> SHOW TABLES; +-----------------+ | Tables_in_nihao | +-----------------+ | user | +-----------------+ 1 row in set (0.01 sec) MariaDB [nihao]> SELECT DATABASE(); +------------+ | DATABASE() | +------------+ | nihao | +------------+ 1 row in set (0.00 sec) MariaDB [nihao]> SHOW TABLES; +-----------------+ | Tables_in_nihao | +-----------------+ | user | +-----------------+ 1 row in set (0.00 sec) MariaDB [nihao]> DROP TABLE user; #刪除表 Query OK, 0 rows affected (0.01 sec)
3.2、刪除數據庫:
MariaDB [nihao]> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | nihao | | performance_schema | | test | +--------------------+ 5 rows in set (0.00 sec) MariaDB [nihao]> DROP DATABASE nihao; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | +--------------------+ 4 rows in set (0.00 sec)
B、DML操縱語言命令如下
1、INSERT
2、DELETE
3、SELECT
4、UPDATE
1、INSERT 插入數據
MariaDB [nihao]> INSERT INTO users(id,name,gender) VALUES (1,'tom','M'),(2,'hill','M'); Query OK, 2 rows affected (0.01 sec) Records: 2 Duplicates: 0 Warnings: 0 MariaDB [nihao]> SELECT * FROM users; +----+------+--------+ | id | name | gender | +----+------+--------+ | 1 | tom | M | | 2 | hill | M | +----+------+--------+ 2 rows in set (0.00 sec)
2、DELETE 刪除數據
MariaDB [nihao]> DELETE FROM users WHERE name='tom'; Query OK, 1 row affected (0.00 sec) MariaDB [nihao]> SELECT * FROM users; +----+------+--------+ | id | name | gender | +----+------+--------+ | 2 | hill | M | +----+------+--------+ 1 row in set (0.00 sec) MariaDB [nihao]> INSERT INTO users(id,name,gender) VALUES (3,'nihao','M'),(4,'herry','M'); Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0 MariaDB [nihao]> SELECT * FROM users; +----+-------+--------+ | id | name | gender | +----+-------+--------+ | 2 | hill | M | | 3 | nihao | M | | 4 | herry | M | +----+-------+--------+ 3 rows in set (0.00 sec) MariaDB [nihao]> DELETE FROM users; Query OK, 3 rows affected (0.00 sec) MariaDB [nihao]> SELECT * FROM users; Empty set (0.00 sec)
3、SELECT 查看數據
MariaDB [nihao]> SELECT * FROM users; #沒有指定條件 +----+-------+--------+ | id | name | gender | +----+-------+--------+ | 1 | nihao | M | | 2 | herry | M | | 3 | hill | M | | 4 | tom | M | +----+-------+--------+ 4 rows in set (0.00 sec) MariaDB [nihao]> SELECT * FROM users WHERE id = 2 #指定查詢的條件 -> ; +----+-------+--------+ | id | name | gender | +----+-------+--------+ | 2 | herry | M | +----+-------+--------+ 1 row in set (0.00 sec) MariaDB [nihao]> SELECT * FROM users WHERE id > 2 -> ; +----+------+--------+ | id | name | gender | +----+------+--------+ | 3 | hill | M | | 4 | tom | M | +----+------+--------+ 2 rows in set (0.00 sec) MariaDB [nihao]> SELECT * FROM users WHERE name LIKE '%l'; +----+------+--------+ | id | name | gender | +----+------+--------+ | 3 | hill | M | +----+------+--------+ 1 row in set (0.00 sec)
4、UPDATE 更改數據
MariaDB [nihao]> UPDATE users SET id = 10 WHERE name = 'hill'; Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0 MariaDB [nihao]> SELECT * FROM users ; +----+-------+--------+ | id | name | gender | +----+-------+--------+ | 1 | nihao | M | | 2 | herry | M | | 4 | tom | M | | 10 | hill | M | +----+-------+--------+ 4 rows in set (0.00 sec)
C、DCL控制語言命令如下
1、GRANT;當用戶不存在時還會自動創建用戶,創建完用戶后需要重新刷新授權表
2、REVOKE:
1、GRANT
MariaDB [nihao]> GRANT ALL ON *.* TO 'hill'@'localhost' IDENTIFIED BY '123456'; Query OK, 0 rows affected (0.29 sec) MariaDB [nihao]> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.00 sec) MariaDB [nihao]> GRANT ALL ON *.* TO 'hill'@'127.0.0.1' IDENTIFIED BY '123456'; Query OK, 0 rows affected (0.00 sec) MariaDB [nihao]> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.00 sec) MariaDB [nihao]> EXIT Bye [root@localhost ~]# mysql -uhill -p Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 19 Server version: 5.5.46-MariaDB-log MariaDB Server Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> MariaDB [nihao]> INSERT INTO users (id,name,gender) VALUES (5,'alex','M'); Query OK, 1 row affected (0.01 sec) MariaDB [nihao]> SELECT * FROM users; #授權的用戶可登錄以及插入數據 +----+-------+--------+ | id | name | gender | +----+-------+--------+ | 1 | nihao | M | | 2 | herry | M | | 4 | tom | M | | 5 | alex | M | | 10 | hill | M | +----+-------+--------+ 5 rows in set (0.00 sec)
2、REVOKE
MariaDB [(none)]> REVOKE INSERT ON *.* FROM 'hill'@'127.0.0.1' ; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> REVOKE INSERT ON *.* FROM 'hill'@'localhost' ; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> FLUSH PRIVILEGES -> ; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> EXIT Bye [root@localhost ~]# mysql -uhill -p Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 21 Server version: 5.5.46-MariaDB-log MariaDB Server Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> USE NIHAO ERROR 1049 (42000): Unknown database 'NIHAO' MariaDB [(none)]> USE nihao Database changed MariaDB [nihao]> INSERT INTO users (id,name,gender) VALUES (6,'hello','M'); ERROR 1142 (42000): INSERT command denied to user 'hill'@'localhost' for table 'users'
總結(源自網絡)
七、mysql的事務機制
1、什么是事務:
事務:transaction
一個事務是一個連續的一組數據庫操作,就好像它是一個單一的工作單元進行。換言之,永遠不會是完整的事務,除非該組內的每個單獨的操作是成功的。如果在事務的任何操作失敗,則整個事務將失敗。
2、為什么需要事務功能:
以一個經典的例子來舉例事務的必要性:
假設一個銀行的數據庫有兩張表:支票(checking)和儲蓄(savings)。現在如果要從用戶Jane的支票賬戶轉移轉移200美元到她的儲蓄賬戶。
那么至少需要以下3個步驟:
(1)檢查支票賬戶的余額是否大于200美元。
(2)如果為真則,從支票賬戶減去200美元。
(3)在儲蓄賬戶余額中增加200美元。 顯而易見,這3步必須打包在一個事務中,任何一個步驟失敗,必須全部回滾。 假設,在執行到第3步時服務器崩潰了,這時會發生什么情況?——用戶很可能會損失200美元。又或者在執行第二步和第三步之間時,另外一個進程要刪除支票賬戶的所有余額,這時又會發生什么情況?——銀行很可能白白給用戶200美元。
3、一個事務的必須要同時支持ACID四個特性
ACID表示:原子性(atomicity)、一致性(consistency)、隔離性(Isolation)、持久性(durability)
A:原子性(atomicity)整個事務中的所有操作要么全部成功執行,要么全部失敗后回滾;
C:一致性(consistency)數據庫總是從一個一致性狀態轉換為另一個一致性狀態;
I:隔離性(Isolation)一個事務所做出的操作在提交之前,是不能為其它所見;隔離有多種隔離級別;
D:持久性(durability)一旦事務提交,其所做的修改會永久保存于數據庫中;
4、mysql的事務:
MySQL的事務支持不是綁定在MySQL服務器本身,而是與存儲引擎相關
MyISAM:不支持事務,用于只讀程序提高性能
InnoDB:支持ACID事務、行級鎖、并發
Berkeley DB:支持事務
在MySQL中,事務開始使用COMMIT或ROLLBACK語句開始工作和結束。開始和結束語句的SQL命令之間形成了大量的事務。
COMMIT & ROLLBACK:
這兩個關鍵字提交和回滾主要用于MySQL的事務。
當一個成功的事務完成后,發出COMMIT命令應使所有參與表的更改才會生效。
如果發生故障時,應發出一個ROLLBACK命令返回的事務中引用的每一個表到以前的狀態。
可以控制的事務行為稱為AUTOCOMMIT設置會話變量。如果AUTOCOMMIT設置為1(默認值),然后每一個SQL語句(在事務與否)被認為是一個完整的事務,并承諾在默認情況下,當它完成。 AUTOCOMMIT設置為0時,發出SET AUTOCOMMIT =0命令,在隨后的一系列語句的作用就像一個事務,直到一個明確的COMMIT語句時,沒有活動的提交。
可以通過使用mysql_query()函數在PHP中執行這些SQL命令。
OK,更多文章請關注我的博客。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。