数据库理论

2 篇文章 0 订阅

数据库基本概念解析目录

           1:  什么是数据库

           2:  数据库的种类

           3:  什么是关系型数据库

           4:  什么是非关系型数据库

           5: 关系型数据库存储数据的特点

           6:   MySQL数据库的存储位置及如何更改存储位置

数据库就是服务器提供的N种服务的一种,用来存储数据

1: 数据的存储方式(软件开发过程中的)

1-1: 内存

产生方式: 使用计算机的程序时产生

优势:内存存储/访问数据是最快的(此种存储方式可以用来优化访问速度)

缺点: 数据是临时存储的,程序关闭或PC关机,内存中的数据消失

1-2: 数据库服务器(对数据安全要求较高的机构,例如银行,公安等)

1-3: 第三方的云服务器(研究一下阿里云服务器,主要用来学习使用的云服务器)

阿里云,腾讯云,华为云

开发项目首选第三方云服务器,成本低

2: 数据库服务器(主要用来了解数据库服务器的概念,作用等)

2-1: 数据库服务器是通过一定的形式(有规律的存储,方便后面操作数据)存储数据

2-2: 常见数据库的类别: 关系型数据库,非关系型数据库

3:关系型数据库(主要使用的数据库服务类型,数据之间的关联是操作数据的基础)

3-1: 关系型数据库的逻辑结构

Server                        database             datatable

关系型数据库服务    关系型数据库          数据表       三者之间是一对多的关系

关系型数据库服务是通过安装数据库软件完成的

关系型数据库是关系型数据库服务器提供的服务

数据表是关系型数据库中存储数据的形式

3-2: 关系型数据库中数据表中的数据是行和列的关系

3-3: 常见的关系型数据库:MySQL数据库,

4: MySql数据库(以他为例学习关系型数据库)

4-1: 开源的中小型数据库,可以用于各种操纵系统(mac,linux等)

4-2: MariaDB数据库于MySQl数据相同的使用形式(相同的作者尽心开发的,

       但是MariaDB数据更新快)

4-3: 命令行工具命令

     .exe是可执行文件

     MySQL数据库的启动文件MySQLd.exe文件,位置: MySQL数据库安装目录bin目录下

     MySQL数据库命令

      登录: MySQL.exe -h127.0.0.1 -P3306 -uroot -p

      简写: MySQL -uroot  这种形式因为root用户默认没有密码

      退出: quit

      数据库层: 

       show databases;

       use 数据库名; 进入数据库

       create database 数据库名 charset = utf8; 创建数据库

       drop 数据库名;  删除数据库

       drop database if exists 数据库名; 如果存在指定数据库会删除数据库

4: 非关系型数据库(微信小程序会涉及,使用的越来越多)

7: SQL命令

7-1: 结构化查询语言: 用于操作关系型数据(MySQL数据库是其中一个)操作: CRUD

7-2:SQL命令的执行方式

1: 交互模式:客户端中执行命令, 临时性的操作数据

2: 脚本形式: 客户端中执行,批量的操作数据

   脚本模式的实现方式

   1: 编写SQL命令的文本

   2: 进入shell命令行界面--执行MySQL -Uroot<将SQL脚本拖拽到此处  回车

   3: 脚本命令中注释的命令不在执行,注释的方式 #SQL命令 或者 /* SQL命令

       即: SQL命令的语言规范

  4: 脚本文件存储的文件格式是UTF-8

1:  什么是数据库

          数据库就是存储/管理数据仓库。

2:  数据库的种类以及不同种数据库的常见数据库

        1: 数据库种类:  关系型数据库与 非关系型数据

        2: 常见关系型数据库:       Oracle,Mysql,SqlServer

        3: 常见非关系型数据库:   Hive,Hbase(这两种数据库常用于大数据数据存储)

3:  什么是关系型数据库

          关系型数据库的数据之间关系的属于强耦合关系

4:  什么是非关系型数据库

         非关系型数据库的数据之间的关系属于松散关系

5: 关系型数据库存储数据的特点

        1:关系型数据库以行和列的形式存储数据

        2:关系型数据库这一系列的行和列被称为表,一组表组成了数据库。

        3:  关系型数据库存储的单个数据又叫记录

