msyql

https://mirrors.tuna.tsinghua.edu.cn/mariadb/yum/
https://mirrors.tuna.tsinghua.edu.cn/mysql/yum/

1 源碼編譯安裝mariadb
安裝包
yum install bison bison-devel zlib-devel libcurl-devel libarchive-devel boost-devel gcc gcc-c++ cmake ncurses-devel gnutls-devel libxml2-devel openssl-devel libevent-devel libaio-devel

2 做準備用戶和數據目錄
useradd –r –s /sbin/nologin –d /data/mysql/ mysql
mkdir /data/mysql
chown mysql.mysql /data/mysql
tar xvf mariadb-10.2.18.tar.gz
源碼編譯安裝mariadb
cd mariadb-10.2.18/

cmake . \
-DCMAKE_INSTALL_PREFIX=/app/mysql \
-DMYSQL_DATADIR=/data/mysql/ \
-DSYSCONFDIR=/etc/mysql \
-DMYSQL_USER=mysql \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITHOUT_MROONGA_STORAGE_ENGINE=1 \
-DWITH_DEBUG=0 \
-DWITH_READLINE=1 \
-DWITH_SSL=system \
-DWITH_ZLIB=system \
-DWITH_LIBWRAP=0 \
-DENABLED_LOCAL_INFILE=1 \
-DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci

make && make install
提示:如果出錯,執行rm -f CMakeCache.txt

準備環境變量
echo 'PATH=/app/mysql/bin:$PATH' > /etc/profile.d/mysql.sh
. /etc/profile.d/mysql.sh
生成數據庫文件
cd /app/mysql/
scripts/mysql_install_db --datadir=/data/mysql/ --user=mysql
準備配置文件
cp /app/mysql/support-files/my-huge.cnf /etc/mysql/mysql.cnf
準備啓動腳本
cp /app/mysql/support-files/mysql.server /etc/init.d/mysqld
啓動服務
chkconfig --add mysqld ;service mysqld start

MySQL用戶和權限管理
元數據數據庫:mysql
系統授權表:
db, host, user
columns_priv, tables_priv, procs_priv, proxiesprivbr/>用戶賬號:
'USERNAME'@'HOST'
@'HOST':
主機名
IP地址或Network
通配符: %

示例:172.16.%.%

用戶管理
創建用戶:CREATE USER
CREATE USER 'USERNAME'@'HOST' [IDENTIFIED BY 'password'];
默認權限:USAGE
用戶重命名:RENAME USER
RENAME USER old_user_name TO new_user_name;
刪除用戶:
DROP USER 'USERNAME'@'HOST‘
示例:刪除默認的空用戶
DROP USER ''@'localhost';

