zoukankan      html  css  js  c++  java
  • 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.启动执行计划

  • 相关阅读:
    Get-CrmSetting返回Unable to connect to the remote server的解决办法
    Dynamics 365中的常用Associate和Disassociate消息汇总
    Dynamics 365 Customer Engagement V9 活动源功能报错的解决方法
    Dynamics Customer Engagement V9版本配置面向Internet的部署时候下一步按钮不可点击的解决办法
    Dynamics 365检查工作流、SDK插件步骤是否选中运行成功后自动删除系统作业记录
    注意,更改团队所属业务部门用Update消息无效!
    Dynamics 365的审核日志分区删除超时报错怎么办?
    Dynamics 365使用Execute Multiple Request删除系统作业实体记录
    Dynamics 365的系统作业实体记录增长太快怎么回事?
    Dynamics CRM日期字段查询使用时分秒的方法
  • 原文地址:https://www.cnblogs.com/wq-9/p/11572350.html
Copyright © 2011-2022 走看看