mysql再回首

Mysql與Oracle的區別

1.實例區別

  Mysql是一個輕量型數據庫,開源免費。Oracle是收費的並且價格很是高。mysql

  Mysql一個實例能夠操做多個庫,而Oracle一個實例只能對應一個庫。正則表達式

  Mysql安裝完後300M而Oracle有3G左右。sql

2.操做區別

  主鍵:Mysql通常使用自動增加類型,而Oracle則須要使用序列對象。數據庫

  單引號的處理:mysql裏能夠用雙引號包起字符串,oracle裏只能夠用單引號包起字符串。api

  分頁的sql語句:mysql用limit,而oracle使用內建視圖和rownum僞列。緩存

  事務處理:mysql默認是自動提交,而oracle默認不自動提交,須要用戶CTL語言進行事務提交。服務器

 

操做Mysql

mysql和oracle對於數據物理隔離機制上的區別:

  oracle裝好後會有一個oracle實例還有一個庫,庫當中有數據文件,這數據文件在oracle中稱爲表空間。oracle

    因此在Oracle裝好之後,咱們首先要去建立一個永久表空間,再去建立用戶。隨後把這個永久表空間分配給這個用戶。函數

    接着再去建立一個用戶,再給他分配一個表空間。經過表空間來實現物理隔離。性能

    因此說在oracle中庫有一個就夠了,而後咱們再給他建立表空間。

 

  mysql是一個實例能夠對應多個庫,mysql當中呢沒有表空間這個概念,因此說咱們能夠去建立不一樣的庫,而後用戶直接去操做不一樣的庫。每一個庫中放着不一樣的數據文件。

 

1.建立與刪除數據庫

 

1.1.1使用命令建立數據庫

create database 數據庫名 default  character set字符編碼;

1.1.1.1示例

建立一個test的數據庫,並查看該數據庫,以及該數據庫的編碼。

    create database  test default  character set utf-8;

建立數據庫:

  create  database 庫名;

查看數據庫

show databases;

查看數據庫編碼:

select  schema_name  ,default_character_set_name  from information_schema.schemata where schema_name='test';

 

1.2刪除數據庫

 drop database 數據庫名;

1.2.1.1示例

drop database test;

 

2.選擇數據庫

須要在哪一個庫中建立表須要先選擇該數據庫。

use 須要選擇的庫名;

2.1示例一

建立一個名稱爲test的數據庫,編碼爲utf-8;

   create database test  default character set utf8; 

2.2示例二

選擇該數據庫;

 use test;

3.Mysql中的數據類型

3.1數值類型

Mysql支持全部準備sql數值數據類型。

做爲sql標準的擴展,Mysql也支持整數類型tinyint、mediumint和bigint。

 

Mysql數據類型                          含義

tinyint(m)          一個字符 範圍(-128- 127)

smallint(m)         2個字節 範圍(-32768-  32767)

mediumint(m)        3個字節 範圍(-8388608-  8388687)

int(m)            4個字節 範圍(-2147483648-  2147483647)

bigint(m)           8個字節 範圍(+-9.22*10的18次方)

 

數值類型中的長度m是指顯示長度,並不顯示存儲長度,只有字段指定指定zerofill時有用

例如: int(3),若是實際值是2,若是列指定了zerofill,查詢結果就是002,左邊用0來填充。

3.2浮點型

float(m,d)       單精度浮點型  8位精度(4個字節)  m總個數,d小數位

double(m,d)      雙精度浮點型  16位精度(8位) m總個數,d個小數位

3.3字符串型

char(n)  固定長度,最多255個字符

varchar(n)  可變長度,最多65535個字符

tinytext  可變長度,最多255個字符

text  可變長度,最多65535個字符

mediumtext  可變長度,最多2的24次方-1個字符

longtext    可變長度,最多2的32次方-1個字符

 

 

3.3.1char和varchar

1.char(n)若存入字符數小於n,則以空格補於其後,查詢之時再將空格去掉。因此char類型存儲的字符串末尾不能有空格,varchar不限制於此。

2.char類型的字符串檢索要比varchar類型快。

 

3.3.2varchar和text