用戶管理
修改密碼:
mysql>SET PASSWORD FOR 'user'@'host' = PASSWORD(‘password');
mysql>UPDATE mysql.user SET password=PASSWORD('password') WHERE clause;
此方法需要執行下面指令才能生效:
mysql> FLUSH PRIVILEGES;
 #mysqladmin -u root -poldpass password ‘newpass’
忘記管理員密碼的解決辦法:
啓動mysqld進程時,爲其使用如下選項:
--skip-grant-tables --skip-networking
使用UPDATE命令修改管理員密碼
關閉mysqld進程,移除上述兩個選項,重啓mysqld

MySQL用戶和權限管理
管理類:
CREATE TEMPORARY TABLES
CREATE USER
FILE
SUPER
SHOW DATABASES
RELOAD
SHUTDOWN
REPLICATION SLAVE
REPLICATION CLIENT
LOCK TABLES
PROCESS

MySQL用戶和權限管理
程序類: FUNCTION、PROCEDURE、TRIGGER
CREATE
ALTER
DROP
EXCUTE
庫和表級別:DATABASE、TABLE
ALTER
CREATE
CREATE VIEW
DROP
INDEX
SHOW VIEW
GRANT OPTION:能將自己獲得的權限轉贈給其他用戶

MySQL用戶和權限管理
數據操作
SELECT
INSERT
DELETE
UPDATE
字段級別
SELECT(col1,col2,...)
UPDATE(col1,col2,...)
INSERT(col1,col2,...)
所有權限
ALL PRIVILEGES 或 ALL

授權
參考:https://dev.mysql.com/doc/refman/5.7/en/grant.html
GRANT priv_type [(column_list)],... ON [object_type] priv_level TO 'user'@'host' [IDENTIFIED BY 'password'] [WITH GRANT OPTION];
priv_type: ALL [PRIVILEGES]
object_type:TABLE | FUNCTION | PROCEDURE
priv_level: (所有庫) | . | db_name. | db_name.tbl_name | tbl_name(當前庫的表) | db_name.routine_name(指定庫的函數,存儲過程,觸發器)
with_option: GRANT OPTION
| MAX_QUERIES_PER_HOUR count
| MAX_UPDATES_PER_HOUR count
| MAX_CONNECTIONS_PER_HOUR count
| MAX_USER_CONNECTIONS count
示例:GRANT SELECT (col1), INSERT (col1,col2) ON mydb.mytbl TO 'someuser'@'somehost‘;

授權
回收授權
REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ... ON [object_type] priv_level FROM user [, user] ...
示例:REVOKE DELETE ON testdb.* FROM 'testuser'@‘172.16.0.%’;
查看指定用戶獲得的授權
Help SHOW GRANTS
SHOW GRANTS FOR 'user'@'host';
SHOW GRANTS FOR CURRENT_USER[()];
注意:MariaDB服務進程啓動時會讀取mysql庫中所有授權表至內存
(1) GRANT或REVOKE等執行權限操作會保存於系統表中,MariaDB的服務進程通常會自動重讀授權表,使之生效
(2) 對於不能夠或不能及時重讀授權表的命令,可手動讓MariaDB的服務進程重讀授權表:mysql> FLUSH PRIVILEGES;

存儲引擎

InnoDB support for FULLTEXT indexes is available in MySQL 5.6.4 and later.
存儲引擎比較:https://docs.oracle.com/cd/E17952_01/mysql-5.5-en/storage-engines.html

存儲引擎
MyISAM引擎特點
不支持事務
表級鎖定
讀寫相互阻塞,寫入不能讀,讀時不能寫
只緩存索引
不支持外鍵約束
不支持聚簇索引
讀取數據較快,佔用資源較少
不支持MVCC(多版本併發控制機制)高併發
崩潰恢復性較差
MySQL5.5.5前默認的數據庫引擎

存儲引擎
MyISAM存儲引擎適用場景
只讀(或者寫較少)、表較小(可以接受長時間進行修復操作)
MyISAM引擎文件
tbl_name.frm 表格式定義
tbl_name.MYD 數據文件
tbl_name.MYI 索引文件

存儲引擎
InnoDB引擎特點
行級鎖
支持事務,適合處理大量短期事務
讀寫阻塞與事務隔離級別相關
可緩存數據和索引
支持聚簇索引
崩潰恢復性更好
支持MVCC高併發
從MySQL5.5後支持全文索引
從MySQL5.5.5開始爲默認的數據庫引擎

存儲引擎
InnoDB數據庫文件
所有InnoDB表的數據和索引放置於同一個表空間中
表空間文件:datadir定義的目錄下
數據文件:ibddata1, ibddata2, ...
每個表單獨使用一個表空間存儲表的數據和索引
啓用:innodb_file_per_table=ON
參看:https://mariadb.com/kb/en/library/xtradbinnodb-server-system-variables/#innodb_file_per_table
ON (>= MariaDB 5.5)
兩類文件放在數據庫獨立目錄中
數據文件(存儲數據和索引):tb_name.ibd
表格式定義:tb_name.frm

其它存儲引擎
Performance_Schema:Performance_Schema數據庫使用
Memory :將所有數據存儲在RAM中,以便在需要快速查找參考和其他類似數據的環境中進行快速訪問。適用存放臨時數據。引擎以前被稱爲HEAP引擎
MRG_MyISAM:使MySQL DBA或開發人員能夠對一系列相同的MyISAM表進行邏輯分組,並將它們作爲一個對象引用。適用於VLDB(Very Large Data Base)環境,如數據倉庫
Archive :爲存儲和檢索大量很少參考的存檔或安全審覈信息,只支持SELECT和INSERT操作;支持行級鎖和專用緩存區
Federated聯合:用於訪問其它遠程MySQL服務器一個代理,它通過創建一個到遠程MySQL服務器的客戶端連接,並將查詢傳輸到遠程服務器執行,而後完成數據存取,提供鏈接單獨MySQL服務器的能力,以便從多個物理服務器創建一個邏輯數據庫。非常適合分佈式或數據集市環境

其它數據庫引擎
BDB:可替代InnoDB的事務引擎,支持COMMIT、ROLLBACK和其他事務特性
Cluster/NDB:MySQL的簇式數據庫引擎,尤其適合於具有高性能查找要求的應用程序,這類查找需求還要求具有最高的正常工作時間和可用性
CSV:CSV存儲引擎使用逗號分隔值格式將數據存儲在文本文件中。可以使用CSV引擎以CSV格式導入和導出其他軟件和應用程序之間的數據交換
BLACKHOLE :黑洞存儲引擎接受但不存儲數據,檢索總是返回一個空集。該功能可用於分佈式數據庫設計,數據自動複製,但不是本地存儲
example:“stub”引擎,它什麼都不做。可以使用此引擎創建表,但不能將數據存儲在其中或從中檢索。目的是作爲例子來說明如何開始編寫新的存儲引擎

其它存儲引擎
MariaDB支持的其它存儲引擎:
OQGraph
SphinxSE
TokuDB
Cassandra
CONNECT
SQUENCE

管理存儲引擎
查看mysql支持的存儲引擎
show engines;
查看當前默認的存儲引擎
show variables like '%storage_engine%';
設置默認的存儲引擎
vim /etc/my.conf
[mysqld]
default_storage_engine= InnoDB

管理存儲引擎
查看庫中所有表使用的存儲引擎
show table status from db_name;
查看庫中指定表的存儲引擎
show table status like ' tb_name ';
show create table tb_name;
設置表的存儲引擎:
CREATE TABLE tb_name(... ) ENGINE=InnoDB;
ALTER TABLE tb_name ENGINE=InnoDB;

MySQL中的系統數據庫
mysql數據庫
是mysql的核心數據庫,類似於Sql Server中的master庫,主要負責存儲數據庫的用戶、權限設置、關鍵字等mysql自己需要使用的控制和管理信息
performance_schema數據庫
MySQL 5.5開始新增的數據庫,主要用於收集數據庫服務器性能參數,庫裏表的存儲引擎均爲PERFORMANCE_SCHEMA,用戶不能創建存儲引擎爲PERFORMANCE_SCHEMA的表
information_schema數據庫
MySQL 5.0之後產生的,一個虛擬數據庫,物理上並不存在information_schema數據庫類似與“數據字典”,提供了訪問數據庫元數據的方式,即數據的數據。比如數據庫名或表名,列類型,訪問權限(更加細化的訪問方式)

服務器配置
mysqld選項,服務器系統變量和服務器狀態變量
https://dev.mysql.com/doc/refman/5.7/en/mysqld-option-tables.html
https://mariadb.com/kb/en/library/full-list-of-mariadb-options-system-and-status-variables/
注意:其中有些參數支持運行時修改,會立即生效;有些參數不支持,且只能通過修改配置文件,並重啓服務器程序生效;有些參數作用域是全局的,且不可改變;有些可以爲每個用戶提供單獨(會話)的設置

服務器配置
獲取mysqld的可用選項列表:
mysqld --help --verbose
mysqld --print-defaults 獲取默認設置
設置服務器選項方法:
在命令行中設置
shell> ./mysqld_safe --skip-name-resolve=1
在配置文件my.cnf中設置
skip_name_resolve=1

服務器端設置
服務器系統變量:分全局和會話兩種
獲取系統變量
mysql> SHOW GLOBAL VARIABLES;
mysql> SHOW [SESSION] VARIABLES;
mysql> SELECT @@VARIABLES;
修改服務器變量的值:
mysql> help SET
修改全局變量:僅對修改後新創建的會話有效;對已經建立的會話無效
mysql> SET GLOBAL system_var_name=value;
mysql> SET @@global.system_var_name=value;
修改會話變量:
mysql> SET [SESSION] system_var_name=value;
mysql> SET @@[session.]system_var_name=value;

服務器端設置
服務器狀態變量:
分全局和會話兩種
狀態變量(只讀):用於保存mysqld運行中的統計數據的變量,不可更改
mysql> SHOW GLOBAL STATUS;
mysql> SHOW [SESSION] STATUS;

服務器變量SQL_MODE
SQL_MODE:對其設置可以完成一些約束檢查的工作,可分別進行全局的設置或當前會話的設置,參看:https://mariadb.com/kb/en/library/sql-mode/
常見MODE:
NO_AUTO_CREATE_USER
禁止GRANT創建密碼爲空的用戶
NO_ZERO_DATE
在嚴格模式,不允許使用‘0000-00-00’的時間
ONLY_FULL_GROUP_BY
對於GROUP BY聚合操作,如果在SELECT中的列,沒有在GROUP BY中出現,那麼將認爲這個SQL是不合法的
NO_BACKSLASH_ESCAPES
反斜槓“\”作爲普通字符而非轉義字符
PIPES_AS_CONCAT
將"||"視爲連接操作符而非“或運算符”

查詢緩存
查詢緩存( Query Cache )原理
緩存SELECT操作或預處理查詢的結果集和SQL語句,當有新的SELECT語句或預處理查詢語句請求,先去查詢緩存,判斷是否存在可用的記錄集,判斷標準:與緩存的SQL語句,是否完全一樣,區分大小寫
優缺點
不需要對SQL語句做任何解析和執行,當然語法解析必須通過在先,直接從Query Cache中獲得查詢結果,提高查詢性能
查詢緩存的判斷規則,不夠智能,也即提高了查詢緩存的使用門檻,降低其效率;
查詢緩存的使用,會增加檢查和清理Query Cache中記錄集的開銷

查詢緩存
哪些查詢可能不會被緩存
查詢語句中加了SQL_NO_CACHE參數
查詢語句中含有獲得值的函數,包含自定義函數,如:NOW()
CURDATE()、GET_LOCK()、RAND()、CONVERT_TZ()等
對系統數據庫的查詢:mysql、information_schema 查詢語句中使用SESSION級別變量或存儲過程中的局部變量
查詢語句中使用了LOCK IN SHARE MODE、FOR UPDATE的語句,查詢語句中類似SELECT …INTO 導出數據的語句
對臨時表的查詢操作;存在警告信息的查詢語句;不涉及任何表或視圖的查詢語句;某用戶只有列級別權限的查詢語句
事務隔離級別爲Serializable時,所有查詢語句都不能緩存

查詢緩存
查詢緩存相關的服務器變量
query_cache_min_res_unit:查詢緩存中內存塊的最小分配單位,默認4k,較小值會減少浪費,但會導致更頻繁的內存分配操作,較大值會帶來浪費,會導致碎片過多,內存不足
query_cache_limit:單個查詢結果能緩存的最大值,默認爲1M,對於查詢結果過大而無法緩存的語句,建議使用SQL_NO_CACHE
query_cache_size:查詢緩存總共可用的內存空間;單位字節,必須是1024的整數倍,最小值40KB,低於此值有警報
query_cache_wlock_invalidate:如果某表被其它的會話鎖定,是否仍然可以從查詢緩存中返回結果,默認值爲OFF,表示可以在表被其它會話鎖定的場景中繼續從緩存返回數據;ON則表示不允許
query_cache_type:是否開啓緩存功能,取值爲ON, OFF, DEMAND

查詢緩存
SELECT語句的緩存控制
SQL_CACHE:顯式指定存儲查詢結果於緩存之中
SQL_NO_CACHE:顯式查詢結果不予緩存
query_cache_type參數變量
query_cache_type的值爲OFF或0時,查詢緩存功能關閉
query_cache_type的值爲ON或1時,查詢緩存功能打開,SELECT的結果符合緩存條件即會緩存,否則,不予緩存,顯式指定SQL_NO_CACHE,不予緩存,此爲默認值
query_cache_type的值爲DEMAND或2時,查詢緩存功能按需進行,顯式指定SQL_CACHE的SELECT語句纔會緩存;其它均不予緩存
參看:https://mariadb.com/kb/en/library/server-system-variables/#query_cache_type
https://dev.mysql.com/doc/refman/5.7/en/query-cache-configuration.html

查詢緩存
查詢緩存相關的狀態變量:SHOW GLOBAL STATUS LIKE ‘Qcache%';
Qcache_free_blocks:處於空閒狀態 Query Cache中內存 Block 數
Qcache_total_blocks:Query Cache 中總Block ,當Qcache_free_blocks相對此值較大時,可能用內存碎片,執行FLUSH QUERY CACHE清理碎片
Qcache_free_memory:處於空閒狀態的 Query Cache 內存總量
Qcache_hits:Query Cache 命中次數
Qcache_inserts:向 Query Cache 中插入新的 Query Cache 的次數,即沒有命中的次數
Qcache_lowmem_prunes:記錄因爲內存不足而被移除出查詢緩存的查詢數
Qcache_not_cached:沒有被 Cache 的 SQL 數,包括無法被 Cache 的 SQL 以及由於 query_cache_type 設置的不會被 Cache 的 SQL語句
Qcache_queries_in_cache:在 Query Cache 中的 SQL 數量

命中率和內存使用率估算
查詢緩存中內存塊的最小分配單位query_cache_min_res_unit :(query_cache_size - Qcache_free_memory) / Qcache_queries_in_cache
查詢緩存命中率 :Qcache_hits / ( Qcache_hits + Qcache_inserts ) 100%
查詢緩存內存使用率:(query_cache_size – qcache_free_memory) / query_cache_size
100%

InnoDB存儲引擎
InnoDB存儲引擎的緩衝池:
通常InnoDB存儲引擎緩衝池的命中不應該小於99%
查看相關狀態變量:
show global status like 'innodb%read%'\G
Innodb_buffer_pool_reads: 表示從物理磁盤讀取頁的次數
Innodb_buffer_pool_read_ahead: 預讀的次數
Innodb_buffer_pool_read_ahead_evicted: 預讀頁,但是沒有讀取就從緩衝池中被替換的頁數量,一般用來判斷預讀的效率
Innodb_buffer_pool_read_requests: 從緩衝池中讀取頁次數
Innodb_data_read: 總共讀入的字節數
Innodb_data_reads: 發起讀取請求的次數,每次讀取可能需要讀取多個頁

二叉樹

紅黑樹

B-TREE索引

B+TREE索引

B+TREE索引

B+TREE索引
B+Tree索引:順序存儲,每一個葉子節點到根結點的距離是相同的;左前綴索引,適合查詢範圍類的數據
可以使用B+Tree索引的查詢類型:
全值匹配:精確所有索引列,如:姓wang,名xiaochun,年齡30
匹配最左前綴:即只使用索引的第一列,如:姓wang
匹配列前綴:只匹配一列值開頭部分,如:姓以w開頭的
匹配範圍值:如:姓ma和姓wang之間
精確匹配某一列並範圍匹配另一列:如:姓wang,名以x開頭的
只訪問索引的查詢

B+Tree索引
B+Tree索引的限制:
如不從最左列開始,則無法使用索引,如:查找名爲xiaochun,或姓爲g結尾
不能跳過索引中的列:如:查找姓wang,年齡30的,只能使用索引第一列
特別提示:
索引列的順序和查詢語句的寫法應相匹配,才能更好的利用索引
爲優化性能,可能需要針對相同的列但順序不同創建不同的索引來滿足不同類型的查詢需求

Hash索引
Hash索引:基於哈希表實現,只有精確匹配索引中的所有列的查詢纔有效,索引自身只存儲索引列對應的哈希值和數據指針,索引結構緊湊,查詢性能好
Memory存儲引擎支持顯式hash索引,InnoDB和MyISAM存儲引擎不支持
適用場景:只支持等值比較查詢,包括=, <=>, IN()
不適合使用hash索引的場景
不適用於順序查詢:索引存儲順序的不是值的順序
不支持模糊匹配
不支持範圍查詢
不支持部分索引列匹配查找:如A,B列索引,只查詢A列索引無效

索引優化建議
只要列中含有NULL值,就最好不要在此例設置索引,複合索引如果有NULL值,此列在使用時也不會使用索引
儘量使用短索引,如果可以,應該制定一個前綴長度
對於經常在where子句使用的列,最好設置索引
對於有多個列where或者order by子句,應該建立複合索引
對於like語句,以%或者‘-’開頭的不會使用索引,以%結尾會使用索引
儘量不要在列上進行運算(函數操作和表達式操作)
儘量不要使用not in和<>操作

SQL語句性能優化
查詢時,能不要就不用,儘量寫全字段名
大部分情況連接效率遠大於子查詢
多表連接時,儘量小表驅動大表,即小表 join 大表
在有大量記錄的表分頁時使用limit
對於經常使用的查詢,可以開啓緩存
多使用explain和profile分析查詢語句
查看慢查詢日誌,找出執行時間長的sql語句優化

管理索引
創建索引:
CREATE INDEX [UNIQUE] index_name ON tbl_name (index_col_name[(length)],...);
ALTER TABLE tbl_name ADD INDEX index_name(index_col_name);
help CREATE INDEX;
刪除索引:
DROP INDEX index_name ON tbl_name;
ALTER TABLE tbl_name DROP INDEX index_name(index_col_name);
查看索引:
SHOW INDEXES FROM [db_name.]tbl_name;
優化表空間:
OPTIMIZE TABLE tb_name;
查看索引的使用
SET GLOBAL userstat=1;
SHOW INDEX_STATISTICS;

EXPLAIN
通過EXPLAIN來分析索引的有效性
EXPLAIN SELECT clause
獲取查詢執行計劃信息,用來查看查詢優化器如何執行查詢
輸出信息說明:
參考 https://dev.mysql.com/doc/refman/5.7/en/explain-output.html
id: 當前查詢語句中,每個SELECT語句的編號
複雜類型的查詢有三種:
簡單子查詢
用於FROM中的子查詢
聯合查詢:UNION
注意:UNION查詢的分析結果會出現一個額外匿名臨時表

數據庫管理系統
數據庫是數據的彙集,它以一定的組織形式存於存儲介質上
DBMS是管理數據庫的系統軟件,它實現數據庫系統的各種功能。是數據庫系統的核心
DBA:負責數據庫的規劃、設計、協調、維護和管理等工作
應用程序指以數據庫爲基礎的應用程序

關係型數據庫
關係 :關係就是二維表,其中:表中的行、列次序並不重要
行row:表中的每一行,又稱爲一條記錄
列column:表中的每一列,稱爲屬性,字段
主鍵Primary key:用於惟一確定一個記錄的字段
域domain:屬性的取值範圍,如,性別只能是‘男’和‘女’兩個值

關係數據庫
RDBMS:
MySQL: MySQL, MariaDB, Percona Server
PostgreSQL: 簡稱爲pgsql,EnterpriseDB
Oracle
MSSQL
DB2
數據庫排名:
https://db-engines.com/en/ranking

聯繫類型
聯繫的類型
一對一聯繫(1:1)
一對多聯繫(1:n)
多對多聯繫(m:n)
數據的操作:
數據提取:在數據集合中提取感興趣的內容。SELECT
數據更新:變更數據庫中的數據。INSERT、DELETE、UPDATE
數據的約束條件 :是一組完整性規則的集合
實體(行)完整性 Entity integrity
域(列)完整性 Domain Integrity
參考完整性 Referential Integrity

簡易數據規劃流程
第一階段:收集數據,得到字段
•收集必要且完整的數據項
•轉換成數據表的字段
第二階段:把字段分類,歸入表,建立表的關聯
•關聯:表和表間的關係
•分割數據表並建立關聯的優點
•節省空間
•減少輸入錯誤
•方便數據修改
第三階段:
•規範化數據庫

範式
1NF:無重複的列,每一列都是不可分割的基本數據項,同一列中不能有多個值,即實體中的某個屬性不能有多個值或者不能有重複的屬性,確保每一列的原子性。除去同類型的字段,就是無重複的列
說明:第一範式(1NF)是對關係模式的基本要求,不滿足第一範式(1NF)的數據庫就不是關係數據庫
2NF:屬性完全依賴於主鍵,第二範式必須先滿足第一範式,要求表中的每個行必須可以被唯一地區分。通常爲表加上一個列,以存儲各個實例的唯一標識PK,非PK的字段需要與整個PK有直接相關性
3NF:屬性不依賴於其它非主屬性,滿足第三範式必須先滿足第二範式。第三範式要求一個數據庫表中不包含已在其它表中已包含的非主關鍵字信息,非PK的字段間不能有從屬關係

SQL概念
SQL: Structure Query Language
結構化查詢語言
SQL解釋器:
數據存儲協議:應用層協議,C/S
S:server, 監聽於套接字,接收並處理客戶端的應用請求
C:Client
客戶端程序接口
CLI
GUI
應用編程接口
ODBC:Open Database Connectivity
JDBC:Java Data Base Connectivity

約束
約束:constraint,表中的數據要遵守的限制
主鍵:一個或多個字段的組合,填入的數據必須能在本表中唯一標識本行;必須提供數據,即NOT NULL,一個表只能有一個
惟一鍵:一個或多個字段的組合,填入的數據必須能在本表中唯一標識本行;允許爲NULL,一個表可以存在多個
外鍵:一個表中的某字段可填入的數據取決於另一個表的主鍵或唯一鍵已有的數據
檢查:字段值在一定範圍內

MySQL系列
官方網址:
https://www.mysql.com/
http://mariadb.org/
https://www.percona.com
官方文檔
https://dev.mysql.com/doc/
https://mariadb.com/kb/en/
https://www.percona.com/software/mysql-database/percona-server
版本演變:
MySQL:5.1 --> 5.5 --> 5.6 --> 5.7 -->8.0
MariaDB:5.5 -->10.0--> 10.1 --> 10.2 --> 10.3

安裝MYSQL
Mariadb安裝方式:
1、源代碼:編譯安裝
2、二進制格式的程序包:展開至特定路徑,並經過簡單配置後即可使用
3、程序包管理器管理的程序包
CentOS 安裝光盤
項目官方:https://downloads.mariadb.org/mariadb/repositories/
國內鏡像:https://mirrors.tuna.tsinghua.edu.cn/mariadb/yum/
https://mirrors.tuna.tsinghua.edu.cn/mysql/yum/

RPM包安裝MySQL
RPM包安裝
CentOS 7:安裝光盤直接提供
mariadb-server 服務器包
mariadb 客戶端工具包
CentOS 6
提高安全性
mysql_secure_installation
設置數據庫管理員root口令
禁止root遠程登錄
刪除anonymous用戶帳號
刪除test數據庫

MariaDB程序
客戶端程序:
mysql: 交互式的CLI工具
mysqldump:備份工具,基於mysql協議向mysqld發起查詢請求,並將查得的所有數據轉換成insert等寫操作語句保存文本文件中
mysqladmin:基於mysql協議管理mysqld
mysqlimport:數據導入工具
MyISAM存儲引擎的管理工具:
myisamchk:檢查MyISAM庫
myisampack:打包MyISAM表,只讀
服務器端程序
mysqld_safe
mysqld
mysqld_multi 多實例 ,示例:mysqld_multi --example

用戶賬號br/>mysql用戶賬號由兩部分組成:
'USERNAME'@'HOST‘
說明:
HOST限制此用戶可通過哪些遠程主機連接mysql服務器
支持使用通配符:
% 匹配任意長度的任意字符
172.16.0.0/255.255.0.0 或 172.16.%.%
_ 匹配任意單個字符

Mysql 客戶端
mysql使用模式:
交互式模式:
可運行命令有兩類:
客戶端命令:
\h, help
\u,use
\s,status
!,system
服務器端命令:
SQL語句, 需要語句結束符;
腳本模式:
mysql –uUSERNAME -pPASSWORD < /path/somefile.sql
mysql> source /path/from/somefile.sql

Mysql客戶端
mysql客戶端可用選項:
-A, --no-auto-rehash 禁止補全
-u, --user= 用戶名,默認爲root
-h, --host= 服務器主機,默認爲localhost
-p, --passowrd= 用戶密碼,建議使用-p,默認爲空密碼
-P, --port= 服務器端口
-S, --socket= 指定連接socket文件路徑
-D, --database= 指定默認數據庫
-C, --compress 啓用壓縮
-e “SQL“ 執行SQL命令
-V, --version 顯示版本
-v --verbose 顯示詳細信息
--print-defaults 獲取程序默認使用的配置

socket地址
服務器監聽的兩種socket地址:
ip socket: 監聽在tcp的3306端口,支持遠程通信
unix sock: 監聽在sock文件上,僅支持本機通信
如:/var/lib/mysql/mysql.sock)
說明:host爲localhost,127.0.0.1時自動使用unix sock

