Advertisement

mysql笔记(需补充)

阅读量:

目录

  • 1、基本概念

    • 数据库

    • 基本用法

    • 数据类型

      • 数值型数据
      • 文本型数据
      • 日期时间型
    • 运算符

    • 语句执行顺序

    • 数据类型

    • 表结构

    • 表数据

    • 存储

  • 2、数据库操作

    • 索引
    • 查看
    • 创建
    • 删除
    • 重命名
  • 3. 数据操作

    • 增加
    • 删除
    • 修改
    • 查询
    • 比较运算
    • 范围查询
    • 逻辑运算
    • 模糊查询-like
    • regexp
    • 优先级
  • 4、函数

      • 聚合函数
      • 按字段分组
      • 根据条件筛选
      • 连接操作
      • 限定结果数量
      • 拼接操作
      • 文本操作
      • GROUP_CONCAT 函数用于将满足条件的一行或多行的字符串值连接成一个字符串。
        • substr一家用于从字符串中提取特定长度的部分字符。
        • 示例:
          sql 复制代码
          SELECT GROUP_CONCAT(substr(客户ID, 5, 10)) FROM 表名 WHERE 条件;
  • 时间处理相关的功能模块

    • 日期减法运算与日期加法运算

      • 其他日期相关的辅助函数

        • 计算两个日期之间间隔的时间单位的运算符
          • DATEDIFF与TIMESTAMPDIFF
            • 当前时间和日历相关的操作
              • date_format:格式化日期字符串的方法
      • 数字处理函数

      • 逻辑判断

      • 连接

      • union 与union all

      • case when

      • 窗口函数

    • 5、顺序

    • 6、优化查询

1、基本概念

数据库

是按照数据结构来组织、存储和管理数据的仓库。

基于关系模型的数据库中用于存储结构化的数据,并能够清晰地体现实体之间的关联。与我们熟悉的二维表格形式相似也就是常说的行与列各表之间存在错综复杂的联系常见的关系型数据库包括但不限于 MySQL 和 SQL Server 等与此同时在数据存储领域还存在另一种类型的数据库——非关系型数据库例如 NoSQL 和 HiveSQL 等这些专门处理非结构化的文档信息其中以 MySQL 为主要应用的数据库类型

数据库管理系统:DBMS是一种用于管理数据库的计算机软件系统,在其开发过程中通常具备数据存储能力、数据处理能力以及安全防护和数据备份等功能。

完整的数据库存储分为4步:创建数据库,确认字段,创建数据表,插入数据。

SQL语言:
• 数据定义语言 DDL:Data Definition Language (DDL),用于对数据库及其相关对象进行建立、更新和删除操作
• 数据操作语言 DML:Data Manipulation Language (DML),用于执行对表的插入(Insert)、删除(Delete)、更新(Update)以及检索(Select)等基本操作
• 数据控制语言 DCL:Data Control Language (DCL),用于管理数据的安全性和完整性

数据库简称即库,在其内部通常包含多个表格;每个表格都由至少一个字段构成;而字段之间的关系则通过记录连接起来;特别地,在 SQL 数据库系统中还支持日期时间和字符、数值等多种数据类型的存储与管理;

基本用法

• 使用分号;作为SQL语句的结束符
• 通常情况下虽无须区分大小写;但为了规范性起见;关键字一般采用大写的格式
• 单引号‘’用于标识特定的字符区域
• 字段或参数之间通过逗号,进行分隔
• 在WHERE子句之后正确使用ORDER BY子句

数据类型

数值型数据

数值类数据仅限于容纳整數與小數等數值類的數據,并可歸類為整數類別、浮點類別以及位數類別等多种類别

数值型数据类型 说明
TINYINT 存储 1 字节整数值
SMALLINT 存储 2 字节整数值
MEDIUMINT 存储 3 字节整数值
INT 存储 4 字节整数值
BIGINT 存储 8 字节整数值
FLOAT 存储 4 字节浮点值(M,D)位数和小数位
DECIMAL 可变长度的定点数(M,D)位数和小数位

文本型数据