1.varchar能夠指定n,text不能指定,內部存儲varchar是存入的實際字符數+1個字節(n<=255),text是實際字符數+2個字節。

2.text類型不能有默認值。

3.varchar可直接建立索引,text建立索引要指定前多個字符。varchar查詢速度快於text,在都建立索引的狀況下,text的索引彷佛不起做用。

 

3.4日期類型

   mysql數據類型                       含義

  date                                        日期2008-12-2

  time            時間‘12:25:36’

  datetime          日期時間‘2008-12-2 22:06:44’

  timestamp          自動存儲記錄修改時間

 

3.5二進制數據

 

1.BLOB和TEXT存儲方式不一樣,text以文本方式存儲,英文存儲區分大小寫,而Blob是以二進制方式存儲,不分大小寫。

2.BLOB存儲的數據只能總體讀出。

3.text能夠指定字符集,BLOB不一樣指定字符集。

 

DDL語言

4.建立表與刪除表

4.1建立表

  create table employees(employee_id int,last_name varchar(30),salary float(8,3))

4.2查看錶

  show tables;

4.3刪除表

   drop table employees;

 

5.修改表

5.1使用ddl語句修改表名

 

  alter table 舊錶名    rename 新表名

5.1.1示例一

     將employees表名修改成emp。

  alter table employees rename emp;

5.2修改列名

  alter 表名  change  column  舊列名  新列名  類型

5.2.1示例

將emp表中的last_name 修改成name

alter table   employees   change  column  last_name  name varchar(30)

 

5.3使用ddl來修改列類型

alter table 表名 modifity 列名 新類型

5.3.1示例

將emp當中的name長度指定爲49;

alter table employees  MODIFY  name varchar(40);

5.4使用ddl語句來添加列

alter table 表名 add column 新列名 類型

5.4.1示例

在emp表中添加一個新的lie爲commission_pct

alter table employees add column commission_pct float(4,2)

 

5.5使用ddl來刪除列

alter table 表名 drop  column  列名

 

5.5.1示例

刪除emp表中的commission_pct

alter table emp drop column commsission_pct;

 

查詢表的約束信息

show keys from table;

 

6.Mysql中的約束

6.1約束類型

  • 非空約束(not null)
  • 惟一性約束(unique)
  • 主鍵約束(primary key)
  • 外鍵約束(foreign key)
  • 檢查約束(目前Mysql不支持、Oracle支持)

6.2建立表時添加約束

查詢表中的約束信息

show keys from 表名

 

6.2.2示例二

建立employees表包含employees _id該列爲主鍵且自動增加,last_name列不容許含有空值,email列不容許有重複不容許有空值,dept_id爲外鍵參照departments表的主鍵。

create table employees(

employees_id int primary key auto_increment,

last_name varchar(30) not null,

email varhcar(40) not null unique,

dept_id int,

constraint emp_fk foreign key(dept_id)referenes departments(department_id);

)

6.3約束的添加和刪除

6.3.1主鍵約束

 

6.3.1.1添加主鍵約束

alter table 表名 add primarykey(列名)

 

6.3.1.1.1示例

將emp表中的employee_id修改成主鍵自動增加

添加主鍵:alter table emp add primary key(employee_id);

添加自動增加:alter table emp modify_id auto_increment;

 

6.3.1.2刪除主鍵約束

alter table 表名 drop  primary key

注意:刪除主鍵時,若是主鍵列具有自動增加能力,須要先去掉自動增加,而後在刪除主鍵。

 

例子:

刪除employee_Id的主鍵約束。

去掉自動增加:alter table emp modify employee_id int;

 刪除主鍵:alter table emp drop primary key;

 

6.3.2非空約束

6.3.2.1添加非空約束

alter  table 表名 modify 列名 類型 not null;

 

6.3.2.1.1示例

向emp表中的salary添加非空約束

alter table emp  modify salary  float(8,2) not null,

6.3.2.2刪除非空約束

alter table 表名 modify 列名 類型 null

 

6.3.2.3添加惟一性約束

向emp表中的name添加惟一約束

alter table  add constraint emp_uk unique(name);

6.3.3.2刪除惟一性約束

