<b></b>
** 以下提到oracle部分隻是對比<b>擴充</b><b>,本文重點是 《mysql 深入淺出》書中1-17章節 個人覺得需要提筆一記的知識點整理。</b>
<b>** 該書講解 version() ==>’5.0.18-nt‘ ,</b><b>預設引擎 : myisam</b>
1、擷取建表語句
mysql --> show create table emp \g;
oracle --> select dbms_metadata.get_ddl ('table', '表名',user ) from dual;
2、一條insert 多行value值
mysql --> insert into table(id,name) values (1,'a'),(2,'b'),(3,'c');
oracle --> insert into table(id,name) select 1,'a' from dual union all select 2,'b' from dual union all select 3,'c' from dual ; 或者寫多條insert語句;
3、限制/範圍 行數
mysql --> limit [offset_start,row_count] offset_start 表示記錄的起始偏移量{預設0},row_count 表示顯示的行數
4、更改表字段和表名字:
改字段名:
oracle:alter table emp rename column age to age1;
mysql :alter table emp change age age1 int (4) ;
oracle、mysql modify 都不能需要字段名稱。
改表名字:oracle 和mysql 都是用rename emp to emp1或者 alter table emp rename to emp1 實作.
5、執行sql/存儲 有警告/報錯時 檢視warning/error 詳細資訊
mysql --> show warnings;
oracle --> "sql>show errors" 、 os層$ oerr ora 00922
6、表結構設定 id int(5) zerofill 屬性, 再insert 1111111位數為 7 不會報錯,因為zerofill後,寬度格式限制失效,且也不會有填充0部分.
7、字段雷系timestamp(tm ),增加時,系統會自動給第一個timestamp字段 授予預設值 current_timestamp(系統日期),且可以直接寫定制19700101080001數字形式 ....
8、now()函數 代表目前日期
9、year 年份部分 00 "到"69" 範圍的值被轉換為 2000~2069 範圍的 year 值 、"70" 到“99”範圍的值被轉換為 1970~1999 範圍的 year 值
10、<b>mysql 3中注釋符</b>
1)#内容
2)/*内容*/;
3)-- 内容 (提示--後要有空格)
11、 <b>mysql 通過指令直接執行語句</b>
[root@lottery ~]# mysql -uroot -p11 -n -e "use diamond; show tables;"
+-------------+
| config_info |
[root@lottery ~]#
-e 後面跟上要執行的 sql語句
-n 參數是不顯示表頭
25章有詳細介紹。
<b>--------------------------------------------------------------以上為小知識點,小筆記------------------------------------------------------------------------------------------------------ </b>
一、
<b>mysql 中的字元類型</b><b> </b>
字元串類型
描述及存儲需求
char ( m)
m 為 0 ~ 255 之間的整數
varchar ( m)
m 為 0 ~ 65535 之間的整數,值的長度 +1 個位元組
tinyblob
允許長度 0 ~255 位元組,值的長度 +1 個位元組
blob
允許長度 0 ~65535 位元組,值的長度 +2 個位元組
mediumblob
允許長度 0 ~167772150 位元組,值的長度 +3 個位元組
longblob
允許長度 0 ~4294967295 位元組,值的長度 +4 個位元組
tinytext
允許長度 0 ~255 位元組,值的長度 +2 個位元組
text
mediumtext
longtext
varbinary(m)
允許長度 0 ~m 個位元組的變長位元組字元串,值的長度 +1 個位元組
binary ( m)
允許長度 0 ~m 個位元組的定長位元組字元串
<b>char 和varchar 類型 </b>
char(2)
insert '1' oracle資料庫 length=2,mysql資料庫 length=1,
insert '1空格' oracle length=2,mysql=1
varchar(2)
insert '1' oracle length=1,mysql=1 ,
insert '1空格' oracle length=2,mysql=2
<b>二、</b>
<b>第四章 、mysql 中的運算符</b>
<b>算術運算符</b>
<b>運算符 </b>
<b>作用 </b>
+
加法
-
減法
*
乘法
/,div
除法,傳回商
%,mod
除法,傳回餘數
<b>mysql 支援的比較運算符 </b>
=
等于
<>或!=
不等于
<=>
null 安全的等于(null-safe)
<
小于
<=
小于等于
>
大于
>=
大于等于
between
存在與指定範圍
in
存在于指定集合
is null
為 null
is not null
不為 null
like
通配符比對
regexp 或 rlike
正規表達式比對
<b>mysql 中的邏輯運算符 </b>
not 或!
邏輯非
and 或&&
邏輯與
or 或 ||
邏輯或
xor
邏輯異或
<b>mysql 支援的位運算符 </b>
<b>作用</b>
&
位與(位 and)
|
位或 (位 or )
^
位異或(位 xor)
~
位取反
>>
位右移
<<
位左移
<b>mysql 中的運算符優先級 </b>
<b>優先級順序</b>
:=
1
||, or, xor
2
&&, and
3
not
4
between, case, when, then, else
5
=, <=>, >=, >, <=, <, <>, !=, is, like, regexp, in
6
7
8
<<, >>
9
-, +
10
*, /, div, %, mod
11
12
- (一進制減号), ~ (一進制比特反轉)
13
!
14
*** 實際上,我們都是用 “()” 來将需要優先的操作括起來,既起到優先作用也友善看.
<b>三、 </b>
<b>第五章 、mysql常用函數</b>
<b>mysql 中的常用字元串函數 </b>
<b>函數 </b>
<b>功能 </b>
cancat(s1,s2,…sn)
連接配接 s1,s2,…sn 為一個字元串
insert(str,x,y,instr)
将字元串 str 從第 x 位置開始,y 個字元長的子串替換為字元串 instr
lower(str)
将字元串 str 中所有字元變為小寫
upper(str)
将字元串 str 中所有字元變為大寫
left(str ,x)
傳回字元串 str 最左邊的 x 個字元
right(str,x)
傳回字元串 str 最右邊的 x 個字元
lpad(str,n ,pad)
用字元串 pad 對 str 最左邊進行填充,直到長度為 n 個字元長度
rpad(str,n,pad)
用字元串 pad 對 str 最右邊進行填充,直到長度為 n 個字元長度
ltrim(str)
去掉字元串 str 左側的空格
rtrim(str)
去掉字元串 str 行尾的空格
repeat(str,x)
傳回 str 重複 x 次的結果
replace(str,a,b)
用字元串 b 替換字元串 str 中所有出現的字元串 a
strcmp(s1,s2)
比較字元串 s1 和 s2
trim(str)
去掉字元串行尾和行頭的空格
substring(str,x,y)
傳回從字元串 str x 位置起 y 個字元長度的字串
<b>mysql 中的常用數值函數 </b>
abs(x)
傳回 x 的絕對值
ceil(x)
傳回大于x的最大整數值
floor(x)
傳回小于 x 的最大整數值
mod(x,y)
傳回 x/y 的模
rand()
傳回 0 到 1 内的随機值
round(x,y)
傳回參數 x 的四舍五入的有 y 位小數的值
truncate(x,y)
傳回數字 x 截斷為 y 位小數的結果
<b>mysql 中的常用日期時間函數 </b>
curdate()
傳回目前日期
curtime()
傳回目前時間
now()
傳回目前的日期和時間
unix_timestamp(date)
傳回日期 date 的 unix 時間戳
from_unixtime
傳回 unix 時間戳的日期值
week(date)
傳回日期 date 為一年中的第幾周
year(date)
傳回日期 date 的年份
hour(time)
傳回 time 的小時值
minute(time)
傳回 time 的分鐘值
monthname(date)
傳回 date 的月份名
date_format(date,fmt)
傳回按字元串 fmt 格式化日期 date 值
date_add(date,interval expr type)
傳回一個日期或時間值加上一個時間間隔的時間值
datediff(expr,expr2)
傳回起始時間 expr 和結束時間 expr2 之間的天數
<b>mysql 中的日期時間格式 </b>
<b>格式符 </b>
<b>格式說明 </b>
%s,%s
兩位數字形式的秒(00,01,...,59)
%i
兩位數字形式的分(00,01,...,59)
%h
兩位數字形式的小時,24 小時(00,01,...,23)
%h,%i
兩位數字形式的小時,12 小時(01,02,...,12)
%k
數字形式的小時,24 小時(0,1,...,23)
%l
數字形式的小時,12 小時(1,2,...,12)
%t
24 小時的時間形式(hh:mm:ss)
%r
12 小時的時間形式(hh:mm:ssam 或 hh:mm:sspm)
%p
am 或 pm
%w
一周中每一天的名稱(sunday,monday,...,saturday)
%a
一周中每一天名稱的縮寫(sun,mon,...,sat)
%d
兩位數字表示月中的天數(00,01,...,31)
%e
數字形式表示月中的天數(1,2,...,31)
%d
英文字尾表示月中的天數(1st,2nd,3rd,...)
%w
以數字形式表示周中的天數(0=sunday,1=monday,...,6=saturday)
%j
以3位數字表示年中的天數(001,002,...,366)
%u
周(0,1,52),其中 sunday 為周中的第一天
周(0,1,52),其中 monday 為周中的第一天
%m
月名(january,february,...,december)
%b
縮寫的月名(january,february,...,december)
%m
兩位數字表示的月份(01,02,...,12)
%c
數字表示的月份(1,2,...,12)
%y
4位數字表示的年份
兩位數字表示的年份
%%
直接值“%”
<b>mysql 中的日期間隔類型 </b>
<b>表達式類型 </b>
<b>描述 </b>
<b>格式 </b>
hour
小時
hh
minute
分
mm
second
秒
ss
year
年
yy
month
月
day
日
dd
year_month
年和月
yy-mm
day_hour
日和小時
dd hh
day_minute
日和分鐘
dd hh:mm
day_ second
日和秒
dd hh:mm:ss
hour_minute
小時和分
hh:mm
hour_second
小時和秒
hh:ss
minute_second
分鐘和秒
mm:ss
<b>mysql 中的流程函數 </b>
<b>功能</b>
if(value,t f)
如果 value 是真,傳回 t;否則傳回 f
ifnull(value1,value2)
如果 value1 不為空傳回 value1,否則傳回 value2
case when [value1]
如果 value1 是真,傳回 result1,否則傳回 default
then[result1]…else[default]end
case [expr] when [value1]
如果 expr 等于 value1,傳回 result1,否則傳回 default
<b>mysql 中的其他常用函數 </b>
<b>函數</b>
database()
傳回目前資料庫名
version()
傳回目前資料庫版本
user()
傳回目前登入使用者名
inet_aton(ip)
傳回 ip 位址的數字表示
inet_ntoa(num)
傳回數字代表的 ip 位址
password(str)
傳回字元串 str 的加密版本
md5()
傳回字元串 str 的 md5 值
<b>第17章 正規表達式中的模式 </b>
<b>** 和上文函數可一起使用特此一起記錄</b>
<b>序列 </b>
<b>序列說明</b>
在字元串的開始處進行比對
$
在字元串的末尾處進行比對
.
比對任意單個字元,包括換行符
[…]
比對出括号内的任意字元
[^…]
比對不出括号内的任意字元
a*
比對零個或多個 a(包括空串)
a+
比對 1 個或多個 a(不包括空串)
a?
比對 1 個或零個 a
a1|a2
比對 a1 或 a2
a(m)
比對 m 個 a
a(m,)
比對 m 個或更多個 a
a(m,n)
比對 m 到 n 個 a
a(,n)
比對 0 到 n 個 a
(…..)
将模式元素組成單一進制素
<b>四、</b>
<b>第6章 圖形化工具的使用 </b>
<b>提供的功能包括 啟動關閉資料庫、連接配接管理、健康檢查、備份管理、catalogs 管理、使用者管理、參數配置、資料庫對象管理、備份恢複管理等</b>
1)連接配接管理:檢視目前活躍的資料庫連接配接, 與 show processlist 指令的執行結果相同
2)健康檢查 :資料庫連接配接的變化情況、sql 查詢執行的數量、緩沖區的命中率等
3)備份管理
備份執行方法的選項進行說明。
? innodb online backup:為了確定 innodb 表備份結果的資料的一緻性,會在備份開始的時候啟動一個事務,推薦隻在備份 innodb 類型的表時使用。
? lock all tables:為了確定 myisam 表備份結果的資料的一緻性,會在備份開始時對本次要備份的表執行 lock 操作,防止新的資料寫入。這樣在備份期間會阻塞表的更新,對于更新密集型的應用要謹慎選擇使用這個選項。
? online with binlog pos:除了實作和 innodb online backup 相同的功能外,還記錄了目前 binlog 的位置,便于恢複時知道需要恢複的 binlog 的起點。
? normal backup:隻在備份每個表的時候才鎖定該表,這種情況下對應用的影響是最小的,但是相應的這種備份方法生成的備份結果中,表間的資料一緻性是最沒有保障的,選擇這種備份方式前要考慮到這個問題,通過選擇合适的時間執行備份操作來減小備份資料不一緻的風險。
? complete backup:標明資料庫的全備份,而忽視前面選擇的表的清單。這種方式對于資料庫中的表定期增加的情況非常有用,省去每次修改備份清單的工作
注意:控制台的備份管理提供的選項比指令行少很多,例如不能指定導出字元集,不能指定導出記錄的 where 條件,也不能按照指定的分隔符和換行符導出資料成文本檔案。是以如果使用者需要更進階的資料備份功能,還是要熟練掌握 mysqldump 的各個指令行參數
4)catalogs
控制台提供的管理表、索引、視圖和過程的工具。可以用來查詢和修改已有的資料庫對象或者建立新的資料庫對象,取決于連接配接的使用者所擁有的權限。=> 類似show table status 指令行顯示 , show table status 類似oracle的user_tables 裡的(rows,data_length,max_data_length,comment等)
注意:對分區的支援還不是很好,建立/修改分區表,都沒有可以指定分區特性的地方,是以如果你需要建立和維護分區表,那麼暫時還隻能通過指令行來建立。
5)mysql query brower 提供的工具包括資料的查詢、更新和 sql 的優化分析,雖然對于 mysql query brower 提供的大多數功能,用字元界面的 mysql 用戶端都可以實作,但是相比之下, query brower 傳回的結果更直覺,在查詢的列非常多的時候不會因為内容換行而使結果看起來很讓人困惑。此外,對于查詢的傳回結果,可以選擇導出成 xml、html、excel、cvs 等多種格式,相比指令行的方式更靈活和友善。
6)phpmyadmin(簡稱 pma)
一個用 php 編寫的、可以通過 web 控制和操作 mysql 資料庫的工具,功能非常全面,包括資料庫管理、資料對象管理、使用者管理、資料導入導出、資料庫管理、資料管理等
五、
<b>第7章 表類型(存儲引擎)的選擇 </b>
1) mysql 5.0 支援的存儲引擎包括 myisam/innodb/bdb/memory/merge/example/ndb/cluster/
archive/csv/blackhole/federated 等,其中 innodb 和 bdb 提供事務安全表,其他存儲引擎都是非事務安全表。
<b>2) 檢視mysql目前預設的存儲引擎</b><b>:</b>
show variables like '%storage_engine%';
<b>3) 查詢目前資料庫支援的存儲引擎的2種方式。</b>
mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| engine | support | comment | transactions | xa | savepoints |
| performance_schema | yes | performance schema | no | no | no |
| csv | yes | csv storage engine | no | no | no |
| mrg_myisam | yes | collection of identical myisam tables | no | no | no |
| blackhole | yes | /dev/null storage engine (anything you write to it disappears) | no | no | no |
| myisam | yes | myisam storage engine | no | no | no |
| memory | yes | hash based, stored in memory, useful for temporary tables | no | no | no |
| archive | yes | archive storage engine | no | no | no |
| innodb | default | supports transactions, row-level locking, and foreign keys | yes | yes | yes |
| federated | no | federated mysql storage engine | null | null | null |
mysql>
2. show variables like 'have%';
<b>4) 更改表的存儲引擎:</b>
alter table table_name engine = innodb;
<b>5) 常用存儲引擎的對比 </b>
<b>特點 </b>
<b>myisam</b>
<b> innodb </b>
<b>memory </b>
<b>merge </b>
<b>ndb</b>
存儲限制
有
64tb
沒有
事務安全
支援
鎖機制
表鎖
行鎖
b 樹索引
哈希索引
全文索引
叢集索引
資料緩存
索引緩存
資料可壓縮
空間使用
低
高
n/a
記憶體使用
中等
批量插入的速度
支援外鍵
<b>mysql</b> <b>非自動送出設定注意事項 (mysql預設是自動送出,根據業務去更改)</b>
若表引擎不是innodb,即使設定=0 ,每執行也都會自動送出;
若innodb引擎,set auto_commit =1就會自動送出,=0就要手動commit;
<b>innodb 表的自動增長列 (關鍵字autoincre_demo)</b>
insert 自動增長列 可以按照自動增長屬性 insert資料 每行+1,也可以手動寫定值,但當定值為 null或者0時,會按照自動增加列的max(id)+1增長.定值部分還是會正常insert.;
例如:若max(id)=300, 執行insert .. values(103,'1'),(0,'2'),(null,'3'); 對應insert成的資料為: (103,'1'),(301,'2'),(302,'3');
通過alter table *** auto_increment = n; 語句強制設定自動增長列的初識值,預設從 1 開始,
但是該強制的預設值是保留在記憶體中的,如果該值在使用之前資料庫重新啟動,那麼這個強制的預設值就會丢失,就需要在資料庫啟動以後重新設定。
可以使用select last_insert_id()查詢目前線程最後插入記錄使用的值。如果一次插入了多條記錄,那麼傳回的是第一條記錄使用的自動增長值。下面的例子示範了使用 last_insert_id() 的情況:
<b>memory</b> <b>存儲引擎</b>
使用存在記憶體中的内容來建立表。每個 memory 表隻實際對應一個磁盤檔案,格式是.frm。memory 類型的表通路非常得快,因為它的資料是放在記憶體中的,并且預設使用 hash 索引,但是一旦服務關閉,表中的資料就會丢失掉。給 memory 表建立索引的時候,可以指定使用 hash 索引還是 btree 索引:create index 索引名 using hash/btree on 表(列) ;
每個 memory 表中可以放置的資料量的大小,受到 max_heap_table_size 系統變量的限制,這個系統變量的初始值是 16mb,可以按照需要加大。此外,在定義 memory 表的時候,可以通過 max_rows 子句指定表的最大行數。
<b>下面是常用存儲引擎的适用環境。</b>
<b>** </b>myisam :預設的 mysql 插件式存儲引擎。如果應用是以讀操作和插入操作為主,隻有很少的更新和删除操作,并且對事務的完整性、并發性要求不是很高,那麼選擇這個存儲引擎是非常适合的。 myisam 是在 web 、資料倉儲和其他應用環境下最常使用的存儲引擎之一。
<b>** </b>innodb :用于事務處理應用程式,支援外鍵。如果應用對事務的完整性有比較高的要求,在并發條件下要求資料的一緻性,資料操作除了插入和查詢以外,還包括很多的更新、删除操作,那麼 innodb 存儲引擎應該是比較合适的選擇。innodb 存儲引擎除了有效地降低由于删除和更新導緻的鎖定,還可以確定事務的完整送出( commit)和復原(rollback),對于類似計費系統或者财務系統等對資料準确性要求比較高的系統, innodb 都是合适的選擇。
<b>** </b>memory :将所有資料儲存在 ram 中,在需要快速定位記錄和其他類似資料的環境下,可提供極快的通路。 memory 的缺陷是對表的大小有限制,太大的表無法 cache 在記憶體中,其次是要確定表的資料可以恢複,資料庫異常終止後表中的資料是可以恢複的。memory 表通常用于更新不太頻繁的小表,用以快速得到通路結果。
<b>** </b>merge :用于将一系列等同的 myisam 表以邏輯方式組合在一起,并作為一個對象引用它們。 merge 表的優點在于可以突破對單個 myisam 表大小的限制,并且通過将不同的表分布在多個磁盤上,可以有效地改善 merge表的通路效率。這對于諸如資料倉儲等 vldb 環境十分适合。
注意:以上隻是我們按照實施經驗提出的關于存儲引擎選擇的一些建議,但是不同應用的特點是千差萬别的,選擇使用哪種存儲引擎才是最佳方案也不是絕對的,這需要根據使用者各自的應用進行測試,進而得到最适合自己的結果。
<b>六、</b>
<b>第8章 選擇合适的資料類型</b>
<b>char 和 varchar </b>
char 和 varchar 類型類似,都用來存儲字元串,但它們儲存和檢索的方式不同。char 屬于固定長度的字元類型,而 varchar 屬于可變長度的字元類型。
<b>char 和 varchar 對比</b>
值
char(4)
存儲需求
varchar(4)
''
' '
4 個位元組
1 個位元組
'ab'
'ab '
'ab '
3 個位元組
'abcd'
5 個位元組
'abcdefgh'
簡單概括 不同的存儲引擎對 char 和 varchar 的使用原則有所不同 。
myisam 存儲引擎:建議使用固定長度的資料列代替可變長度的資料列。
memory 存儲引擎:目前都使用固定長度的資料行存儲,是以無論使用 char 或 varchar 列都沒有關系。兩者都是作為 char 類型處理。
innodb 存儲引擎:建議使用 varchar 類型。對于 innodb 資料表,内部的行存儲格式沒有區分固定長度和可變長度列(所有資料行都使用指向資料列值的頭指針),是以在本質上,使用固定長度的 char 列不一定比使用可變長度 varchar 列性能要好。因而,主要的性能因素是資料行使用的存儲總量。由于 char 平均占用的空間多于 varchar,是以使用 varchar 來最小化需要處理的資料行的存儲總量和磁盤 i/o 是比較好的。
<b>text 與 blob</b>
text 或者 blob用來儲存較大文本;
二者間主要差别是:
blob 能用來儲存二進制資料,比如照片;
而 text 隻能儲存字元資料,比如一篇文章或者日記。
text 和 blob 中有分别包括 text、mediumtext、longtext 和 blob、mediumblob、longblob3 種不同的類型;
它們之間的主要差別是存儲文本長度不同和存儲位元組不同,使用者應該根據實際情況選擇能夠滿足需求的最小存儲類型。
blob 和 text 值會引起一些性能問題,特别是在執行了大量的删除操作時。
删除操作會在資料表中留下很大的“空洞”,以後填入這些“空洞”的記錄在插入的性能上會有影響。為了提高性能,建議定期使用 optimize table 功能對這類表進行碎片整理,避免因為“空洞”導緻性能問題。
<b> </b>注釋:optimize table會産生鎖表, mysql 空洞類似oracle 高水位,oracle 通過move 等形式解決<b> </b>
浮點數與定點數
float、double(或 real)表示浮點數。
decimal(或 numberic)表示定點數
注意:在今後關于浮點數和定點數的應用中,使用者要考慮到以下幾個原則:
浮點數存在誤差問題;
對貨币等對精度敏感的資料,應該用定點數表示或存儲;
在程式設計中,如果用到浮點數,要特别注意誤差問題,并盡量避免做浮點數比較;
要注意浮點數中一些特殊值的處理。
<b>七、</b>
<b>第9章 字元集</b>
<b>常用字元集比較 </b>
<b>字元集 </b>
<b>是否定長 </b>
<b>編碼方式 </b>
<b>其他說明 </b>
acsii
是
單位元組 7 位編碼
最早的奠基性字元集
iso-8859-1/latin1
單位元組 8 位編碼
西歐字元集,經常被一些程式員用來轉碼
gb2312-80
雙位元組編碼
早期标準,不推薦再使用
gbk
雖然不是國标,但支援的系統不少
gb18030
否
2 位元組或 4 位元組編碼
開始有一些支援,但資料庫支援的還少見
utf-32
4 位元組編碼
ucs-4 原始編碼,目前很少采用
ucs-2
2 位元組編碼
windows 2000 内部用 ucs-2
utf-16
java 和 windows xp/nt 等内部使用 utf-16
utf-8
1 至 4 位元組編碼
網際網路和unix/linux廣泛支援的unicode字元集
mysqlserver 也使用 utf-8
<b>查詢目前伺服器的字元集和校對規則:</b>
show variables like 'character_set_server';
<b>設定/更換字元集 :</b>
1/ my.cnf中設定:
[mysqld] default-character-set=gbk
2/ 啟動選項中指定:
mysqld --default-character-set=gbk
3/ 在編譯的時候指定:
./configure --with-charset=gbk
參數:character_set_client、 character_set_connection 和 character_set_results,分别代表用戶端、連接配接和傳回結果的字元集
<b>八、</b>
<b>btree 索引與 hash 索引</b>
兩種不同類型的索引各有其不同的适用範圍。hash 索引有一些重要的特征需要在使用的時候特别注意,如下所示。
隻用于使用=或<=>操作符的等式比較。
優化器不能使用 hash 索引來加速 order by 操作。
mysql 不能确定在兩個值之間大約有多少行。如果将一個 myisam 表改為 hash 索引的 memory 表,會影響一些查詢的執行效率。
隻能使用整個關鍵字來搜尋一行。
而對于 btree 索引,當使用>、<、>=、<=、between、!=或者<>,或者 like 'pattern'(其中'pattern'不以通配符開始)操作符時,都可以使用相關列上的索引。
例子:
下列範圍查詢适用于 btree 索引和 hash 索引:
select * from t1 where key_col = 1 or key_col in (15,18,20);
下列範圍查詢隻适用于 btree 索引:
select * from t1 where key_col > 1 and key_col < 10;
select * from t1 where key_col like 'ab%' or key_col between 'lisa' and 'simon';
<b>view </b>
使用 create or replace 或者 alter 修改視圖
顯示使用者下多少view :show tables;
檢視視圖狀态 : show table status like 'staff_list' ;
檢視視圖建立語句: show create view staff_list;
檢視存儲狀态: show procedure status like 'film_in_stock';
檢視存儲建立語句: show create {procedure | function} sp_name ;
通過檢視 information_schema. routines 了解存儲過程和 函數的詳細資訊:
select * from routines where routine_name = 'film_in_stock';
*** 怎麼寫存儲/函數 一些文法等,文法太多,在此不做說明,若有需要請自己查找相關資料
<b>九、</b>
<b>第14章 事務控制和鎖定語句 </b>
<b>lock table 和 unlock table</b>
lock tables 可以鎖定用于目前線程的表。如果表被其他線程鎖定,則目前線程會等待,直到可以擷取所有鎖定為止。
unlock tables 可以釋放目前線程獲得的任何鎖定。目前線程執行另一個 lock tables 時,或當與伺服器的連接配接被關閉時,所有由目前線程鎖定的表被隐含地解鎖
<b>一個獲得表鎖和釋放表鎖的簡單例子 </b>
session_1
session_2
獲得表film_text的read鎖定
mysql> lock table film_text read;
query ok, 0 rows affected (0.00 sec)
目前session可以查詢該表記錄
mysql> select film_id,title from film_text where film_id = 1001;
+---------+------------------+
| film_id | title |
| 1001 | academy dinosaur |
1 row in set (0.00 sec)
其他session也可以查詢該表的記錄
其他 session 更新鎖定表會等待獲得鎖:
mysql> update film_text set title = 'test' where film_id =
1001;
等待
釋放鎖
mysql> unlock tables;
query ok, 0 rows affected (0.00 sec)
等待
session 獲得鎖,更新操作完成:
query ok, 1 row affected (1 min 0.71 sec)
rows matched: 1 changed: 1 warnings: 0
<b>事物控制 :</b>
mysql 通過 set autocommit、start transaction、commit 和 rollback 等語句支援本地事務,具體文法如下。
start transaction | begin [work]
commit [work] [and [no] chain] [[no] release]
rollback [work] [and [no] chain] [[no] release]
set autocommit = {0 | 1}
mysql 預設是自動送出(autocommit)的,可用commit 和 rollback 來送出和復原事務,那麼需要通過明确的事務控制指令來開始事務,這是和 oracle 的事務管理明顯不同的地方。如果應用是從 oracle 資料庫遷移到 mysql 資料庫,則需要確定應用中是否對事務進行了明确的管理。
start transaction 或 begin 語句可以開始一項新的事務。
commit 和 rollback 用來送出或者復原事務。
chain 和 release 子句分别用來定義在事務送出或者復原之後的操作,chain 會立即啟動一個新事物,并且和剛才的事務具有相同的隔離級别,release 則會斷開和用戶端的連接配接. ? set autocommit 可以修改目前連接配接的送出方式,如果設定了 set autocommit=0,則設定之後的所有事務都需要通過明确的指令進行送出或者復原。
如果隻是對某些語句需要進行事務控制,則使用 start transaction 語句開始一個事務比較友善,這樣事務結束之後可以自動回到自動送出的方式,如果希望所有的事務都不是自動送出的,那麼通過修改 autocommit 來控制事務比較友善,這樣不用在每個事務開始的時候再執行 start transaction 語句。
***** 在此隻摘取重要說明部分,較多例子在此未作聲明,若想了解請自己查找相關資料
<b>十、</b>
<b>sql mode</b>
mysql 5.0 上, sql mode(sql_mode 參數)預設 為real_as_float/pipes_as_concat/ansi_quotes/gnore_space 和 ansi;
在這種模式下允許插入超過字段長度的值,隻是在插入後, mysql 會傳回一個 warning 。通過修改 sql_mode 為 strict_trans_tables(嚴格模式)實作了資料的嚴格校驗,使錯誤資料不能插入表中,進而保證了資料的準确性,具體實作如下。
檢視預設 sql mode 的指令如下:
mysql> select @@sql_mode;
sql_mode 的一種修改方法,即 set [session|global] sql_mode='modes',其中 session 選項表示隻在本次連接配接中生效;而 global 選項表示在本次連接配接中并不生效,而對于新的連接配接則生效,這種方法在 mysql 4.1 開始有效。另外,也可以通過使用“--sql-mode="modes"”選項,在 mysql 啟動時設定 sql_mode。
<b>mysql 中的 sql mode </b>
<b>sql_mode值 </b>
ansi
等同于 real_as_float、pipes_as_concat、ansi_quotes、ignore_space 和 ansi
組合模式,這種模式使文法和行為更符合标準的 sql
strict_trans_tables
strict_trans_tables 适用于事務表和非事務表,它是嚴格模式,不允許非法日期,也不允許超過字段長度的值插入字段中,對于插入不正确的值給出錯誤而不是警告
traditional
traditional 模式等同于 strict_trans_tables、strict_all_tables、
<b>mysql 中的常用資料庫 mode </b>
組合後的模式名稱
組合模式中的各個sql_mode
db2
pipes_as_concat 、 ansi_quotes 、 ignore_space 、 no_key_options
no_table_options、no_field_options
maxdb
no_table_options、no_field_options、 no_auto_create_user
mssql
no_table_options、 no_field_options
oracle
no_table_options、no_field_options、no_auto_create_user
postgresql
在資料遷移過程中,可以設定 sql mode 為 no_table_options 模式,這樣将去掉 show create table 中的“engine”關鍵字,獲得通用的建表腳本。
測試執行個體如下:
mysql > show create table emp \ g;
create table `emp `
(`ename ` varchar( 20 ) default null )
engine =innodb default charset =gbk ;
mysql> set session sql_mode ='no_table_options' ;
mysql > show create table emp \g ;
create table `emp ` (`ename ` varchar( 20) default null );
從第18章sql 優化開始 往後每章節都需要仔細閱讀書籍和資料。由于知識點過多,是以在此先不做整理。
後續可能會對一些點做整理 另發部落格。