6:   MySQL数据库的存储位置及如何更改存储位置

        在MySQL安装目录下data目录下的配置文件my.ini中会进行默认配置

数据库事务概念解析目录

          1:  什么是数据库的事务

          2:  数据库事务的特点

          3:  数据库事务的隔离级别

          4:  手动开启/结束MySQL数据库事务的方法

1:  什么是数据库的事务

         1: 数据库事务是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行

             要么完全地不执行

        2:  数据库会自动管理事务,MySQL数据库默认开启事务,每条SQL语句都有一个事务

        3:  数据库事务在 关系型数据库与非关系型数据库都有

2:  数据库事务的特点

      1: 数据库事务的特点(简称为ACiD)

               1:原子性   2:一致性   3:隔离性   4:持久性

      2: 原子性:一个事务中的所有操作要么全部完成, 要么全部不完成

             注意:事务执行过程中如果发生错误,会发生事务回滚(Rollback)

      3: 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏

      4: 隔离性:数据库允许多个并发事务, 隔离性可以防止多个事务并发执行时由于交叉执行而导

                         致数据的不一致。

                         注意:操作数据库的执行者是线程

       5: 持久性:事务处理结束后,对数据的增加/修改/删除就是永久的

3:  数据库事务的隔离级别(4种级别)

      1:读未提交(Read uncommitted) 安全性最差,可能发生并发数据问题,性能最好(不常用)
      2:读提交(read committed) Oracle默认的隔离级别(与MySQL默认级别相比  性能  更好)
      3:可重复读(repeatable read)MySQL默认的隔离级别,安全性较好,性能一般                                                                                  (与 Oracle默认级别相比  安全性  更好)
      4:串行化(Serializable) 表级锁,读写都加锁,效率低下,安全性高,不能并发(不常用)

4:  手动开启/结束MySQL数据库事务的方法

      1:  开启事务的两种方式:start transaction;/begin;   开启事务在执行SQL语句之前开启

      2:  结束事务的两种方式:commit     rollback

      3:   commit   表示提交事务, 提交事务后,对数据库中的新增/修改/删除会永久生效

            rollback  表示事务回滚, 事务回滚到SQL语句执行之前, 即: 对数据库中任何操作都不会生效

数据库中的数据类型目录

           1: 字符 

           2: varchar字符串

           3: 大文本

           4: 数字

           5: 日期

           6: 图片

1: 字符 

       char长度固定,不足使用空格填充,最多容纳2000个字符。                                               

       若知道字符的固定长度,使用char类型,因为查询速度快                                             

2: varchar字符串

         varchar长度不固定,最多容纳4000个字符,                                                     

        varchar(11)存储abc,只占3位。查询稍慢,但节省空间,长度11,存储三位,剩下                         的8个位置不会被占用

3: 大文本

        以utf8编码计算的话,一个汉字在u8下占3个字节

4: 数字

      1:tinyint,int整数类型

      2:float,double小数类型

      3:numberic(5,2) decimal(5,2)—也可以表示小数,表示总共5位, 其中可以有两位小数

      4:decimal和numeric表示精确的整数数字

      特殊点:如果字段的数据类型是int,在创建新表的时候,该字段可不用标明字段长度

5: 日期

      1:date 包含年月日

      2:time时分秒

      3:datetime包含年月日和时分秒

      4:timestamp时间戳,不是日期,而是从1970年1月1日到指定日期的毫秒数

6: 图片

         二进制数据,可以存放图片、声音,容量4g。

         数据库中只存储图片在磁盘中的文件路径

         图片存储在磁盘中

数据库字段命名规则

1:字段名必须以字母开头,尽量不要使用拼音
2:长度不能超过30个字符(不同数据库,不同版本会有不同)
3:不能使用SQL的保留字,如where,order,group
4:只能使用如下字符az、AZ、0~9、$ 等
5:Oracle习惯全大写:USER_NAME,mysql习惯全小写:user_name
6:多个单词用下划线隔开,而非java语言的驼峰规则 