alter table 表名 drop key 表名。

alter table emp drop key emp_uk;

6.3.4外鍵約束

alter table 表名 add constraint  約束名 foreign key(列名)

refrences 參照的表名(操做的列名)

 

alter table  add constraint e_fk foreign key(dept_id) refrences departments(department_Id);

 

6.3.4.2刪除外鍵約束

刪除外鍵:

alter table 表名 drop foreign key 約束名

刪除外鍵索引(索引名與約束名同名)

alter table表名 drop index 索引名。

 

6.3.4.2.1示例

刪除dept_id的外鍵約束

刪除外鍵: alter table emp drop foreign key e_fk;

刪除索引: alter table emp drop  index  e_fk;

 

7mysql中DML操做

 

7.1添加數據(insert )

7.1.1插入數據

7.1.1.1選擇插入

insert into 表名(列名1,列名2....)values(值1,值2,值3...);

7.1.1.2徹底插入

insert into 表名 values(值1,值2,值3.....)

7.1.1.3插入多條記錄

insert into 表名 (...)values

(值1,值2,值3.....),

(值1,值2,值3.....),

(值1,值2,值3.....);

 

Mysql中的自動增加類型要求

一個表中只能有一個列爲自動增加。

自動增加的列的類型必須是整數類型。

自動增加只能添加到具有主鍵約束與惟一性約束的列上。

刪除主鍵約束或者惟一約束,若是該列擁有自動增加能力,則須要去掉自動增加而後刪除約束。

 

Create table emp2(id int primary key ,name varchar(30),seq_num int unique auto_increment);

默認值

在MySQL中可使用default爲字段設定一個默認值。若是在插入數據時並未指定該列的值,那麼MySQL會將默認值添加到該列中。

 

7.1.3.1建立表時指定列的默認值

create table emp3(emp_id int  primary key auto_increment ,name varhcar(30),address varchar(50) default 'unknown');

跟新

update 表名 set 列名=值,列名=值 where 條件

 

mysql的update的特色

跟新的表不能在set和where中用於子查詢;

update後面能夠作任意的查詢。

 

跟新emp3中id爲2的數據,將地址修改成id爲1用戶相同

 Oracle:     update emp3 e set e.address=(select  address from emp3 where emp_id=1)where e.emp_id=2;

 mysql: update emp3 e,(select address from emp3 where emp_id=1)t set  e.address=t where e.emp_id=2;

方式二:

update emp3 e set e.address=(select t1.address from(select  * from emp3) t1 where t1.emp_id=1)

 

7.3刪除數據(DELETE)

7.3.1使用delete子句

 delete from 表名 where 條件

7.3.1.1示例

刪除emp3表中emp_id爲1的僱員信息。

7.3.2使用truncate清空表

truncate  table 表名

7.3.2.1示例

刪除emp3表中的全部數據

truncate table emp3;

7.3.3delete與truncate區別

  • truncate是總體刪除(速度較快),delete是逐條刪除(速度較慢);
  • truncate不寫服務器log,delete寫服務器log,也就是truncate效率比delete高的緣由;
  • truncate是會重置自增值,至關於自增列會被置爲初始值,又從新從1開始記錄,而不是接着原來的值。而delete刪除之後,自增值仍然會繼續累加。

8.MySQL中事務處理

在mysql中默認狀況下,事務是自動提交的,也就是說,只要執行一條DML語句就開啓了事務,而且提交了事務。

8.1關閉MSQL的事務自動提交

 

start transaction                  (此後的數據須要本身手動提交)

DML.....

commit|rollback

8.1.1示例

向emp3表中添加一條數據,要求手動提交事務。

 

六.Mysql查詢數據

1.1Mysql的列選擇

select *|投影列from 表名

1.1.1示例

查詢全部

select * from departments;

1.2Mysql的行選擇

select *|投影列 from 表名 where 選擇條件。

 

select department_name,location_Id from departments where department_id=4;

 

1.3Mysql語句中的算數表達式

 

+:加法運算

-:減法運算

*:乘法運算

/:除法運算,返回商

%:求餘運算,返回餘數。

示例一

