MySQL技術分類整理
一:DB應用開發基礎
1.庫
1).創建庫
syntax:
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name
[create_specification] ...
create_specification:
[DEFAULT] CHARACTER SET [=] charset_name
| [DEFAULT] COLLATE [=] collation_name
注:如果不使用if not exists,則當數據庫存在的時候就會報錯,如果使用了則不會報錯且不會做任何操作,也就是說對現有數據庫不存在任何破壞。
建議:創建數據庫的時候,不要加該選項,因爲這可以明確提示我們數據庫是否存在,如果加了當數據庫存在,但沒有任何錯誤提示,可能會導致腳本接下來的操作都不正常。
2).刪除庫
a.drop database [if exists] db_name;
注:這裏的if exists,如果使用則不管數據庫存在不存在都不會報錯,且一定會刪除其數據庫。
建議:刪除數據庫的時候加上該語句,防止在數據庫不存在的時候產生報錯信息。
b.在database目錄下,直接刪除相關的數據庫文件即可
3).數據庫改名
a.如果數據庫引擎是MyISAM,則可以直接修改database目錄下數據庫的文件名即可;
b.如果是非MyISAM引擎,則以上方法不可用,必須先導出數據,然後創建新數據庫並導入數據,最後刪除舊數據庫;
4).查看數據的信息
a.查看數據庫管理系統中所有的數據庫信息
show databases;
b.查看某個數據庫的創建信息
show create database db_name;
c.查看當前所在的數據庫
select database();
注:database()是一個內置的函數,用來查看當前的數據庫,而在MySQL中所有的函數調用都是通過select來調用
5).數據庫屬性的修改
Syntax:
ALTER {DATABASE | SCHEMA} [db_name]
alter_specification ...
alter_specification:
[DEFAULT] CHARACTER SET [=] charset_name
| [DEFAULT] COLLATE [=] collation_name
由上面的信息可知,對數據庫的屬性修改很少,只有字符集和校對規則兩個屬性
2.表
表,是數據庫中的重要元素,表必須依附於某個數據庫下面,表用來存放了數據的一切屬性及值,學習數據庫也就是學習對錶的各種操作。
1).創建表
表的創建方式有三種:
a.使用常規的create來創建表
create table [if not exists] tb_name (create_definition,...)
example: create table if not exists t1 (id int primary key auto_increment,name varchar(40));
b.使用select語句創建
create table [if not exists] tb_name [as] select ... from old_tb_name;
注:使用該方法創建的表的表字段取決於select後面所跟的字段名以及個數,創建的表的字段定義和old表是一樣的,其次還將保存其對於字段的值,相當於創建一個子表或者附表
c.使用like形式創建
create table [if not exists] tb_name like old_tb_name;
注:使用該方創建的表只是創建了和old_tb_name表一樣的表結構和定義,不包含old表中的任何數據,因此相當於複製了old表的表結構來創建新的表
注意:關於表的創建的定義和子選項非常多,具體信息請查看help幫助信息或者官網文檔。對於開發來說重點就是設計表,創建表。
2).刪除表
a.刪除整個表
drop table [if exists] tb_name;
b.清空表的內容而保留表結構
truncate table tb_name;
3).查看錶的信息
a.查看某個數據庫下所有的表
show tables;
show table status; // 查看當前數據庫下所有表的狀態信息
b.查看錶的創建信息
show create table tb_name;
c.查看錶的結構字段信息
desc tb_name;
d.查看錶中的數據信息
select {*|single_col} from tb_name; //具體使用查看select語句的介紹
4).修改表的字段屬性
常用的幾個選項
syntax:
alter table tb_name {add|drop|modify|change}...
add: 添加一個字段
drop:刪除一個字段
modify: 修改某個字段的定義,但是字段名不變
change: 替換舊的字段,使用新的字段名及定義替換舊的字段名及定義
example:
alter table t1 add sex varchar(20);
多字段:alter table t1 add (weight int not null default 0,height int not null default 0); 其他幾個同理
alter table t1 drop sex;
alter table t1 modify sex char(30);
alter table t1 change sex age int;
注:alter對錶的修改功能和create 創建表的功能一樣強大,幾乎create table使用的定義選項,alter都可以對其進行修改定義
5).修改表的選項屬性
表的選項屬性跟表的定義是不一樣的,選項屬性例如 engine,character collation等
example:
alter table t1 engine=innode character set utf8;
6).重命名錶
表的重命名的功能也經常使用;
syntax:
rename old_tb_name to new_tb_name,old2_tb_name to new2_to_name...;
example:
rename table t1 to new_t1;
3.用戶及權限
1).用戶管理
MySQL中的用戶與其它地方用戶之說有點不一樣,在DB中,用戶的概念是用戶名和主機的組合才被稱爲一個數據庫用戶,例如:'root'@'localhost',因此必須
要弄明白數據庫中用戶指的到底是什麼。
a.創建用戶
創建用戶的方式有兩種:
方法一:create user
create user user_name [identified by "password"];
使用此方法創建的用戶默認情況下是沒有任何權限的,因此如果想單純的創建一個用戶,則可以使用該方法
方法二:grant 創建
example:
grant all privileges on *.* to 'lxm'@'localhost' identified by "password" [with grant option];
使用這種方法也可以創建一個用戶,但是在創建用戶的同時也進行了授權,在實際工作中用的更多的是該方法,因爲沒有需要,是不允許存在無用的帳號的。
注:在mysql中創建的DB系統級用戶帳號默認都是保存在mysql.user表中的。
b.刪除用戶
刪除用戶也有兩種方法:
方法一:delete語句
delete from mysql.user where User = 'user_name' and Host = 'host_name';
使用該方法刪除用戶只是刪除用戶本身,如果對該用戶授予了某些權限,則不會刪除這些權限信息;
方法二:drop user
drop user username;
使用該方法刪除用戶會一併刪除用戶的權限信息等,即徹底的刪除用戶帳號相關的所有信息;建議使用該方法
c.查看所有的用戶信息
在MySQL數據庫中,並沒有提供能夠查詢所有用戶帳號的命令,但是我們可以使用select語句實現;
select distinct contact('user: ',User,'@',Host,';') as users from mysql.user;
example:
mysql> select distinct concat('User: ',User,'@',Host,';') as users from mysql.user;
+----------------------------+
| users |
+----------------------------+
| User: [email protected]; |
| User: @localhost; |
| User: lxm@localhost; |
| User: root@localhost; |
| User: @node10.lxm.com; |
| User: [email protected]; |
+----------------------------+
2).權限管理
只要存在用戶的地方就有權限的管理
a.數據庫中常見的權限控制
ALL PRIVILEGES : 該權限表示出with grant option之外的所有權限;
WITH GRANT OPTION: 該權限表示對於授權的用戶來說可以給其它用戶進行授權的操作,即具有grant操作的權限;
GRANT OPTION: 授權grant的權限,和with grant option的功能是一樣的,但是授權的方式卻不一樣;
ALTER: 表示授予alter命令的權限,針對表
ALTER ROUTINE: 表示可以修改存儲過程
CREATE: 表示可以使用create命令,創建數據庫,表和索引的權限
CREATE ROUTINE: 表示可以創建存儲過程
CREATE TEMPORARY TABLES:表示可以創建臨時表
CREATE USER: 表示可以創建用戶
CREATE VIEW: 表示可以創建視圖
DELETE: 表示可以使用delete命令,針對表刪除數據權限;
DROP: 表示可以使用drop命令,刪除數據庫或這表權限;
EXECUTE: 表示可以調用存儲過程(call procedure_name);
EVENT: 影響事件的執行能力;
FILE: 表示可以使用SELECT INTO OUTFILE 和LOAD DATA INFILE
INDEX: 表示可以對索引進行創建和刪除,create index,drop index
INSERT: 表示可以使用insert命令,針對表
LOCK TABLES: 表示有權限鎖定表
PROCESS: 表示可以查看當前的用戶連接線程,show processlist;
RELOAD: 表示可以使用flush命令集,執行flush-hosts, flush-logs, flush-privileges, flush-status, flush-tables, flush-threads, refresh,
reload等命令的權限
REPLICATION CLIENT: 跟主從相關
REPLICATION SAVE: 複製從服務器所需的權限;
SUPER: 影響管理員級命令的使用,如CHANGE、MASTER、KILL thread、mysqladmin debug、PURGE MASTER LOGS和SET GLOBAL
SELECT: 表示可以使用select語句;
SHOW DATABASES: 表示可以查看數據庫;
SHOW VIEW: 表示可以使用show create view
SHUTDOWN: 表示可以使用shutdown命令
UPDATE: 表示可以使用update語句
TRIGGER: 表示可以執行觸發器
USAGE:該權限只能連接數據庫,而不能做任何其它的操作,所有的用戶都必須有該權限,否則將無法連接數據庫
常見的MySQL權限分佈:
表權限: 'Select', 'Insert', 'Update', 'Delete', 'Create', 'Drop', 'Grant', 'References', 'Index', 'Alter'
列權限: 'Select', 'Insert', 'Update', 'References'
過程權限: 'Execute', 'Alter Routine', 'Grant'
b.授予權限:grant
GRANT
priv_type [(column_list)]
[, priv_type [(column_list)]] ...
ON [object_type] priv_level
TO user_specification [, user_specification] ...
[REQUIRE {NONE | ssl_option [[AND] ssl_option] ...}]
[WITH with_option ...]
object_type:
TABLE
| FUNCTION
| PROCEDURE
priv_level:
*
| *.*
| db_name.*
| db_name.tbl_name
| tbl_name
| db_name.routine_name
user_specification:
user [IDENTIFIED BY [PASSWORD] 'password']
ssl_option:
SSL
| X509
| CIPHER 'cipher'
| ISSUER 'issuer'
| SUBJECT 'subject'
with_option:
GRANT OPTION
| MAX_QUERIES_PER_HOUR count
| MAX_UPDATES_PER_HOUR count
| MAX_CONNECTIONS_PER_HOUR count
| MAX_USER_CONNECTIONS count
以上爲grant的語法格式,該命令的用處是很大的
example:
grant all privileges on *.* 'root'@'localhost' identified by "password" [with grant option];
c.查看用戶相關的權限
show grants [for username];
如果不加for username,則表示查看當前用戶的權限,如果加上for username,則表示查看特定用戶的權限信息;
d.刪除權限:revoke
revoke命令用來刪除用戶的權限,但是必須該用戶是存在的。如果用delete刪除了用戶,此時在用revoke刪除權限,則會報錯爲沒有定義該用戶;
方法一:刪除指定的權限
example: revoke select on *.* from 'lxm'@'localhost';
方法二:刪除所有的權限
example: revoke all privileges,grant option from 'lxm'@'loalhost';
4.索引
索引類似於書本的目錄,加快查詢的速度。在MySQL中常見的索引有:普通索引,主鍵索引,唯一索引,全文索引,聚合索引(多個列組合成的索引)
1).創建索引
創建索引有三種方式:
a.create table 時順帶創建索引
example:
主鍵索引:
create table t (id int primary key,name varchar(20),sex char(10));
create table t(id int ,name varchar(20),sex char(10),primary key (id));
普通索引:
create table t(id int,name varchar(20),sex char(10),index index_name (index_column));
唯一索引:
create table t(id int ,name varchar(20),sex char(10),unique index index_name (index_column));
全文索引:
create table t(id int ,name varchar(20),sex char(10), str text,fulltext (str));
聚合索引:建議在上面索引的基礎之上
create table t (id int ,name varchar(20),sex char(10),index group_index (name,sex));
b.create index:
syntax:
CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name
[index_type]
ON tbl_name (index_col_name,...)
example:
create index common_index on t1 (name);
c.alter 創建索引
alter table tablename add index/unique/fulltext [索引名] (列名)
alter table tablename add primary key (列名)//不要加索引名,因爲主鍵只有一個
2).查看索引
syntax:
SHOW INDEX FROM tbl_name [FROM db_name]
3).刪除索引
刪除索引有兩種方式:
a.drop index
syntax:
DROP INDEX index_name ON tbl_name;
如果要刪除主鍵索引,則必須使用下面的方式:
DROP INDEX `PRIMARY` ON tbl_name;
b.alter 刪除
alter table tbl_name drop index/unique/fulltext index_name;
alter table tbl_name drop primary key :刪除主鍵索引
4).大數據遷移,索引處理機制
當有大量的數據需要遷移時,此時如果設置了索引,則最好是先取消所有索引,然後遷移數據,最後在新的數據庫表上在添加索引。之所以這樣做是因爲索引雖然加快了查詢的速度,但是降
低了增刪改的速度,且索引的容量有時可能比數據還要大。
5.變量
對於數據庫而言,也有自己的內部編程,例如自定義函數,存儲過程。既然有涉及到編程,就不得不涉及到變量的概念,在mysql中變量大致分爲以下幾種內容:局部變量,用戶變量,會
話變量,全局變量。
1).局部變量
在mysql中,局部變量一般是在函數或者是存儲過程中定義的,且使用declare來定義,當函數或者存儲過程運行結束後,變量就失效了,因此被稱爲局部變量;局部變量也是自定義變量的一
種。
定義方式:
declare c int [default 0]; //default可以爲變量指定默認值
2).用戶變量
用戶變量也是自定義變量的一種,它的使用範圍比局部變量要大,其使用生命週期是當前用戶的整個會話週期。一旦斷開連接,則用戶變量就失效了。
用戶變量的定義:
set @var_name = value;
select @var_name := value;
3).會話變量
會變變量是系統變量的一種,也就是說會話變量在用戶連接時就已經初始化好,用戶只能更改現有的且屬於自己的會話變量,而無法新增會話變量。
查看所有會話變量:
show session variables;
修改會話變量:
set session sess_var = value; //常用
set @@session.sess_var = value;
set var_name = value;
查看會話變量:
select @@var_name;
select @@session.var_name;
show session variables like 'pattern';
4).全局變量
全局變量也是系統變量的一種,但是其生命週期是整個mysql的在線週期,只要mysql一直在線未重啓,則所有全局變量都可以使用。但是重啓後,則所有全局變量的更改全部失效,如果要長
期有效,則將變量寫入配置文件中。
查看所有全局變量:
show global variables;
修改全局變量:
set global var_name = value;
set @@global.var_name = value;
查看特定的全局變量:
select global @@var_name;
select @@global.var_name;
show global variables like 'pattern';
6.函數
1).內置常用函數
now():查看當前時間,顯示的是語句執行的當前時間
example:select now(),sleep(2),now();
雖然睡眠了2秒,但是第二now和第一個now一樣,因爲select執行的時間只有一個
sleep(num):設置睡眠時間
sysdate():顯示系統時間,實時的時間
user():顯示當前用戶
database():顯示當前數據庫
last_inert_id():顯示最後一次的插入id號
connection_id():查看當前mysql連接線程的id,線程的id也可以從show processlist獲取
concat():連接字符串函數
max():取最大值
min():取最小值
sum(): 求和
avg(): 求平均值
count(*):統計行數
2).自定義函數
對於自定義函數來說,必須依賴於某個數據庫的下面,也就是在哪個數據庫下面創建的函數,在只能在該數據庫下進行調用:
a.創建函數
syntax:
create function 函數名 (參數列表)returns 返回值類型
begin
函數體;
end
example:
delimiter $$
create [definer=`username`@`host_name`] function `sayHello` () returns varchar(20)
begin
return "hello world";
end
注:definer是用來定義函數的創建者或者說那個賬戶可以訪問,如果沒有明確定義,則默認是'root'@'localhost'用戶。這在視圖,存儲過程中都默認存在。
帶參數的函數:
delimiter $$
create definer='root'@'localhost' function sayHello(string varchar(20)) returns varchar(20)
begin
return string;
end
$$
select sayHello('hello world')
注:函數中還可以使用循環語句
b.查看庫下的函數
show function status; //查看mysql數據庫中所有的函數,並且可以看到隸屬於那個庫
show function code func_name; //該命令經測試無效;
show create function func_name; //查看創建函數的代碼
c.調用函數
select func_name(param);
d.刪除函數
drop function [if exists] func_name;
7.存儲過程
存儲過程和函數有點類似,但是也有很大的區別,存儲過程通常是一組sql的集合,可以對不同的表等進行操作以完成某些任務,而函數通常針對性較強且簡
單不能用戶修改表等操作。
a.創建存儲過程
CREATE
[DEFINER = { user | CURRENT_USER }]
PROCEDURE sp_name ([proc_parameter[,...]])
[characteristic ...] routine_body
proc_parameter:
[ IN | OUT | INOUT ] param_name type
type:
Any valid MySQL data type
這裏要注意的是存儲過程有三個參數:in,out,inout
in :表示輸入參數,調用時必須指定,可以在存儲過程中修改,但是無法返回修改後的值,即存儲過程中修改了參數的值並不影響外部的參數原值;
out: 表示輸出參數,可以在存儲過程中修改其值,並返回.存儲過程並不會調用原值,但是會返回新值覆蓋其原值
inout: 輸入輸出參數,調用是必須指定,可以在存儲過程中修改,且返回值
example:
delimiter $$
create procedure test(out param int)
begin
select count(*) into param from mysq.user;
end
$$
delimiter ;
call test(@a)
select @a; //此時就可以看到變量a被賦值了
b.查看存儲過程
show procedure status; //查看mysql數據庫中所有的存儲過程
show create procedure proc_name; // 查看特定的存儲過程的創建代碼
c.調用存儲過程
call proc_name(param);
d.刪除存儲過程
drop procedure [if exists] proc_name;
8.觸發器
觸發器概念:
所謂觸發器,就是當滿足某個條件時引發的某種動作,在mysql中,當發生某個事件時,就會執行一段sql的代碼完成某些工作;
在mysql中只能有一類觸發器,就是監聽表中行數據的改變
一個完整的觸發器通常由:事件,事件執行的時機和執行代碼所構成
事件:insert ,update ,delete
時機:before, after
由事件和時機組合成爲六種觸發狀況:before insert,before update,before delete,after insert,after update,after delete
動態獲取觸發器程序內的數據:old,new
old:監聽事件所在表上的數據,在事件發生之前時的數據,舊的數據。
new:監聽表上事件發生之後,新處理完畢的數據。
數據就是觸發該事件的記錄。也就說說old和new永遠代表的是觸發該觸發器操作的表的數據。或者說代表的是事件之後的表中的數據。
還需注意的地方:
insert:在插入之前沒有數據,因此不能使用old
delete:在刪除之後沒有數據,因此不能使用new
觸發器也必須是依賴於某個庫下面
1).創建觸發器
syntax:
CREATE [DEFINER = { user | CURRENT_USER }] TRIGGER trigger_name trigger_time trigger_event ON tbl_name
FOR EACH ROW
BEGIN
body_code
END
example:
delimiter $$
create definer='root'@'localhost' trigger `trigger_test` after update on t1
for each row
begin
update t2 set age = age + 10;
END
$$
delimiter ;
注:創建觸發器的時候,body_code部分操作的表不能和觸發器監聽的表是一張表,否則會報錯
2).查看觸發器
SHOW TRIGGERS [FROM db_name] [like_or_where]
show create trigger trigger_name; //查看具體觸發器的創建代碼
3).刪除觸發器
drop trigger trigger_name;
9.視圖(view)
視圖的相關概念:
視圖是mysql中的一種內部虛擬表,想對於真實表而言,其並不存在,是真實表的一個虛擬對象;
視圖對於用戶來說是一張表,但是對於數據庫內部來說其不是一張表,是真實表某些字段的映射,保存的只是一個語句;
視圖在未執行前其並不是一張表,而是一串sql語句,在對視圖進行操作的時候,視圖纔會臨時使用sql代碼形成一張臨時表或者嵌套真實語句形成新的語句對真實表進行操作;
視圖的最終操作結果還是真實表;
視圖通常是一串select語句從真實表中查詢出需要的內容形成視圖表展示給客戶,這樣可以隱藏不需要對用戶開放的數據;
視圖表的數據和真實表的數據息息相關,視圖表數據的改變也會影響真實表數據的改變,而真實表數據的改變也會影響視圖表數據的改變,但爲了安全起見,通常視圖表只給予查詢的權限,
一切修改操作都將在真實表中完成
視圖的算法:
視圖的算法決定了視圖在執行時的一種流程,視圖有三種算法(algorithm):merge,temptable,undefined
merge: 使用該算法,在訪問視圖的時候採用的是一種合併的機制,將用戶的查詢語句和視圖的查詢語句合併起來,最終對真實表進行操作;
temptable: 臨時表,使用該算法,在訪問視圖的時候,首先會創建視圖的臨時表,然後用戶的查詢操作針對臨時表進行操作,此訪問纔有視圖的效果
undefined; 視圖默認採用的算法,使用該算法,系統會根據情況自動從merge和temptable中選擇一種合適的算法進行視圖操作,因此無特殊需要,通常保留爲undefined
1).創建視圖
Syntax:
CREATE
[OR REPLACE]
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
[DEFINER = { user | CURRENT_USER }]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
從上面的語法格式來看,主體爲:
create view view_name [(column_list)] as select_statement;
example:
create view v_test (v_name,v_age) as select name,age from t;
如上所示一個視圖就創建完成了,這裏使用了列改名(v_name,v_age),如果不加,則默認使用select後面所跟的查詢字段名;
2).查看視圖
在mysql中沒有專門的視圖查看命令來查看視圖的信息,但是可以通過查看錶狀態信息把視圖過濾出來。這是因爲在創建視圖的時候,會自動在表狀態信息的comment字段中添加view的字樣。
show table status where comment='view'; //注:必須在數據庫下面操作,查看的是當前數據庫下面的視圖信息
show create view view_name;//通過上面的命令可以查看到視圖名,通過該命令則可以查看具體視圖的創建代碼;
查看視圖的表結構:
desc view_name;
3).修改視圖
修改視圖其實是修改視圖的sql代碼而已,或者說是修改視圖的虛擬表結構,但是跟真正的表的修改又不一樣,視圖的修改必須是改變了整個的查詢字段;
syntax:
ALTER
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
[DEFINER = { user | CURRENT_USER }]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
從上面的語法可知,和創建視圖基本是一樣的,只是修改視圖的時候,視圖名稱是不能變化的
example:
alter view v_test (vv_name,vv_age,vv_sex) as select name,age,sex from t;
4).刪除視圖
drop view if exists view_name;
10.事務
事務的概念:
a.數據庫中所謂的事務,實則是一串sql語句執行並生效的時刻控制的問題。當啓動事務時,接下來的一連串的sql語句都是事務的執行語句,直到提交(commi
t)命令給出,一個事務纔算結束。而在事務未提交之前,事務語句執行結果的可見與否是由當前的事務隔離級別來控制的,但是即使結果可見也並不是真正生效,
取決於事務的提交(commit)還是回滾(rollback)
b.在未事務未提交的之前,事務都是可以回滾的,可以回滾所有的操作,也可以回滾到某個保存點(必須設置事務保存點).所謂回滾即是取消事務所有的操作
c.事務的隔離級別:
read uncommitted: 表示事務未提交時,對於寫入數據的事務,不允許其它的事務對該行的數據進行寫操作,但是允許其它的事務讀取此行的數據;
read committed: 表示事務提交後,才能讀取。讀取數據的事務允許其它事務對該行數據進行訪問,但是未提交的寫事務是不允許其它人進行讀取操作;
repatable read: 表示事務在未提交之前,讀取數據的事務允許其它事務的讀取訪問,但是讀取的是原始的數據,禁止寫事務的操作,寫數據的事務則
禁止其它任何事務的操作。
seriablizable:可串行事務,同一個時刻只允許一個事務在執行,此時不存在任何的問題
注:在mysql中默認的事務隔離級別是repatable-read,通過變量tx_isolation來設置的,通常是不需要修改此選項,但是如果想提高併發能力,則可以將
事務的隔離級別設置的低一點,但是此時對於開發來說要求很高,必須保證數據不出問題。
d.事務的ACID特性
原子性(一組sql語句,要麼都成功,要麼都失敗)
一致性(事務週期內,事務是一致的,只受事務的影響,不會受到其它的改變)
隔離性(多個事務之間是互相隔離的,不會互相影響)
持久性(當事務提交之後,修改永久生效)
e.事務的執行過程
事務的執行過程跟一般的sql語句執行過程不一樣,一般的sql語句直接針對數據文件進行操作。而事務則分爲兩步,首先事務的執行語句會現在事務日誌
中進行執行,當使用commit命令後,纔會同步到數據文件中。正是因爲這個原因使得事務可以進行回滾。此外當一個事務中的語句執行有錯誤時,該錯誤語句
的執行結果是不會生效的。
f.支持事務的引擎
在mysql中,最常用的引擎有兩種,一種是MyISAM,一種是InnoDB,而其中支持事務的引擎只有InnoDB。因此要想使用事務必須是用InnoDB引擎。在mysql
5.5.x以後的版本中,默認的引擎已經改爲InnoDB。
1).事務的執行與回滾
syntax:
start transaction;
sql1;
sql2;
commit/rollback;
2).事務保存點的回滾
syntax:
start transaction;
sql1;
savepoint point_name;
sql2;
savepoint point_name;
commit/rollback to savepoint point_name;
注:
a.回滾到某個point之後,則包含point及其之前的數據修改在提交之後是生效的,而point之後的數據修改則不生效
b.start transaction是顯式的開始事務,而必須使用commit或者rollback表示結束一個事務。如果不想使用start,則表示講autocommit設爲0,不自動提交
默認情況下是自動提交的,只有將commit設爲0才能手動提交,事務執行後還要改爲自動提交,否則會影響其它語句的執行。因此標準的做法是start顯式
開啓。
11.字符集和校對規則
簡單的理解字符集就是某種字符編碼規則,將字符和編碼進行一一對應轉換。存儲數據時,是根據字符編碼規則講數據進行轉換成特定的編碼格式進行存儲,
而在展示數據時,則根據編碼規則將特定的編碼轉換成容易理解的數據進行展示。所謂校對規則則是字符集內部編碼的排序方式。
1).MySQL中的字符集變量
character_set_server:默認的內部操作字符集 :mysql內部進行數據存儲時候的字符集
character_set_client:客戶端來源數據使用的字符集 :告訴服務器客戶端發來的命令使用的字符集
character_set_connection:連接層字符集 :轉換層字符集用作客戶端和服務器字符集不一致時的轉碼工作
character_set_results:查詢結果字符集 :查詢結果以什麼字符集發送給客戶端
character_set_database:當前選中數據庫的默認字符集
character_set_system:當設置中文數據庫名是,將以此處設置字符集的編碼的格式來保存數據庫。該編碼爲當前標識符的編碼,或者說是字段名的編碼。該
變量是一個只讀變量,不可以對其修改,該值是系統自動識別設置。
2).MySQL中的字符集轉換過程
a.MySQL Server收到請求時將請求數據從character_set_client轉換爲character_set_connection;
b.進行內部操作前將請求數據從character_set_connection轉換爲內部操作字符集,其確定方法如下:
使用每個數據字段的CHARACTER SET設定值;
若上述值不存在,則使用對應數據表的DEFAULT CHARACTER SET設定值(MySQL擴展,非SQL標準);
若上述值不存在,則使用對應數據庫的DEFAULT CHARACTER SET設定值;
若上述值不存在,則使用character_set_server設定值。
c.將操作結果從內部操作字符集轉換爲character_set_results
注:對於字符集而言,最常見的問題就是亂碼的問題。亂碼之所以產生,就是因爲變量值設置的不合理導致字符集之間的轉換出了問題。建議在使用中可以全部設
置爲utf8的字符集編碼。
3).編碼的設置
除了設置每一個變量之外,還可以使用偷懶的方式:set names code_name; 但是使用此方法的前提是character_set_client/connection/results三個變量的
字符集必須一致才行,也就是說set names 的結果是將這三個變量設爲一個值。
12.增刪改查以及show語句
這裏的增刪改查只是從運維的角度來敘述需要掌握的基礎內容,至於詳細的參數設置等細節可自行查看help信息或者官方文檔手冊等
insert: 插入,增加數據
語法:
insert into tb_name(col1_name,col2_name,...) values(col1_value,col2_value,...),(col1_value,col2_value,...),...;
插入數據通常分爲兩種:
單數據:
insert into tb_name(col2_name,col2_name,...) values(col1_value,col2_value,...);
多數據:
insert into tb_name(col1_name,col2_name,...) values(col1_value,col2_value,...),(col1_value,col2_value,...),...;
注:
1).對於寫出來的字段,在values後面必須有其值相對應,也就是說字段名個數與值的個數必須相等;
2).對於有自動增長的列字段,可以不用寫出,其會自動增加,但是也不能對其明確賦值;
delete: 刪除表中的數據
syntax:
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count
1).刪除表中的所有數據;
delete from tb_name;
2).刪除where過濾的內容;
delete from tb_name where where_condition;
3).刪除限制的幾行內容;
delete from tb_name limit row_count;
update: 更新表中的數據
syntax:
UPDATE [LOW_PRIORITY] [IGNORE] table_reference
SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]
1).更新相同字段的所有行的值;
update tb_name set col_name = col_value;
2).更新特定行的值
update tb_name set col_name = col_value where where_condition;
3).更新截取行的值
update tb_name set col_name = col_value limit row_count;
select: 查詢語句
查詢語句的使用是MySQL中的重重之重,其功能之強大支撐着各種數據分析工作,因此看似簡單的查詢語句其實也是最難學的一個語句。下面就簡單的總結
下:
syntax:
SELECT
[ALL | DISTINCT | DISTINCTROW ]
[HIGH_PRIORITY]
[STRAIGHT_JOIN]
[SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
[SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
select_expr [, select_expr ...]
[FROM table_references
[WHERE where_condition]
[GROUP BY {col_name | expr | position}
[ASC | DESC], ... [WITH ROLLUP]]
[HAVING where_condition]
[ORDER BY {col_name | expr | position}
[ASC | DESC], ...]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
[PROCEDURE procedure_name(argument_list)]
[INTO OUTFILE 'file_name'
[CHARACTER SET charset_name]
export_options
| INTO DUMPFILE 'file_name'
| INTO var_name [, var_name]]
[FOR UPDATE | LOCK IN SHARE MODE]]
注:對於語法不做多說,但是特別要強調的是查詢子語句的順序,where,group by,having,limit這些的排列順序,如果有多個組合時一定要遵循此規則。
1).普通查詢
(1).無子句查詢
select * from tb_name; //查詢表中所有字段的內容
select col1_name,col2_name,... from tb_name; //查詢表中指定字段的內容
(2).where 子句查詢
where查詢用作條件的過濾,後面所跟的內容爲條件的判斷
example:
select * from tb_name where name = 'jack';
where條件過濾類型:
a.比較運算符
< 小於
<= 小於等於
= 等於
in 在某集合內(等於集合內的任意一個值都行) exmaple: in (1,2,3)
not in :不在集合之內 example not in (1,2,3)
!= or <> 不等於
>= 大於等於
> 大於
between num1 and num2 在某範圍內大於等於num1小於等於num2
注:在數據庫系統中,列字段可以當作變量進行計算
example:
select * from price where new_price - old_price > 2000;
b.邏輯運算符
NOT 或 ! 邏輯非
OR 或 || 邏輯或
AND 或 && 邏輯與
c.模糊查詢
like模糊插敘:
select goods_id,goods_name from goods where goods_name like '三星‘;
%->通配任意字符
‘-’-> 通配單個字符
正則表達式查詢:
REGEXP,RLIKE:支持正則表達式的寫法
example:
select name from students where name rlike '^[XY].*$';
(3).group by 子句查詢
group by 查詢是將表中的數據按照某字段的值進行分組並顯示組中的第一個值
syntax:
select col1,col2,...from tb_name group by col1,col2,...
注:group by 的用法不難,但是結果需要注意。group by 查詢之後默認顯示的是分組中的一條記錄,此時毫無意義,但是group by 和聚合函數一起使用就顯得很重要。
常見的聚合函數:
avg(col_name): 取平均值
sum(col_name): 取和
max(col_name): 取最大值
min(col_name): 取最小值
count(*): 統計行數
因此,當group by 和這些聚合函數一起使用時,就可以取出每組中平均值,最大值,最小值等。千萬不要嘗試在分組的情況下使用排序加limit的取最大最小值,那樣的結果是錯誤的。
example:
select id,max(days) from tb_name group by c_id; //以c_id進行分組,並取每組中days最大的一組值
如果想顯示某個字段的所有值,則可以結合group_concat()函數進行使用:
example:
select id,t_id,c_id,group_concat(days) from join_teacher_class_time group by c_id;
+----+------+------+--------------------+
| id | t_id | c_id | group_concat(days) |
+----+------+------+--------------------+
| 1 | 1 | 1 | 15,20,15,15,5 |
| 2 | 1 | 2 | 18,22 |
| 3 | 1 | 3 | 22,15 |
+----+------+------+--------------------+
(4).having 子句查詢
having 子句查詢和where子句查詢幾乎是一樣的,但是有一個很重要的區別。having子句查詢具備在查詢結果之上在進行篩選,而where則不具有這個功能。
example:
select id,t_id,c_id as class_id,days from join_teacher_class_time having class_id = 1;
+----+------+----------+------+
| id | t_id | class_id | days |
+----+------+----------+------+
| 1 | 1 | 1 | 15 |
| 4 | 2 | 1 | 20 |
| 6 | 3 | 1 | 15 |
| 7 | 1 | 1 | 15 |
| 9 | 2 | 1 | 5 |
+----+------+----------+------+
5 rows in set (0.00 sec)
由上面的可見,c_id 被命名爲class_id,having可以完好插敘,看where:
mysql> select id,t_id,c_id as class_id,days from join_teacher_class_time where class_id = 1;
ERROR 1054 (42S22): Unknown column 'class_id' in 'where clause'
由上面可見,where查詢報錯了。
(5).order by 子句查詢
order by子句查詢,顧名思義是用來對查詢結果進行排序的。可以通過asc和desc來指明是升序排序還是降序排序,默認情況下是按升序排序的。通常會結合limit子句查詢獲取最大值和最小
值。
example:
select * from tb_name order by c_id desc limit 1 //按照c_id進行排序並獲取c_id最大的一組值
(6).limit 子句查詢
limit 子句查詢,顧名思義限制查詢,限制查詢結果顯示的行數。
syntax:
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
用法一:
select col1,col2,... from tb_name limit row_count; //明確表示取多少行
用法二:
select col1,col2,... from tb_name limit num1,num2 //表示從num1行開始往後去num2行數據,不包括num1行數據
(7).into 子句查詢
syntax:
[INTO OUTFILE 'file_name'
[CHARACTER SET charset_name]
export_options
| INTO DUMPFILE 'file_name'
| INTO var_name [, var_name]]
從上面可知,into的用法有三種:
用法1:into outfile 將數據導入到一個文件中
example:
select col1,col2,...from tb_name into outfile "filename";
對於outfile的文件還可以使用格式符號,常見的有以下幾種:
fields terminated by ',' --字段的結束符
optionally enclosed by '"' –-字符串的結束符
lines terminated by '\n' --行的結束符
用法2:into dumpfile 用來將數據導入到一個文件中,但是這個用法很奇特,只能導入一行的內容,且無任何格式符號可用
select * from tb_name limit 1 into dumpfile "filename";
用法3:into var_name 使用該方法可以爲一個變量賦值
example:
select c_name from tb_name limit 1 into @test;
select $test
mysql> select @test;
+---------+
| @test |
+---------+
| php0115 |
+---------+
1 row in set (0.00 sec)
(8).去重複查詢 :distinct
example:
select distinct col1,distinct col2,...from tb_name;
2).子查詢
所謂子查詢有點類似於嵌套查詢,外層查詢和內層查詢都是一個完成的查詢語句,而外層查詢是基於內層查詢。注意,千萬不要和子句查詢混淆了。
(1).where 子查詢
關鍵:把內層的查詢結果當作外層的條件進行比較
example:
select * from join_class where room = (select max(room) from join_class);
(2).from 子查詢
關鍵:把內層的查詢結果當作臨時表供外層查詢
example:
mysql> select * from (select * from join_class where room < 200) as tmp;
+----+---------+------+
| id | c_name | room |
+----+---------+------+
| 2 | php0228 | 104 |
| 3 | php0331 | 102 |
+----+---------+------+
(3).exists 子查詢
關鍵:把外層的查詢結果拿到內層,看內層是否成立(有點虛幻)
example:
查欄目下有商品的欄目:
select cat_id,cat_name from category where exists (select * from goods where goods.cat_id = category.cat_id);
3). 多表連接查詢
測試表內容:
mysql> select * from join_class;
+----+---------+------+
| id | c_name | room |
+----+---------+------+
| 1 | php0115 | 207 |
| 2 | php0228 | 104 |
| 3 | php0331 | 102 |
| 4 | php0505 | 202 |
| 6 | php0202 | 302 |
+----+---------+------+
5 rows in set (0.00 sec)
mysql> select * from join_teacher;
+----+-----------+--------+
| id | t_name | gender |
+----+-----------+--------+
| 1 | 韓信 | male |
| 2 | 李白 | female |
| 3 | 韓非子 | secret |
| 4 | 孫武 | male |
| 5 | 王八 | male |
+----+-----------+--------+
5 rows in set (0.00 sec)
(1).合併查詢: union (union all)
合併查詢的概念:
所謂合併查詢是將多張的表的查詢結果合併起來,但是此處的合併是從上往下的方式進行合併,而不是左右合併
合併查詢的命令是union,默認情況下合併結果如果有重複的行,則會進行去重複的操作,如果想顯示所有的行,則使用union all
合併查詢的前提是字段個數必須一樣多,其次字段類型也最好一樣,如果不類型不一樣可能會出現混亂。
合併查詢中,如果字段名不一樣,則以第一個查詢列字段爲準
合併查詢中的order by子句如果不跟limit則會被語法分析器去除,因爲order by很影響性能
syntax:
(select col1,col2,... from tb1_name) union (select col1,col2,...from tb2_name);
(select col1,col2,... from tb1_name) union all (select col1,col2,...from tb2_name);
(2).笛卡爾積查詢
所謂笛卡爾積就是兩張表在沒有任何條件判斷的情況下進行互乘.例如表A M行,表B,N行,則表A,表B的笛卡爾積爲M*N
syntax:
select * from tb1,tb2,...;
example:
mysql> select * from join_class,join_teacher;
+----+---------+------+----+-----------+--------+
| id | c_name | room | id | t_name | gender |
+----+---------+------+----+-----------+--------+
| 1 | php0115 | 207 | 1 | 韓信 | male |
| 2 | php0228 | 104 | 1 | 韓信 | male |
| 3 | php0331 | 102 | 1 | 韓信 | male |
| 4 | php0505 | 202 | 1 | 韓信 | male |
| 6 | php0202 | 302 | 1 | 韓信 | male |
| 1 | php0115 | 207 | 2 | 李白 | female |
| 2 | php0228 | 104 | 2 | 李白 | female |
| 3 | php0331 | 102 | 2 | 李白 | female |
| 4 | php0505 | 202 | 2 | 李白 | female |
| 6 | php0202 | 302 | 2 | 李白 | female |
| 1 | php0115 | 207 | 3 | 韓非子 | secret |
| 2 | php0228 | 104 | 3 | 韓非子 | secret |
| 3 | php0331 | 102 | 3 | 韓非子 | secret |
| 4 | php0505 | 202 | 3 | 韓非子 | secret |
| 6 | php0202 | 302 | 3 | 韓非子 | secret |
| 1 | php0115 | 207 | 4 | 孫武 | male |
| 2 | php0228 | 104 | 4 | 孫武 | male |
| 3 | php0331 | 102 | 4 | 孫武 | male |
| 4 | php0505 | 202 | 4 | 孫武 | male |
| 6 | php0202 | 302 | 4 | 孫武 | male |
| 1 | php0115 | 207 | 5 | 王八 | male |
| 2 | php0228 | 104 | 5 | 王八 | male |
| 3 | php0331 | 102 | 5 | 王八 | male |
| 4 | php0505 | 202 | 5 | 王八 | male |
| 6 | php0202 | 302 | 5 | 王八 | male |
+----+---------+------+----+-----------+--------+
25 rows in set (0.00 sec)
(3).左右連接查詢
概念:
左連接是以左表爲基準,從右表中查找匹配的行組合成一行,如果右表中沒有則返回null
右連接是以右表爲基準,從左表中查找匹配的行組合成一行,如果左表中沒有則返回null
通常左右連接可以互相轉換,爲了統一,建議使用左連接,即講右連接轉換爲左連接
syntax:
左連接:
select col1,col2,...from tb1 left join tb2 on tb1.colN = tb2.colN;
右連接:
select col1,col2,...from tb1 right join tb2 on tb1.colN = tb2.colN;
example:
左連接:
mysql> select * from join_class left join join_teacher on join_class.id = join_teacher.id;
+----+---------+------+------+-----------+--------+
| id | c_name | room | id | t_name | gender |
+----+---------+------+------+-----------+--------+
| 1 | php0115 | 207 | 1 | 韓信 | male |
| 2 | php0228 | 104 | 2 | 李白 | female |
| 3 | php0331 | 102 | 3 | 韓非子 | secret |
| 4 | php0505 | 202 | 4 | 孫武 | male |
| 6 | php0202 | 302 | NULL | NULL | NULL |
+----+---------+------+------+-----------+--------+
5 rows in set (0.00 sec)
右連接:
mysql> select * from join_class right join join_teacher on join_class.id = join_teacher.id;
+------+---------+------+----+-----------+--------+
| id | c_name | room | id | t_name | gender |
+------+---------+------+----+-----------+--------+
| 1 | php0115 | 207 | 1 | 韓信 | male |
| 2 | php0228 | 104 | 2 | 李白 | female |
| 3 | php0331 | 102 | 3 | 韓非子 | secret |
| 4 | php0505 | 202 | 4 | 孫武 | male |
| NULL | NULL | NULL | 5 | 王八 | male |
+------+---------+------+----+-----------+--------+
5 rows in set (0.00 sec)
mysql> select * from join_teacher left join join_class on join_class.id = join_teacher.id;
+----+-----------+--------+------+---------+------+
| id | t_name | gender | id | c_name | room |
+----+-----------+--------+------+---------+------+
| 1 | 韓信 | male | 1 | php0115 | 207 |
| 2 | 李白 | female | 2 | php0228 | 104 |
| 3 | 韓非子 | secret | 3 | php0331 | 102 |
| 4 | 孫武 | male | 4 | php0505 | 202 |
| 5 | 王八 | male | NULL | NULL | NULL |
+----+-----------+--------+------+---------+------+
5 rows in set (0.00 sec)
從上面的信息可見,左右連接是可以互換的,當然這裏的位置好像不一致,如果要一直,只要在select的時候指定列的順序即可。
(4).內外連接查詢
概念:
內連接既是兩張表的交集,必須在兩種表中都有匹配的內容才顯示,否則不顯示,即不會顯示爲null的值
外連接既是兩張表的並集,在mysql中沒有外連接語句,但是可以整合左右連接來達到實現外連接的效果
syntax:
內連接:
select * from tb1 inner join tb2 on tb1.colN = tb2.colN;
外連接:
轉換:(select * from tb1 left join tb2 on tb1.colN = tb2.colN) union (select * from tb1 right join tb2 on tb1.colN = tb2.colN);
example:
內連接:
mysql> select * from join_class inner join join_teacher on join_class.id = join_teacher.id;
+----+---------+------+----+-----------+--------+
| id | c_name | room | id | t_name | gender |
+----+---------+------+----+-----------+--------+
| 1 | php0115 | 207 | 1 | 韓信 | male |
| 2 | php0228 | 104 | 2 | 李白 | female |
| 3 | php0331 | 102 | 3 | 韓非子 | secret |
| 4 | php0505 | 202 | 4 | 孫武 | male |
+----+---------+------+----+-----------+--------+
外連接:
mysql> (select * from join_class left join join_teacher on join_class.id = join_teacher.id) union (select * from join_class right join join_teacher on join_class.id = join_teacher.id);
+------+---------+------+------+-----------+--------+
| id | c_name | room | id | t_name | gender |
+------+---------+------+------+-----------+--------+
| 1 | php0115 | 207 | 1 | 韓信 | male |
| 2 | php0228 | 104 | 2 | 李白 | female |
| 3 | php0331 | 102 | 3 | 韓非子 | secret |
| 4 | php0505 | 202 | 4 | 孫武 | male |
| 6 | php0202 | 302 | NULL | NULL | NULL |
| NULL | NULL | NULL | 5 | 王八 | male |
+------+---------+------+------+-----------+--------+
注:
a.如果內連接沒有使用條件,則等價於笛卡爾積;
b.所爲的外連接其實就是聯合查詢(union)
c.除了on條件外,還有where和using條件,但是通常建議使用on
on:表示數據連接條件,條件不滿足,連接都不形成,建議使用的方法
where:表示數據過濾條件,先形成笛卡爾積,然後在過濾出想要的數據
using:只適用於字段一樣的,並且會去掉結果中的重複字段,並放在列前。專門爲連接條件設置的條件
example: select * from join_class left join join_teacher using(id);
(5).自然連接
所謂自然連接,也即在不給定條件的情況下,也能自己進行判斷連接。相比內外左右連接而言,可以在不給定條件的情況下,系統自動使用相同的列字段名
進行連接。如果沒有相同的列字段名,則等價於笛卡爾積。
自然連接又分爲三種:自然內連接,自然左外連接,自然右外連接
syntax:
自然內連接:
select * from tb1 natural join tb2; == select * from tb1 inner join tb2 using(public_field);
自然左外連接:
select * from tb1 natural left join tb2; == select * from tb1 left join tb2 using(public_field);
自然右外連接:
select * from tb2 natural right join tb2; == select * from tb1 right join tb2 using(public_field);
show: 查看相關的信息
syntax:
SHOW AUTHORS : 查看MySQL數據的作者信息
SHOW {BINARY | MASTER} LOGS //查看binlog日誌信息
SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count] //查看binlog日誌內容
SHOW CHARACTER SET [like_or_where] //查看字符集信息
SHOW COLLATION [like_or_where] //查看校對規則信息
SHOW [FULL] COLUMNS FROM tbl_name [FROM db_name] [like_or_where] //查看錶的字段信息,等價於desc tb_name;
SHOW CONTRIBUTORS //查看貢獻者信息
SHOW CREATE DATABASE db_name //查看創建數據的代碼
SHOW CREATE EVENT event_name //查看創建事件的代碼
SHOW CREATE FUNCTION func_name //查看創建函數的代碼
SHOW CREATE PROCEDURE proc_name //查看創建存儲過程的代碼
SHOW CREATE TABLE tbl_name //查看創建表的代碼
SHOW CREATE TRIGGER trigger_name //查看創建觸發器的代碼
SHOW CREATE VIEW view_name //查看創建視圖的代碼
SHOW DATABASES [like_or_where] //查看數據的信息
SHOW ENGINE engine_name {STATUS | MUTEX} //查看特定存儲引擎的狀態信息
SHOW [STORAGE] ENGINES //查看系統中支持的存儲引擎信息
SHOW ERRORS [LIMIT [offset,] row_count] //查看當前會話所發生的錯誤信息
SHOW EVENTS //查看事件信息
SHOW FUNCTION CODE func_name //查看特定函數的代碼信息,但是目前似乎廢棄無效
SHOW FUNCTION STATUS [like_or_where] //查看函數的狀態信息
SHOW GRANTS FOR user //查看特定用戶的權限信息
SHOW INDEX FROM tbl_name [FROM db_name] //查看錶的索引信息
SHOW MASTER STATUS //查看當前binlog的pos信息等,用在主從的情況下
SHOW OPEN TABLES [FROM db_name] [like_or_where] //查看當前打開的表的信息
SHOW PLUGINS //查看支持的插件信息
SHOW PROCEDURE CODE proc_name //查看特定存儲過程的信息
SHOW PROCEDURE STATUS [like_or_where] //查看存儲過程的狀態信息
SHOW PRIVILEGES //查看數據庫支持的所有權限控制信息
SHOW [FULL] PROCESSLIST //查看當前打開的連接線程信息
SHOW PROFILE [types] [FOR QUERY n] [OFFSET n] [LIMIT n] //查看profile的信息
SHOW PROFILES //分析mysql的性能
SHOW SLAVE HOSTS //查看當前的從服務器
SHOW SLAVE STATUS //查看從服務器的主從狀態信息
SHOW [GLOBAL | SESSION] STATUS [like_or_where] //查看全局或者會話的狀態變量信息
SHOW TABLE STATUS [FROM db_name] [like_or_where] //查看錶的狀態信息
SHOW [FULL] TABLES [FROM db_name] [like_or_where] //查看所有的表
SHOW TRIGGERS [FROM db_name] [like_or_where] //查看觸發器的信息
SHOW [GLOBAL | SESSION] VARIABLES [like_or_where] //查看全局後者會話的變量信息
SHOW WARNINGS [LIMIT [offset,] row_count] //查看警告信息
like_or_where:
LIKE 'pattern'
| WHERE expr
13.數值類型
在MySQL中數值類型其實就是編程語言中所說的變量類型,但是不同的體系結構下有點區別而已。在MySQL中數值類型其實是一種域約束,或者說是字段值的約
束,其規定了該字段能夠存儲那些類型的數據以及其長度大小等。
MySQL中常見的數值類型:
整數型:
tinyint(num):最小整數型,1個字節,無符號範圍爲0-256,有符號範圍是-128-127 默認是有符號的,通常用在年齡這些範圍不大的情況下
smallint(num):2byte,無符號範圍0-65536,有符號範圍-32768-32767
mediumint(num):3byte
int(num):4byte
bigint(num):8byte
注:這裏的num表示的是允許顯示的數字個數,而不是代表的字節數
浮點型:
float(M,D):單精度浮點數,4個字節,可以提供7位有效數字
double(M,D):雙精度浮點數,8個字節,可以提供16位有效數字
注:M表示的數值總位數,不包括小數點;D表示的是小數點的個數
decimal:定點小數類型
decimal(M,D): M表示的總長度,不包括小數點,D表示的是小數的個數
注:看起來decimal好像和浮點類型是一樣的,但是其並不屬於浮點類型,也沒有明確的表明其屬於那種類型,這裏我表示的是定點小數類型,意思是該類型的數
據必須保證有D位小數,也就是說即使你存入的是個整數,但是會自動以0填充加上小數位,讀取時自然是帶小數位。而浮點型就不同了,加入你存入的是整數,則
會按照整數類型存入,沒有任何小數位,這在對小數爲要求高的地方就容易出問題了。
example:
decimal(10,2)---->存入10時---->10.00
float(10,2)----->存入10時----->10
字符型:
char(M):定長字符型,不區分大小
binary(M):二進制定長字符型,區分大小寫
varchar(M):不定長字符型,不區分大小寫
varbinary(M):二進制不定長字符型,區分大小寫
text: 文本類型,通常用在大段文本內容的地方
logtext: 長文本類型
注:M表示的是字符長度
常見字符型需要空間大小以及最大長度
type sotrage required max length
char(M) M characters 255
varchar(M) L characters plus 1 or 2bytes 65535
tinytext L character+1byte 255
text L character+2byte 65535
mediumtext L character+3byte 16777215
longtext l character+4bytes 4294967295
binary 0-255
varbinary 0 - 65535
blob:二進制大對象字符類型
tinyblob:最大255個字節 1 byte overhead
blob:最大64kb,2 bytes overhead
mediumblob--up to 16Mb 3 bytes overhead
longblob---up to 4Gb 4 bytes overhead
日期時間型:
日期時間相關的數值類型有如下幾種:
date '1000-01-01' to '9999-12-31' 3bytes
time '-838:59:59' to '838:59:58' 3 bytes
datetime :date 和time的組合 8 bytes
year 00 to 99 1bytes
year(4) 1901 to 2155 1 bytes
timestamp '1970-01-01 00:00:00' to '2038-01-18 22:14:07' 4 bytes
枚舉型:enum 用於單項選擇,2個字節
example:
create table tb_enum (
a enum ('female','male')
);
枚舉的特點:
1)從數據的角度限制可能的選項
2)枚舉看起來是字符類型,其實存儲的是整型
3)枚舉最多允許65535個枚舉
集合型:set 用戶多項選擇,最多可以佔8個字節,最多64個選項
example:
create table s_9(
hobby set('basket','football','pingpang')
);
用戶在選擇的時候可以選擇多個
14.MySQL存儲引擎
存儲引擎在數據庫系統中是非常重要的組成部分,其負責數據庫系統中數據的展示和存儲方式的轉換。不同的存儲引擎其所能支持的功能也是有所不同的,在
MySQL中支持的存儲引擎有:MyISAM,InnoDB,MEMORY等,至於其它所有支持的存儲引擎可以使用show engines來查看。
在平時的生產環境中,常見以及經常使用的存儲引擎則是:MyISAM 和 InnoDB。對於這兩種引擎比較大致有幾點主要的區別:
myisam innodb
批量插入速度 高 低
事務安全 支持
全文索引 支持 5.5以後支持
鎖機制 表鎖 行鎖(併發性好)
存儲限制 無限制 64TB
B數索引 支持 支持
哈希索引 支持
集羣索引 支持
數據緩存 支持
索引緩存 支持
數據可壓縮 可壓縮 不支持
空間使用 低 高
內存使用 低 高
外鍵支持 否 支持
因此從上面的比較來看,通常業界的普遍的選擇標準是,如果不需要事務的功能,不是頻繁的寫入,則選項MyISAM引擎,而如果需要事務的功能,寫操作頻繁
則選擇InnoDB引擎
15.sql 模型
sql mode指的是數據庫中sql語句需要遵從的規則法則或者說是某些限制,不要跟數據模型搞混淆。
sql mode definitions:
1).ANSI QUOTES:
該模型下,雙引號的含義和反引號的含義是一樣的,只能用來引用庫名,表
名和字段名,而其它任何字符串只能使用單引號來引用。
2).IGNORE_SPACE:
該模型下,在內建函數中會忽略多餘的空白字符,否則可能會出錯
3).STRICT_ALL_TABLES
該模型下,在插入表時,任何非法的數值都是被拒絕的
4).STRICT_TRANS_TABLES:
該模型下,任何支持事務表中的插入非法數值的時候是不允許的,並拋出錯
誤。
5).TRADITIONAL
該模式下,語法和行爲期望滿足傳統的風格
6).NO_ENGINE_SUBSTITUTION
該模式下,如果需要的存儲引擎被禁用或者未編譯,可以防止自動替換存儲
引擎。
注:在mysql5.6之前,sql_mode爲空,在5.6之後,sql_mode 默認爲STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
16.開發中列的常用屬性
列的常見屬性有:
auto_increment //設置自動增長
not null or null //設置值可以爲null 還是不允許爲null,默認情況下是允許爲null的
default value //設置字段的默認值,只有在字段爲空的時候才設置默認值,注意null值並不等價於空,即null值也是有值的
primary key //設置字段是否爲主鍵
comment //設置字段的註釋,特別有用
主鍵的注意點:
可以唯一標識某條記錄的字段或者是字段的集合就是主鍵
每一個記錄必須要有一個主鍵,主鍵必須唯一
主鍵一般來說不屬於任何實體的真實屬性,但是可以是真實屬性不過不建議使用真實屬性
建議主鍵不與業務邏輯發生關係,只用於標誌記錄
主鍵不能爲null,當一個字段爲主鍵的時候,會自動設置爲不能爲空
主鍵可以是負值或者爲0,只要唯一即可。
主鍵的查找速度特別快,通過主鍵來鎖定數據
主鍵可以保證當前字段數據的唯一性
auto_increment: 對於自動增長通常有兩個問題需要解決:
1).清空了一個表的內容後,怎麼樣使得自動增長從1開始;
方法一:使用truncate 來情況表的內容,此方法會一併初始化auto_increment計數器
方法二: 修改表的auto_increment的值從1開始
alter table tb_name auto_increment=1;
2).一個表的內容刪除了一部分之後,需要自動增長的值按順序執行
此時的方法只有一個,修改自動增長的值
alter table tb_name auto_increment=num;
17.外鍵約束
概念:
外鍵約束也是字段屬性的一種,通常是用來關聯兩張表即兩個實體,用一個實體去約束另一個實體的行爲;
外鍵約束的存在是爲了業務邏輯數據的完整性,以便更加的符合實際情況,比如當一個班級表中不存在的班級,則不允許在學生表中插入屬於該不能存在班
級的學生;
外鍵約束通常有兩張表,一張表稱爲主表,被指向的表,一張表是從表,負責指向主表主鍵的表。注意,外鍵約束從表中的字段只能指向主表中的主鍵字段
外鍵約束的默認行爲:
主表更新時,從表不做任何限制;
主表刪除時,必須保證從表關聯的數據已經刪除,否則不允許刪除;
從表更新時,如果關聯的外鍵在主表中不存在,則不允許更新;
從表刪除時,主表不做任何限制
外鍵約束允許的級聯動作:
cascade關聯操作:如果主表被執行刪除或更新,則從表也會執行相應的操作
set null:設置爲null,表示從表外鍵不指向任何主表記錄,設置外鍵值爲null
restrict:拒絕主表的相關操作,該值爲默認的操作,查看錶語法時不會顯示,但是效果會達到。
創建外鍵的方式:
1).create table時創建
create table tb_name( col1_name type_define,col2_name,type_define,...,foreign key (col_name) references master_tb_name (col_name));
2).alter 創建
alter table tb_name add foreign key (col_name) reference master_tb_name (col_name);
ok,over!