執行命令
運行mysql命令:默認空密碼登錄
mysql>use mysql
mysql>select user();查看當前用戶
mysql>SELECT User,Host,Password FROM user;
登錄系統:mysql –uroot –p
客戶端命令:本地執行
mysql> help
每個命令都完×××式和簡寫格式
mysql> status 或 \s
服務端命令:通過mysql協議發往服務器執行並取回結果
每個命令末尾都必須使用命令結束符號,默認爲分號
示例:SELECT VERSION();

配置文件
配置文件:
後面覆蓋前面的配置文件,順序如下:
/etc/my.cnf Global選項
/etc/mysql/my.cnf Global選項
SYSCONFDIR/my.cnf Global選項
$MYSQL_HOME/my.cnf Server-specific 選項
--defaults-extra-file=path
~/.my.cnf User-specific 選項

MairaDB配置
偵聽3306/tcp端口可以在綁定有一個或全部接口IP上
vim /etc/my.cnf
[mysqld]
skip-networking=1
關閉網絡連接,只偵聽本地客戶端, 所有和服務器的交互都通過一個socket實現,socket的配置存放在/var/lib/mysql/mysql.sock) 可在/etc/my.cnf修改

通用二進制格式安裝過程
二進制格式安裝過程
(1) 準備用戶
groupadd -r -g 306 mysql
useradd -r -g 306 -u 306 –d /data/mysql mysql
(2) 準備數據目錄,建議使用邏輯卷
mkdir /data/mysql
chown mysql:mysql /data/mysql
(3) 準備二進制程序
tar xf mariadb-VERSION-linux-x86_64.tar.gz -C /usr/local
cd /usr/local
ln -sv mariadb-VERSION mysql
chown -R root:mysql /usr/local/mysql/
(4) 準備配置文件
mkdir /etc/mysql/
cp support-files/my-large.cnf /etc/mysql/my.cnf
[mysqld]中添加三個選項:
datadir = /data/mysql
innodb_file_per_table = on
skip_name_resolve = on 禁止主機名解析,建議使用
(5)創建數據庫文件
cd /usr/local/mysql/
./scripts/mysql_install_db --datadir=/data/mysql --user=mysql
(6)準備服務腳本,並啓動服務
cp ./support-files/mysql.server /etc/rc.d/init.d/mysqld
chkconfig --add mysqld
service mysqld start
(7)PATH路徑
echo ‘PATH=/user/local/mysql/bin:$PATH’ > /etc/profile.d/mysql
(8)安全初始化
/user/local/mysql/bin/mysql_secure_installation

