数据库小知识

Posted hnlmy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库小知识相关的知识,希望对你有一定的参考价值。

数据库管理软件分类

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 = [email protected];
            特别的:当or条件中有未建立索引的列才失效,以下会走索引
                    select * from userinfo where id = 1 or name = alex1222;
                    select * from userinfo where id = 1 or email = [email protected] 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=[email protected];

                 select * from userinfo where  email=[email protected];

             如果使用组合索引如上,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)索引散列(重复少)不适用于建索引,例如:性别不合适

 

以上是关于数据库小知识的主要内容,如果未能解决你的问题,请参考以下文章

python小知识片段

Flutterflutter doctor 报错Android license status unknown. Run `flutter doctor --android-licenses‘(代码片段

微信小程序代码片段

Android课程---Android Studio使用小技巧:提取方法代码片段

微信小程序代码片段分享

小程序各种功能代码片段整理---持续更新