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.启动执行计划