源碼編譯安裝mariadb
安裝包
yum install bison bison-devel zlib-devel libcurl-devel libarchive-devel boost-devel gcc gcc-c++ cmake ncurses-devel gnutls-devel libxml2-devel openssl-devel libevent-devel libaio-devel
做準備用戶和數據目錄
useradd –r –s /sbin/nologin –d /data/mysql/ mysql
mkdir /data/mysql
chown mysql.mysql /data/mysql
tar xvf mariadb-10.2.18.tar.gz
cmake 編譯安裝
cmake的重要特性之一是其獨立於源碼(out-of-source)的編譯功能,即編譯工作可以在另一個指定的目錄中而非源碼目錄中進行,這可以保證源碼目錄不受任何一次編譯的影響,因此在同一個源碼樹上可以進行多次不同的編譯,如針對於不同平臺編譯
編譯選項:https://dev.mysql.com/doc/refman/5.7/en/source-configuration-options.html

源碼編譯安裝mariadb
cd mariadb-10.2.18/
cmake . \
-DCMAKE_INSTALL_PREFIX=/app/mysql \
-DMYSQL_DATADIR=/data/mysql/ \
-DSYSCONFDIR=/etc/mysql \
-DMYSQL_USER=mysql \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITHOUT_MROONGA_STORAGE_ENGINE=1 \
-DWITH_DEBUG=0 \
-DWITH_READLINE=1 \
-DWITH_SSL=system \
-DWITH_ZLIB=system \
-DWITH_LIBWRAP=0 \
-DENABLED_LOCAL_INFILE=1 \
-DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci
make && make install
提示:如果出錯,執行rm -f CMakeCache.txt

