mysql再回首

Mysql与Oracle的区别

1.实例区别

  Mysql是一个轻量型数据库,开源免费。Oracle是收费的而且价格非常高。

  Mysql一个实例可以操作多个库,而Oracle一个实例只能对应一个库。

  Mysql安装完后300M而Oracle有3G左右。

2.操作区别

  主键:Mysql一般使用自动增长类型,而Oracle则需要使用序列对象。

  单引号的处理:mysql里可以用双引号包起字符串,oracle里只可以用单引号包起字符串。

  分页的sql语句:mysql用limit,而oracle使用内建视图和rownum伪列。

  事务处理:mysql默认是自动提交,而oracle默认不自动提交,需要用户CTL语言进行事务提交。

操作Mysql

mysql和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)  将str1、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.启动执行计划

原文地址:https://www.cnblogs.com/wq-9/p/11572350.html