子查询,mysql索引,权限,搜索引擎,范式(036)

一.子查询

       1. 可以将子查询放在许多的 SQL 子句中,包括:

           WHERE 子句• HAVING 子句

            FROM 子句

        2使用子查询的原则

            子查询放在圆括号中。

            将子查询放在比较条件的右边。

             在单行子查询中用单行运算符,在多行子查询中用多行运算符。

                示例

                    谁的薪水比 Oldlu 高

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

            单行子查询

            示例

            查询 Oldlu 的同事,但是不包含他自己。

            select empl.last_name from employees empl where empl.department_id = (select

e.department_id from employees e where e.last_name = 'Oldlu') and empl.last_name <>   'Oldlu'

          多行子查询

        示例

        查找各部门收入为部门最低的那些雇员。显示他们的名字,薪水以及部门 ID。

        select em.last_name,em.salary,em.department_id from employees em where em.salary

        in(select min(e.salary) from employees e group by e.department_id) 

二.正则表达式

        1.规则

• MySQL 中允许使用正则表达式定义字符串的搜索条件,性能要高于 like。

• MySQL 中的正则表达式可以对整数类型或者字符类型检索。

• 使用 REGEXP 关键字表示正则匹配。

• 默认忽略大小写,如果要区分大小写,使用 BINARY 关键字

        2“^”符号

            ^在正则表达式中表示开

             查询以 x 开头的数据(忽略大小写)

            SELECT 列名 FROM 表名 WHERE 列名 REGEXP '^x';

            示例

            查询雇员表中名字是以 k 开头的雇员名字与薪水。

            select last_name,salary from employees where last_name REGEXP binary '^K'

        3“$”符号

            查询以 x 结尾的数据(忽略大小写)

            SELECT 列名 FROM 表名 WHERE 列名 REGEXP 'x$';

             示例

            查询雇员表中名字是以 n 结尾的雇员名字与薪水。

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

       4. “.”符号 

            英文的点,它匹配任何一个字符,包括回车、换行等。

            SELECT 列名 FROM 表名 WHERE 列名 REGEXP 'x.';

             示例

            查询雇员表中名字含有 o 的雇员的姓名与薪水。

            select last_name,salary from employees where last_name REGEXP 'o.'

    5.  “*”符号 

        “*”:星号匹配 0 个或多个字符,在它之前必须有内容。10.6“+”符号 

    6. "+":加号匹配 1 个或多个字符,在它之前也必须有内容。

        SELECT 列名 FROM 表名 WHERE 列名 REGEXP 'x+';-匹配大于 1 个的任意字符

    .7“?”符号 

        “?”:问号匹配 0 次或 1 次。

        SELECT 列名 FROM 表名 WHERE 列名 REGEXP 'x?';-匹配 0 个或 1 个字符

     8.“|”符号 

            “|”:表示或者含义

            SELECT 列名 FROM 表名 WHERE 列名 REGEXP 'abc|bcd';-匹配包含 abc 或 bcd


            查询雇员表中名字含有 ke 或者 lu 的雇员的名字与薪水。

            select last_name,salary from employees where last_name REGEXP 'ke|lu'

            9“[a-z]” 

            “[a-z]”:字符范围

            “^[....]”:以什么字符开头的

            “[^....]”:匹配不包含在[]的字符

            SELECT 列名 FROM 表名 WHERE 列名 REGEXP '[a-z]';-匹配内容包含 a-z 范围的数 

        10 “{n}”


            “{n}”:固定次数。

            select * from student where name REGEXP 's{2}';--匹配以 s 连续出现 2 次的所有数据 

            查询雇员名字含有连续两个 e 的雇员的姓名与薪水

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

三.MySQL 数据库存储引擎

1.查看数据库引擎

    SHOW ENGINES

2.innodb 与 myisam 区别

1. InnoDB 支持事务,MyISAM 不支持,对于 InnoDB 每一条 SQL 语言都默认封装成事

务,自动提交,这样会影响速度,所以最好把多条 SQL 语言放在 begin 和 commit 之间,组

成一个事务;

2. InnoDB 支持外键,而 MyISAM 不支持。对一个包含外键的 InnoDB 表转为 MYISAM

会失败;

3. InnoDB 是聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引

效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,

主键不应该过大,因为主键太大,其他索引也都会很大。而 MyISAM 是非聚集索引,数据

文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。

4. InnoDB 不保存表的具体行数,执行 select count(*) from table 时需要全表扫描。而

MyISAM 用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度

很快;

5. Innodb 不支持全文索引,而 MyISAM 支持全文索引,查询效率上 MyISAM 要高;(在

MySQL5.7 版本中已经支持全文索引)

----------------------------------------------------------------------------------------------------------------------

一.索引的类型

普通索引,唯一索引,主键索引,组合索

引,全文索引。

二.普通索引

1.是基本的索引,没有任何限制

2.创建索引是,可以指定索引的长度。length为可选参数,表示所有的长度,只有字符串类型的字段才能指定索引的长度,如果是 BLOB 和 TEXT 类型,必须指定 length。

3.直接创建索引

create index 索引名 on 表名(列名

[长度])

4.修改表添加索引

alter table 索引名 add index 表名

(列名[长度])

