数据库学习知识点总结

SELECT
   person_id,
   on_time,
   off_time,
   signin_time,
   signout_time,
   result,
   TIMESTAMPDIFF( MINUTE, on_time, off_time ) scheduleWorkingDuraion,
   TIMESTAMPDIFF( MINUTE, signin_time, signout_time ) realWorkingDuraion
FROM
   `attendance_results`
WHERE
   date >= '2020-07-01 08:05:09'
   AND date <= '2020-09-10 08:05:09'
   ORDER BY person_id ASC
 --  AND person_id IN ( '1','2' )


DBMS数据库管理系统

show databases;      显示当前连接下的所有数据库;

show tables;         显示当前库中所有表

show tables from 库名 显示指定库中所有表

show columns from 表名 显示指定表中所有列

use 库名                打开指定库


DQL 数据查询语言
  select    查询列表
  from        表名
  where        筛选条件
     as作为别名  两个数值方可以用“+”符号

去重 distinct

补充函数 
select database();
select user();
select ifnull(字段名,表达式);
select concal(字符1,字符2);拼接字符
select length();

二.特点

1.条件表达式筛选,


>= <= <>不等于

2.按逻辑表达式筛选

逻辑运算符:
and or  not

3.模糊查询

like 一般和通配符搭配使用

_任意单个字符

%任意多个字符

between and:一般用于某字段是否在指定的区间

in:一般用于某字段是否在指定的列表;

is null 判断null值

三.排序查询

 order by 排序列表:放到末尾排序;
特点:
①排序列表是单个字段·多个字段·函数·表达式·列的索引·以及组和别名
②升序 asc
③降序 desc


例题1.查询员工的姓名和部门号和年薪,按年薪降序,按姓名升序。
select last_name,department_id,salary*12*(1+IFNULL(comission_pct,0)) 年薪 from employees 
OEDER BY 年薪 DESC,last_name ASC;


四.常见函数

1.自定义函数
2.调用函数

常见函数:字符函数:CONCAT 拼接函数 SUBSTR(‘asdfg’,1,3) 截取子串 //从1开始的几位字母
    TRIN去前后空格,LRAD/RPAD('王港',10,‘a’) 左填充、右填充,UPEPER/LOWER 变大写/变小写
    STRCMP()/比较函数,LEFT/RIGHT('23333',1) ;

      数学函数: ABS()绝对值,CELT/FLOOR() 向上取整/向下取整  , TRUNCATE(1.999,1)截断函数 , NOD() 取余

      日期函数: NOW()当前时间,CURDATE(当前日期),CURTIME(当前时间),DATE_FORMAT(datetime,fmt),
    STR_TO_DATE() 按指定格式解析字符串为日期类型

      流程控制函数:if(100>9,'好',‘坏’), CASE 表达式  WHEN 值1 THNE 结果1, 
    

例题:查询员工表的姓名,要求格式:首性字母大写,名小写,且姓和名之间用_分割;

select UPPER(substr(str,pos,len))from .;
select LOWER(substr(str,pos))from .;
select UPPER(str) ;

select CONCAT(UPPER(substr(str,pos,len)),LOWER(substr(str,pos)),‘_’);

例题:    部门编号是30,工资显示为2倍
    部门编号是50,工资显示为4倍
    否则不变
    显示部门编号,新工资,旧工资;

    select  department-id,salary,
    case department—id
    when 30 then salary*2
    when 50 then salary*
    else salary
    end newsalary from 表名;


分组函数:一组数据进行统计计算,最终得到一个值
    sum()求和
    avg()求平均数
    max()求最大值
    min()求最小值
    count()非空字段的个数
    order by()排序列表
    groupby()分组列表

    执行顺序:     ①from
            ②where    
            ③group by
            ④having
            ⑤select
            ⑥order by

    
    需要分组查询的时候使用GROUP BY子句,例如查询每个部门的工资和,要使用部门来分组。
    select 查询列表
    from 表名
    where 筛选条件
    group by 分组列表
    特点① 查询列表往往是分组函数和被分组的字段
        ② 分组查询的筛选一般分为两类
                    筛选的基表    使用的关键词    位置
分组前筛选                原始表        where        GROUP BY的前边

分组后筛选                分组后的结果集    having        GROUP BY后边

where--group by--having

例题:    select sum(salary)
    from employee
    GROUP BY department;

例题:搭配distinct实现去重统计
    select COUNT(DISTINCT XX)from 表名;
    
例题:每个工种有奖金的员工的最高工资>12000的工种编号和最高工资

select job_id,MAX(salary)
from employees
where commission is not null
having MAX(salary)>12000;