修改employees表添加salary。

  alter table employees add column salary float(9,2);

示例二

select  employees_id,last_name,email,12*salary from employees;

 

3.Mysql中常見的單行函數

3.1大小寫控制函數

LOWER(str)    轉換大小寫混合的字符串爲小寫

UPPER(str)    轉換大小寫混合的字符串爲大寫

3.2字符處理

CONCAT(str1,str2)  將str一、str2等字符串鏈接起來

SUBSTR(str,pos,len)  從str的第pos位(範圍:1-str.length)開始,截取長度爲len的字符串

length(str)  獲取str的長度

instr(str,substr)

Lpad(str,len,padstr) 獲取substr在str中的位置

trim(str)  從str中刪除開頭和結尾的空格(不會處理字符串中間含有的空格)

Ltrim(str)  從str中刪除左側開頭的空格

Rtrim(str) 從str中刪除右側結尾的空格

 

REPLACE(str,from_str,to_str) 將str中的from_str替換爲to_str(會替換掉全部符合from_str的字符串)

 

3.3數字函數

ROUND(arg1,arg2):四捨五入指定小數的值

ROUND(arg1):四捨五入保留整數

TRUNC(arg1,arg2):截斷指定小數的值,不作四捨五入。

MOD(arg1,arg2):取餘

 

3.4日期函數

SYSDATE()或者NOW()    返回當前系統時間,格式爲YYYY-MM-DD-hh-mm-ss

CURDATE()   返回系統當前日期,不返回時間

CURTIME()   返回當前系統中的時間,不返回日期

DAYOFMONTH(date)  計算日期 d是本月的第幾天。

 DAYOFWEEK(date)   日期d今天是星期幾    1星期日   

dayofyear(date)

dayname(date)

LAST_DAY(date)      返回date日期當月的最後一天。

 

3.5轉換函數

date_format(date,format)  將日期轉換成字符串(相似oracle中的to_char())

str_to_date(str,format)   將字符串轉換成日期(相似oralce中的to_date())

format的格式都列出來:

    %M 月名字(January……December) 
    %W 星期名字(Sunday……Saturday) 
    %D 有英語前綴的月份的日期(1st, 2nd, 3rd, 等等。) 
    %Y 年, 數字, 4 位 
    %y 年, 數字, 2 位 
    %a 縮寫的星期名字(Sun……Sat) 
    %d 月份中的天數, 數字(00……31) 
    %e 月份中的天數, 數字(0……31) 
    %m 月, 數字(01……12) 
    %c 月, 數字(1……12) 
    %b 縮寫的月份名字(Jan……Dec) 
    %j 一年中的天數(001……366) 
    %H 小時(00……23) 
    %k 小時(0……23) 
    %h 小時(01……12) 
    %I 小時(01……12) 
    %l 小時(1……12) 
    %i 分鐘, 數字(00……59) 
    %r 時間,12 小時(hh:mm:ss [AP]M) 
    %T 時間,24 小時(hh:mm:ss) 
    %S 秒(00……59) 
    %s 秒(00……59) 
    %p AM或PM 
    %w 一個星期中的天數(0=Sunday ……6=Saturday ) 
    %U 星期(0……52), 這裏星期天是星期的第一天 
    %u 星期(0……52), 這裏星期一是星期的第一天 
    %% 字符% )

https://www.jb51.net/article/135803.htm

 

 

select date_format(sysdate,'%Y年%月%d日')

select str_to_date('2019年03月23日','%Y年%m月%d日');

3.6示例一

 

insert into empoyess values(default,'King','King@sxt.cn',190000,0.6,str_to_date('2018年5月1日','%Y年%m月%d日'))

 

3.9通用函數

ifnull(expr1,expr2)

if(expr1,expr2,expr3)

coalesce(value...)判斷value的值是否爲null,若是不爲null,則返回value;若是爲空,則判斷下一個value是否爲空..直到出現不爲空的value並返回或者返回最後一個爲null的value。

 

4.多表鏈接查詢

4.1等值鏈接

示例

查看僱員king所在部門名稱

select  department_name from  employees e,departments d where e.dept=d.department_id and e.last_name='king'