5.创建表时指定索引列

create table 表名(

列名 类型,

index 索引名 (列名[长度])

6.删除索引

drop index 索引名 on 表名

三.唯一索引

1.唯一索引与普通索引类似,不同的就

是:索引列的值必须唯一,但允许有空

值。

2.直接创建唯一索引

create unique index 索引名 on 表名

(列名[长度])

3.修改表是添加唯一索引

alter table 表名 add unique index

索引名(列名[长度])

4.创建表时指定索引列

create table 表名(

列名 类型,

unique index 索引名 (列名[长度])

四.主键索引

创建一个主键

五.组合索引

1.组合索引是指使用多个字段创建的索

引,只有在查询条件中使用了创建索引

时的第一个字段,索引才会被使用(最左

前缀原则)。

2.最左前缀原则

最左边的优先。如果跳过最左边的,直

接进行第二个就无效。

3.修改添加组合索引

alter table 表名 add index 索引名

(列1[长度],列2[长度])

4.创建时创建组合索引

create table 表名(

列名 类型,

index 索引名(列1[长度],列2[长度])

六.全文索引

1.查找文本中的关键字,不是直接与索引

的值相比较,想是一个搜索引擎,配合

match,against使用。

2.修改添加全文索引

alter table 表名 add fulltext 索引

名(列名)

3.创建时创建全文检索

create table 表名(

列名 类型,

fulltext 索引名(列))

4.删除全文检索

drop index 索引名 on 表名

或者

alter table 表名 drop index 索引名

5.使用全文索引

select 列名 from 表名 where

match(全文索引列名) against('搜

索内容')

实列:

(1)创建全文索引

修改 emp8 表,为 content 列创建名

为 emp8_content_full 的全文索引

alter table emp8 add fulltext

emp8_content_full(content)

(2)插入数据

向 emp8 表中插入一条数据 content

的值为”hello,bjsxt”

insert into emp8 values(default ,

'hello bjsxt')

(3)查询

查询 emp8 表中内容包含 bjsxt 的数

据。

select * from emp8 where match

(content) against('bjsxt')

6.全文解析器

全文索引中基本单位是”词”。分词,

全文索引是以词为基础的,MySQL 默认

的分词是所有非字母和数字的特殊符号

都是分词符。在检索数据时我们给定的

检索条件也是词。

MySQL 中默认的全文解析器不支持中文

分词。如果数据含有中文需要更换全文

解析器NGRAM。

7.更换全文解析器

创建指定ngram解析器,此解析器不用分

词,搜索时可以匹配内容中的任何内容

alter table 表名 add fulltext 索

引名(列) with parser ngram

实列:

向 emp8 表中添加一条数据 content 值

为”你好,北京尚学堂”:

insert into emp8 values(default ,

'你好,北京尚学堂')

查询 emp8 表中内容包含”北京尚学

堂”的数据

select * from emp8 where match

(content) AGAINST('北京尚学堂')

------------------------------------------------------------------------------------------------------

一.mysql用户

root是超级管理员,由root创建的是普通用

户。

二用户管理

1.创建用户

create user 用户名 identified by '密

码'

2.查看用户

select user,host from mysql.用户名

3.分配权限

GRANT 权限 ON 数据库.表 TO 用户名@登

录主机 IDENTIFIED BY "密码"

GRANT ALL PRIVILEGES ON *.* TO

'username'@'localhost' IDENTIFIED BY

'password'

登陆主机:% 匹配所有主机

localhost localhost 不会被解析成 IP

地址,直接通过 UNIXsocket 连接

127.0.0.1 会通过 TCP/IP 协议连接,并

且只能在本机访问;

::1 ::1 就是兼容支持 ipv6 的,表示同

ipv4 的 127.0.0.1

3.权限列表

ALTER: 修改表和索引。

CREATE: 创建数据库和表。

DELETE: 删除表中已有的记录。

DROP: 删除数据库和表。

INDEX: 创建或删除索引。

INSERT: 向表中插入新行。

SELECT: 检索表中的记录。

UPDATE: 修改现存表记录。

FILE: 读或写服务器上的文件。

PROCESS: 查看服务器中执行的线程信息或杀死线程。

RELOAD: 重载授权表或清空日志、主机缓存或表缓存。

SHUTDOWN: 关闭服务器。

ALL: 所有权限,ALL PRIVILEGES 同义词。

USAGE: 特殊的 "无权限" 权限

6.刷新权限

每当调整权限后,通常需要执行以下语句

刷新权限

FLUSH PRIVILEGES

7.删除权限

DROP USER username@localhost

三.limit

1.语法格式

select 列 from 表名 where 条件 order

by limit 起始位置,查询数量。

实列:

查询雇员表中所有数据按 id 排序,实现

分页查询,每次返回两条结果。

select * from employees order by

employees_id limit 0,2

2.limit offset

select 列 from 表名 where 条件 order

by limit 查询数量 offset 起始位置。

实列:

查询雇员表中所有数据按 id 排序,使用

LIMIT OFFSET 实现分页查询,每次返回两

条结果。

select * from employees order by

employees_id limit 2 offset 4

你可能感兴趣的:(子查询,mysql索引,权限,搜索引擎,范式(036))