数值型数据类型 说明
CHAR 存储固定长度的字符串
VARCHAR 存储可变长度的字符串
TEXT 存储可变长度的字符串
TINYTEXT 存储可变长度的字符串

日期时间型

日期时间型数据类型 说明
DATE 存储年月日的日期值
TIME 存储时间值
DATETIME/TIMESTAMP 存储年月日时分秒值

运算符

算数运算符:加减乘除
比较运算符:

比较运算符 说明
= 等于
> 大于
< 小于
<> 不等于
!= 不等于
>= 大于等于
<= 小于等于
between 介于
like 通配符
in 介于
is null 为空
is not null 不为空

逻辑运算符

逻辑运算符 说明
AND 与,表示必须几个条件同时满足
OR 或,表示几个条件中有一个满足即可
NOT 非,表否定

语句执行顺序

from

随后,在from子句中选择前两个表并进行笛卡尔乘积运算,并在此基础上创建虚拟表格vt1(选择相对较小规模的那个作为基准表格)。随后应用on筛选器将其逻辑表达式应用于vt1的所有行,并筛选出满足条件的记录以生成新的虚拟表格vt2。如果当前操作是外连接(outer join),那么下一步将是添加外部记录。如果使用左外连接(left outer join),则会将左表在上一步骤中未被选中的记录加入结果;类似地,在右外连接(right outer join)的情况下,则会补充右表在上一步骤中未被包括的记录。通过这种方式逐步构建最终的结果表格vt3。

在第四步中:当从子句中的表数量超过两个时,则需要将vt3与第三个表进行连接以计算笛卡尔积,并生成一个虚拟表格。这一操作类似于前几步骤的操作流程,在完成之后会得到一个新的虚拟表格 vt3。

具体来说

第六步:通过group by子句将具有唯一值的数据组合成一个组,并生成虚拟表vt5。一旦采用了group by操作,则后续的所有步骤只能基于vt5的列或聚合函数(如count、sum、avg等)来执行。这是因为最终的结果集仅包含每组对应的一行数据。这一原则必须牢记。

第七步:使用cube或rollup指令为vt5创建超级分组,并将其命名为vt6。
第八步:施加having条件以过滤数据,并将其命名为vt7;其中第一个也是唯一的用于施加分组数据条件的having过滤器。
第九步:处理select语句时,请注意将vt7结果集中的那些出现在select语句中的列进行筛选;随后即可获得最终结果集vt8。

第十步:我们可以利用distinct子句从vt8中去除重复的记录以获得vt9。实际上,在采用group by子句时distinct就不再必要了。原因归根结底是因为在分组操作后每一组都会被总结成单一的一条记录而不必担心重复的问题。

在第十一步骤中:应用order by子句(根据order_by_condition对vt9进行排序),此时返回一个游标变量(而不是虚拟表)。该种基于集合论的查询(因为返回的是游标变量),其结果成员的顺序不影响最终结果(即顺序无关紧要)。这个游标实际上代表的是一个包含特定物理顺序逻辑组织的对象部分(即集合对象的一部分)。由于返回值是游标变量而非实际数据行(即不包含完整的数据行),因此无法直接应用于表表达式运算(因为这会强制要求按特定顺序排列数据行)。排序操作通常会产生较高的执行成本(除非必须进行排序操作),因此除非确实需要排序结果外层查询才建议使用order by子句进行排序操作。最后,在这一步骤中:应用select语句并为列名生成别名是唯一且可行的选择步骤之一

第十二步:应用top选项。此时才返回结果给请求者即用户。

数据类型

整数据类型:

选择时,在选择过程中需要综合考虑存储空间与可靠性之间的权衡问题。第一步是确保数据处于合法范围内;同时关注如何进一步优化存储效率。

浮点型类型:

img

该浮点类型的精度存在问题是由于其存储机制所导致的不足。在二进制定点表示法中将数值转换为二进制形式时会出现精度上的缺失;而采用十进制定点表示法(decimal),则通过将数值分解为整数部分和小数部分分别处理的方式实现了精确存储的目的;通过这种方法存储的所有数值都能保持精确性。

