• 软件测试Day7|数据库Mysql


    数据库基础

    • 数据库:保存有组织的数据的容器(一个文件或一组文件);
    • 表:某种特定类型数据的结构化清单;-模式:关于数据库和表的布局及特定信息;
    • 列(column)和数据类型(data type):列是表中一个字段;数据类型:限制存储在列中的数据种类
    • 行(row):一行就是一条数据库记录(reocrd);
    • 主键(primary key):一列或一组列,唯一区分表中每个行;
      任意两行不具有相同的主键值,每行必有一个主键值(主键列不允许为NULL
    • SQL(Structured Query Language):一种专门用来与数据库通信的语言

    DBMS 和 MySQL简介

    DBMS

    • 数据库定义功能(DDL:CREATE\ALTER\DROP)

    • 数据库操作功能(DML:select\delete\update\insert)

    • 数据库保护功能:保护数据完整性和安全性

    • 数据库维护功能:数据库中数据的表结构和数据维护功能

    • 数据库经历的三阶段
      网状模型、层次模型、关系模型

    关系型数据库

    基本信息
    • 信息:数据加工处理后得到的有用信息
    • 实体(Entity)-联系(Relationship)-模型==ER图
      • 实体:客观事物在信息世界中称为实体
      • 属性:描述实体或者联系的性质或特征的数据项
      • 联系:反应事物内部或事物之间的关联集合【一对一,一对多,多对多】
      • 关系:一个关系就是一个二维表,通常将一个没有重复行没有重复列的二维表看成一个关系,每个关系都有一个关系名
      • 元组:二维表的每一行在关系中成为称为元组,也就是一条记录
      • 属性:二维表的每一列在关系中称为属性
      • :属性的取值范围
      • 关键字(主键):关系中唯一能区分、确定不同元组的属性或属性组合,称为关系的一个关键字
      • 关系模式:对关系(表)的描述; 关系名(属性名1,属性名2,…,属性名n)
        • 关系模式特点:关系必须规范化,属性不可再分;同意关系中不允许出现相同属性名;元组的顺序任意;属性的顺序任意。
    • 关系运算:选择(行)、投影(列)和连接(笛卡尔积组成新的关系)3种
    约束和范式
    • 完整性约束:实体完整性(主键不为空)、参照完整性(引用完整性,外键存在)、域完整性(用户定义完整性,限制某个列的取值范围)
    • 范式:关系模式要满足的条件称为规范化形式,简称范式
      • 目的:消除存储异常,减少数据冗余、保证数据的完整性和存储效率,一般规范为3NF即可
      • 第一范式 1NF:所有属性为简单属性,每个属性不可再分【无重复的列】
      • 第二范式 2NF:R满足1NF,且每一个非主键字段完全依赖主键,则R满足第二范式
      • 第三范式 3NF:R满足2NF,且非主键字段之间不存在依赖关系(在员工表中,出现部门号之后就不能出现部门名)
      • 一个基本的关系型数据库满足1NF,一个完整的关系型数据库满足3NF
    • E-R图:实体联系图,提供表示实体类型、属性和联系的方法,用来描述现实世界的概念模型;
      • 矩形实体型;椭圆实体属性;菱形实体间的关系;直线连接写m、n、1表示多对多还是一对一还是多对一

    MySQL

    • 一种数据库管理系统DBMS(开源免费使用、性能执行快、可信赖、简单安装和使用)
    • 常用命令
    • mysql -u username -p -h myserver -P 3306 p密码 P端口号 默认3306
      quit 或 exit 退出命令行实用程序
      SHOW dbname 登录账户后展示已创建的数据库
      USE dbname 登录账户后打开某个数据库
      SHOW tables 进入某个数据库后查看已创建的表

    SQL

    SELECT

    相关操作符
    • DISTINCT:Distinct应用于所有列而不是其前置的列
      SELECT DISTINCT id, price :除非id和price都不同,否则所有列将被检出

    • LIMIT:限制检索的条数
      LIMIT 3,4 == LIMIT 4 OFFSET 3 :限制4行,从第三行开始(有第0行

    • WHERE : 过滤数据,放在ORDER BY 前
      BEYWEEN x1 AND x2 和 >=x1 <=x2BETWEEN 包含指定的开始值和结束值
      <、> 、=注意是=不是==<> 和 != :不相等;IS NULL :空值检查; IN (x1,x2,x3)在这些值中
      AND 和 OR :并列多个条件,AND 优先级比 OR 高 (乘法比加法高)
      NOT :支持 NOT IN、BTEWEEN、EXISTS

      • LIKE 操作符 + 通配符 : 通过配置是否区分大小写
        % :任意字符出现任意次数;jet% :表示jet开头的数据;
        _ :匹配任意单个字符;
        注意:1)其他操作符能达到的目的,不用通配符;2)使用通配符时,不要置于搜索模式开始处;放到开始处是最慢的
    • REGEXP 操作符+ 正则表达式
      . :匹配单个字符
      BINARY :加该操作符,则不区分大小写 REGEXP BINARY 'jet'
      | 相当于or,连接多个正则表达式;REGEXP '1001|1002'
      \\ 匹配特殊字符; \\.匹配 .
      [] ^ - 相当于or、否定、指定范围;
      - REGEXP '[123]001' 匹配1001;2001;3001;[^123]匹配除123以外的所有字符;[1-3] [a-z]分别匹配1-3,a-

      • 匹配字符类[:alnum:]匹配字母和数字,相当于[a-zA-Z0-9]…还有很多种 P5
      • 重复元字符:跟在要匹配的字符后面
      元字符说明
      *0个或多个匹配
      +1个或多个匹配,相当于{1,}
      0个或1一个匹配,相当于{0,1}
      {n}指定数目的匹配
      {n,}不少于n个的匹配
      {n,m}匹配数目的范围
      • [[:digits:]]{4} 匹配任意4个数字

      • stricks? strick或者stricks

      • 定位元字符符

      元字符说明
      ^文本开始
      $文本结束
      [[:<:]]词的开始
      [[:>:]词的结尾
      • ^[0-9a-zA-Z] 数字和字母开头的字符串;
    • LIKE VS REGEXP
      1)LIKE 匹配整个串 ;REGEXP匹配子串
      2)WHERE name LIKE '1001' :不会返回数据,也不会返回name=1001的数据,因为没有使用通配符
      WHERE name REGEXP '1001' :返回name=1001的数据,因为没有符号的正则表达式也有效

    • ORDER BY:默认ASC升序,DESC 降序
      ORDER BY id, price :先id升序排列;id相同,按price升序排列

    • 聚集函数AVG() MAX() MIN() COUNT() SUM()用在SELECT语句;默认为ALL,若不计算相同值,用DISTINCT;
      SELECT COUNT(*) FROM t1 :不忽略为NULL的值,COUNT(c1):会忽略c1为NULL的列
      SELECT AVG(DISTINCT price) FROM t1 计算不同price的平均值

      • GROUP BY 数据分组
      • GROUP BY子句中的列必须是能索引的列,不能使用聚集函数
      • SELECT 子句中的列必须都出现在GROUP BY子句中,SELECT子句中包含聚集函数的列除外
      • 如果分组具有NULL值,NULL作为一个分组返回,多个NULL作为一个分组
      • HAVING 过滤 GROUP BY分组
    • SELECT 子句顺序

      SELECT
      FROM
      WHERE
      GROUP BY
      HAVING
      ORDER BY
      LIMIT
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
    • 常用函数

      • 拼接字段和算数运算符
        | 操作符 | 说明 |示例|
        |–|–|–|
        | Concat | 拼接字段 | SELECT Concat(vend_name,‘(’,vend_country,‘)’ as vend_title)
        | + - * /|计算字段,加减乘除
    • 文本处理函数

    • |日期和时间处理函数

    • 数值处理函数

    多表查询=子查询+内外连接

    子查询
    • 单行单列(一个值) <、>、>=、<=、!=、=
    • 多行单列(一串数据结构相同的值) (IN,ALL,ANY),其中ANY ALL 需结合 <、>、>=、<=、!=、=、<>
      • >ANY =ANY||| 错误用法:<>ANY
    • >ALL <>ALL||| 错误用法:=ALL
    • 也可以用(dept_no id) = (SELECT dept_no,id WHERE...)
    • 多行多列(表)
    内外连接
    • join (联合连接) 和 union(组合查询)
      • join 是两张表做交连后里面条件相同的部分记录产生一个记录集,
        union是产生的两个记录集(字段要一样的)并在一起,成为一个新的记录集 。
      • union的两张表需要列数和字段完全匹配 与 Intersect 相同
      • union 自动去重 union all 不去重
    • 内连接和外连接
      • 内连接 [inner] join inner 可忽略
      • 外连接 = 左右连接+全连接 left/right [outer] join outer可忽略 +left join... union right join... 全连接
    in VS exists
    • exits的使用:exits 只关心 是否返回行,不关心具体的返回数据,返回有数据即为True
      例子:没有下过订单的客户 ( where 条件后为True则被筛选出来
      SELECT * FROM customer c
            WHERE not exists (SELECT customer_id FROM order o WHERE c.customer_id=o.customer_id);
      
      • 1
      • 2
    • in 和 exits
      • in后面放数据量小的表,exits后面放数据量大的表
      • 使用 in ,两表执行顺序是先查 B 表,再查 A 表
        select * from A where id in (select id from B)
        
        • 1
      • 使用exits,使用 exists,两表执行顺序是先查 A 表,再查 B 表
        select * from A where exists (select 1 from B where B.id = A.id)
        
        • 1
    窗口函数

    窗口函数是一种分析型的 OLAP(Online Anallytical Processing,联机分析处理)函数,意思是对数据库数据进行实时分析处理。

    • 执行顺序:在执行完select之后,在所得结果集之上进行partition

    • <函数名称> OVER ([PARTITION BY <列名1>, <列名2>, ...] ORDER BY <排序列> [ASC|DESC] ROWS <行范围指定>)

      • 函数
        • 聚合函数
        • row_num()、rank()、dense_rank() 1234\1223\1223
        • first_value、last_value 取分组内,排序后,截止到当前行第一个值\最后一个值
      • PARTITION BY colx (分组语句,类似group by)
      • ORDER BY coly
      • ROWS 行选择语句
        • rows unbounded preceding 当前行至第一行
        • rows x following/preceding 当前行到当前行往后/前x行
        • rows between x preceding and y following 从前x到后y行
        • rows between unbounded preceding and unbounded following 从第一行到最后一行
    • 链接1

    INSERT

    • 插入完整数据,忽略列名
      INSERT INTO table1
      VALUES(NULL,'Pop E.','90046','USA',NULL,NULL);
      
      • 1
      • 2
    • 插入部分列数据,写上对应列名
      INSERT INTO table1(name,addr,zip,country)
      VALUES('Pop E.','90046','USA');
      
      • 1
      • 2
    • 插入多个行
      INSERT INTO table1(name,addr,zip,country)
      VALUES('Pop E.','90046','USA'),
      	  ('Martian M.','11213','USA');
      
      • 1
      • 2
      • 3

    UPDATE、DELETE

    • 更新
      UPDATE table1
      SET name = 'new name',
      	zip = 'new zip'
      WHERE id =10005;
      
      • 1
      • 2
      • 3
      • 4
    • 删除
      DELETE FROM table1
      WHERE id =10005;
      
      • 1
      • 2

    表操作

    • 创建表
      • NOT NULL,AUTO_INCREMENT:只允许一个自增列;DEFUALT,PRIMARY KEY(),ENGINE =
      --注释
      /*
      多行注释
      */
      CREATE TABLE table1
      (
      	id int NOT NULL AUTO_INCREMENT,
      	name char(50) NOT NULL DEFAULT 'JACK',
      	countrt char(50) NULL,
      	PRIMARY KEY(id)
      )ENGINE = InnoDB;
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
    • 更新表
      ALTER TABLE table1
      ADD  c2 int, --新增
      ADD  CONSTRAINT xxx,
      Drop c3, -- 删除列
      CHANGE c_old c_new int.  -- 修改列名
      MODIFY c4, int -- 修改数据类型
      FOREIGN KEY (id) REFERENCES table2 (id)
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
    • 重命名表
      RENAME TABLE new_table1 TO table1,
      			 new_table2 TO table2,
      			 new_table3 TO table3;
      
      • 1
      • 2
      • 3
    • 删除表
      DROP TABLE tables
      
      • 1

    视图

    为什么使用视图

    • 虚拟的表,包含的不是数据,而是根据需要检索数据的查询
    • 重用SQL语句
    • 简化复杂的SQL操作
    • 使用表的组成部分而不是整个表
    • 保护数据,给予用户表的特定访问权限而不是整个表的访问权限
    • 更改数据格式和表示,视图可返回与底层表的表示和格式不同的数据

    视图的规则和限制

    • 唯一命名
    • 可创建的视图数目没有限制
    • 创建视图需要有相应的访问权限
    • 视图可以嵌套(可以从其他视图查询数据得到视图)和联结(可以编写联结视图与表的SELECT语句)
    • ORDER BY可以用在视图中,但如果从该视图中查询的SELECT语句含有ORDER BY,则会覆盖视图的ORDER BY 语句?
    • 视图不能索引,也不能有关联的触发器和默认值

    视图的使用

    • 创建视图
      CREATE VIEW view_name
      SELECT id
      FROM table1
      
      • 1
      • 2
      • 3
    • 删除视图
      DROP VIEW view_name
      
      • 1
    • 更新视图 可以先drop再创建,也可使用下列语句
      CREATE OR REPLACE VIEW view
      
      • 1
    • 查看创建视图的语句
      SHOW CREATE VIEW view_name
      
      • 1

    存储过程

    • 创建存储过程

      CREATE PROCEDURE procedure_name(
          In id  INT,                      //输入参数  
      	OUT p1 DECIMAL(8,2),             //输出变量,也可不输出
      	OUT ph DECIMAL(8,2),
      	OUT pa DECIMAL(8,2),
      )
      BEGIN
      	SELECT MIN(price)
      	INTO p1
      	FROM table1
      	SELECT MAX(price)
      	INTO ph
      	FROM table1
      	SELECT AVG(price)
      	INTO pa
      	FROM table1
      END
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
    • 调用:执行存储过程

      CALL PROCEDURE procedure_name(1000,    //传入输入参数
                                    @price1,  //传入参数接受结果
                                    @price2, 
                                    @price3); 
      SELECT @price1;
      
      • 1
      • 2
      • 3
      • 4
      • 5
    • 删除存储过程

      DROP PROCEDURE procedure_name
      
      • 1
    • 更新存储过程

      CREATE OR REPLACE VIEW view
      
      • 1
    • 查看创建存储过程的语句

      SHOW CREATE PROCEDURE procedure_name
      
      • 1

    游标

    • 游标(cursor)是一个存储在MySQL服务器上的数据库查询,它不是一条SELECT语句,而实被该语句检索出来的结果集。在存储了游标之后,应用程序可以根据需要滚动或浏览其中的数据。
    • 使用游标
      • MySQL5中只能用于存储过程中(或函数)中,其他的DBMS不一定;
      • 声明游标 DECLARE
      • 声明后,必须打开游标使用
      • 对于含有数据的游标,根据需要取出(检索)游标
      • 结束游标使用后,必须关闭游标
    CREATE PROCEDURE procedurename()
    BEGIN
    	DECLARE o INT;     // 声明局部变量
    
    	DECLARE cursorname CURSOR   // 声明游标
    	FOR 
    	SELECT num FROM orders;
    
    	OPEN cursorname;
    
    	REPEAT   // 循环将查询到的num赋值给局部变量o
    		FETCH num TO o;
    	UNTIL done END REPEAT;
    	
    	CLOSE cursorname;
    END
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    触发器

    触发器使用注意

    • 唯一的触发器名
    • 触发器关联表
    • 触发器响应的活动(DELETE、UPDATE、INSERT)
    • 触发器何时执行(AFTER、BEFORE)

    INSERT 触发器

    • NEW 虚拟表,访问插入的行
    • BEFORRE 触发器中,NEW的值可进行更改
    • 对于AUTO_INCREMENT列,插入前包含0,插入后自动包含自动生成的值
    CREATE TRIGGER trigger_name AFTER INSERT ON table1
    FOR EACH ROW SELECT NEW.ordernum;
    
    • 1
    • 2

    DELETE 触发器

    • OLD 虚拟表,访问被删除的行
    • OLD表中的值只读,不可更新
    CREATE TRIGGER trigger_name BEFORE DELETE ON table1
    FOR EACH ROW 
    BEGIN
    	INSERT INTO tabel2(name,id)
    	VALUES (OLD.name,OLD.id);
    END;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    UPDATE触发器

    • NEW 虚拟表,访问更新后的行,BEFORE触发器中可更改需要UPDATE的行的数据
    • OLD 虚拟表,访问被更新的行,只读
    CREATE TRIGGER trigger_name BEFORE UPDATE ON table1
    FOR EACH ROW SET NEW.country = upper(NEW.country);
    
    • 1
    • 2
  • 相关阅读:
    Vue中如何进行瀑布流布局与图片加载优化
    oracle10数据库迁移
    首届COLM顶会:见证NLP领域的又一里程碑
    ES6新增关键字:let和const及let的常用场景
    ASEMI整流桥UD4KB100,UD4KB100体积,UD4KB100大小
    基于Java+SpringBoot+Vue前后端分离失物招领平台设计和实现
    使用Python进行自然语言处理(NLP):NLTK与Spacy的比较【第133篇—NLTK与Spacy】
    深度学习入门(二) 环境配置与预备知识
    Navicat导入SQL文件
    pdf文件属性的删除
  • 原文地址:https://blog.csdn.net/qq_43250021/article/details/132650001