源碼編譯安裝mariadb
準備環境變量
echo 'PATH=/app/mysql/bin:$PATH' > /etc/profile.d/mysql.sh
. /etc/profile.d/mysql.sh
生成數據庫文件
cd /app/mysql/
scripts/mysql_install_db --datadir=/data/mysql/ --user=mysql
準備配置文件
cp /app/mysql/support-files/my-huge.cnf /etc/mysql/my.cnf
準備啓動腳本
cp /app/mysql/support-files/mysql.server /etc/init.d/mysqld
啓動服務
chkconfig --add mysqld ;service mysqld start

關係型數據庫的常見組件
數據庫:database
表:table
行:row
列:column
索引:index
視圖:view
用戶:user
權限:privilege
存儲過程:procedure
存儲函數:function
觸發器:trigger
事件調度器:event scheduler,任務計劃

SQL語言規範
在數據庫系統中,SQL語句不區分大小寫(建議用大寫)
SQL語句可單行或多行書寫,以“;”結尾
關鍵詞不能跨多行或簡寫
用空格和縮進來提高語句的可讀性
子句通常位於獨立行,便於編輯,提高可讀性
註釋:
SQL標準:
/註釋內容/ 多行註釋
-- 註釋內容 單行註釋,注意有空格
MySQL註釋:
#