复制代码
    #修改数据类型
    ALTER TABLE demo.goodsmaster
    MODIFY COLUMN price DECIMAL(5,2);
    
    alter 

文本类型:

char:固定长度字符串,

varchar:可变长度字符串,不超过最大长度

text:65535字节,longtext:4gb,mediumtext:16777215字节,tinytext:255字节

text字段不可以作为主键字段除非选择其他类型的text字段,并且字符型字段也可以作为主键

日期与时间类型:

优先考虑datetime类型

表结构

约束:非空约束,唯一约束,自增约束

复制代码
    非空约束
    ALTER TABLE demo.goodsmaster
    MODIFY specification TEXT NOT NULL;
复制代码
    增加字段
    mysql> ALTER TABLE demo.importheadhist
    -> ADD confirmer INT; -- 添加一个字段confirmer,类型INT
    Query OK, 0 rows affected (0.04 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> ALTER TABLE demo.importheadhist
    -> ADD confirmdate DATETIME; -- 添加一个字段confirmdate,类型是DATETIME
    Query OK, 0 rows affected (0.04 sec)
    Records: 0  Duplicates: 0  Warnings: 0
复制代码
    修改字段
    
    mysql> ALTER TABLE demo.importheadhist
    -> CHANGE quantity importquantity DOUBLE;
    Query OK, 0 rows affected (0.15 sec)
    Records: 0  Duplicates: 0  Warnings: 0
复制代码
    修改类型
    ALTER TABLE demo.importheadhist
    MODIFY importquantity DECIMAL(10,3);

表数据

复制代码
    增加一条数据
    
    INSERT INTO demo.goodsmaster
    (
      itemnumber,
      barcode,
      goodsname,
      specification,
      unit,
      price
    )
    VALUES
    (
      4,
      '0003',
      '尺子',
      '三角型',
      '把',
      5
    );
    
    
    #删除记录
    
    DELETE
    FROM demo.goodsmaster
    WHERE itemnumber=5;
    
    #插入查询数据
    
    INSERT INTO 历史流水表 (日结时间字段,其他字段)
    SELECT 获取当前时间函数,其他字段
    FROM 流水表
    
    修改数据
    不能修改主键的值
    
    mysql> UPDATE demo.goodsmaster
    -> SET itemnumber=2
    -> WHERE itemnumber = 3;
    
    
    查询数据
    
    SELECT *|字段列表
    FROM 数据源
    WHERE 条件
    GROUP BY 字段
    HAVING 条件
    ORDER BY 字段
    LIMIT 起始点,行数

order by 查询结果如何排序asc,desc降序

limi显示部分查询结果

主键:业务字段主键,自增字段做主键,手动辅助字段做主键

存储

img
img

2、数据库操作

存储操作

复制代码
    creat databases demo #创建数据库
    show databases #查看数据库

主建:必须唯一,不能重复,不能是空的,必须可以唯一标识数据表中的记录

索引

属于图书管理系统的检索目录的一种存储结构。
这种存储结构使mysql能够高效地进行目录查询。
通过索引机制,在给定查询条件下,
利用预设字段值进行匹配,
从而实现对数据记录位置的快速定位,
无需遍历整个数据表。

分为单字段索引和组合索引。

复制代码
    CREATE INDEX 索引名 ON TABLE 表名 (字段);
    
    
    ALTER TABLE 表名 ADD { INDEX | KEY } 索引名 (字段);

单字段索引的作用原理

选择索引字段的时候,要选择那些经常拿来被用作筛选条件的字段。

查看

复制代码
    #查看数据库
    show databases
    #查看表
    show tables
    #查看表结构
    desc student;
    #查看建表语句
    show create table students;
    
    describe demo.test;#表结构

创建

复制代码
    #创建数据库
    create database python3 charset=utf8
    
    #创建表
    create table student(
    id int auto_increment primary key not null,
    name varchar(10) not null,
    gender bit default 1,
    birthday datetime)
    其中包含表名,类型,属性

删除

复制代码
    #数据库
    drop database python3;
    
    #删除表
    drop table student;

重命名

复制代码
    #表的重命名
    rename table student to students;

3、数据操作

复制代码
    #全列插入
    insert into student values(0,'郭靖',1,'1990-1-1',0); 
    
    #部分列插入(插入部分列字段)
    #格式insert into 表名(列 1,列 2,…) values(值 1,值 2,…);
    insert into student(gender,name) values(0,'小龙女');
    
    #同时插入多条数据
    insert into 表名 values('杨过'),('雕'),('郭襄');
    
    
    #添加主键
    alter table test add column abc int primary key aut_INCREMENT

复制代码
    delete from student where id=3;
    #(不写 where 条件,所有的数据都将删除)
    #delete 属于物理删除,一旦删除,数据就不存在,
    
    #逻辑删除
    update student set isDelete=1 where id=6; #把不想看到数据 isDelete 设置为 1;
    select * from student where isDelete=0; #然后显示的时候把 isDelete=1 的值过滤 

复制代码
    update student set gender=0,birthday='2019-4-24' where id=6;
    #(不写 where 条件,相当于把一整列数据都修改了)
    
    改字段名
    alter table 表名字  change timestamp timestamps int(14)

复制代码
    select * from student;
    #as 为列起别名.*表示在结果集中,显示表中的所有列
    列前面,使用 distinct 可以消除重复的行
    select distinct a from student #对a字段去重
    select distinct a,b from student #对a、b组合字段去重

比较运算

复制代码
    等于 =
    大于 >
    小于 <
    大于等于 >=
    小于等于 <=
    不等于 !=或者<>

范围查询

复制代码
    非连续范围查询 in/not in (包含和不包含)
    select * from student where id in(1,2,3,8);
    
    
    连续范围查询 between…and…(可以用于数值型,以及日期型数据)
    select * from student where id between 3 and 8;
    between…and…和 and 同时运用,会优先计算 between…and…。
    
    
    空判断---------is null 
    非空判断------is not null 
    查询null用 is 和is not
    select * from student where is null #查询出null值
    null不是普通值不能用<>进行查询

逻辑运算

复制代码
    且 and
    或 or
    非 not 

模糊查询like

复制代码
    % 表示匹配一个或多个任意字符
    _ 表示匹配一个任意字符
    select * from student where like '%王'#查询王结尾的
    select * from student where like '%王%'#查询包含王的
    
    select * from student where like '王_'#查询王某的
    select * from student where like '王__'#查询王某某的

正则表达式regexp

正则表达式 说明
^ 匹配字符开始的位置
$ 匹配字符串结束的位置
. 匹配任意字符
[xyz] 匹配括号内任意单个字符
[m-n] 匹配m到n的任意字符,如[1-9],[a-z],[A-Z]
* 匹配0或者多个前面的字符
+ 匹配1或者多个前面的字符
? 匹配0或者1次前面的字符
x y 匹配x或者y
{m} 匹配m次前面的字符
{m,} 匹配大于或等于m次前面的字符
{m,n} 匹配m到n次前面的字符
{0,m} 匹配0到m次前面的字符
(pattern) 正则表达式
复制代码
    #查询第一个字符为李或者王
    select * from table where name regexp '^[李王]'
    #至少包含三个连续的8
    select * from table where name regexp '8{3,}'
    #@之前有任意英文字母
    select * from table where name regexp '[a-zA-Z].*@'

优先级

复制代码
    小括号 —> not —> 比较运算符 —> 逻辑运算符 #优先级从高到低排列
    注意:and 比 or 优先运算。如果同时出现并希望 or 优先运算,可以使用小括号。

4、函数

聚合函数

count

复制代码
    count(*) 表示计算总行数,括号中可以写“*”和“列名”
    count(1),
    count(0)
    count(字段)统计一共多少个不为空的字段值
    
    max(列) 表示求此列的最大值
    min(列) 表示求此列的最小值
    sum(列) 表示求此列的和
    avg(列) 表示求此列的平均值

group by

复制代码
    对数据进行分组
    select count(*) from student group by gender

having

having需要与groupby一起使用,先链接后筛选

where是先筛选后链接

复制代码
    where 是对原始数据集的筛选,having 是对分组后的结果数据进行筛选。
    having 的运算符与 where 相同,像“逻辑运算符”、“比较运算符”
    
    select gender,count(*) from student group by gender having gender=0;
    select gender,count(*) from student group by gender having count(*)>2;
    select gender,count(*) as rs from student group by gender having count(*)>2;

order by排序

复制代码
    asc:升序;desc:降序。
    select * from student order by a desc#a列降序排列
    select * from student order by a desc ,b #a列降序排列,b升序

limit

复制代码
    使用limits时先考虑数据第一条的索引为0,1,2,3。。。
    
    limit 1 
    #表示前1行
    
    limit 3,2 #表示是从索引为3开始查询2条数据
    #相当于limit 2 offset 3 offset可以理解为开端索引和起始索引
    #表示从第3行开始第一行 
    
    select * from student limit 1,5;#第二行开始后5行
    select * from student limit 5;#前五行

join函数

只有join的时候默认是内连接

  • left join : 左侧连接操作返回左表中所有记录以及右表中与左表"join"字段相等的记录。
    • right join : 右侧连接操作返回右表中所有记录以及左表中与右表"join"字段相等的记录。
    • inner join : 内部(等值)连接操作仅返回两个表在"join"字段上相等的所有行。
    • full join : 外部(全)"join"操作返回两个表格中的所有行:即执行左侧"join"+"right"+"join"操作结果集合。
    • cross join : 笛卡尔积运算的结果是第一个表格中的行数乘以第二个表格中的行数。

链接的两个表是要避免出现重复值

mysql遵循的执行顺序是:基于from进行连接操作,在子查询中使用连接到其他表时应用avg,sum等聚合函数用于聚合计算,并在选择项中应用select关键字,在去重操作中控制排序由order by关键字以及限制条件中的最大值由limit关键字控制

如果需要拼接两次则可以join进行两次比如

复制代码
    FROM 
        hello_bike_riding_rcd r
        JOIN gd_loc_map m1 ON r.start_loc = m1.loc_nm
        JOIN gd_loc_map m2 ON r.end_loc = m2.loc_nm
    WHERE 
        (
            (m1.loc_type = '地铁站' AND m2.loc_type = '写字楼') OR 
            (m1.loc_type = '写字楼' AND m2.loc_type = '地铁站')
        )
        AND r.start_time >= '2020-01-01' AND r.start_time <= '2024-12-31'

3)group by 与having,count