4.2非等值鏈接

4.2.1示例一

建立sal_level表,包含lowest_sal,highest_sal ,level.

 

create  table sal_level(lowest_sal int ,highest_sal int  ,level VARCHAR(30));

 

插入多條數據

insert into sal_level  values(1000,2999,'A')

 

 

select  e.last_name  from employee e,sal_level s where e.salary between s.lowest_sal and highest_sal;

 

select emp.last_name  from employees emp ,employees man where emp.manager_id=man.employees_id;

 

SQL99標準中的查詢

Mysql5.7支持SQL99標準。

6.1SQL99中的交叉鏈接(cross join)

 

6.1.1示例

使用交叉鏈接查詢employees表與department表

select  * from employees cross join departments

 

 

6.2SQL99中的天然鏈接(natural join)

使用天然鏈接查詢全部部門的僱員的名字以及部門名稱。

select  e.last_name,d.department_name from employees natural join departments  d where e.last_name='oldlu';

若兩個表有多個列相同,則都作鏈接條件。

6.3SQL99的內鏈接(inner join)

6.3.1示例

查詢僱員名字爲oldlu的僱員id,薪水與部門名稱。

  select  e.employees_id,e.salary,d.department_name from employees e inner join departments d on e.department_id=d.department_id where e.last_name='Oldlu';

7.聚合函數

7.1AVG(arg)函數

 

對分組數據作平均值運算

arg:參數類型只能是數字類型

 

select  avg(e.salary) from employees e;

7.2SUM(arg)函數

對分組數據求和

arg:參數類型只能是數字類型

 

select  sum(salary) from employees;

7.3MIN(arg)函數

求分組中最小數據。

arg:參數類型能夠是字符、數字、日期

select imn(salary) from employees;

7.4MAX(arg)函數

 

求分組中最大的數據。

arg:參數類型能夠是字符、數字、日期。

 

7.5COUNT函數

返回一個表中的行數

 

COUNT  函數有三種格式:

count(*)

count(expr)

count(distinct  expr)

 

8.數據分組(group by)

8.1.1示例

計算每一個部門的平均薪水

select   avg(e.salary) from employees  e group by e.department_id;

8.2約束分組結果(having)

顯示那些最高薪水大於5000的部門的部門號和最高薪水。

select e.department_id,max(e.salary) from employees e group by e.department_id having max(e.salary)>5000;

 

9.子查詢

能夠將子查詢放在許多的sql子句中,包括:

  • where子句
  • having 子句
  • from子句

9.1使用子查詢的原則

  • 子查詢放在圓括號中。
  • 將子查詢放在比較條件的右邊。
  • 在單行子查詢中庸單行運算符,在多行子查詢中用多行運算符。

9.1.1示例

誰的薪水比oldru高

  select  em.last_name ,em.salary from empoyees em where em.salary>(select e .salary from employees e where e.last_name='Oldlu');

 

9.2子查詢中的單行運算符

=        等於

>       大於

>=      大於或等於

<         小於

<=     小於或者等於

<>        不等於

9.2.1示例

查詢oldlu的同事,可是不包含他本身。

  select empl.last_name from employees empl

where empl.department_id=

(select  e.department_id from employees e where e.last_name='oldru')

and empl.last_name<>'Oldlu';

9.3多行子查詢

  操做                     含義

  in                       等於列表中的任何成員

  any                     比較子查詢返回的每一個值

  all                        比較子查詢返回的所有值

 

示例:

查找各個部門收入最低的那些僱員。顯示他們的名字,薪水以及部門id。

select  em.last_name ,em.salary,em.department_Id from employees em where em.salary in(select min(e.salary) from employees group by e.department_id);

10Mysql中的正則表達式

 mysql中容許使用正則表達式定義字符串搜索條件,性能高於like。

mysql中的正則表達式能夠對整數類型或者字符類型檢索。

使用REGEXP關鍵字表示正則匹配。

默認忽略大小寫,若是要區分大小寫,使用BINARY關鍵字

 

10.1正則表達式的模式及含義

 