数据库中字段约束解析目录

             1: 什么是字段约束

             2: 字段约束的种类 

             3: 主键约束解析

             4: 非空约束解析 

             5: 唯一约束 

             6:  外键约束(foreign key)

             7:  默认约束 default 默认值

             8:  检查约束 check()

1: 什么是字段约束

         1: 字段约束使用在创建数据表时,对字段属性进行约束

         2: 字段约束的作用:保证输入字段中的数据符合我们的规定

2: 字段约束的种类 

         1: 主键约束   2: 非空约束   3: 唯一约束  4: 外键约束  5: 默认约束   6: 检查约束

3: 主键约束解析

         1:  主键约束的特点:  数据唯一  不能为空

         2:  添加主键约束的语法: primary key auto_increment

         3:  使用主键约束的时间: 创建数据表时

         4:  主键自增策略: 

               1: 表中主键通常是int类型的数据,为了方便维护,设置主键自增

               2: 主键设置主键自增后,主键初始值为1,每添加一条记录,主键自动加一

               3:添加主键的方式:1:SQL语句 ,2:可视化工具的的主键添加

4: 非空约束解析   

         1: 非空约束的特点:  字段值不可为空,可以重复

         2:非空约束的语法:not null                  

5:  唯一约束 
         1:  唯一约束的特点:字段值唯一,可以为空

         2:唯一约束的语法:unique 

6:  外键约束(foreign key)

        1: 外键约束的作用:通过两个表的主键,把两张表关联起来

        2: 外键约束的使用位置:创建子表时,一般在最后一行

        3: 外键约束的语法:foreign key (子表主键名称) references 主表名(主表主键名称)

        特殊点:  1:  若主表中主键字段的某条记录没有,那么子表也不可创建该条记录的关联关系

                      2:  若要删除子表中的记录,需要先删除主表中的关联关系

                      3:若要删除主表,需要先删除子表,否则无法删除

7:  默认约束 default 默认值

        1:  默认约束的概念/作用:给指定字段设置默认值

        2:  默认约束的使用位置: 创建数据表时,在指定字段后添加默认约束

        3: 默认约束的语法:default  默认值 

8:  检查约束 check()

        1:  检查约束的概念:用来检查数据是否合规,且可能因为数据库版本较低会不生效

        2:  检查约束的使用位置:  创建数据表时,一般在最后几行

        3: 检查约束的语法:

                            create table ha(
                                    id int primary key auto_increment,
                                    age int,
                                    check(age > 0 and age <= 100) 
                            );

数据库常用操作解析目录

             1:  创建数据库

             2:  删除数据库

             3:  查看所有数据库

             4:  查看当前数据库

             5:  创建数据表

             6:  删除数据表

             7:  修改数据表

             8:  所有数据 表 的语法

             9:查看单张表的结构:     

1:  创建数据库

       创建数据库语法:create database 数据库名 Default character set utf8; 

       创建数据库语法解析: 

                Default character set utf8的作用:指定新建库的编码格式,防止中文乱码                 

2:  删除数据库

         删库语法:drop database 数据库名;                                                                 

         注意:删除库会把库永久删除,所以需要注意删除操作      

3:  查看所有数据库

         show databases

4:  查看当前数据库

         select database(); 