count(字段) 用于计算该字段在表中的出现次数,并将所有字段值为null的情况予以排除。

count(1) 会统计表中的所有的记录数,包含字段为null 的记录

count(·)涵盖了全部字段,在计算统计结果时不会因字段值为NULL而被排除

执行效率上:当表中的列为主键时, COUNT(列名)的操作速度将显著快于COUNT(1). 当表中的列为非主键字段时, COUNT(1)的操作速度将快于COUNT(列名). 若同一张表中存在多个字段且无主键索引, 则使用COUNT()更为高效. 当存在主键索引时, 默认选择COUNT(main_key)即可达到最佳性能. 若仅有一个字段存在于该表中, COUNT()即为最佳选择.

concat函数

拼接字符串

复制代码
    拼接ab两列
    select *,concat(a,b)as 拼接 from table 

文本处理函数

img
复制代码
    left(字段/字符串,3)#从左边取指定长度
    right(字段/字符串,3)#从右边取指定长度
    length(字段/字符串)#返回长度,char_length
    lower('ABC')#返回小写字母
    upper('')#返回大写字母
    ltrim()#左边空格去除
    rtrim()#右边空格去除
    
    locate('a','abc')#第一次出现的位置
    FIND_IN_SET('a',app)#出现的位置
    
    replace(a,',','')#替换
    
    #截取mid,left,right