數據庫對象
數據庫的組件(對象):
數據庫、表、索引、視圖、用戶、存儲過程、函數、觸發器、事件調度器等
命名規則:
必須以字母開頭
可包括數字和三個特殊字符(# _ $)
不要使用MySQL的保留字
同一database(Schema)下的對象不能同名

SQL語句分類
SQL語句分類:
DDL: Data Defination Language 數據定義語言
CREATE,DROP,ALTER
DML: Data Manipulation Language 數據操縱語言
INSERT,DELETE,UPDATE
DCL:Data Control Language 數據控制語言
GRANT,REVOKE,COMMIT,ROLLBACK
DQL:Data Query Language 數據查詢語言
SELECT

SQL語句構成
SQL語句構成:
Keyword組成clause
多條clause組成語句
示例:
SELECT * SELECT子句
FROM products FROM子句
WHERE price>400 WHERE子句
說明:一組SQL語句,由三個子句構成,SELECT,FROM和WHERE是關鍵字

數據類型
數據類型:
數據長什麼樣
數據需要多少空間來存放
系統內置數據類型和用戶定義數據類型
MySql支持多種列類型:
數值類型
日期/時間類型
字符串(字符)類型
https://dev.mysql.com/doc/refman/5.5/en/data-types.html
選擇正確的數據類型對於獲得高性能至關重要,三大原則:
更小的通常更好,儘量使用可正確存儲數據的最小數據類型
簡單就好,簡單數據類型的操作通常需要更少的CPU週期
儘量避免NULL,包含爲NULL的列,對MySQL更難優化

數據變型

數據類型
1、整型
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的一些交互工具(例如MySQL命令行客戶端)用來顯示字符的個數。對於存儲和計算來說,Int(1)和Int(20)是相同的
BOOL,BOOLEAN:布爾型,是TINYINT(1)的同義詞。zero值被視爲假,非zero值視爲真
數據類型
2、浮點型(float和double),近似值
float(m,d) 單精度浮點型 8位精度(4字節) m總個數,d小數位
double(m,d) 雙精度浮點型16位精度(8字節) m總個數,d小數位
設一個字段定義爲float(6,3),如果插入一個數123.45678,實際數據庫裏存的是123.457,但總個數還以實際爲準,即6位

數據類型
3、定點數
在數據庫中存放的是精確值,存爲十進制
decimal(m,d) 參數m<65 是總個數,d<30且 d<m 是小數位
MySQL5.0和更高版本將數字打包保存到一個二進制字符串中(每4個字節存9個數字)。例如,decimal(18,9)小數點兩邊將各存儲9個數字,一共使用9個字節:小數點前的數字用4個字節,小數點後的數字用4個字節,小數點本身佔1個字節
浮點類型在存儲同樣範圍的值時,通常比decimal使用更少的空間。float使用4個字節存儲。double佔用8個字節
因爲需要額外的空間和計算開銷,所以應該儘量只在對小數進行精確計算時才使用decimal——例如存儲財務數據。但在數據量比較大的時候,可以考慮使用bigint代替decimal

數據類型
4、字符串(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集合

數據類型
char和varchar:
•1.char(n) 若存入字符數小於n,則以空格補於其後,查詢之時再將空格去掉,所以char類型存儲的字符串末尾不能有空格,varchar不限於此
•2.char(n) 固定長度,char(4)不管是存入幾個字符,都將佔用4個字節,varchar是存入的實際字符數+1個字節(n< n>255),所以varchar(4),存入3個字符將佔用4個字節
•3.char類型的字符串檢索速度要比varchar類型的快
varchar和text:
•1.varchar可指定n,text不能指定,內部存儲varchar是存入的實際字符數+1個字節(n< n>255),text是實際字符數+2個字節。
•2.text類型不能有默認值
•3.varchar可直接創建索引,text創建索引要指定前多少個字符。varchar查詢速度快於text

數據類型
5.二進制數據:BLOB
•BLOB和text存儲方式不同,TEXT以文本方式存儲,英文存儲區分大小寫,而Blob是以二進制方式存儲,不分大小寫
•BLOB存儲的數據只能整體讀出
•TEXT可以指定字符集,BLOB不用指定字符集
6.日期時間類型
•date 日期 '2008-12-2'
•time 時間 '12:25:36'
•datetime 日期時間 '2008-12-2 22:06:44'
•timestamp 自動存儲記錄修改時間
•YEAR(2), YEAR(4):年份
timestamp字段裏的時間數據會隨其他字段修改的時候自動刷新,這個數據類型的字段可以存放這條記錄最後被修改的時間

函數
函數:系統函數和自定義函數
系統函數:https://dev.mysql.com/doc/refman/5.7/en/func-op-summary-ref.html
自定義函數 (user-defined function UDF)
保存在mysql.proc表中
創建UDF
CREATE [AGGREGATE] FUNCTION function_name(parameter_name type,[parameter_name type,...])
RETURNS {STRING|INTEGER|REAL}
runtime_body
說明:
參數可以有多個,也可以沒有參數
必須有且只有一個返回值

自定義函數
創建函數
示例:無參UDF
CREATE FUNCTION simpleFun() RETURNS VARCHAR(20) RETURN "Hello World!”;
查看函數列表:
SHOW FUNCTION STATUS;
查看函數定義
SHOW CREATE FUNCTION function_name
刪除UDF:
DROP FUNCTION function_name
調用自定義函數語法:
SELECT function_name(parameter_value,...)

自定義函數
示例:有參數UDF
DELIMITER //
CREATE FUNCTION deleteById(uid SMALLINT UNSIGNED) RETURNS VARCHAR(20)
BEGIN
DELETE FROM students WHERE stuid = uid;
RETURN (SELECT COUNT(stuid) FROM students);
END//
DELIMITER ;

自定義函數
自定義函數中定義局部變量語法
DECLARE 變量1[,變量2,... ]變量類型 [DEFAULT 默認值]
說明:局部變量的作用範圍是在BEGIN...END程序中,而且定義局部變量語句必須在BEGIN...END的第一行定義
示例:
DELIMITER //
CREATE FUNCTION addTwoNumber(x SMALLINT UNSIGNED, Y SMALLINT UNSIGNED)
RETURNS SMALLINT
BEGIN
DECLARE a, b SMALLINT UNSIGNED;
SET a = x, b = y;
RETURN a+b;
END//
DELIMITER ;

自定義函數
爲變量賦值語法
SET parameter_name = value[,parameter_name = value...]
SELECT INTO parameter_name
示例:
...
DECLARE x int;
SELECT COUNT(id) FROM tdb_name INTO x;
RETURN x;
END//
存儲過程
存儲過程:存儲過程保存在mysql.proc表中
創建存儲過程
CREATE PROCEDURE sp_name ([ proc_parameter [,proc_parameter ...]])
routime_body
proc_parameter : [IN|OUT|INOUT] parameter_name type
其中IN表示輸入參數,OUT表示輸出參數,INOUT表示既可以輸入也可以輸出;param_name表示參數名稱;type表示參數的類型
查看存儲過程列表
SHOW PROCEDURE STATUS;

存儲過程
查看存儲過程定義
SHOW CREATE PROCEDURE sp_name
調用存儲過程
CALL sp_name ([ proc_parameter [,proc_parameter ...]])
CALL sp_name
說明:當無參時,可以省略"()",當有參數時,不可省略"()”
存儲過程修改
ALTER語句修改存儲過程只能修改存儲過程的註釋等無關緊要的東西,不能修改存儲過程體,所以要修改存儲過程,方法就是刪除重建
刪除存儲過程
DROP PROCEDURE [IF EXISTS] sp_name

存儲過程示例
創建無參存儲過程
delimiter //
CREATE PROCEDURE showTime()
BEGIN
SELECT now();
END//
delimiter ;
CALL showTime;

存儲過程示例
創建含參存儲過程:只有一個IN參數
delimiter //
CREATE PROCEDURE selectById(IN uid SMALLINT UNSIGNED)
BEGIN
SELECT * FROM students WHERE stuid = uid;
END//
delimiter ;
call selectById(2);

存儲過程示例
示例
delimiter //
CREATE PROCEDURE dorepeat(n INT)
BEGIN
SET @i = 0;
SET @sum = 0;
REPEAT SET @sum = @sum+@i; SET @i = @i + 1;
UNTIL @i > n END REPEAT;
END//
delimiter ;
CALL dorepeat(100);
SELECT @sum;

存儲過程示例
創建含參存儲過程:包含IN參數和OUT參數
delimiter //
CREATE PROCEDURE deleteById(IN uid SMALLINT UNSIGNED, OUT num SMALLINT UNSIGNED)
BEGIN
DELETE FROM students WHERE stuid >= uid;
SELECT row_count() into num;
END//
delimiter ;
call deleteById(2,@Line);
SELECT @Line;
說明:創建存儲過程deleteById,包含一個IN參數和一個OUT參數.調用時,傳入刪除的ID和保存被修改的行數值的用戶變量@Line,select @Line;輸出被影響行數

流程控制
存儲過程和函數中可以使用流程控制來控制語句的執行
流程控制:
IF:用來進行條件判斷。根據是否滿足條件,執行不同語句
CASE:用來進行條件判斷,可實現比IF語句更復雜的條件判斷
LOOP:重複執行特定的語句,實現一個簡單的循環
LEAVE:用於跳出循環控制
ITERATE:跳出本次循環,然後直接進入下一次循環
REPEAT:有條件控制的循環語句。當滿足特定條件時,就會跳出循環語句
WHILE:有條件控制的循環語句

觸發器
觸發器的執行不是由程序調用,也不是由手工啓動,而是由事件來觸發、激活從而實現執行
創建觸發器
CREATE
[DEFINER = { user | CURRENT_USER }]
TRIGGER trigger_name
trigger_time trigger_event
ON tbl_name FOR EACH ROW
trigger_body
說明:
trigger_name:觸發器的名稱
trigger_time:{ BEFORE | AFTER },表示在事件之前或之後觸發
trigger_event::{ INSERT |UPDATE | DELETE },觸發的具體事件
tbl_name:該觸發器作用在表名

觸發器示例
CREATE TABLE student_info (
stu_id INT(11) NOT NULL AUTO_INCREMENT,
stu_name VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (stu_id)
);
CREATE TABLE student_count (
student_count INT(11) DEFAULT 0
);
INSERT INTO student_count VALUES(0);

觸發器示例
示例:創建觸發器,在向學生表INSERT數據時,學生數增加,DELETE學生時,學生數減少
CREATE TRIGGER trigger_student_count_insert
AFTER INSERT
ON student_info FOR EACH ROW
UPDATE student_count SET student_count=student_count+1;
CREATE TRIGGER trigger_student_count_delete
AFTER DELETE
ON student_info FOR EACH ROW
UPDATE student_count SET student_count=student_count-1;

觸發器
查看觸發器
SHOW TRIGGERS
查詢系統表information_schema.triggers的方式指定查詢條件,查看指定的觸發器信息。
mysql> USE information_schema;
Database changed
mysql> SELECT * FROM triggers WHERE trigger_name='trigger_student_count_insert';
刪除觸發器
DROP TRIGGER trigger_name;

創建用戶以及查看用戶

修改表 update 表名 set 你要改的列的名字例如age=19 where 主鍵 例如 stuid=1;

備份數據庫

導入spl文件 寫絕對路徑 source /data/mysql/hellodb/songhe.sql
添加行 insert into students(name,age) values(haiyang,18);

數據
SELECT
INSERT
DELETE
UPDATE
字段級別
SELECT(col1,col2,...)
UPDATE(col1,col2,...)
INSERT(col1,col2,...)

所有權限
ALL PRIVILEGES 或 ALL
數據庫操作
創建數據庫:
CREATE DATABASE|SCHEMA [IF NOT EXISTS] 'DB_NAME';
CHARACTER SET 'character set name’COLLATE 'collate name'
修改數據庫:
ALTER DATABASE DB_NAME character set utf8;
刪除數據庫
DROP DATABASE|SCHEMA [IF EXISTS] 'DB_NAME';
查看支持所有字符集:SHOW CHARACTER SET;
查看支持所有排序規則:SHOW COLLATION;
獲取命令使用幫助:
mysql> HELP KEYWORD;
查看數據庫列表:
mysql> SHOW DATABASES;

創建表
創建表:CREATE TABLE
(1) 直接創建
(2) 通過查詢現存表創建;新表會被直接插入查詢而來的數據
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)] [table_options]
[partition_options] select_statement
(3) 通過複製現存的表的表結構創建,但不復制數據
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name { LIKE old_tbl_name | (LIKE old_tbl_name) }
注意:
Storage Engine是指表類型,也即在表創建時指明其使用的存儲引擎,同一庫中不同表可以使用不同的存儲引擎
同一個庫中表建議要使用同一種存儲引擎類型