5:  创建数据表

       第一步: 进入指定数据库  use 数据库名

       第二步: 创建数据表

       创建数据表的语法: 

           drop table if exists 表名;如果表存在则删除

           create table 数据表名(                                                                                                                               字段1名 字段数据类型 字段长度,//第一行通常设置主键                                                                   字段2名 字段数据类型 字段长度    //最后一个字段的字段长度 后不要                                                                                                       加“逗号”                                                                              );

6: 删除数据表

       第一步:  进入指定数据库  use 数据库名

       第二步:  删除数据表

       删除数据表的语法:drop table 数据表名; 

7: 修改数据表           

       第一步:  进入指定数据库  use 数据库名

       第二步:  修改数据表

      修改数据表语法:  alter table 表名 add column 字段名称 字段数据类型( 字段长度)

8:  所有数据 表 的语法:

         show tables;     

9:查看单张表的结构:

          desc 表名;

SQL查询语句中的条件查询解析目录

               1: 查询语句中的条件查询关键字

               2: where关键字解析

               3: like关键字解析

               4: limit关键字解析 

               5: order by关键字解析

               6: between and关键字解析

               7: null关键字解析

               8: distinct关键字解析

               9: group by 关键字

             10: 同一个查询语句中出现多个查询关键字如何处理

1: 查询语句中条件查询的关键字  

         查询语句中条件查询关键字一共有7个

         分别是  1: where  2: like  3: limit  4: order by  5: between and 6: null 7: distinct

2: where关键字解析

      1: where 关键字用来过滤数据

             使用where关键字,进行过滤数据

      2: 语法案例: select * from dept where deptno = 1   

              查询dept表中deptno字段等于1的所有数据

      3: Where关键字中SQL查询语句的执行顺序:

              第一步:确定查询那个表  第二步:确定过滤条件   第三步:确定查询那个字段

      注意:   1:  Where关键字后的过滤条件不能使用列别名

                  2:一条查询语句中只能有一个where关键字,并列的过滤条件之间用and连接

                            或者关系的过滤条件之间用 or 连接,这种过滤条件的个数没有限制

3: like关键字解析

       1:  like是模糊查询的关键字

       2:  模糊查询的种类:

                1:select * from dept where dname like  "o%"

                2:select * from dept where dname like  "%o"

                3:select * from dept where dname like  "o%o"

       注意:1:%是通配符也叫占位符,通配符%代表0到n个字符,                                                                          通配符下划线_代表1个  字符

                  2: "%o",以o结尾的数据  , "o%",以o开头的数据 ,                                                                          "%o%"数据中有o就行的数据

                  3:模糊查询的数据没有等号 where dname like  "%o"

                  4:使用模糊查询需要配合where关键字进行使用

4: limit关键字解析 

       1:  limit是分页查询的关键字,用来限制分页查询后,每页的记录数

       2:  分页查询的SQL语句

               1:select * from emp  limit 2;取指定表中的前两条数据

               2:select * from emp  limit 2,3;从表中第三条记录开始,取3条数据

       注意:1:当limit有两个参数时,第一个参数是开始位置,第二个参数分页后每页的记录个数

                        第一个参数的起点是0,

                  2:分页技术与过滤条件配合使用时,先使用过滤条件,在使用分页技术

                         原因:是SQL语句的执行顺序决定的

                  3:若有查询语句中有多个关键字,分页技术一般在查询语句的最后,且与前面的   

                        关键字之间不使用任何符号,空格隔开即可

5: order by关键字解析

    1:  order  by 是进行排序的关键字

    2:  排序的种类 1:升序(默认是升序) 2:降序

         select * from emp order by 字段名

6: between and关键字解析

       1:  between  and  是用来查询指定字段的指定区间的关键字

       2:  SQL语句案例:   select * from emp where sal between 5000 and 10000

                      解析:1:需要配合where关键字进行使用

                                 2:包含指定区间的边界,即:指定的区间包括5000,10000     

7: null关键字解析

        1: 使用null的种类:1:is null  2:is not null

                select * from emp where comm is null

                select * from emp where comm is not null

        2: 解析:1:null 使用时使用 is 来联系与字段之间的关系,而不是等号

                       2:配合Where 关键字进行使用,只能配合where关键字进行使用吗? 

8: distinct关键字解析

        1: distinct是去重关键字,作用是: 去除重复的记录行

        2: 解析:select DISTINCT loc from dept                                                                         

        特殊点:1:顺序不可乱即:关键字在前,指定字段在后                                                                                2:关键后跟指定字段名,多个字段用逗号隔开 

9:  group by 关键字

        1: group by 是分组关键字

        2:  如果查询的数据需要分类分别,且查询时出现聚合列和非聚合列

              通常按照非聚合列进行分组

        3:  什么是聚合列: 就是聚合函数参数中的列

        4:  查询语句中的 group by 与 where/having 的组合使用

              1:  group by 与 where 同时使用时,where 表示的过滤条件在前group by 分组操作在后,

                   即先过滤在分组:相对高效

                   注意:group by 与 where 同时使用时,where后不可使用聚合函数

              2:  group by和 having 的同时使用时,having表示的过滤条件在后group by 分组操作在前,

                   即先分组在过滤:相对低效

                   注意:过滤条件中使用聚合函数 ,必须使用group by与having 的组合

              3:group by ,where,having 三者可以同时使用

                   顺序是:where 普通过滤条件  group by 分组的标准  having 使用聚合函数的过滤条件

10: 同一个查询语句中出现多个查询关键字如何处理

       1:不同关键字代表不同过滤条件,不同的关键字之间用空格隔开即可      

       2:在同一条查询语句中使用不同关键字时,不同关键字之间的执行顺序不一样,

                              此时需要考虑使用关键字的顺序

SQL语句中函数解析目录

            1:  SQL语句中函数的种类

            2:  SQL语句中基础函数

            3:  SQL语句中聚合函数

            4: SQL语句中出现聚合函数的处理方式

1:  SQL语句中函数的种类

        SQL语句中函数的种类:1:基础函数 2:聚合函数

        函数使用的位置:使用在SQL查询语句中

         SQL语句中函数的参数就是指定字段名

2:  SQL语句中基础函数(11种基础函数)

        1: 使用基础函数的语法:  select  查询的指定字段,基础函数(基础函数的参数)from 表名

        2: 基础函数名称及作用

                  1:lower--将指定字段的数据转小写,并显示查询结果

                         语法: select 'ABC',lower('ABC') from dept;

                  2:upper--将指定字段的数据转大写,并显示查询结果

                  3:length--数据的长度                                                                                   

                        注意:底层使用了UTF-8编码,一个字母占一个字节,一个汉字占三个字节

                  4:subst---截取指定字段后的值

                            substr(dname,3):截取Dname字段的值,从第三个字符开始截取,截取到最后

                            substr(dname,3,5):截取Dname字段的值,从第三个字符开始截取,截取到     

                                                             第5个字符,头尾都包含

                  5:concat---指定字段后追加指定字符

                          concat(指定字段,拼接的字符),该方式是在指定字段后直接拼接             

                  6:replace--替换指定字段的指定字符

                           replace(指定字段,指定字段中被替换的字符,用来替换的字符)

                  7:ifnull---如果指定字段中有null值,就替换指定值                     

                           ifnull(comm,10),如果comm字段中有null的数据,就替换成10

                  8:round & ceil & floor---对于小数的处理

                           round四舍五入,ceil向上取整,floor向下取整

                         1: round(指定字段名)四舍五入  

                                round(指定字段名,1)四舍五入并保留一位小数   

                         2:ceil(字段名)向上取整,  floor(字段名)向下取整

                               向上取整就是舍掉小数,不管小数部分是多少,得数=原来的数的整数部分+1

                               向下取整就是舍掉小数,不管小数部分是多少,得数=原来的数的整数部分

                   9:uuid():返回UUID

                               SELECT UUID()

                  10:时间函数

                        1: select now() -- 年与日 时分秒                                                                             

                        2: select curdate() --年月日                                                                                     

                        3: select curtime() --时分秒                                                                                     

                        4:    查询具体的年/月/日/时/分/秒的函数
                               year() & month() & day() & hour() & minute() & second()

                        5: select now(),year(now()),month(now()),day(now()) from emp ;                     

                               是查询现在时间 对应的 单独的 年月日

                        6: select now(),hour(now()),minute(now()),second(now()) from emp ;               

                               是查询现在时间 对应的 单独的 时分秒

                          总结:查询单独的年月日时分秒,需要使用组合函数,例 year(now())

                   11:转义字符

                           反斜杠 (\) 表示转译的作用 

                           即: 将SQL语句中有特殊作用的符号转译为符号本身

3:  SQL语句中聚合函数(5种)

             1:  聚合函数的种类:1:max最大值,2:min 最小值,3:sum 求和,                                                                              4:avg 平均数,5:count  个数

              1:max()最大值 / min()最小值

                     解析:select max(sal), min(sal) from emp --求指定字段的最大值/最小值

              2:sum() 求和/avg() 平均数

                     解析:select sum(sal), avg(sal) from emp --求指定字段的总和/平均值

              3:count()个数             
                       1:select count(*) from emp --低效                                                                                                             作用:查询指定表中的记录的个数

                       2:select count(1) from emp --效果和*一样,但比*高效,查询个数最常使用的形式                                   作用:查询指定表中的记录的个数

                       3:select count(comm) from emp --慢,只统计非NULL的                                                                             作用:根据字段名查询指定表中的记录的个数

4: SQL语句中出现聚合函数且需要分组的处理方式

         1:  如果查询的数据需要分类分别,且查询时出现聚合列和非聚合列

              通常按照非聚合列进行分组

         2:  什么是聚合列: 就是聚合函数参数中的列

         3:  查询语句中的 group by 与 where/having 的组合使用

              1:  group by 与 where 同时使用时,where 表示的过滤条件在前group by 分组操作在后,

                   即先过滤在分组:相对高效

                   注意:group by 与 where 同时使用时,where后不可使用聚合函数

              2:  group by和 having 的同时使用时,having表示的过滤条件在后group by 分组操作在前,

                   即先分组在过滤:相对低效

                   注意:过滤条件中使用聚合函数 ,必须使用group by与having 的组合

              3:group by ,where,having 三者可以同时使用

                   顺序是:where 普通过滤条件  group by 分组的标准  having 使用聚合函数的过滤条件

SQL的执行顺序,由上往下 执行次序依次靠后
(1) FROM [left_table] 选择表
 
(2) ON <join_condition> 链接条件
 
(3) <join_type> JOIN <right_table> 链接
 
(4) WHERE <where_condition> 条件过滤
 
(5) GROUP BY <group_by_list> 分组
 
(6) AGG_FUNC(column or expression),... 聚合
 
(7) HAVING <having_condition> 分组过滤
 
(8) SELECT (9) DISTINCT column,... 选择字段、去重
 
(9) ORDER BY <order_by_list> 排序
 
(10) LIMIT count OFFSET count; 分页

常见的SQL语句优化

1:查询SQL语句中查询具体字段,尽量不要使用  * 
      使用 * 可能不会使用索引进行查询
2:避免在where过滤条件中使用or来连接过滤条件
      使用or可能会使索引失效,从而全表扫描
3:  数据库的字符串类型数据尽量使用varchar,不使用char
       varchar是可变字符串,会根据数据实际长度进行存储数据,不会浪费空间
4:  尽量使用数值替代字符串类型,可以提高查询效率
5:  查询尽量避免返回大量数据
     查询返回数据量很大,就会造成查询时间过长,网络传输时间过长。
     如若返回数据很多,通常采用分页查询的方式
6:  使用索引指令 explain,查看SQL语句是否最优
7:  优化模糊查询,模糊查询SQL可能会使索引失效
     优化方式: 尽量使用以什么为开头的模糊查询
8:  优化索引,优化方式: 索引表中索引个数不要超过5个
     索引的本质是一个数据表,索引每次进行修改/删除/增加都会更新索引表,若个数很多,会消耗大量的时间和资源
     索引不适合建在有大量重复数据的字段
9:  限定where过滤条件的个数, 避免返回无用的数据
10: 避免在where过滤条件中使用字段表达式操作/<>/!=不等于操作符
       可能会时索引失效
11: 尽量进行批量插入操作,MySQL独有的,可以增加插入SQL语句的效率
12: 删除数据多,采用分批删除的方式,若一次删除数据过多,可能会造成锁表
13: 进行多表联查时,数据表的个数不要超过3个,若数据表个数过多,效率十分低
 


数据库最费劲的就是程序链接的释放。
假设链接了两次,每次做上百万次的数据集查询,查完就结束,
这样就只做了两次;相反建立了上百万次链接,申请链接释放反复重复,
就会额外花费很多实际,这样系统就受不了了,慢,卡顿
尽量使用union all替代union

union和union all的区别是,union会自动去掉多个结果集合中的重复结果,而union all则将所有的结果全部显示出来,不管是不是重复
union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序
union在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION

数据库索引解析目录

             1:  什么是索引

             2:  索引的种类

             3:  创建索引的方法

             4:  查看索引的语法

             5:  删除索引的语法

             6:  使用索引的语法

             7:  索引的优缺点

1:  什么是索引

       1:  索引是一种排好序的快速查找的数据结构,它帮助数据库高效的进行数据的检索。

       2:  索引本身是一张表, 索引表保存了主键与索引字段,并指向实体表的记录

             目前索引都采用BTree树方式构建

       3:  索引是数据库的优化

2:  索引的种类

      1:  单值索引:一个索引只包括一个列,一个表可以有多个列   

      2:  唯一索引:唯一索引只包含一个列,唯一索引列的值要求必须唯一,但允许为为空         

                             注意:主键会自动创建唯一索引

      3:复合索引:一个索引同时包括多列

3:  创建索引的语法

      1:创建普通索引语法:create index 索引名  on 表名(字段名);

          语法翻译成:给指定表中的指定字段创建普通索引

          索引名的通常命名规则:字段名_index

     2:创建唯一索引语法:alter table 表名 add unique(指定字段名)

           要求:唯一索引要求指定字段中的记录不可重复,可以为空

           语法翻译成:给指定表中的指定字段创建唯一索引

     3:创建复合索引语法:alter table 表名 add index fuhe(指定字段名1,指定字段名2,  等)

             1:复合索引的最左特性,除了最左边的字段,其他字段的索引特效可能会失效

             2:最左特性:最左特性只针对复合索引

                                       因为最左特性,复合索引有可能失效,失效的表现形式:在查询时如果没                                         有使用最左边的字段,索引加速查询的效果可能失效

                                 3:创建复合索引时,有几个字段就会创建几个索引,并不是创建了一个索                                             引,且这几个字段单独的索引之间有关联关系

     4:创建复合唯一索引语法:alter table 表名 add index fuhe(指定字段名1,指定字段名2,等)

4:  查看索引的语法

         show index from 表名;      会展示指定表中创建好的所有索引 

5:  删除索引的语法

         alter table 表名 drop index 索引名

6:  使用索引的语法

        1:  使用索引的位置: 查询SQL语句之前

        2:  使用索引的指令:  explain

        3:  使用索引的语法案例

                         explain
                         select dname from dept; 

                  注意:explain后没有分号,

                  作用:1:使用这种方式可以用来检验索引有无生效

                             2:如果使用了索引,可以看到使用的索引的信息

        4: 使用索引关键字后返回的type的含义

               1:  ALL 全表扫描,没有优化,最慢的方式

               2: index 索引全扫描

               3: range 索引范围扫描,常用语<,<=,>=,between等操作

               4: ref 使用非唯一索引扫描或唯一索引前缀扫描,返回单条记录,常出现在关联查询中

               5:  eq_ref 类似ref,区别在于使用的是唯一索引,使用主键的关联查询
7:  索引的优缺点

7.1: 索引的优点

         1:  索引事先对数据进行了排序,所以极大提高了查询效率

         2:  大量降低数据库的IO磁盘读写成本,极大提高了检索速度

7.2: 索引的缺点

         1:  索引是一张表,所以需要占用空间, 索引占用空间较多,

              所以索引一般以文件的形式存放在磁盘中。

         2:  索引表中的内容与业务表中的部分数据是重复,浪费空间

         3:  数据量大的前提下, 索引提高了查询的速度

              但是如果对数据库中的记录进行增、删、改的操作后,需要更新索引表

              更新索引表会耗费大量时间

数据库中多表联查的目录:

          1:  表的关联关系的种类

          2:  什么是多表联查

          3:  多表联查的方式

          4:  笛卡尔积方式解析

          5:  join方式解析

          6: 子查询的方式解析

          7:  多表联查的缺点

1:  表的关联关系的种类

       表关联概念:表与表之间的关联关系

       表与表的关系分为四种:

              1:一对一 one to one QQ和QQ邮箱,员工和员工编号
              2:一对多 one to many 最常见,部门和员工,用户和订单
              3:多对一 many to one 一对多反过来,员工和部门,订单和用户
              4:多对多 many to many 老师和学生,老师和课程

2:  什么是多表联查 

            多变联查是指基于两个和两个以上的表的查询,并把数据展示出来

            注意:  多表联查也可使用过滤条件进行过滤数据,过滤条件使用的两张表中相同字段

3:  多表联查的方式

         1:笛卡尔积 

         2:join的方式,内连接,左连接,右连接 

         3:子查询方式

4:  笛卡尔积方式解析

        1: 什么是笛卡尔积

               将两个及以上的表数据都拼接起来,查询指定字段信息

               笛卡尔积又称直积,一般笛卡尔积没有实际的业务意义,但多表查询都是先生成笛卡尔积,

               再进行数据的筛选过滤

       2: 笛卡尔积的语法

              笛卡尔积的语法:select * from 表1名称,表2名称,表**名名称 过滤条件

               例:1,基本结构SELECT * from dept,emp;

                      2,添加过滤条件1:select * from dept,emp where dept.deptno = emp.deptno;

               注意:1,笛卡尔积的方式,查询的多个表之间用逗号隔开,

                          2,多表联查与单表查语法一样,两张表的关联关系用where来表示

                          3,过滤条件中,两张表的字段进行关联关系,需要具体表的具体字段

                                且具体的字段是两张表都有的字段

5:  join方式解析

        1: join方式的种类

                  1:内连接:    inner join(inner 可以不写,默认就是inner)

                  2:外连接:   1:左连接,left join(左连接最常使用)

                                       2:右连接,right join

        2: join方式不同种类的区别

                 1:内连接 , inner join:取左右两个表中,都满足了条件的记录

                                  即:INNER JOIN两边都对应有记录的才展示,其他去掉

                  2:左连接,left join:取 左 表中的所有记录  和  右 表满足了条件的记录 

                                                            其中  右  表中不满足条件的记录用null填充

                              解析:右表不满足的条件的记录是指左表中的记录按照关联条件进行取                                                      值,左表有的关联条件,右表没有

                  3:右连接,right join:取 右 表中的所有记录 和 左 表满足了条件的记录 

                                                            其中 左表中不满足条件的记录用null填充

        3:  join方式的语法结构

                    select * from   表1名称    join    表2名称   on 两张表的关联条件 where 过滤条件

                    例:select dept.dname from emp join dept                                                                                                on dept.deptno =  emp.deptno                                                                                                            where emp.ename = "jack" 

                     解析:该语句的执行顺序  1:先进入from后的第一个表                                                                                                              2:在按照 on 后的关联关系确定 join 后面表 要查询的字段                                                                3:进入 join 后面的表并查询确定好的关联关系                                                                                4:按照过滤条件进行过滤                                                                                                                  5:显示查询结果

                                 该语句结构解析:1:from 后的结构就是有那些表

                                                              2:on 后的结构就是两张表的关联关系

                                                              3:where 后的结构因为过滤条件不同,所以不固定     

6: 子查询的方式解析

       1: 什么是子查询

                子查询又叫嵌套查询,是普通查询语句的嵌套

       2: 子查询的步骤:1:先根据过滤条件查出两张表的对应关联条件的记录

                                    2:将第一步查询的结果作为过滤条件,进行查询最终的结果

        3: 案例:列出research部门的所有员工的信息?

                      子查询第一步:select  deptno from dept where dname = "research"

                      子查询第二步:select * from  emp where deptno = (子查询第一步的代码/子查询第

                                                一步返回的数据)

                       注意:若子查询第一步返回的数据超过 1 行,子查询第二步接收子查询第一步返回                                    的数据应该使用  in ,而不是等号

7:  多表联查的缺点

          使用多表联查进行查询时,会在内存中先构建一个结果集,然后再进行数据的过滤。

          这个结果集构建过程和所使用的内存资源,包括过滤时的判断,都是既耗费资源,又浪费时

          间的, 所以尽量不使用多表联查


                

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hello HiGoodSir

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值