连接查询:又称多表查询。
    假设多表 A*B*C;
    
    分类:
        按年代分类;
        sq192标准
        sq199标准【推荐】

        按功能分类:
            内连接:
                等值连接
                非等值连接
                自连接
            外连接:
                左外连接
                右外连接
                全外连接
            交叉连接:
                
---------------------------SQL92------------------------------
1.内连接
1.等值连接
    语法:
        select 查询列表
        from 表名1 as 别名1,表名2 别名2
        where 等值连接的连接条件
    特点:
        1.表字段重名问题用别名解决
        2.

例题:查询员工名和部门名
    select last_name,‘department_name’
    from employee e,department d
    where e.'department_id'= d.'department_id'; 
    AND
    添加分组加筛选
    案例1:查询每个城市的部门个数。1,‘city’
    
    select COUNT(*) as 部门个数,l.'city'
    from departments d,localtion_id l
    where d.'location_id' = 1.'location_id'
    group by l.city;

二.sql99语法

语法:         
    select
    from 表1  别名  【连接类型】
    join 表2  别名
    on  连接条件
    【where 筛选条件】
    【GROUP BY 分组】
    【having 筛选条件】
    【order by 排序列表】
    
分类
内连接 :inner

外连接
    左外:left【outer】
    右外:right【outer】
    全外:full【outer】
交叉连接:cross

特点:
1.添加排序,分组,筛选
2.inner可以省略
3.筛选条件放在where后面,连接条件放在on后面,提高阅读性
4.内连接和92语法中的等值连接效果一样,都是查询多表的交际

1.等值连接
例题:查询员工名,部门名

select last_name,department_name
from employee e
inner join department d
on e.‘department’ = d.department_id

2.非等值连接 
例题查询员工的工资级别
select count(*),grade_level
from empl e
join job g
on e.salry between g.glowest_sal and g.high_sal
group by grade_level
having count(*)>20
order by grade_level desc;

3.自连接
查询员工的名字上级的名字


二.外连接
应用场景:用于查询一个表中有,另一个表中没有的记录
特点:
1.外连接的查询结果为主表中的所有记录
    如果表中有和它匹配的,则显示匹配的值
    如果表中没有和它匹配的,则显示NULL
    外连接查询结果 = 内连接查询结果+主表中有而从表中没有的记录
2.左外连接,left join左边的是主表
  右外连接,right join右边的是主表
3.左外和右外连接两个表的顺序,可以实现同样的效果    

引用:查询没有男朋友的女神名
select b.name ,bo.*
from beauty b
left outer join boys bo
on b.b_id = bo.id
where bo.id if null;

子查询:
含义:
出现在其他语句中的select语句,称为子查询或内查询


1.在where或者having后边

1.标量子查询(单行子查询)
2.列子查询(多行子查询)
3.行子查询(多列多行)

特点:
1.子查询放在小括号内
2,标量子查询一般搭配这单行操作符使用
> < >= <= = <>

标量子查询
例题1:谁的工资比abel高?
1.查询abel的工资
select salary
from employee
where last_name = ‘able’
2.查询员工的信息,满足salary》1
select salary
from employee
where salary》

    1


分页查询
应用场景:当要显示的数据,一页显示不全需要分页
语法:
    select 查询列表
    from 表
    【join type】 join表2
    on 连接条件
    where 筛选条件
    GROUP BY 分组字段
    having 分组后的筛选
    order by 排序的字段
    limit 起始索引,size

select 查询列表        7
from 表            1
连接类型 join 表2    2
on 连接条件        3
where 筛选条件        4
group by 分组列表    5
having 分组后的筛选    6
order by 排序列表    8
limit 偏移,条目数    9


9.联合查询
union 联合 合并:将多条查询语句合并成一个结果
自主去重 加 all可以不去重


DML语言 
数据操作语言
插入insert,修改update,删除delete

语法
插入
insert into 表名(列名) values(值1,。。。)
可以支持插入多行
支持子查询
例题
insert into beauty(id,name,phone)
select id,boyname,‘1234567’
from boys where id<3;

insert into 表名
set 列名 = 值,列名 = 值。。。。


修改数据 
语法 
1.修改单表的记录
update 表名
set 列=新值,列=新值,...
where 筛选条件

例题修改beauty表中姓唐的女神的电话为138999

update beauty set phone = ‘139999’
where name like‘唐%’;

修改多表的记录

语法:mysql92
update 表1 别名,表2,别名
set 列=值,...
where 筛选条件

语法mysql99
update 表一,别名
inner|left|right join 表2 别名
on 连接条件 
set 列 = 值,...
where 筛选条件;


删除语句
1.单表的删除
delete from 表名 where 筛选条件
2.多表的删除
truncate table 表名


DDL语言
1.库的管理
创建修改删除
2.表的管理
创建修改删除
创建 create
修改alter
删除 drop

1.库的管理
库的创建 create database 【if not exists】 库名;