創建表
CREATE TABLE [IF NOT EXISTS] ‘tbl_name’ (col1 type1 修飾符, col2 type2 修飾符, ...)
字段信息
•col type1
•PRIMARY KEY(col1,...)
•INDEX(col1, ...)
•UNIQUE KEY(col1, ...)
表選項:
•ENGINE [=] engine_name
SHOW ENGINES;查看支持的engine類型
•ROW_FORMAT [=] {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT}
獲取幫助:mysql> HELP CREATE TABLE;

表操作
查看所有的引擎:SHOW ENGINES
查看錶:SHOW TABLES [FROM db_name]
查看錶結構:DESC [db_name.]tb_name
SHOW COLUMNS FROM [db_name.]tb_name
刪除表:DROP TABLE [IF EXISTS] tb_name
查看錶創建命令:SHOW CREATE TABLE tbl_name
查看錶狀態:SHOW TABLE STATUS LIKE 'tbl_name’
查看庫中所有表狀態:SHOW TABLE STATUS FROM db_name

修飾符
所有類型:
•NULL 數據列可包含NULL值
•NOT NULL 數據列不允許包含NULL值
•DEFAULT 默認值
•PRIMARY KEY 主鍵
•UNIQUE KEY 唯一鍵
•CHARACTER SET name 指定一個字符集
數值型
•AUTO_INCREMENT 自動遞增,適用於整數類型
•UNSIGNED 無符號

示例
CREATE TABLE students (id int UNSIGNED NOT NULL PRIMARY KEY,name VARCHAR(20)NOT NULL,age tinyint UNSIGNED);
DESC students;
CREATE TABLE students2 (id int UNSIGNED NOT NULL ,name VARCHAR(20) NOT NULL,age tinyint UNSIGNED,PRIMARY KEY(id,name));

