数据库笔记


这份笔记,还是大二学数据库时候的笔记。

博客地址

zyzcos.gitee.io


00-基础概念

  • sql:标准的结构化查询语言(由DBMS编译完成)
  • DB:DataBase(数据库,实际上在硬盘上以文件形式存在)
  • DBMS:DataBase Management System (数据库管理系统 MYSQL ORACLE DB2 …)

  • 表:table
  • 行:数据 / 记录
  • 列:字段(字段三元素:字段名、数据类型、相关的约束)

SQL语句

  • DQL(数据查询语言):查询语句、凡是select都是DQL语句 (select)
  • DML(数据操作语言):insert delete update 对表数据的增删改 (insert delete update)
  • DDL(数据定义语言):create drop alter 对表结构的增删改 (create drop alter)
  • TCL(事务控制语言):commit提交事务,rollback回滚事务
  • DCL(数据控制语言):grant授权 revoke撤销权限等

DOS命令窗口使用mysql

  1. 登录:mysql -u root -p
  2. 查看有什么数据库:show databases
  3. 创建表:create database 表名
  4. 使用表:use 表名
  5. 展示表:show tables
  6. 查询表结构:desc 表名
  7. 初始化数据:执行初始化语句脚本: source 脚本文件路径

sql脚本

  • 后缀名为 .sql
  • 脚本的使用:在DOS命令窗口中: source 脚本路径

MYSQL常用命令

  • select database(); 查看当前数据库
  • \c 结束一条语句
  • show create table 表名 查看创建表的语句

字符串用单引号

字段值可以参与数值运算

常见数据类型

  • int 整数型
  • bigint 长整型
  • float 浮点型
  • char 定长字符串
  • varchar 可变长字符串
  • data 日期类型
  • BLOB 二进制大对象(存储图片、视频等流媒体信息)Binary Large OBject
  • CLOB 字符大对象(存储较大文本,可存储4G字符串) Character Large OBject

CRUD

  • create
  • retrieve(检索)
  • update
  • delete

01-简介

1.什么是SQL

​ 一种操作数据库的语言

2.SQL可以做什么?

* 数据查询、获取、插入、更新、修改、删除
* 创建数据库
* 在数据库中创建表、创建存储过程、创建视图
* 设置表、存储过程、视图的权限

3.SQL的重要命令

  • SELECT:从数据库获取数据
  • UPDATE:更新数据库中的数据
  • DELETE:从数据库中删除数据
  • INSERT INTO:向数据库插入新的数据
  • CREATE DATABASE:创建新数据库
  • ALTER DATABASE:修改数据库
  • CREATE TABLE:从创建新表
  • ALTER TABLE:该表数据库表
  • DROP TABLE:删除表
  • CREATE INDEX:创建索引
  • DROP INDEX:删除索引