模式 什麼模式匹配
^ 字符串的開始
$ 字符串的結尾
. 任何單個字符
[...] 在方括號內的任何字符列表
[^...] 非列在方括號內的任何字符
p1|p2|p3 交替匹配任何模式p1,p2或者p3
* 零個或者多個前面的元素
+ 前面的元素的一個或多個實例
{n} 前面的元素的n個實例
{m,n} m到n個實例前面的元素

10.2  ^符號

^在正則表達式中表示開始

 

10.2.1語法

查詢以x開頭的數據(忽略大小寫)

select 列名  from 表名 where 列名  REGEXP '^X';

 

10.2.2示例

查詢僱員表中名字以k開頭的僱員名字與薪水

  • select  name ,salary from emp3 where name regexp BINARY '^k';

10.3'$'符號

10.3.1語法

查詢以x結尾的數據(忽略大小寫)

select 列名 from 表名 where 列名 REGEXP 'x$';

 

10.3.2示例

查詢僱員表中名字以n結尾的僱員名字與薪水。

select   last_name ,salary from employees where last_name REGEXP binary 'n$';

 

10.4'.'符號

10.4.1語法

英文的點,它匹配任何一個字符,包括回車、換行等。

 

select 列名 from 表名 where 列名REGEXP 'x';

 

10.4.2示例

查詢僱員表中名字含有o的 僱員的姓名與薪水。

 

select  last_name,salary  from employees where last_name REGEXP'O.';

10.5「*」符號

10.5.1語法

「*」:星號匹配0個或者多個字符,在它以前必須有內容。

10.6「+」符號

10.6.1語法

「+」:加號匹配1個或者多個字符,在它以前也必須有內容。

select  列名 from  表名  where 列名 REGEXP 'x+';  匹配大於1個的任意字符。

 

10.7「?」符號

「?」:問號匹配0次或者1次

select 列名 from 表名 where 列名 REGEXP 'x?';     匹配0個或者1個字符

 

10.8「|」符號

"|":表示或者含義

select  列名 from 表名 where 列名 REGEXP ‘abc|bcd’ ;     匹配包含abc或者bcd

 

10.8.2示例

查詢僱員表中名字含有ke或者lu的僱員的名字與薪水。

select last_name,salary form employees where last_name REGEXP'ke|lu';

 

10.9"[a-z]"

 

10.9.1語法

「[a-z]」:字符範圍

「^[...]」:以什麼字符開頭的

"[^...]":匹配不包括在[]的字符

select 列名 from 表名 where 列名 REGEXP '[a-z]';  匹配內容包含a-z範圍的數據。

 

10.9.2示例一

查詢僱員表中名字包含x、y、z字符的僱員的名字和薪水。

  select last_name ,salary from employees where last_name regexp '[x-z]';

  select last_name ,salary from employees where last_name regexp 'x|y|z';

10.9.3示例二

查詢僱員名字是t、f開頭的僱員名字與薪水。

select last_name ,salary from employees where last_name regexp '^[t|f]';

10.9.3示例三

查詢僱員的名字與薪水,不包括oldlu.

 

select last_name ,salary from employees where last_name regexp '[^oldlu]';

 

10.10"{n}"

10.10.1語法

「{n}」:固定次數

select * from student where name REGEXP's{2}';----匹配以s連續出現2次的全部的數據

 

10.10.2示例一

    查詢僱員名字含有連續兩個e的僱員的姓名與薪水

    select  last_name,salary from employees where last_name REGEXP'e{2}';

10.10.3示例二

    查詢名字含有兩個o的僱員的名字與薪水。

    select  last_name,salary from employees where last_name REGEXP'o.{2}';

 

10.11"{n,m}"

10.11.1語法

「{n,m}":範圍次數

select * from student where name REGEXP '^s{2,5}';---匹配以s開頭且重複2到5次的全部數據

10.11.2示例

查詢僱員名字中包含1個或者兩個o的僱員姓名與薪水。

select  last_name ,salary from employees where last_name REGEXP 'o.{1,2}';

 

普通索引

是最基本的索引,它沒有任何限制。

在建立索引時,能夠指定索引長度。length爲可選參數,表示索引的長度,只有字符串類型的字段才能指定索引長度,若是是BLOB和TEXT類型,必須指定length。