concat:拼接

GROUP_CONCAT

#字符串分组拼接

img
img

substr一家

复制代码
    substring('abc123',2,3)#第二位截取三个字符
    substr
    substring_index

https://www.cnblogs.com/zdz8207/p/3765073.html

时间处理函数

extract(type from date) 表示从日期数据date中抽取type指定位置

year,month,day,hour,minute,second

date_sub与date_add

复制代码
    date_sub(t2.dt,INTERVAL 1 day) 减
    date_add(t1.dt,INTERVAL 1 day) 加
    date_add('2021-01-01',interval 2 day)#往后挪两天
    date_sub('2021-01-01',interval 2 day)#往前挪两天
    date_add与 adddate,date_SUB,SUBDATE()也能达到相同的结果

其他日期函数

复制代码
    last_DAY(date) 表示日期函数date所在月份的最后一天
    dayofweek(DATE),获取日期是周几

DATEDIFF与TIMESTAMPDIFF

复制代码
    DATEDIFF #两个字段时间距离
    datediff('2021-01-01','2020-12-01')#返回日期之间的天数
    
    TIMESTAMPDIFF(second, start_time, end_time) #两个时间差距用秒显示

now与day

复制代码
    now()当前日期和时间/curdate()当前日期/curtime()当前时间
    date('2021-01-01 8:00:00') #返回日期
    day('2021-01-01')#返回天数
    hour(日期)/month(日期)/year(日期)

