• 数据库小知识


    数据库管理软件分类

    mysql就是一个基于socket编写的C/S架构的软件
    分两大类:
      关系型:如sqllite,db2,oracle,access,sql server,MySQL,注意:sql语句通用
      非关系型:mongodb,redis,memcache
    
    总结两句话:
        关系型数据库需要有表结构
        非关系型数据库是key-value存储的,没有表结构

    存储引擎

    数据库中的表也应该有不同的类型,表的类型不同,会对应mysql不同的存取机制,表类型又称为存储引擎。
    
    ps: 存储引擎说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。因为在关系数据库中数据的存储是以表的形式存储的,
    所以存储引擎也可以称为表类型(即存储和操作此表的类型) 在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的。而MySql 数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据 自己的需要编写自己的存储引擎

    单表查询注意点

    where约束

    where子句中可以使用
    1.比较运算符:>、<、>=、<=、<>、!=
    2.between 80 and 100 :值在80到100之间
    3.in(80,90,100)值是10或20或30
    4.like 'xiaomagepattern': pattern可以是%或者_。%小时任意多字符,_表示一个字符
    5.逻辑运算符:在多个条件直接可以使用逻辑运算符 and or not

    group by 分组查询

    #1、首先明确一点:分组发生在where之后,即分组是基于where之后得到的记录而进行的
    
    #2、分组指的是:将所有记录按照某个相同字段进行归类,比如针对员工信息表的职位分组,或者按照性别进行分组等
    
    #3、为何要分组呢?
        取每个部门的最高工资
        取每个部门的员工数
        取男人数和女人数
    
    小窍门:‘每’这个字后面的字段,就是我们分组的依据
    
    #4、大前提:
        可以按照任意字段分组,但是分组完毕后,比如group by post,只能查看post字段,如果想查看组内信息,需要借助于聚合函数

    继续验证通过group by分组之后,只能查看当前字段,如果想查看组内信息,需要借助于聚合函数

    聚合函数

    max()求最大值
    min()求最小值
    avg()求平均值
    sum() 求和
    count() 求总个数
    
    #强调:聚合函数聚合的是组的内容,若是没有分组,则默认一组
    # 每个部门有多少个员工
    select post,count(id) from employee group by post;
    # 每个部门的最高薪水
    select post,max(salary) from employee group by post;
    # 每个部门的最低薪水
    select post,min(salary) from employee group by post;
    # 每个部门的平均薪水
    select post,avg(salary) from employee group by post;
    # 每个部门的所有薪水
    select post,sum(age) from employee group by post;

    HAVING过滤

    HAVING与WHERE不一样的地方在于
    
    #!!!执行优先级从高到低:where > group by > having 
    #1. Where 发生在分组group by之前,因而Where中可以有任意字段,但是绝对不能使用聚合函数。
    
    #2. Having发生在分组group by之后,因而Having中可以使用分组的字段,无法直接取到其他字段,可以使用聚合函数

    order by 查询排序

    按单列排序
        SELECT * FROM employee ORDER BY age;
        SELECT * FROM employee ORDER BY age ASC;
        SELECT * FROM employee ORDER BY age DESC;
    按多列排序:先按照age升序排序,如果年纪相同,则按照id降序
        SELECT * from employee
            ORDER BY age ASC,
            id DESC;

    limit  限制查询的记录数

    示例:
        SELECT * FROM employee ORDER BY salary DESC 
         LIMIT 3;                    #默认初始位置为0 
    
        SELECT * FROM employee ORDER BY salary DESC
            LIMIT 0,5; #从第0开始,即先查询出第一条,然后包含这一条在内往后查5条
    
        SELECT * FROM employee ORDER BY salary DESC
            LIMIT 5,5; #从第5开始,即先查询出第6条,然后包含这一条在内往后查5条

    多表查询

    语法:

    SELECT 字段列表
        FROM 表1 INNER|LEFT|RIGHT JOIN 表2
        ON 表1.字段 = 表2.字段;

    inner join

    内连接:只连接匹配的行

    找两张表共有的部分,相当于利用条件从笛卡尔积结果中筛选出了匹配的结果

    left join

    外链接之左连接:优先显示左表全部记录

    本质就是:在内连接的基础上增加左边有,右边没有的结果

    right join

    外链接之右连接:优先显示右表全部记录

    本质就是:在内连接的基础上增加右边有,左边没有的结果

    子查询

    #1:子查询是将一个查询语句嵌套在另一个查询语句中。
    #2:内层查询语句的查询结果,可以为外层查询语句提供查询条件。
    #3:子查询中可以包含:IN、NOT IN、ANY、ALL、EXISTS 和 NOT EXISTS等关键字
    #4:还可以包含比较运算符:= 、 !=、> 、<等

    命中索引

    - like '%xx'
                select * from userinfo where name like '%al';
            - 使用函数
                select * from userinfo where reverse(name) = 'alex333';
            - or
                select * from userinfo where id = 1 or email = 'alex122@oldbody';
                特别的:当or条件中有未建立索引的列才失效,以下会走索引
                        select * from userinfo where id = 1 or name = 'alex1222';
                        select * from userinfo where id = 1 or email = 'alex122@oldbody' and name = 'alex112'
            - 类型不一致
                如果列是字符串类型,传入条件是必须用引号引起来,不然...
                select * from userinfo where name = 999;
            - !=
                select count(*) from userinfo where name != 'alex'
                特别的:如果是主键,则还是会走索引
                    select count(*) from userinfo where id != 123
            - >
                select * from userinfo where name > 'alex'
                特别的:如果是主键或索引是整数类型,则还是会走索引
                    select * from userinfo where id > 123
                    select * from userinfo where num > 123
            - order by
                select email from userinfo order by name desc;
                当根据索引排序时候,选择的映射如果不是索引,则不走索引
                特别的:如果对主键排序,则还是走索引:
                    select * from userinfo order by nid desc;
             
            - 组合索引最左前缀
                如果组合索引为:(name,email)
                name and email       -- 使用索引
                name                 -- 使用索引
                email                -- 不使用索引

    最左前缀:

    最左前缀匹配:
            create index ix_name_email on userinfo(name,email);
                     select * from userinfo where name = 'alex';
                     select * from userinfo where name = 'alex' and email='alex@oldBody';
    
                     select * from userinfo where  email='alex@oldBody';
    
                 如果使用组合索引如上,name和email组合索引之后,查询
                 (1)name和email ---使用索引
                 (2)name        ---使用索引
                 (3)email       ---不适用索引
                  对于同时搜索n个条件时,组合索引的性能好于多个单列索引
            ******组合索引的性能>索引合并的性能*********

    索引注意事项

    (1)避免使用select *
           (2)count(1)或count(列) 代替count(*)
           (3)创建表时尽量使用char代替varchar
           (4)表的字段顺序固定长度的字段优先
           (5)组合索引代替多个单列索引(经常使用多个条件查询时)
           (6)尽量使用短索引 (create index ix_title on tb(title(16));特殊的数据类型 text类型)
           (7)使用连接(join)来代替子查询
           (8)连表时注意条件类型需一致
           (9)索引散列(重复少)不适用于建索引,例如:性别不合适
  • 相关阅读:
    js面试题-----算法类
    js面试题-----安全类
    js面试题-----通信类
    js面试题-----面向对象类
    js面试题-----HTTP协议类
    js面试题-----CSS盒模型
    Java-JVM 类的初始化
    加密的相关基础
    AngularJS-directive.js 基本指令
    AngularJS-liveRoomDirective.js 直播间指令
  • 原文地址:https://www.cnblogs.com/hnlmy/p/10561436.html
Copyright © 2020-2023  润新知