建立索引時須要注意:

  若是指定單列索引長度,length必須小於這個字段所容許的最大字符個數。

 

查詢索引: show index from  table_name;

 

1.2.1直接建立索引

 create index  index_name on table(column(length))

1.2.1.1示例

爲emp3表中的name建立一個索引,索引名爲emp3_name_index;

   create index emp3_index  on emp3(name);

 

 

1.2.2修改表添加索引

alter table  table_name  add index index_name (column(length))

 

1.2.2.1示例

修改emp3表,爲address列添加索引,索引名爲emp3_address_index

alter table emp3 add index emp3_address_index(address)

 

1.2.3建立表時指定索引列

  create table 'table'(

    column type,

    primary key(id);

    index index_name(column(length))

)

 

1.2.3.1示例

建立emp4表,包含emp_id,name,address列,同時爲name列建立索引。索引名爲emp4_name_index

 

  create table emp4(

    emp_id int primary key auto_increment,

    name  varchar(30),

    address varchar(50),

    index  emp4_name(name)

)

 

1.2.4刪除索引

drop index inde_name  on table

 

 1.2.4.1示例

刪除mep3表中索引名爲emp3_address_index的索引。

  drop index  emp3_address_index on table;

 

 

1.3惟一索引

惟一索引與普通索引相似,不一樣的就是:索引列的值必須惟一,可是容許有空值。它有如下幾種建立方式。

 

1.3.1建立惟一索引

create unique index  indexname  on table(column(length))

1.3.1.1示例

爲emp表中的name建立一個惟一索引,索引名爲emp_name_index

create unique index emp_name_index on emp(name);

 

1.3.2修改表添加惟一索引

alter table table_name add unique indexName(column(length))

1.3.2.1示例

修改emp表,爲address列添加惟一索引,索引名爲emp_address_index

alter table emp add unique emp_salary(salary);

1.3.3建立表時指定惟一索引

 create table table(

  column type,

  primary key(id),

  unique index_name(column(length))

)

1.4主鍵索引

主鍵索引是一種特殊的惟一索引,一個表只能有一個主鍵,不容許有空值。通常是在建表的時候同時建立主鍵索引。

 

1.4.1修改表添加主鍵索引

alter table 表名 add  primary key(列名)

 

 

1.4.1.1示例

修改emp表爲employee_id添加主鍵索引

alter table emp add primary key(employee_id)

1.4.2建立表時指定主鍵索引

 

 

 

1.5組合索引

組合索引是指使用多個字段建立的索引,只有在查詢條件中使用了建立索引時的第一個字段,索引纔會被使用(最左前綴原則)

 

1.5.1最左前綴原則

就是最左優先。

如:咱們使用表中的name,address,salary建立組合索引,那麼想要組合索引生效,咱們只能使用以下組合:

name/address/salary

name/address

name/

若是使用address/salary或者是salary則索引不會生效。

1.5.2修改添加組合索引

alter  table table_name add  index index_name(column(length),column(length))

 

1.5.2.1示例

修改emp6表,爲name,address列建立組合索引

 

alter table emp6 add index  emp6_index_n_a (name,address);

1.5.3建立表時建立組合索引

  create table table(

    column type,

    index index_name(column(length),column(length))

)

 

1.5.3.1示例

建立emp7表,包含emp_id,name,address列,同時爲name,address列建立組合索引。

 

create table emp7(emp_id int  primary key auto_increment ,name varchar(20),address varchar(30),index emp_index7_n_a(name,address))

 

1.6全文索引

  全文索引(FULLTEXT  INDEX)主要用來查找文本中的關鍵字,而不是直接與索引中的值相比較。fulltext索引跟其餘索引不大相同,它更像是一個搜索引擎,而不是簡單的where語句的參數匹配。fulltext索引配合match against 操做使用,而不是通常的where語句加like。

  全文索引能夠從char、varchar或者text列中做爲create table語句的一部分被建立,或是隨後使用alter table 添加。不過切記對於大容量的數據表,生成全文索引是一個很是消耗時間很是消耗硬盤空間的作法。

  1.6.1修改添加全文索引

  alter table table_name add fulltext index_content(content)

  1.6.1.1示例一

  修改emp7表添加content列類型爲text

  alter table emp7 add column contemt text;

  1.6.1.2示例二

  修改emp7,爲content列建立全文索引

  alter table emp7 add fulltext emp_content_fullindex(content)

  1.6.2建立表時建立全文索引。

    create table(

     column type,

    fulltext index_name(column)

  )