库的修改 更改库的字符集
alter database 库名 character set gbk;

库的删除 drop database 【if exist】 库名;


2.表的管理
表的创建 create table 表名(
    列名 列的类型【(长度) 约束】, 
    列名 列的类型【(长度) 约束】, 
    列名 列的类型【(长度) 约束】, 

表的修改

    修改列名 
    alter table 表名 change column     列名 被改列名 列类型;

    修改列的类型或约束
    alter table 表名 modify column     列名  列类型;

    添加新列
    alter table 表名 add column 新列名 类型; 

    删除列
    altet table 表名 drop column 列名;
    
    修改表名
    alter table 表名 rename to 新表名;

    复制表结构
    create table 表一 like 表二

常见的数据类型

常见约束(限制,用于限制表中的数据,为了保证表中的数据的准确性和可靠性)
{
    NOT NULL,非空,用于保证该字段的值不能为空
    比如姓名,学号等
    default,默认,用于保证该字段有默认值
    比如性别
    PRIMARY KEY:主键,用于保证唯一性(非空)
    UNIQUE 唯一:用于保证字段有唯一性,可以为空
    CHECK:检查支持(mysql不支持)
    FPREIGN KEY :外键 用于限制两个表的关系,用于保证该字段的值必须来自主表的关系列的值
}

表级约束

添加约束的时机:1.创建表时
        2.修改表时

create 表名(
    字段名 字段类型 约束
    

主键和唯一的区别 
        唯一性    允许为空 可以存在多个    
    主键:     √      ×        最多提一个
    唯一:     √      √        允许多个


标识列(自增长列)
    提供默认序列值
    
    1创建表时添加标识列 主键后加 AUTO_INCREMENT

    2修改表时添加标识列 后加INT PRINARY KEY;
    
    3修改表时删除标识列 
    

TCL(Transaction Control Language)事务控制语言

事务:一个或一组语句组成一个执行单元,这个执行单元要么全都执行,要么全不执行


    
事务属性(ACID)
1.原子性 : 一个事务不可再分割,要么都执行,要么都不执行
2.一致性:一个事务执行会使数据从一个一致状态切换到另外一个一致状态
3.隔离性:一个事务的执行不受其他事务的干扰
4.持久性:一个事务一旦提交,则会永久的改变数据库的数据


对于同时运行的多个事务 导致并发的问题:
1.脏读:对于两个事务T1,T2,T1读取了一个字段,然后T2更新了该字段但还没有被提交的字段之后,T2回滚,T1读取的内容就是无效的
2.不可重复读:对于两个事务T1,T2,T1读取了已经被T2更新但还没有被提交的字段,然后T2更新了该字段,之后,T1再次读取了同一个字段,值不相同
3.幻读: 插入时

避免方法:设置隔离级别,避免并发

隔离级别: 
            脏读    不可重复读    幻读
read uncommitted    可以    可以        可以
read committed        不可以    可以        可以
repeatable        不可以    不可以        可以 (默认第三个默认级别)
serializable        不可以    不可以        不可以

查看隔离级别 select @@tx_isolation
设置隔离级别 set session|global transation isolation level 隔离级别;

truncate(不支持) 与 delete(支持回滚) 在事务中的区别


视图{
    含义:虚拟表
    mysql5.1出现的新特性,通过表动态生成的数据
}

create view 别名
AS

视图的修改{
    1.create or replace view as  没有就创建有就替代
    2.alter view 视图名 as
}

视图的删除{
    DROP view 视图1,视图2,视图3
}

视图查看 {
    DESC 视图名
    SHOW CREATE VIEW 视图名;
}

视图的修改

1.插入    insert into 视图名 values(~);
2.修改 update 视图名 xxx=yyy where xxx=zzz
3.删除 delete from 视图名 where xxx=yyy;

视图权限


变量{
    系统变量
        全局变量:
            查看所有的系统变量 show session/global variables; 
        会话变量
    自定义变量
        用户变量
        局部变量
}


函数 创建语法
CREATE FUNCTION 函数名(参数列表)RETURNS 返回类型
BEGIN


END
{    
    如果函数体中仅有一句话可以省略begin end
    使用delimiter语句设置结束标语
    
}

例题 根据员工名 返回他的工资
delimiter $
CREATE FUNCTION myf2(rmpName VARCHAR(20))RETURNS double
BEGIN
    set sal = 0;//定义用户变量
    select salary into sal
    from employees
    where last_name = empName;
    
    return sal;
END $


查看函数
SHOW CREATE FUNCTION myf3;

删除函数
DROP FUNCTION myf3;

流程控制结构
{
    顺序结构:程序从上往下依次进行
    分支结构:程序从两条或者多条路径上去找一条去执行
    {
        if(表达式1,表达式2,表达式3)//若1成立,返回2,否则3
        case结构
    }
    循环结构:程序在满足一定条件的基础上,重复执行一段代码

}


mysql性能下架的原因:执行时间长,等待时间长
{
    查询语句写的烂
    索引失效:单值/复合
    关联查询太多join
    服务器调优以及各种参数设置
}

SQL
索引(index)是帮助MYsql高效获取数据的数据结构,可以得到索引的本质是数据结构
排好序的快速查找数据结构,降低i/o成本与cpu消耗

索引的类别:
    单值索引:一个索引只包含单个列,一个表可以有多个单列索引
    唯一索引:索引列的值必须唯一,但必须有空值
    复合索引:一个索引包含多个列
    基本索引:{
            创建CREATE【unique】 INDEX indexname on mytable (columnname(length))
                ALTER mytable ADD 【unique】 INDEX【indexName】ON (columnname(length))
            删除 DROP INDEX 【indexName】 ON mytable
            查看 SHOW INDEX FROM table_name\G
        }

索引分类 BTree

    索引结构:1.主键自动建立索引
          2.频繁作为查询条件应该创建索引
          3.查询中与其他表关联的字段,外键关系建立索引
          4.频繁的更新不适合建立索引
          5.where条件用不到的字段不建立索引
          6.单键/组合索引的选择问题
          7.查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度
          8.查询中统计或者分组字段
    
    不适合建立索引:1.表记录太少
            2.经常增删改查的表
            3.重复记录太多的表

    性能分析:1.mysql query optimizer(自带性能优化器)
          2.IO:磁盘I/O瓶颈发生在装入数据远大于内存容量的时候
          3.服务器可以用:top,free,iostat和vmstat来查看


使用explain可以模拟执行查询语句
    Explain+SQL语句
            表头数据:id select_type table type possible_keys key key_len ref rows
    
    id相同 执行顺序,执行顺序由上到下。如果是子查询,id的序号会递增,id值越大,优先值越高,越先被执行

    select_type {
            simple:简单的select查询,查询中不包括子查询或者union
            primary:查询中包含任何复杂的子部分,最外层查询则被标记为
            subquery:在select或者where列表中包含了子查询
            derived:在FORM列表中包含的子查询被标记为DERIVED
            union:若第二个select出现在union之后,则被标记为
            union_result:从union获得的表
            }
    table:是关于数据是关于哪张表的
    
    type:{
        访问类型排列,显示查询使用了哪种类型从最好到最差依次是
        system>const>eq_ref>ref>range>index>ALL

        SYSTEM:表只有一行记录,const类型的特列,平时不会出现
        const:表示通过索引一次就找到了,const用于比较primary key或者union索引。
        er_ref:唯一索引扫描,对于每个索引键,表中只有一条记录为之匹配。常见于主键或者唯一索引
        ref:非唯一性索引扫描,返回匹配单独值的所有行。
        range:只检索给定范围的行,使用一个索引来选择行,key列显示使用了哪些索引,一般就是在你的where语句中出现了between,<,>,in的查询,这种范围查找比全表扫描要好,因为它需要开始于索引的某一点,而结束语另一点,不用扫描全部索引。
        index:从索引中读取,而不是all从硬盘中读的。
        All:遍历全表找到匹配的行。    
        }


    possible_keys:显示可能应用在这张表中的索引,一个或多个。
    
    key:实际使用的索引

    key_len:表示索引中使用的字节数,在不损失精确性的情况下,长度越短越好,key_len显示的是指为索引字段的最大可能长度,并非实际长度,即key_len是根据定义所得,而不是通过表内索引检索出的。
    
    ref:显示索引的哪一列被使用了,如果可能的话,是一个常数。

    rows:根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数

    extra:包含不适合在其他列又很重要的信息
    {
        Using filesort:说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取,mysql中无法利用索引完成的排序操作称为文件排序。
        Using temporary:使用了临时表保存中间结果,MYsql在对查询结果排序使用临时表。常见于排序order by 和分组查询 group by。
        Using Index:表示使用的select操作使用了覆盖索引,避免了访问表的数据行,效率不错
    }


索引的优化:explain是性能优化的参数
    索引失效(应该避免)
    {
        1.全职匹配最好
        2.最佳左前缀法则
        3.不在索引列上做任何操作(计算,函数,(自动or手动)类型转换),会导致索引失效而转向全表扫描
        4.储存引擎不能使用索引范围的条件右边的列
        5.尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致)),减少select*
        6.mysql在使用不等于(!=或者《》)的时候无法使用索引会导致全表扫描
        7.is null,is not null也无法使用索引
        8.like以通配符开头(‘%abc。。。’)mysql索引失效会变成全表扫描的操作
        9.字符串不加单引号索引失效
        10.少用or,用它来连接时索引会失效
    }

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值