02-查询、排序、条件语法

  1. SELECT 用于向数据库中选取数据

    语法:

    SELECT column_name1,column_name2 
    FROM table_name; 
    
  2. **SELECT DISTINCT **用于列出不同的值 去重

    语法:

    SELECT DISTINCT column_name1,column_name2 
    FROM table_name; 
    
  3. WHERE 用于提取满足指定条件的记录

    语法:

    SELECT column_name,column_name
    FROM table_name
    WHERE column_name operator value;
    

    例子:从table1中选出属性country中值为cn的url

    SELECT url 
    FROM TABLE1
    WHERE country='cn'	
    

    其中opreator的可用运算符有:

    运算符描述
    =等于
    <>不等于。**注释:**在 SQL 的一些版本中,该操作符可被写成 !=
    >大于
    <小于
    >=大于等于
    <=小于等于
    BETWEEN在某个范围内
    LIKE搜索某种模式
    IN指定针对某个列的多个可能值
  4. ORAND 用于多过滤条件(AND 优先级大于 OR)

    语法+例子: 列出contry为cn 且 年龄大于18 的人的名字

    SELECT name
    FROM people_table
    WHERE country='CN'
    AND age>18
    

    ADN和OR 还可以嵌套使用 比如说 :列出年龄大于18 国家是cn或者us的人名

    SELECT name
    FROM people_table
    WHERE age>18
    AND (contry='cn' OR contry='us')
    
  5. ORDER BY 用于排序

    语法:默认为ASC 升序

    SELECT column_name,column_name
    FROM table_name
    ORDER BY column_name,column_name ASC|DESC;
    

    例子: 按age的降序 给整个表进行排序

    SELECT * 
    FROM table_people
    ORDER BY age DESC
    

    例子: 先按照sex进行降序排序 当sex一样的时候,按照age进行升序排序

    SELECT *
    FORM table_people
    ORDER BY sex DESC, age  
    

    例子:按照所选字段的第1个字段升序排序 不建议使用

    SELECT NAME AGE
    FROM TABLE_NAME
    ORDER BY 1;
    
  6. INSERT INTO 用于向表插入新记录(也可以插入一个表)

    语法: 不指定插入的位置(可以多行插入)

    INSERT INTO table_name
    VALUES (value1,value2,value3,value4...),(value1,value2,value3,value4...),....
    

    语法:指定插入的文位置

    INSERT INTO table_name(column1,column2,column3...)
    VALUES (value1,value2,value3...)
    

    语法:插入一个表(将表2的左右记录插入到表1中)

    INSERT INTO table_name1 SELECT * FROM table_name2;
    
  7. UPDATE 用于更新表已存在的记录(修改)

    语法:如果没有where 整个表的column1 column2的值都会被改变

    UPDATE table_name
    SET column1=value1,column2=value2...
    WHERE some_column=some_value
    

    例子:更新table_people,将所有contry为us的记录中 其money改为1 name改为son

    UPDATE table_people
    SET money=1, name='son'
    WHERE contry='us'
    
  8. DELETE 用于删除表中记录

    语法:

    DELETE FROM table_name
    WHERE some_column=some_value
    

    例子:删除 已经死亡 且 国籍为null的记录

    DELETE FROM table_name
    WHERE (isdead=1 AND contry=null)
    

    例子:删除所有

    DELETE * 
    FROM table_name
    
  9. IN 用于条件筛选的

    语法:列出 年龄为18或者36的人名

    SELECT NAME FROM TABLE_NAME
    WHERE AGE IN (18,36);
    

    语法:列出年龄不为18和36的人名

    SELECT NAME FROM TABLE_NAME
    WHERE AGE NOT IN (18,36);
    
  10. BETWEEN 用于条件筛选的

    语法:列出年龄在18到36之间的人名(包括18和36) 左边小值 右边大值

    SELECT NAME FROM TABLE_NAME
    WHERE AGE BETWEEN 18 AND 36;
    
  11. LIKE 用于模糊查询 _代表一个字符 %代表任意多个字符

    语法:列出开头为A的人名

    SELECT NAME FROM TABLE_NAME
    WHERE NAME LIKE 'A%';
    

    语法:列出第二个字母为A的人名

    SELECT NAME FROM TABLE_NAME
    WHERE NAME LIKE '_A';
    

    语法: 列出第一个字母为_的人名(使用转义字符

    SELECT NAME FROM TABLE_NAME
    WHERE NAME LIKE '\_';
    
  12. IS NULL 和 IS NOT NULL

    语法:列出国籍为空的人名

    SELECT NAME FROM TABLE_NAME
    WHERE COUNTRY IS NULL

03-SQL语句的执行顺序

SELECT 						5
​	字段
FROM							1
​	表名
WHERE							2
​	条件
GROUP BY					3
​	....
HAVING						4
​	....
ORDER BY						6
​	.... 
LIMIT 							7(limit语句是SQL语句中,最后一个执行的)
​	...

04-处理函数

1.多行处理函数(分组函数)

特点
  • 多行处理,一行结果
  • 多行处理函数,自动忽略字段值为NULL的
  • 不能运用于WHERE子句当中(会1111报错)why???
    • 因为 group by是在执行where之后才执行的
    • 而分组函数 在group by 后面才执行的
    • 于此同时,就解释了为什么叫分组函数
类别
  • count(字段值):计数

    语法:统计记录的条数

    SELECT count(*) FROM TABLE_NAME
    

    语法:统计国籍不为NULL的条数

    SELECT count(country) FROM TABLE_NAME
    
  • sum(字段值):求和

    语法:求工资总和

    SELECT sum(sal) FROM TABLE_NAME
    
  • avg(字段值):求平均值

  • max(字段值):求最大值

  • min(字段值):求最小值

2.单行处理函数

特点
  • 单行处理、单行结果
类别
  • ifnull(可能为NULL的数据,被当做什么处理)

    语法:将字段值为null的设置为‘cn’ 且列出其名字 和 国籍

    SELECT name ifnull(country,'cn') FROM TABLE_NAME	
    

05-分组查询

group byhaving

单字段值分组查询
  • 语法:

    GROUP BY :按照某个字段或者某些字段进行分组

    HAVING:对分组之后的数据进行再次过滤

    例子:找出每个工作岗位的最高薪资

    SELECT job,max(sal) FROM table_name GROUP BY job;
    

    例子:找出每个国家的最高年龄

    SELECT max(age),country FROM table_name GROUP BY country;
    

    例子:找出每个部门平均薪资,且显示平均薪资大于等于2500的

    SELECT deptno,avg(sal) FROM table_name GROUP BY deptno having avg(sal)>2500
    

    错误例子:name没有意义

    SELECT name,max(age),country FROM table_name GROUP BY country;
    
  • 注意:当sql语句中有group by的时候,select只能跟分组函数分组字段

  • 当sql语句中,没有group by的时候,整个表会自成一组;

多字段值分组查询
  • 例子:找出不同部门中每个工作岗位的最高薪资

    SELECT deptno,job,max(sal) FROM table_name GROUP BY deptno,job;
    

注意:

​ 分组进行筛选的时候,优先考虑where筛选后再分组 效率较高

​ 分组进行筛选的时候,其次考虑分组后 再用having筛选

06-多表查询

什么是链接查询?

​ 就是多表查询

链接查询的分类

  • 按照语法年代分

    • SQL92语法(一些老的DBA还在用)
      • SQL99语法(常用)
  • 其他

    • 内连接(inner join INNER可以省略)

      • 等值链接(体现在限制条件中)

        99语法: 查询每个人对应的职位以及部门名称 a表中拥有人和职位和部门编号 b表中拥有部门编号和部门名称

        SELECT a.name a.job , b.depname
        FROM table_a AS a 
        INNER JOIN table_b AS b
        ON a.depno = b.depno
        

        92语法:

        SELECT a.name a.job , b.name
        FROM table_a AS a , table_b AS b
        WHERE a.depno = b.depno
        
      • 非等值链接(体现在限制条件中)

        99语法: 查询每个人的工资等级 a表中有人和工资 b表中有工资等级以及对应的最高最低值

        SELECT a.name , b.grade
        FROM table_a AS a 
        INNER JOIN table_b AS b
        ON a.sal BETWEEN b.lowest AND b.heighest
        

        92语法:

        SELECT a.name , b.grade
        FROM table_a as a , table_b as b
        WHERE a.sal BETWEEN b.lowest AND b.heighest
        
      • 自链接(将一张表 看成 两张表 来链接查询)

        99语法:查询每个员工的上级领导 表中有每个员工的编号 员工名字 以及 员工上级的编号

        SELECT a.name , b.name
        FROM table_a AS a 
        INNER JOIN table_a AS b
        ON b.manage = a.id
        
    • 外连接(outer join OUTER可以省略)

      • 左外链接(左链接) 左边为主表

        99语法:查询出所有员工的上级领导(相较于自链接而言,不会忽略主表中的a.mange=NULL的记录

        SELECT a.name , b.name
        FROM table_a as a
        LEFT JOIN
        table_b as b
        ON a.manAge = b.id
        
      • 右外连接(右链接)

        99语法:查询出所有员工的上级领导(相较于自链接而言,不会忽略主表中的a.mange=NULL的记录

        SELECT a.name , b.name
        FROM table_b as b
        RIGHT JOIN
        table_a as a
        ON a.manAge = b.id
        
    • 全连接 = 左连接 + 右链接 + 去重

      • 很少使用,作为了解即可
      • FULL OUTER JOIN

内外链接的区别

  • 内连接:
    • A,B两表进行内链接查询, A,B两表处于平等地位,没有主副之分
  • 外链接:
    • A,B两表进行外查询,A,B两表处于不平等地位,有主副之分,主要查询主表,捎带查询副表。当副表中的数据不能和主表的匹配,则副表自动模拟出与主表NULL进行匹配

笛卡尔乘积现象

​ 当进行多表查询时,如果没有添加限制条件,就会出现笛卡尔积现象

内外链接、全连接等的Venn diagram解释:

https://blog.csdn.net/u014204541/article/details/79739980

多表查询

....
a表
(left/right)jion
b表
on	条件1
(left/right)join
c表
on	条件2
...

意为:a表和b表通过条件1链接后,再和c通过条件2链接

07-union

union:将两个表链接起来

  • 前提条件:两个表的列数要一致,不然会报错
  • 语法:
    select e.name from table_a e
    union
    select d.name from table_b d;
    

08-limit

limit(重点,分页查询全靠它)

  • 它是mysql特有的语句
  • 作用:用于提取结果数据中的某一部分
  • 语法:limit startIndex,length
    取出工资前5的人名以及其工资
    select e.name,e.sal
    from table_a e
    order by e.sal desc
    limit 0,5;
    

使用limit进行分页

  • 每一页pageSize条记录
    第pageNo页:limit ( pageNo - 1 ),pageSize;

09-表操作

创建表

​ 语法格式:

create table 表名(
	字段名1 数据类型 约束条件,
	字段名2 数据类型 约束条件,
	字段名3 数据类型 约束条件,
	字段名4 数据类型 约束条件,
);

复制表

​ 语法格式:将查询到的表 创建成一个新表

create table 表名 as select语句;

删除表

delete:删除表格上面的数据,但是不删除物理空间
删除大表: truncate table 表名(表被截断,不可回滚,永久丢失,但是保留表头)

10-约束

约束的分类

  • 非空约束(not null):约束的字段不能为空

  • 唯一约束(unique):约束的字段不能重复

    • 单字段约束**(列级约束)**:

       字段 数据类型 unique;
      
    • 多字段联合约束**(表级约束)**:

       unique(字段1,字段2....);
      
  • 主键约束(primary key):约束的字段既不能为空,又不能重复

    • 主键的作用:

      • 表的三范式中,第一范式要求表必须有主键
      • 主键值是这行记录在当前表中的唯一标识
    • 主键的分类:

      • 根据主键字段的字段数量来划分
        • 单一主键(推荐使用
        • 复合主键(多个字段联合添加主键约束)(不推荐使用,违反了三范式
      • 根据主键性质来划分
        • 自然主键(主键值最好是一个和业务没有任何挂钩的自然数
        • 业务主键(不推荐使用,因为主键最好不要跟记录有关联。)
    • 一个表只能由一个主键约束

    • 主键值自增

      id int primary key auto_increment;
      
  • 外键约束(foreign key):

    • 语法: 学生表t_student 中的外键calssno 参考与班级表t_class中的cno

      create table t_student(
      	foreign key(classno) references t_class(cno),
      );
      
    • 外键一般引入的是主键,即使不是主键,也必须具有唯一性

  • 检查约束(check):Oracle数据库有,MYSQL没有

11-存储引擎

  • 完整的建表语句

    CREATE TABLE '表名'(
    	'id' int(11) DEFAULT NULL
    )ENGINE=InnoDB DEFAULT CHARSET=utf8
    
  • 存储引擎是MYSQL特有的,指的是表的存储方式

  • MYSQL的默认存储引擎是InnoDB

MYSQL存储引擎的分类

  • 查看当前版本MYSQL支持的存储引擎
    show engines \G
    

MyISAM

  • 是MYSQL中最常见的引擎
  • 不支持事务
  • 其用三个文件来表示一个表
    • 格式文件 — 存储表结构**(.FRM)**
    • 数据文件 — 存储表数据**(.MYD)**
    • 索引文件 — 存储表索引**(.MYI)**
  • 优点:
    • 灵活的 AUTO_INCREMENT 字段处理
    • 被压缩文件节省存储空间,并且可以转化为只读表,提高检索效率
  • 缺点:
    • 不支持事务

InnoDB

  • 是MYSQL中的默认引擎,最安全
  • 支持事务
  • 数据库目录用**.FRM文件格式表示;使用tablespace存储表内容**,无法被压缩,无法转化为只读
  • 在MySQL服务器崩溃后提供自动恢复
  • 支持行级锁级联删除、更新

MEMORY

  • 数据库目录用**.FRM**文件格式表示;
  • 表数据、索引存储在内存中(断电丢失数据)
  • 表级锁
  • 不能包含CLOB BLOB字段
  • 检索很快!

12-事务

什么是事务?

  • 一个事务 是 一个完整的业务逻辑单元,不可再分

    • 银行的转账系统,这就是一个事务

      update t_account set balance = balance - 1000 where actno = 'act001'
      update t_account set balance = balance + 1000 where actno = 'act002'
      
  • 事务只包含DML语句(delete insert update),且其中的DML语句只能全部成功或者全部失败

事务的特性:ACID

  • A:原子性 事务时最小的工作单元,不可再分
  • C:一致性 事务必须保证多条DML语句同时成功或同时失败
  • I:隔离性 事务与事务之间必须有隔离
  • D:持久性 最终数据必须持久化到硬盘文件中,事务才算成功

关于事务的隔离性:

  • 第一级别:读未提交(read uncommitted)
    • 对方数据还未提交,当前事务就可以读取到对方未提交的数据
    • 缺点:存在脏读(Dirty read)现象。
  • 第二级别:读已提交(read committed)
    • 对方数据提交,当前事务就可以读取到对方已提交的数据
    • 缺点:不可重复读,不能读取到历史记录,只能读取到最新数据。存在幻读现象
  • 第三级别:可重复读(repeatable read)
    • 解决了不可重复读问题
    • 缺点:事务A读取到的数据是开启事务A时的表的内容,若事务B对该表进行操作的话,不影响事务A里面的表的内容。存在幻读现象
  • 第四级别:序列化读 / 串行化读 (serializeable)
    • 每次只能处理一个事务,解决了所有问题
    • 缺点:效率低,事务需要排队

设置事务隔离等级

​> 设置

set global transaction isolation level read uncommitted/其他

​> 查看

select @@global.tx isolation

oracle默认二档起步,mysql默认三档起步

事务的原理:

利用MYSQL食物日志undolog文件,udolog属于逻辑日志,它记录的是sql执行相关的信息,当回滚发生的时候,数据库会工具undolog的内容做与之前相反的工作。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UX0MxahD-1642854504136)(E:\02-数据库的深入学习\笔记-SQL\事务原理图.png)]

事务的操作

  • mysql默认自动提交,所以要通过开启事务,来关闭自动提交

    start transaction	//用来开启事务
    	DML		//sql语句
    commit/rollback		//用于结束事务
    

redo日志

​ 防止缓存到硬盘的过程中,只执行了一部分而发生mysql宕机问题。mysql具有redo日志。可以重启mysql后,重新将数据持久化到硬盘中

13-索引

数据库中的两种检索方式

  • 全表扫描 (效率较低)
  • 根据索引检索(效率较高)

什么是索引

相当于一本书的目录,可以通过目录快速找到对应的资源

什么时候考虑添加索引

  • 当数据量庞大时
  • 该字段很少的DML操作
  • 该字段常常出现在where语句中
  • 注意:
    • 主键会自动添加索引,主键索引效率非常高。
    • unique也会自动添加索引

如何使用索引

  • 创建索引对象

    create index 索引名称 on 表名(字段名)		
    
  • 删除索引对象

    drop index 索引名称 on 表名
    

索引的分类

  • **单一索引:**单一字段添加索引
  • **复合索引:**多个字段联合添加一个索引
  • **主键索引:**主键会自动添加索引
  • **唯一索引:**unique也会自动添加索引

索引的实现原理

  1. 添加索引后,底层构建了一个B+Tree(进行排序、分区等)
  2. 通过树的搜索,找到目标字段值
  3. 通过该目标字段值的物理地址,找到整条记录

注意:

​ 索引不是万能的,索引也需要维护

​ 索引的底层原理——B + Tree

​ 当进行like模糊查询的时候,索引会失效

​ 如果字段是字符的话 会通过hash函数,使其唯一且可排序

00-索引拓展

什么是索引

快速找到目标字段值,提高查询速度

索引的分类

  1. MYSQL根据存储引擎对索引进行分类
  2. InnoDB主键使用聚簇索引
  3. MyISAM所有的索引都是非聚簇索引

非聚簇索引

  1. 什么是非聚簇索引

    • 在二叉树存储数据中,叶子存储着数据的主键值数据所在行地址
  2. 非聚簇索引工作原理

    //创建表
    create table 'stu'(
    	'id' int(11) not null,
    )
    //创建索引
    create index id_index on s(id);
    //进行查询
    SELECT * FROM stu s WHERE s.id=1;
    
    • 先在索引树找到id
    • 这个索引id存储在叶子上,同时叶子上还会存储着数据的地址信息

聚簇索引

  1. 什么是聚簇索引
    • 在二叉树存储数据中,叶子还存储着索引其数据
    • 这样的话 就不需要根据数据地址 再去寻找其数据 从而提高了效率

聚簇索引和非聚簇索引的区别 以及 存储引擎区别

  1. 索引类型与存储引擎的关系

    • InnoDB可以创建【聚簇索引】和【非聚簇索引】

    • MyISAM 只可以创建 【非聚簇索引】

  2. 叶子节点存储的内容

    • 非聚簇索引:存储着【主键值】以及【该主键值数据的地址信息】
    • 聚簇索引:存储着【主键值】以及【该主键的数据信息】
  3. 关于索引的问题

    • MyISAM 允许表中可以没有主键和索引

    • InnoDB 自动将主键设置为聚簇索引 , 若没有主键,则会将一个唯一且非空的字段设置为索引

      若在没有 , 则会自动生成一个6字节的主键,但对于用户不可见

  4. 关于自动增长问题

    • MyISAM、InnoDB 自动增长 都必须是索引
    • 当使用组合索引时 :
      • MyISAM:自动增长 不一定是第一列,可以是多列排序后递增
      • InnoDB: 自动增长 一定是第一列
  5. 关于count函数

    • MyISAM : 存有总的行数
    • InnoDB:没有存储总行数,但是使用where的时候,两者一致
  6. 关于全文索引

    • MyISAM 支持FULLTEXT类型的全文索引
    • InnoDB 不支持
  7. 关于删除表问题

    • InnoDB DELETE:一条一条删除数据;truncate:截断 不可回滚
    • MyISAM DELETE:会创建临时表,在临时表进行删除,然后使用临时表覆盖原表

聚簇索引和非聚簇所以的适用场合

  • 大前提:索引能够大大地提升查询速度,但是对存储空间和CPU使用率影响很大

  • 适用场合参考条件

    • 数据频繁修改的表,不应该设置索引

    • 不是经常作为【检索字段】、【分组字段】、【排序字段】的字段,不应该设置索引

14-视图

什么是视图

​> 站在不同角度去看数据

视图的使用

  • 创建视图:将table_a中的name,age,sex创建为一个视图

    create view myview as select name,age,sex from table_a;
    
  • 删除视图:

    drop view myview;
    
  • 对视图的操作:

    select * from myview;
    

对视图的操作会影响原表数据

视图的作用

* 仅仅给数据操作者,其需要操作的数据,隐藏了表的**其他数据**并起到**保密作用**。

15-数据三范式

数据三范式的作用:

降低数据冗余

第一范式

​ 必须有主键,并且每个字段原子不可分性

第二范式

  • 建立在第一范式的基础之上,所有非主键字段完全依赖主键不能产生部分依赖。(不能用于联合主键)
  • 多对多关系的处理方法三张表,关系表两个外键

第三范式

  • 建立在第二范式的基础之上,所有非主键字段直接依赖主键,不能产生传递依赖
  • 一对多关系的处理方法两张表,多的表加外键

注意:在实际的开发中,以满足客户的需求为主,有的时候会拿冗余换执行速度。

  • 一对一关系处理方法:
    • 共享主键
    • 外键+唯一(相当于老师所说的引用

16-存储过程

什么是存储过程

​> 将多个SQL语句封装成一个函数,用函数的形式调用。

DELIMITER //	-- 设置//为结束符号
create procedure 存储过程名(参数类型 变量名 变量类型)
-- 参数类型 
-- in为写入类型参数 存储过程内,外部传进来的值 在内部中操作 对外部的值的本身不受影响
-- out为写出类型参数	存储过程内, 外部传来的值对内部的值没有影响 内部操作 对外部有影响
begin
xxxx;
xxxxx;
xxxx;	-- 存储过程的主体
end	//	-- 结束语句
DELIMITER;	-- 取消//为结束符号
  • 如果没有DELIMITER。遇到第一个;就结束了
  • 所以DELIMITER意义为:从现在开始 //为结束符号
call 存储过程名称(参数)

mysql变量

  • 局部变量

    declare 变量名 变量类型 [default value]
    set c=a+b;	-- 赋值
    select name into v_name from emp where emp_id='1';	-- 将获取的值,放在v_name中
    
    • 数据的定义,必须放在最前端【在所有数据使用之前】
  • 用户变量【在整个数据库实例中有效】

    set @变量名=变量值
    select @变量名;=变量值
    select @变量名;=字段名 from 表名 where 条件	-- 动态加载
    

控制语句

IF	ELSEIF	ELSE	END IF;

CASE 判断值

​	WHEN xxx THEN xxxx

​	WHEN xxx THEN xxx

​	ELSE xxxx

END CASE

外键**。

第三范式

  • 建立在第二范式的基础之上,所有非主键字段直接依赖主键,不能产生传递依赖
  • 一对多关系的处理方法两张表,多的表加外键

注意:在实际的开发中,以满足客户的需求为主,有的时候会拿冗余换执行速度。

  • 一对一关系处理方法:
    • 共享主键
    • 外键+唯一(相当于老师所说的引用

16-存储过程

什么是存储过程

​> 将多个SQL语句封装成一个函数,用函数的形式调用。

DELIMITER //	-- 设置//为结束符号
create procedure 存储过程名(参数类型 变量名 变量类型)
-- 参数类型 
-- in为写入类型参数 存储过程内,外部传进来的值 在内部中操作 对外部的值的本身不受影响
-- out为写出类型参数	存储过程内, 外部传来的值对内部的值没有影响 内部操作 对外部有影响
begin
xxxx;
xxxxx;
xxxx;	-- 存储过程的主体
end	//	-- 结束语句
DELIMITER;	-- 取消//为结束符号
  • 如果没有DELIMITER。遇到第一个;就结束了
  • 所以DELIMITER意义为:从现在开始 //为结束符号
call 存储过程名称(参数)

mysql变量

  • 局部变量

    declare 变量名 变量类型 [default value]
    set c=a+b;	-- 赋值
    select name into v_name from emp where emp_id='1';	-- 将获取的值,放在v_name中
    
    • 数据的定义,必须放在最前端【在所有数据使用之前】
  • 用户变量【在整个数据库实例中有效】

    set @变量名=变量值
    select @变量名;=变量值
    select @变量名;=字段名 from 表名 where 条件	-- 动态加载
    

控制语句

IF	ELSEIF	ELSE	END IF;

CASE 判断值

​	WHEN xxx THEN xxxx

​	WHEN xxx THEN xxx

​	ELSE xxxx

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值