1.6.2.1示例

  建立emp8包含emp_id列,content列該列類型爲text,併爲該列添加名爲emp8_content_fulltext的全文索引。

    create table emp8(emp_Id int primary key  auto_increment,

          content text ,

          fulltext emp8_content_fullindex(content))

  1.6.3刪除全文索引

   drop index index_name  on table

   

  alter table table_name drop index index_name;

 

1.6.3示例

刪除emp8表中名爲emp8_content_full的索引

drop index   emp8_cotent_fullindex on emp8

 

1.7使用全文索引

全文索引的使用與其餘索引不一樣。在查詢語句中須要使用match(column)against('content')來檢索數據。

 

1.7.1全文解析器

全文索引中基本單位是「詞」。分詞,全文索引是以詞爲基礎的,mysql默認的分詞是全部非字母和數字的特殊符號都是分詞符。在檢索數據咱們給定的檢索條件也是詞。

 mysql中默認的全文解析器不支持中文分詞。若是數據含有中文須要更換全文解析器NGRAM。

 

1.7.2使用全文索引

select 投影列 from表名 where match(全文列名) against('搜索內容')

 

示例二

向emp8表中插入一條數據content的值爲"hello,bjsxt";

insert into emp8 values(default,"hello bjsxt");

示例三

查詢emp8表中內容包含bjsxt的數據

select * from emp8 where match(content)AGAINST("bjsxt");

 

1.7.3更換全文解析器

在建立全文索引時能夠指定ngram解析器

alter table table_name add fulltext index_content(content) with parser ngram 

 

1.7.3.1示例一

刪除emp8表中的emp8_content_full全文索引

drop index emp8_content_Full on emp8

 

1.7.3.2示例二

修改emp8表,爲content列添加名稱emp8_content_full的全文索引,並指定ngram全文解析器。

  alter table emp8 add fulltext emp8_content_full(content) with parser ngram

1.7.3.3示例三

向emp8表中添加一條數據content 值爲「 你好,詩聖杜甫」

  insert into emp8  values(default,'你好,詩聖杜甫');

1.7.3.4示例四

查詢emp8表中內容包含「詩聖杜甫」

select  * from emp8  where match(content) against('詩聖杜甫');

 

mysql分頁查詢

mysql分頁查詢原則

  • 在mysql數據庫中使用limit子句進行分頁查詢。
  • mysql分頁中開始位置爲0.
  • 分頁子句查詢語句的最後側。

1.limit子句

1.1語法格式

select 投影列from  表名 where  條件 order by limit  開始位置,查詢數量。

1.1.1示例

查詢僱員表中全部數據按id排序,實現分頁查詢,每次返回兩條結果。

 select * from employees order by employees_id limit 0,2;

2.limit offset子句

 2.1語法格式

select  投影列 from  表名 where 條件 ordfer by limit  查詢數量 offset 開始位置。

2.1.1示例

查詢僱員

select * from employees order by employee_id limit 2 offset  0;

 

mysql中的執行計劃

1.mysql執行計劃

在mysql中能夠經過explain關鍵字模擬優化器執行sql語句,從而知道mysql是如何處理sql語句的。

explain select * from employees;

2.mysql整個查詢執行過程

  • 客戶端向mysql服務器發送一條查詢請求
  • 服務器首先檢查查詢緩存,若是命中緩存,則馬上返回存儲在緩存中的結果。不然進入下一階段
  • 服務器進行sql解析、預處理、再由優化器生成對應的執行計劃。
  • mysql根據執行計劃,在調用存儲引擎的api來執行查詢。
  • 將結果返回給客戶端,同時緩存查詢結果。

3.啓動執行計劃

相關文章
相關標籤/搜索