表的創建
表操作
DROP TABLE [IF EXISTS] 'tbl_name';
ALTER TABLE 'tbl_name'
字段:
添加字段:add
ADD col1 data_type [FIRST|AFTER col_name]
刪除字段:drop
修改字段:
alter(默認值), change(字段名), modify(字段屬性)
索引:
添加索引:add index
刪除索引:drop index
表選項
修改:
查看錶上的索引:SHOW INDEXES FROM [db_name.]tbl_name;
查看幫助:Help ALTER TABLE

修改表示例
ALTER TABLE students RENAME s1;
ALTER TABLE s1 ADD phone varchar(11) AFTER name;
ALTER TABLE s1 MODIFY phone int;
ALTER TABLE s1 CHANGE COLUMN phone mobile char(11);
ALTER TABLE s1 DROP COLUMN mobile;
ALTER TABLE s1 character set utf8;
ALTER TABLE s1 change name name varchar(20) character set utf8;
Help ALTER TABLE 查看幫助

修改表示例
ALTER TABLE students ADD gender ENUM('m','f')
ALETR TABLE students CHANGE id sid int UNSIGNED NOT NULL PRIMARY KEY;
ALTER TABLE students drop primary key ;
ALTER TABLE students ADD UNIQUE KEY(name);
ALTER TABLE students ADD INDEX(age);
ALTER TABLE students drop primary key ;
DESC students;
SHOW INDEXES FROM students;
ALTER TABLE students DROP age;

DML語句
DML: ITENSERT, DELETE, UPDA
INSERT:
一次插入一行或多行數據
語法
INSERT [L OW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name [(col_name,...)]
{VALUES | VALUE} ({expr | DEFAULT},...),(...),...
[ ON DUPLICATE KEY UPDATE 如果重複更新之
col_name=expr
[, col_name=expr] ... ]
簡化寫法:
INSERT tbl_name [(col1,...)] VALUES (val1,...), (val21,...)

DML語句
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name
SET col_name={expr | DEFAULT}, ...
[ ON DUPLICATE KEY UPDATE
col_name=expr
[, col_name=expr] ... ]
INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name [(col_name,...)]
SELECT ...
[ ON DUPLICATE KEY UPDATE
col_name=expr
[, col_name=expr] ... ]

DML語句
UPDATE:
UPDATE [LOW_PRIORITY] [IGNORE] table_reference
SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]
注意:一定要有限制條件,否則將修改所有行的指定字段
限制條件:
WHERE
LIMIT
Mysql 選項:-U|--safe-updates| --i-am-a-dummy

DML語句
DELETE:
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]
可先排序再指定刪除的行數
注意:一定要有限制條件,否則將清空表中的所有數據
限制條件:
WHERE
LIMIT
TRUNCATE TABLE tbl_name; 清空表

SELECT
字段顯示可以使用別名:
col1 AS alias1, col2 AS alias2, ...
WHERE子句:指明過濾條件以實現“選擇”的功能:
過濾條件:布爾型表達式
算術操作符:+, -, *, /, %
比較操作符:=,<=>(相等或都爲空), <>, !=(非標準SQL), >, >=, <, <=
BETWEEN min_num AND max_num
IN (element1, element2, ...)
IS NULL
IS NOT NULL

SELECT
DISTINCT 去除重複列
SELECT DISTINCT gender FROM students;
LIKE:
% 任意長度的任意字符
_ 任意單個字符
RLIKE:正則表達式,索引失效,不建議使用
REGEXP:匹配字符串可用正則表達式書寫模式,同上
邏輯操作符:
NOT
AND
OR
XOR

SELECT
GROUP:根據指定的條件把查詢結果進行“分組”以用於做“聚合”運算
avg(), max(), min(), count(), sum()
HAVING: 對分組聚合運算後的結果指定過濾條件
ORDER BY: 根據指定的字段對查詢結果進行排序
升序:ASC
降序:DESC
LIMIT [[offset,]row_count]:對查詢的結果進行輸出行數數量限制
對查詢結果中的數據請求施加“鎖”
FOR UPDATE: 寫鎖,獨佔或排它鎖,只有一個讀和寫
LOCK IN SHARE MODE: 讀鎖,共享鎖,同時多個讀

示例
DESC students;
INSERT INTO students VALUES(1,'tom','m'),(2,'alice','f');
INSERT INTO students(id,name) VALUES(3,'jack'),(4,'allen');
SELECT FROM students WHERE id < 3;
SELECT
FROM students WHERE gender='m';
SELECT FROM students WHERE gender IS NULL;
SELECT
FROM students WHERE gender IS NOT NULL;
SELECT FROM students ORDER BY name DESC LIMIT 2;
SELECT
FROM students ORDER BY name DESC LIMIT 1,2;
SELECT FROM students WHERE id >=2 and id <=4
SELECT
FROM students WHERE BETWEEN 2 AND 4
SELECT FROM students WHERE name LIKE ‘t%’
SELECT
FROM students WHERE name RLIKE '.[lo].';
SELECT id stuid,name as stuname FROM students

SQL JOINS

多表查詢
交叉連接:笛卡爾乘積
內連接:
等值連接:讓表之間的字段以“等值”建立連接關係;
不等值連接
自然連接:去掉重複列的等值連接
自連接
外連接:
左外連接:
FROM tb1 LEFT JOIN tb2 ON tb1.col=tb2.col
右外連接
FROM tb1 RIGHT JOIN tb2 ON tb1.col=tb2.col

多表查詢
子查詢:在查詢語句嵌套着查詢語句,性能較差
基於某語句的查詢結果再次進行的查詢
用在WHERE子句中的子查詢
用於比較表達式中的子查詢;子查詢僅能返回單個值
SELECT Name,Age FROM students WHERE Age>(SELECT avg(Age) FROM students);
用於IN中的子查詢:子查詢應該單鍵查詢並返回一個或多個值從構成列表
SELECT Name,Age FROM students WHERE Age IN (SELECT Age FROM teachers);
用於EXISTS

多表查詢
用於FROM子句中的子查詢
使用格式:SELECT tb_alias.col1,... FROM (SELECT clause) AS tb_alias WHERE Clause;
示例:
SELECT s.aage,s.ClassID FROM (SELECT avg(Age) AS aage,ClassID FROM students WHERE ClassID IS NOT NULL GROUP BY ClassID) AS s WHERE s.aage>30;
聯合查詢:UNION
SELECT Name,Age FROM students UNION SELECT Name,Age FROM teachers;

視圖
視圖:VIEW,虛表,保存有實表的查詢結果
創建方法:
CREATE VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
查看視圖定義:SHOW CREATE VIEW view_name
刪除視圖:
DROP VIEW [IF EXISTS]
view_name [, view_name] ...
[RESTRICT | CASCADE]
視圖中的數據事實上存儲於“基表”中,因此,其修改操作也會針對基表實現;其修改操作受基表限制

破解密碼登陸 select from users where name='admin' and password=' ' or '1'='1';
去重 selectdistinct gender from students ;
分組之後再過濾 select gender,count(
) from students group by gender having gender = 'F' ;
先過濾在分組 select classid,dender,avg(age) from students group by classid,gender;
排序 select age from students order by age
對平均年齡倒着排序
select classid,gender,avg(age) from students group by classid,gender order by avg(age)
desc;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章