CREATE TABLE `user` (
`id` ?int NOT NULL AUTO_INCREMENT ,
`name` ?varchar(255) NULL ,
`sex` ?varchar(255) NULL ,
`age` ?int NULL ,
`address` ?varchar(255) NULL ,
PRIMARY KEY (`id`)
)
;
然后插入數(shù)據(jù)
insert into `user`(`name`,`sex`,`age`,`address`) values('張三','男',22,'北京') ;
insert into `user`(`name`,`sex`,`age`,`address`) values('李四','男',12,'河北') ;
insert into `user`(`name`,`sex`,`age`,`address`) values('王五','女',23,'江蘇') ;
insert into `user`(`name`,`sex`,`age`,`address`) values('趙六','男',21,'北京') ;
1.改動(dòng)某一個(gè)字段的名稱(比如改動(dòng)地址)
alter table user modify address varchar(50) ;
2.把user表中某些字段的值復(fù)制出來,變成另外一個(gè)表
create table user2 as select id,name from user ;
3.刪除user表
drop table user [restrict|cascade] ;
4.創(chuàng)建表的時(shí)候加上外鍵約束
constraint ID_FK ?foreign key(id) references user2(id) ;
改動(dòng)表的外鍵關(guān)系
alter table user add constraint ID_FK ?foreign key(id) references user2(id) ;
5.加入表的檢查約束
alter table user add constraint CHK_SEX check(sex = '男') ;
alter table user add constraint CHK_SEX check(sex in ('男','女')) ;
6.從還有一個(gè)表插入數(shù)據(jù)
insert into user (name) select name from user2 ;
事務(wù) 是對(duì)數(shù)據(jù)庫運(yùn)行的一個(gè)操作單位。它是以邏輯順序完畢的工作單元或工作序列,不管是用戶手工操作,還是由程序進(jìn)行的自己主動(dòng)操作。
控制事務(wù)的命令有3個(gè)
COMMIT ?ROLLBACK ?SAVEPOINT
首先把數(shù)據(jù)庫默認(rèn)的提交模式改變
set autocommit=0 禁止自己主動(dòng)提交
set autocommit=1 開啟自己主動(dòng)提交
我們要從表user里刪除剩余的數(shù)據(jù),在進(jìn)行每次刪除之前都使用savepoint命令,這樣就能夠在不論什么時(shí)候利用rollback命令
回退到隨意一個(gè)保存點(diǎn),從而把適當(dāng)?shù)臄?shù)據(jù)回復(fù)到原始狀態(tài)。
以下是一個(gè)事務(wù)處理的完整樣例:
**********************************
mysql> set autocommit=
0 ;
Query OK, 0 rows affected
mysql> delete from user where id=3 ;
Query OK, 1 row affected
mysql> select * from user ;
+----+------+-----+-----+---------+
| id | name | sex | age | address |
+----+------+-----+-----+---------+
| ?1 | 張三 | 男 ?| ?22 | 北京 ? ?|
| ?2 | 李四 | 男 ?| ?12 | 河北 ? ?|
+----+------+-----+-----+---------+
2 rows in set
mysql> rollback ;
Query OK, 0 rows affected
mysql> select * from user ;
+----+------+-----+-----+---------+
| id | name | sex | age | address |
+----+------+-----+-----+---------+
| ?1 | 張三 | 男 ?| ?22 | 北京 ? ?|
| ?2 | 李四 | 男 ?| ?12 | 河北 ? ?|
| ?3 | 王五 | 女 ?| ?23 | 江蘇 ? ?|
+----+------+-----+-----+---------+
3 rows in set
mysql> savepoint sp1 ;
Query OK, 0 rows affected
mysql> delete from user where id=2 ;
Query OK, 1 row affected
mysql> savepoint sp2 ;
Query OK, 0 rows affected
mysql> delete from user where id=3 ;
Query OK, 1 row affected
mysql> savepoint sp3 ;
Query OK, 0 rows affected
mysql> delete from user where id=1 ;
Query OK, 0 rows affected
mysql> select * from user ;
Empty set
mysql> rollback to sp1 ;
Query OK, 0 rows affected
mysql> select * from user ;
+----+------+-----+-----+---------+
| id | name | sex | age | address |
+----+------+-----+-----+---------+
| ?1 | 張三 | 男 ?| ?22 | 北京 ? ?|
| ?2 | 李四 | 男 ?| ?12 | 河北 ? ?|
| ?3 | 王五 | 女 ?| ?23 | 江蘇 ? ?|
+----+------+-----+-----+---------+
3 rows in set
************************************
mysql> release savepoint sp1 ;
Query OK, 0 rows affected
這個(gè)命令用于刪除創(chuàng)建的保存點(diǎn) 。在某個(gè)保存點(diǎn)被釋放之后,就不能再利用rollback命令來撤銷這個(gè)保存點(diǎn)之后的
事務(wù)操作了。利用這個(gè)命令能夠避免意外的回退到某個(gè)不再須要的保存點(diǎn)。
總結(jié):commit用于把事務(wù)保存到數(shù)據(jù)庫,rollback用于撤銷已經(jīng)運(yùn)行了的事務(wù),而savepoint用于把事務(wù)劃分成組,
讓我們能夠回退到事務(wù)過程中特定的邏輯位置。在執(zhí)行大規(guī)模事務(wù)操作時(shí),應(yīng)該常常使用commit和rollback命令來保證
數(shù)據(jù)庫具有足夠的剩余空間。另外還要記住,這些事務(wù)命令僅僅用于3個(gè)DML命令:insert、update和delete。
查詢語句
select all name from user 和 select name from user 使用方法一樣,都是從表里查詢出字段名為name的全部值
mysql> select distinct sex from user ;
+-----+
| sex |
+-----+
| 男 ?|
| 女 ?|
+-----+
2 rows in set
查詢出不反復(fù)的字段值distinct。
對(duì)查詢出來的內(nèi)容進(jìn)行 排序order by ,默認(rèn)是asc也就是升序。
mysql> select * from user order by age
?;?
+----+------+-----+-----+---------+
| id | name | sex | age | address |
+----+------+-----+-----+---------+
| ?2 | 李四 | 男 ?| ?12 | 河北 ? ?|
| ?1 | 張三 | 男 ?| ?22 | 北京 ? ?|
| ?3 | 王五 | 女 ?| ?23 | 江蘇 ? ?|
+----+------+-----+-----+---------+
3 rows in set
mysql> select * from user order by age asc
;?
+----+------+-----+-----+---------+
| id | name | sex | age | address |
+----+------+-----+-----+---------+
| ?2 | 李四 | 男 ?| ?12 | 河北 ? ?|
| ?1 | 張三 | 男 ?| ?22 | 北京 ? ?|
| ?3 | 王五 | 女 ?| ?23 | 江蘇 ? ?|
+----+------+-----+-----+---------+
3 rows in set
mysql> select * from user order by age de
sc;?
+----+------+-----+-----+---------+
| id | name | sex | age | address |
+----+------+-----+-----+---------+
| ?3 | 王五 | 女 ?| ?23 | 江蘇 ? ?|
| ?1 | 張三 | 男 ?| ?22 | 北京 ? ?|
| ?2 | 李四 | 男 ?| ?12 | 河北 ? ?|
+----+------+-----+-----+---------+
3 rows in set
排序還能夠針對(duì)多個(gè)字段,也就是第一個(gè)指定的排序字段假設(shè)相等的話,比較第二個(gè)字段的值。以此類推。
mysql> select * from user order by age ;
+----+---------+-----+-----+---------+
| id | name ? ?| sex | age | address |
+----+---------+-----+-----+---------+
| ?2 | 李四 ? ?| 男 ?| ?12 | hebei ? |
| ?1 | 張三 ? ?| 男 ?| ?22 | beijing |
| ?3 | 王五 ? ?| 女 ?| ?23 | jiangsu |
| ?4 | wuhaixu | nan | ?23 | hunan ? |
+----+---------+-----+-----+---------+
4 rows in set
mysql> select * from user order by age,address ;
+----+---------+-----+-----+---------+
| id | name ? ?| sex | age | address |
+----+---------+-----+-----+---------+
| ?2 | 李四 ? ?| 男 ?| ?12 | hebei ? |
| ?1 | 張三 ? ?| 男 ?| ?22 | beijing |
| ?4 | wuhaixu | nan | ?23 | hunan ? |
| ?3 | 王五 ? ?| 女 ?| ?23 | jiangsu |
+----+---------+-----+-----+---------+
4 rows in set
當(dāng)然我們還能夠用數(shù)字取代字段名,例如以下所看到的:整數(shù)1代表id,2代表name...
mysql> select * from user order by 4
?;
+----+---------+-----+-----+---------+
| id | name ? ?| sex | age | address |
+----+---------+-----+-----+---------+
| ?2 | 李四 ? ?| 男 ?| ?12 | hebei ? |
| ?1 | 張三 ? ?| 男 ?| ?22 | beijing |
| ?3 | 王五 ? ?| 女 ?| ?23 | jiangsu |
| ?4 | wuhaixu | nan | ?23 | hunan ? |
+----+---------+-----+-----+---------+
4 rows in set
mysql> select * from user order by 4,5 ;
+----+---------+-----+-----+---------+
| id | name ? ?| sex | age | address |
+----+---------+-----+-----+---------+
| ?2 | 李四 ? ?| 男 ?| ?12 | hebei ? |
| ?1 | 張三 ? ?| 男 ?| ?22 | beijing |
| ?4 | wuhaixu | nan | ?23 | hunan ? |
| ?3 | 王五 ? ?| 女 ?| ?23 | jiangsu |
+----+---------+-----+-----+---------+
count函數(shù)的使用方法:
mysql> select count(*) as '總數(shù)' from user ;
+------+
| 總數(shù) |
+------+
| ? ?4 |
+------+
1 row in set
mysql> select count(distinct sex) as `總數(shù)` from user ;
+------+
| 總數(shù) |
+------+
| ? ?3 |
+------+
1 row in set
邏輯操作符:is null、between、in、like、exists、unique、all和any
mysql> select * from user where sex is null ;
Empty set
mysql> select * from user where age between 20 and 22;
+----+------+-----+-----+---------+
| id | name | sex | age | address |
+----+------+-----+-----+---------+
| ?1 | 張三 | 男 ?| ?22 | beijing |
+----+------+-----+-----+---------+
1 row in set
mysql> select * from user where age in(22,23);
+----+---------+-----+-----+---------+
| id | name ? ?| sex | age | address |
+----+---------+-----+-----+---------+
| ?1 | 張三 ? ?| 男 ?| ?22 | beijing |
| ?3 | 王五 ? ?| 女 ?| ?23 | jiangsu |
| ?4 | wuhaixu | nan | ?23 | hunan ? |
+----+---------+-----+-----+---------+
3 rows in set
操作符like 利用通配符把一個(gè)值與類似的值進(jìn)行比較,下劃線代表一個(gè)數(shù)字或字符,這些符號(hào)能夠復(fù)合使用。
百分號(hào)%代表零個(gè)、一個(gè)或多個(gè)字符,下劃線代表一個(gè)數(shù)字或字符。這些符號(hào)能夠復(fù)合使用。
mysql> select * from user where address like '%i%';
+----+------+-----+-----+---------+
| id | name | sex | age | address |
+----+------+-----+-----+---------+
| ?1 | 張三 | 男 ?| ?22 | beijing |
| ?2 | 李四 | 男 ?| ?12 | hebei ? |
| ?3 | 王五 | 女 ?| ?23 | jiangsu |
+----+------+-----+-----+---------+
3 rows in set
mysql> select * from user where address like '__i%';
+----+------+-----+-----+---------+
| id | name | sex | age | address |
+----+------+-----+-----+---------+
| ?1 | 張三 | 男 ?| ?22 | beijing |
+----+------+-----+-----+---------+
1 row in set
mysql> select * from user where exists (select id from user where age <40) ;
+----+---------+-----+-----+---------+
| id | name ? ?| sex | age | address |
+----+---------+-----+-----+---------+
| ?1 | 張三 ? ?| 男 ?| ?22 | beijing |
| ?2 | 李四 ? ?| 男 ?| ?12 | hebei ? |
| ?3 | 王五 ? ?| 女 ?| ?23 | jiangsu |
| ?4 | wuhaixu | nan | ?23 | hunan ? |
+----+---------+-----+-----+---------+
4 rows in set
匯總函數(shù):count、sun、max、min、avg
mysql> select count(*
) from user ;
+----------+
| count(*) |
+----------+
| ? ? ? ?5 |
+----------+
1 row in set
count函數(shù)配合all使用時(shí),不包括為空的字段。address有一條為空,所以count為4
mysql> select count(all address) from user ;
+--------------------+
| count(all address) |
+--------------------+
| ? ? ? ? ? ? ? ? ?4 |
+--------------------+
1 row in set
mysql> select count(distinct address) from user ;
+-------------------------+
| count(distinct address) |
+-------------------------+
| ? ? ? ? ? ? ? ? ? ? ? 4 |
+-------------------------+
1 row in set
mysql> select sum(age) from user ;
+----------+
| sum(age) |
+----------+
| 102 ? ? ?|
+----------+
1 row in set
假設(shè)數(shù)據(jù)不能隱含地轉(zhuǎn)化為數(shù)值類型,其結(jié)果就是0.以name為例:
mysql> select sum(name) from user ;
+-----------+
| sum(name) |
+-----------+
| ? ? ? ? 0 |
+-----------+
1 row in set
mysql> select avg(name) from user ;
+-----------+
| avg(name) |
+-----------+
| ? ? ? ? 0 |
+-----------+
1 row in set
mysql> select avg(age) from user ;
+----------+
| avg(age) |
+----------+
| 20.4000 ?|
+----------+
1 row in set
mysql> select max(age) from user ;
+----------+
| max(age) |
+----------+
| ? ? ? 23 |
+----------+
1 row in set
mysql> select min(age) from user ;
+----------+
| min(age) |
+----------+
| ? ? ? 12 |
+----------+
1 row in set
數(shù)據(jù)的排序與分組:
mysql> select * from user group by age;
+----+------+-----+-----+---------+
| id | name | sex | age | address |
+----+------+-----+-----+---------+
| ?2 | 李四 | 男 ?| ?12 | hebei ? |
| ?1 | 張三 | 男 ?| ?22 | beijing |
| ?3 | 王五 | 女 ?| ?23 | jiangsu |
+----+------+-----+-----+---------+
3 rows in set
mysql> select * from user group by age,address;
+----+---------+-----+-----+---------+
| id | name ? ?| sex | age | address |
+----+---------+-----+-----+---------+
| ?2 | 李四 ? ?| 男 ?| ?12 | hebei ? |
| ?5 | aa ? ? ?| nv ?| ?22 | NULL ? ?|
| ?1 | 張三 ? ?| 男 ?| ?22 | beijing |
| ?4 | wuhaixu | nan | ?23 | hunan ? |
| ?3 | 王五 ? ?| 女 ?| ?23 | jiangsu |
+----+---------+-----+-----+---------+
5 rows in set
上面的是先依據(jù)age進(jìn)行分組,再對(duì)單個(gè)分組里的address內(nèi)容進(jìn)行分組。
replace函數(shù)用于把某個(gè)字符或某個(gè)字符串替換為指定的一個(gè)字符(或多個(gè)字符)
mysql> select address,replace(address,'ei','ab') from user ;
+---------+----------------------------+
| address | replace(address,'ei','ab') |
+---------+----------------------------+
| beijing | babjing ? ? ? ? ? ? ? ? ? ?|
| hebei ? | hebab ? ? ? ? ? ? ? ? ? ? ?|
| jiangsu | jiangsu ? ? ? ? ? ? ? ? ? ?|
| hunan ? | hunan ? ? ? ? ? ? ? ? ? ? ?|
| NULL ? ?| NULL ? ? ? ? ? ? ? ? ? ? ? |
+---------+----------------------------+
5 rows in set
upper函數(shù)能夠把字符串里的小寫字母轉(zhuǎn)化為大寫
mysql> select upper(address) from user ;
+----------------+
| upper(address) |
+----------------+
| BEIJING ? ? ? ?|
| HEBEI ? ? ? ? ?|
| JIANGSU ? ? ? ?|
| HUNAN ? ? ? ? ?|
| NULL ? ? ? ? ? |
+----------------+
5 rows in set
lower把字符串里的大寫字符轉(zhuǎn)化為小寫
mysql> select lower
(address) from user ;
+----------------+
| lower(address) |
+----------------+
| beijing ? ? ? ?|
| hebei ? ? ? ? ?|
| jiangsu ? ? ? ?|
| hunan ? ? ? ? ?|
| NULL ? ? ? ? ? |
+----------------+
5 rows in set
substr用來獲取字符串子串的函數(shù)
mysql> select address,substr(address,1,2) from user ;
+---------+---------------------+
| address | substr(address,1,2) |
+---------+---------------------+
| beijing | be ? ? ? ? ? ? ? ? ?|
| hebei ? | he ? ? ? ? ? ? ? ? ?|
| jiangsu | ji ? ? ? ? ? ? ? ? ?|
| hunan ? | hu ? ? ? ? ? ? ? ? ?|
| NULL ? ?| NULL ? ? ? ? ? ? ? ?|
+---------+---------------------+
5 rows in set
選擇函數(shù),相當(dāng)與oracle里的decode()
mysql> select case address when 'beijing' then '北京' else '其它' end as '地址' from user ;
+------+
| 地址 |
+------+
| 北京 |
| 其它 |
| 其它 |
| 其它 |
| 其它 |
+------+
5 rows in set
length函數(shù)用于得到字符串。數(shù)字、日期或表達(dá)式的長度,單位是字節(jié)。
mysql> select address,length(address) as '長度' from user ;
+---------+------+
| address | 長度 |
+---------+------+
| beijing | ? ?7 |
| hebei ? | ? ?5 |
| jiangsu | ? ?7 |
| hunan ? | ? ?5 |
| NULL ? ?| NULL |
+---------+------+
5 rows in set
lpad函數(shù)用于在字符串左側(cè)加入字符或空格。
mysql> select address,lpad(address,30,'.') from user ;
+---------+--------------------------------+
| address | lpad(address,30,'.') ? ? ? ? ? |
+---------+--------------------------------+
| beijing | .......................beijing |
| hebei ? | .........................hebei |
| jiangsu | .......................jiangsu |
| hunan ? | .........................hunan |
| NULL ? ?| NULL ? ? ? ? ? ? ? ? ? ? ? ? ? |
+---------+--------------------------------+
5 rows in set
rpad函數(shù)在字符串右側(cè)加入字符或空格
mysql> select address,rpad(address,30,'.') from user ;
+---------+--------------------------------+
| address | rpad(address,30,'.') ? ? ? ? ? |
+---------+--------------------------------+
| beijing | beijing....................... |
| hebei ? | hebei......................... |
| jiangsu | jiangsu....................... |
| hunan ? | hunan......................... |
| NULL ? ?| NULL ? ? ? ? ? ? ? ? ? ? ? ? ? |
+---------+--------------------------------+
5 rows in set
ASCII函數(shù)返回字符串最左側(cè)的‘美國信息交換標(biāo)準(zhǔn)碼’。
mysql> select ascii('a') ;
+------------+
| ascii('a') |
+------------+
| ? ? ? ? 97 |
+------------+
1 row in set
mysql> select ascii('A') ;
+------------+
| ascii('A') |
+------------+
| ? ? ? ? 65 |
+------------+
1 row in set
最常見的算數(shù)函數(shù)有:絕對(duì)值(ABS)、舍入(ROUND)、平方根(SQRT)、符號(hào)(SIGN)、冪(POWER)、上限和下限(CEIL、FLOOR)、指數(shù)(EXP)、SIN、COS、TAN
日期和時(shí)間存儲(chǔ)的標(biāo)準(zhǔn)SQL數(shù)據(jù)類型有3種:
date:直接存儲(chǔ)日期。date的格式是YYYY-MM-DD,范圍是從0001-01-01到9999-12-31
time:直接存儲(chǔ)時(shí)間。time的格式是HH:MI:SS.nn...,范圍是從00:00:00...到23:59:61.999...
timestamp:直接存儲(chǔ)日期和時(shí)間。timestamp的格式是YYYY-MM-DD HH:Mi:SS.nn...,范圍是從0001-01-01 00:00:00...到9999-12-31 23:59:61.999...
mysql中使用now()來獲取當(dāng)前時(shí)間
mysql> select now() ;
+---------------------+
| now() ? ? ? ? ? ? ? |
+---------------------+
| 2014-07-07 14:51:56 |
+---------------------+
1 row in set
首先創(chuàng)建一個(gè)簡單的user表
CREATE TABLE `user` (
`id` ?int NOT NULL AUTO_INCREMENT ,
`name` ?varchar(255) NULL ,
`sex` ?varchar(255) NULL ,
`age` ?int NULL ,
`address` ?varchar(255) NULL ,
PRIMARY KEY (`id`)
)
;
然后插入數(shù)據(jù)
insert into `user`(`name`,`sex`,`age`,`address`) values('張三','男',22,'北京') ;
insert into `user`(`name`,`sex`,`age`,`address`) values('李四','男',12,'河北') ;
insert into `user`(`name`,`sex`,`age`,`address`) values('王五','女',23,'江蘇') ;
insert into `user`(`name`,`sex`,`age`,`address`) values('趙六','男',21,'北京') ;
創(chuàng)建一張與user表關(guān)聯(lián)的表
CREATE TABLE `teacher` (
`id` ?int NOT NULL AUTO_INCREMENT ,
`name` ?varchar(255) NULL ,
`stu_id` int NOT NULL ,
PRIMARY KEY (`id`),
constraint ID_FK foreign key(stu_id) references user(id)
)
;
insert into `teacher`(name,stu_id) values('張老師',1) ;
insert into `teacher`(name,stu_id) values('王老師',4) ;
insert into `teacher`(name,stu_id) values('吳老師',2) ;
insert into `teacher`(name,stu_id) values('方老師',2) ;
insert into `teacher`(name,stu_id) values('林老師',3) ;
等值結(jié)合:
mysql> select t.name,u.name from user u,teacher t where u.id=t.stu_id ;
+--------+---------+
| name ? | name ? ?|
+--------+---------+
| 張老師 | 張三 ? ?|
| 吳老師 | 李四 ? ?|
| 方老師 | 李四 ? ?|
| 林老師 | 王五 ? ?|
| 王老師 | wuhaixu |
+--------+---------+
5 rows in set
mysql> select t.name,u.name from teacher t inner join user u on t.stu_id = u.id ;
+--------+---------+
| name ? | name ? ?|
+--------+---------+
| 張老師 | 張三 ? ?|
| 吳老師 | 李四 ? ?|
| 方老師 | 李四 ? ?|
| 林老師 | 王五 ? ?|
| 王老師 | wuhaixu |
+--------+---------+
5 rows in set
在這樣的方式里,where子句里的結(jié)合操作符被去掉了,取而代之的是keywordinner join。要被結(jié)合的表位于join之后,而結(jié)合操作符位于keywordon之后。
上面還使用了表的別名
union操作符能夠組合兩個(gè)或多個(gè)select語句的結(jié)果,不包括反復(fù)的記錄。假設(shè)某行的輸出存在于一個(gè)查詢結(jié)果里,那么其它查詢結(jié)果同一行的記錄就不會(huì)
再輸出了。在使用union操作符時(shí),每一個(gè)select語句里必須選擇相同數(shù)量的字段、相同數(shù)量的字段表達(dá)式、相同的數(shù)據(jù)類型、相同的次序--但長須不必一樣。
mysql> select id from user?
? ? -> union
? ? -> select id from teacher ;
+----+
| id |
+----+
| ?1 |
| ?2 |
| ?3 |
| ?4 |
| ?5 |
+----+
5 rows in set
union all操作符能夠組合兩個(gè)select語句的結(jié)果,而且包涵反復(fù)的結(jié)果。其使用規(guī)則與union一樣,它與union基本上是一樣的,僅僅是一個(gè)返回反復(fù)的結(jié)果,一個(gè)不返回。
mysql> select id from user?
? ? -> union all
? ? -> select id from teacher ;
+----+
| id |
+----+
| ?1 |
| ?2 |
| ?3 |
| ?4 |
| ?1 |
| ?3 |
| ?4 |
| ?5 |
| ?2 |
+----+
9 rows in set
索引是怎樣工作的呢?索引在創(chuàng)建之后,用于記錄與杯索引字段相關(guān)聯(lián)的位置值。當(dāng)表里加入新數(shù)據(jù)時(shí),索引里也會(huì)加入新項(xiàng),當(dāng)數(shù)據(jù)庫運(yùn)行查詢,并且where條件里指定的字段已經(jīng)設(shè)置了
索引時(shí),數(shù)據(jù)庫會(huì)首先在索引里搜索where子句里指定的值。假設(shè)在索引里找到了這個(gè)值,索引就能夠返回被搜索數(shù)據(jù)在表里的實(shí)際位置。
創(chuàng)建單字段索引:
create index index_id on user(id) ;
創(chuàng)建唯一索引:
create unique index index_id on user(id) ;
組合索引是基于一個(gè)表里兩個(gè)或多個(gè)字段的索引。在創(chuàng)建組合索引時(shí),我們要考慮性能的問題,由于字段在索引里的次序?qū)?shù)據(jù)檢索速度有非常大的影響。一般來說,最具有限制的值應(yīng)該排在前面,
從而得到最好的性能。可是,總是會(huì)在查詢里指定的字段應(yīng)該放在首位。
create index index_name on table_name (column1,column2) ;
隱含索引是數(shù)據(jù)庫服務(wù)程序在創(chuàng)建對(duì)象時(shí)自己主動(dòng)創(chuàng)建的。比方,數(shù)據(jù)庫會(huì)為主鍵約束和唯一性約束自己主動(dòng)創(chuàng)建索引。
什么時(shí)候選擇用索引呢?唯一索引隱含地與主鍵共同實(shí)現(xiàn)主鍵的功能。外鍵經(jīng)經(jīng)常使用于與父表的結(jié)合,所以也適合設(shè)置索引。一般來說,大多數(shù)用于表結(jié)合的字段都應(yīng)該設(shè)置索引。
常常在order by和group by里引用的字段也應(yīng)該考慮設(shè)置索引。
何時(shí)應(yīng)該避免使用索引?1、索引不應(yīng)該用于小規(guī)模的表。2、當(dāng)字段用于where子句做為過濾器會(huì)返回表里的大部分記錄時(shí),該字段就不適合設(shè)置索引。舉例來說,圖書里的索引不會(huì)
包含像the或and這種單詞。3、常常會(huì)被批量更新的表能夠具有索引,但批量操作的性能會(huì)因?yàn)樗饕鴾p少。對(duì)于常常會(huì)被載入或批量操作的表來說,能夠在運(yùn)行批量操作之前去掉索引,
在完畢操作之后再又一次創(chuàng)建索引,這是由于當(dāng)表里插入數(shù)據(jù)時(shí),索引也會(huì)杯更新,從而添加了額外的開銷。4、不應(yīng)該對(duì)包涵大量null值的字段設(shè)置索引。索引對(duì)在不同記錄中包涵不同數(shù)據(jù)
的字段特別有效,字段中過多的null值會(huì)嚴(yán)重影響索引的執(zhí)行效率。5、常常被操作的字段不應(yīng)該設(shè)置索引,由于對(duì)索引的維護(hù)會(huì)變得非常繁重。
改動(dòng)索引alter index INDEX_NAME
刪除索引drop index index_name on table_name
我們應(yīng)該對(duì)僅僅包括非常少不同值的字段創(chuàng)建索引,比方性別、州名等。
在讀取大規(guī)模的表時(shí),應(yīng)該避免進(jìn)行全表掃描。舉例來說,當(dāng)讀取沒有索引的表時(shí),就會(huì)發(fā)生全表掃描,這一般會(huì)須要較長的時(shí)間才干返回?cái)?shù)據(jù)。對(duì)于大多數(shù)大型表來說,應(yīng)該考慮設(shè)置索引。
以下是應(yīng)該被索引的數(shù)據(jù);
? 1、做為主鍵的字段
? 2、做為外鍵的字段
? 3、在結(jié)合表里常常使用的字段
? 4、常常在查詢里做為條件的字段
? 5、大部分是唯一值的字段
在調(diào)整sql語句里還有其它一些性能考慮:
? 1、使用like操作符和通配符
? 2、避免or操作符
? 3、避免having子句。
? 4、避免大規(guī)模排序操作
? 5、使用存儲(chǔ)過程
? 6、在批載入時(shí)關(guān)閉索引
1、使用like操作符
mysql> select address from user where address like '%jing' ;
+---------+
| address |
+---------+
| beijing |
+---------+
1 row in set
mysql> select address from user where address like '___
jing' ;
+---------+
| address |
+---------+
| beijing |
+---------+
1 row in set
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