date_format

复制代码
    date_format(in_time,"%Y-%m") #定义形式
    date_format(now(),'%Y-%m-%d')#返回格式化日期
    #参数格式百度

SUBSTRING_INDEX??

时间戳转化成时间函数为 from_unixtime();

数字处理函数

复制代码
    abs(-2)#绝对值
    round(1.2)#四舍五入
    向上取证ceil(X)、ceiling(x)
    向下取证floor(x)
    #其他函数百度
    
    ifnull(a,0)#存在null时用0填充

逻辑判断

连接

常见的内联结类型包括(两边都有)的内联结、(仅左边有数据)的左联结、(仅右边有数据)的右联结以及(所有记录都参与)的全联结

select * from a left join b on a.1=b.1

union 与union all

union 组合结果去重,union all 拼接

order by 写在最后是最终结果的排序

case when

语法1: case 表达式 when 值1 then 结果1 when 值2 then 结果2 …else 结果n end

语法2:case when 表达式1 then 结果1 when 表达式1 then 结果2 …else 结果n end

窗口函数

8.0支持窗口函数

窗口函数olap

基础语法: window function OVER (partition by with用于分组的列) order by the sorting columns

窗口还是有哪些:sum,avg,count,max,min,rank,dense_rank,row_number

排序窗口函数

复制代码
    SELECT
    *
    ,RANK() over ( PARTITION BY userid ORDER BY score ) AS score1 
    FROM
    test
    
    
    根据userid进行分组根据score进行排序
    rank(1,1,3,4,5)
    dense_rank(1,1,2,3,4)
    row_number(1,2,3,4,5)
复制代码
    SELECT
    *
    ,avg(score) over ( ORDER BY date rows 2 perceding ) AS score1 
    FROM
    test
    
    #rows 2 perceding 当前行与前面两行进行平均
    
    avg(score) over ( ORDER BY date rows  between 1 perceding  and 1 following )#当前行的前一行与后一行

其他窗口函数:

precent_rank(),按照公式:(排名-1)/(总行数-1)

cume_dist():当前rank值的行数/总行数

lag(字段,3):返回前n行的数据

lead(字段,3):返回后n行数据

first_value(字段):返回第一个值

last_value(字段):返回最后一个值

nth_value(n):返回有序行列最小的n值

ntile(3):将分区中的有序数据分为n个等级

5、顺序

语句执行顺序

书写顺序: select , form ,where ,group by ,having ,order by

6、优化查询

数据表设计三大范式

第一范式:所有字段都是基础数据字段,不可进一步拆分

第二范式:数据表里每条记录都是唯一可标识的。

第三范式:不存在依赖于非主建字段。

er模型三个要素:实体,属性,关系

关系,1对1,1对多,多对对。

img

全部评论 (0)

还没有任何评论哟~