数据库

一、初识MySQL

1、什么是数据库

数据库是由一批数据构成有序的集合,这些数据被存放在结构化的数据表中。数据表之间相互关联,反映了客观事物间的本质联系。数据库系统提供对数据的安全控制和完整性控制。
2、为什么要使用数据库

数据库系统是用来管理数据的,建立的数理逻辑和集合操作基础上的。
具有高效、可靠、完整、自同步等特性,是业务系统进行数据控制的最佳选择。
数据库系统一般提供高效的数据控制和数据检索功能,采用SQL语言来进行数据操作。

数据库的基本概念(关系型 非关系型Memcache(K,V)、Redis(k,v k,h,v lists set))

表:在关系型数据库中,数据表是一系列二维数据的集合,用来存储 数据和操作数据的逻辑结构。它由纵向的列和横向的行组成,行被称之为记 录,是组织数据的单位,列被称之为字段,每一列表示一条记录的某一个属 性,都有相应的描述信息,如数据类型、数据长度等。
数据类型:数据类型决定了数据在计算机中的存储格式,代表不同的 信息类型。常用的数据类型有:整数数据类型、浮点数据类型、精确小数类型、 二进制数据类型、日期/时间数据类型、字符串数据类型等,表中的每一个 字段必须指定某种数据类型,例:上图中的姓名字段为字符串类型。
主键:主键(Primary Key:简称 PK),又称主码,用于唯一地标识表中 的每一条记录。可以定义表中的一列或多列为主键,主键列上不能存在两行 相同的值,也不能为空值。例如:上图中的编号为主键

数据库技术的组成:

数据库系统,由以下三部分组成:
(1)数据库:用于存储数据的地方 例:Mysql Server
(2)数据库管理系统:用于管理数据库的软件 SqlYog
(3)数据库应用程序

*SQL语言,包含以下四部分(重点、难点):

(1)数据定义语言 DDL:DROP CREATE ALTER等语句
(2)数据操作语言 DML:INSERT(插入) UPDATE(修改) DELETE(删除)
(3)数据库查询语言 DQL:SELECT 语句
(4)数据库控制语言 DCL:GRANT REVOKE COMMIT ROLLBACK

数据访问接口(重点、难点 后续讲解):

*(1)ODBC:Open Database Connectivity 开放数据库直 连为访问不同的SQL数据库提供了一个共同的接口。 ODBC使用SQL作为访问数据的标准。这一组接口提供 了最大限度的互操作性:一个应用程序可以通过共同的 一组代码访问不同的SQL数据库管理系统(DBMS)
(2)JDBC:Java Database Connectivity 用于Java应用 和数据库连接的标准方法,是一种用于执行SQL语句 的Java API,可以为多种关系型数据库提供统一访问, 它由一组用Java语言编写的类和接口组成

MySQL简介

MySQL是一个小型关系型数据库,与其他大型数据库管理系统(Oracle,DB2)相比,MySQL规模小、功能有限,但是它体积小、速度快、成本低,且它提供的功能对稍微复杂的应用来说已足够使用,这些特性使MySQL成为世界上最受欢迎的开源数据库。

SQL中的运算符

*(1)算数运算符
+(加) -(减) (乘) /(除) %(取余)
(2)赋值运算符
=(赋值)
(3)逻辑运算符
AND(并且)OR(或者)NOT(非)
(4)比较运算符
=(等于) >(大于)<(小于)>=(大于等于)<=(小于等于)<>(不等于) !=(不等于)

创建数据库时常用语法

#创建数据库
CREATE DATABASE IF NOT EXISTS MySchool;
#删除数据库
DROP DATABASE IF EXISTS MySchool;
#使用数据库
USE MySchool;
#在数据库内创建表
CREATE TABLE IF NOT EXISTS `Student`(
	`stuNo` INT(4) PRIMARY KEY NOT NULL  COMMENT '学号',
	`stuName` VARCHAR(50) NOT NULL  COMMENT '姓名',
	`stuSex` CHAR(2) NOT NULL  COMMENT '性别',
	`gradeId` INT(4) UNSIGNED  COMMENT '年级编号',
	`phone` VARCHAR(50) COMMENT '联系电话',
	`address` VARCHAR(255) COMMENT '家庭住址',
	`bornDate` DATETIME  COMMENT '出生日期',
	`email` VARCHAR(50)  COMMENT '邮件账号',
	`identityCard` VARCHAR(18) NOT NULL  COMMENT '身份证号码'
)
#查看表信息
SELECT * FROM Student;
#查看数据库创建的语句
SHOW CREATE DATABASE myschool;
#查看数据表创建的语句
SHOW CREATE TABLE student;
#查看表结构
DESC student;

创建数据库时常用语法

MySQL中的数据类型

整数数据类型
TINYINT 很小的整数
SMALLINT 小的整数
MEDIUMINT 中等大小的整数
INT(INTEGER) 普通大小的整数
BIGINT 大整数

浮点数类型和定点数类型
FLOAT 单精度浮点数
DOUBLE 双精度浮点数
DECIMAL(M,D) 压缩严格的定点数

日期与时间类型
YEAR YYYY
TIME HH:MM:SS
DATE YYYY-MM-DD
DATETIME YYYY-MM-DD HH:MM:SS
TIMESTAMP YYYY-MM-DD HH:MM:SS

文本字符串类型
CHAR(M) 固定长度的非二进制字符串
VARCHAR(M) 可变长的非二进制字符串
TINYTEXT 非常小的非二进制字符串
TEXT 小的非二进制字符串
MEDIUMTEXT 中等大小的非二进制字符串
LONGTEXT 大的非二进制字符串

二进制字符串类型(Activiti)
TINYBLOB(M) 非常小的BLOB
BLOB(M) 小的BLOB
MEDIUMBLOB 中等大小的BLOB
LONGBLOB 非常大的BLOB

数据表操作

创建数据表的语法
CREATE TABLE [IF NOT EXISTS] 表名 (
字段1 数据类型 [字段属性|约束][索引][注释],
……
字段n 数据类型 [字段属性|约束][索引][注释]
)[表类型][表字符集][注释];

[IF NOT EXISTS]:代表可以被省略 IF NOT EXISTS 代表判断 在当前数据库
中是否已存在该表 如果存在 则不创建 反之则创建新表。
[ ]:统一代表可被省略的意思.
在DOS命令行中书写有些不便,所以我们可以使用MySQL的图形化界面SQLYog!

使用主键约束
主键约束,要求主键列的数据唯一且不为空。主键能够唯一的标识表中的一条记录,可以结合外键来定义不同数据表的关系,并且可以加快数据库查询的速度。

方式1:在定义主键列的同时设置主键约束
CREATE TABLE TB_NAME(
#定义主键列ID
userId INT(10) PRIMARY KEY,

);
在这里插入图片描述
方式2:在定义完所有列之后指定主键
CREATE TABLE TB_NAME(
userid INT(10),

PRIMARY KEY(userid)
);

在这里插入图片描述
使用外键约束*
外键是用来在两个表上的数据之间建立连接,它可以是一列或多列。一个表可以有一个或多个外键。外键对应的是参照完整性,一个表的外键可以为空值,若不为空值,则每一个外键列的值必须等于另一个表主键列的值。
以创建员工、部门表以及之间的外键关系为示例
#创建部门表
CREATE TABLE dept(
deptid INT(10) PRIMARY KEY COMMENT ‘部门编号’,
deptname CHAR(25) COMMENT ‘部门名称’
);
#创建员工表
CREATE TABLE emp(
empid INT(10) PRIMARY KEY COMMENT ‘员工编号’,
empname CHAR(25) COMMENT ‘部门名称’,
deptid INT(10),
CONSTRAINT FK_emp_dept FOREIGN KEY(deptid) REFERENCES dept(deptid)
);

FK_emp_dept:外键约束名
FOREIGN KEY:外键列
REFERENCES:关联表(主键列)
注意:由于员工表中数据的产生需要依赖部门表 那么 我们将部门表称之为主表,员工表称之为从表。在创建主表从表之前,必须要保证主表存在!

使用非空约束

非空约束,指字段的值不能为空。对于使用了非空约束的字段,如果用户在添加数据时没有指定值,数据库则会报错。
主键约束的案例中,使用的NOT NULL语法即为非空约束。

在这里插入图片描述
使用唯一约束 UNIQUE(唯一的意思)
唯一性约束,和主键约束有点类似,要求列的值唯一,但可以为空。使用唯一约束约束的字段如果出现重复数据 则会报错。
在这里插入图片描述
使用默认约束
默认约束,指定某列的默认值。
语法:字段名 数据类型 DEFAULT 默认值

在这里插入图片描述
自增列
在数据库应用中,经常希望在每次插入新纪录的时候,系统可以自动成主键列的值,那么可以使用AUTO_INCREMENT来实现。
在这里插入图片描述

常用数据表操作:

查看表的基本结构 DESCRIBE语句
在这里插入图片描述
查看表详情的语句 SHOW CREATE TABLE语句
在这里插入图片描述
修改表名
ALTER TABLE 旧表名 RENAME 新表名;
修改字段的数据类型
ALTER TABLE 表名 MODIFY 字段名 数据类型;
修改字段名
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型;
添加字段
ALTER TABLE 表名 ADD 新字段名 数据类型;
删除字段
ALTER TABLE 表名 DROP 字段名;
给表设置主键约束 约束名:PK_列名
ALTER TABLE 表名 ADD CONSTRAINT 约束名 PRIMARY KEY 表名()
给表设置外键约束
ALTER TABLE 从表 ADD CONSTRAINT 约束名 FOREIGN KEY(从表的外键) REFERENCES 主表 (主键);
删除数据表(表结构和数据都不保留)
DROP TABLE 表名;
删除数据表(表结构保留、数据不保留)
TRUNCATE 表名;

在这里插入图片描述

DML的插入操作

添加数据
语法:INSERT INTO 表名(column_list) VALUES(value_list);
更新数据
UPDATE 表名 set 字段1=值1,字段2=值2,…,字段N=值N [where 条件]
删除数据
1:DELETE FROM 表名 [WHERE条件];#删除表中的某几条记录
2:TRUNCATE TABLE 表名;#截断表数据 保留表结构。

在这里插入图片描述

查询DQL

查询:产生一个虚拟表,看到的是表形式显示的结果,但结果并不真正的存储。每次执行查询只是从数据表中提取数据,并安装表的形式展示出来。
查询语法
SELECT 列名|表达式|函数|常量
FROM 表名
[WHERE 查询条件表达式]
[ORDER BY 排序的列名[ASC或DESC]];

聚合函数与GROUP BY 字句

常用的聚合函数如下:
avg() 返回某字段的平均值
count() 返回某字段的行数
max() 返回某字段的最大值
min() 返回某字段的最小值
sum() 返回某字段的和

GROUP BY 字句:
分组查询是对数据按照某个或多个字段进行分组,基本语法形式为[GROUP BY 字段] [HAVING 条件表达式]。

0.1 GROUP BY 关键字通常和聚合函数一起使用,例如 AVG(),COUNT(),MAX(),MIN(),SUM() 等。
0.2 GROUP BY 可以和HAVING一起限定显示记录所需满足的条件,只有满足条件的分组才会被展示。

ORDER BY 字句
在MySQL中,可以使用ORDER BY 字句排序查询的结果集
在这里插入图片描述
LIMIT 分页字句
在MySQL中,如果要单独查询表中的某几条记录 可以使用LIMIT 字句
语法:LIMIT [行的偏移量],条数

在这里插入图片描述
模糊查询
模糊查询使用LIKE关键字进行对条件的筛选,LIKE(代表像的意思)
通配符是一种在SQL的WHERE条件字句中拥有特殊意义的字符,SQL语句中支持多种通配符,可以和LIKE一起使用的通配符有 ‘%’和 ‘_’。

% 通配符,匹配任意长度的字符,甚至包括零字符
_ 下划线通配符,一次只能通配一个字符
在这里插入图片描述
在这里插入图片描述
BETWEEN AND 的范围查询
BETWEEN AND用来查询某个范围内的值,该操作符需要两个参数,即范 围的开始值和结束值,如果字段值满足指定的范围查询条件,则这些记录会被返回。
在这里插入图片描述

MySQL中常用的内置函数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

高级查询

连接查询
连接查询是关系型数据库模型的主要特点。连接查询是关系型数据库中最主要 的查询,主要包括内连接、外连接等。通过连接运算符可以实现多个表的连接查询。 在关系型数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体 的所有信息存放在一个表中。当数据查询时,通过连接查询的操作查询出存放在多 个表中的部分数据,当两个或多个表中存在相同意义的字段时,便可以通过这些字 段对不同的表进行连接查询。
在这里插入图片描述
外连接查询
外连接查询将查询多个表中相关联的行,内连接时,返回的结果集仅仅只是 符合查询条件和连接条件的行。但有时候需要包含没有关联的行中数据,即返回查 询结果集合中的不仅包含符合连接条件的行,而且还包含左表(左外连接或左连 接)、右表(右外连接或右连接)或两个连接表(全连接)的数据行。

1.左连接 查看哪个部门下没有员工。
返回包括左表中的所有记录和右表中连接字段相等的记录。

在这里插入图片描述

2.右连接 查看哪个员工没有从属的部门。
返回包括右表中的所有记录和左表中连接字段相等的记录

在这里插入图片描述
3.MySQL中不支持全连接!

子查询

子查询指一个查询语句嵌套在另一个查询语句内部的查询。这个特性从 MySQL4.1开始引入。
在SELECT字句中先计算子查询,子查询结果作为外层 的另一个查询的过滤条件,查询可以基于一个或多个表。

简单子查询
使用比较运算符连接的子查询被称之为简单子查询。
在这里插入图片描述

注意以上子查询返回的结果集都是单条记录!

IN和NOT IN子查询
使用IN关键字进行子查询时,内层查询语句仅仅返回一个数据列,这个数据 列里的值将提供给外层查询语句进行比较操作。

在这里插入图片描述
NOT IN 表示条件不在内层查询语句的数据列中!
在这里插入图片描述

EXISTS和NOT EXISTS子查询
EXISTS关键字后面的参数是任意一个子查询,系统对子查询进行运算以判 断它是否返回行,如果至少返回一行。则EXISTS返回的结果为TRUE,此 时外层查询语句将执行查询,反之若没有数据。则EXISTS返回为FALSE, 外层查询语句将不执行。
在这里插入图片描述
NOT EXISTS代表取反的意思,如果至少返回一行。则NOT EXISTS返回的结果为FALSE,此时外层查询语句将不执行查询,反之若没有数据。则NOT EXISTS返回为TRUE,外层查询语句将执行执行。

事务、视图、索引 数据备份和恢复

事务
**为什么需要事务
为了避免错误的操作导致数据的一致性受到影响。

举例说明:转账**
**需求:cmy给jack 转账1000元
假设转账分为两部完成

1.     jeff减少1000  update test set money = money -500 where name= ‘cmy’
2.     jack增加1000  update test set money = money +500 where name= ‘jack’

如果在完成了第1步的时候突然宕机了,cmy的钱减少了而jack的钱没有增加那jeff岂不是白白丢了1000元;这时候就需要用到我们的事务了**
什么是事务
事务(TRANSACTION) 是作为单个逻辑工作单元执行的一系列操作。
多个操作作为一个整体向系统提交,要么都执行,要么都不执行。
事务是一个不可分割的逻辑单元。

事务的特性
事务具备以下四个特性,简称ACID属性。
原子性(Atomicity):
事务是一个完整的操作,事务的各步操作都是不可再分的,要么都执行, 要么都不执行。
一致性(Consistency):
当事务完成时,数据必须处于一致的状态。
隔离性(Isolation):
并发事务之间相互独立、隔离,它不应以任何方式依赖于或影响其他事 务。
持久性(Durability):
事务完成后,它对数据库的修改被永久保持。

**如何创建事务
MySQL中支持事务的存储引擎有InnoDB和BOB
#开始事务
BEGIN;

START TRANSACTION;
#提交事务
COMMIT;
#撤销回滚事务
ROLLBACK;

使用事务解决银行的转账问题。

#开启事务
BEGIN;
update test set money = money -500 where name= ‘cmy’;
update test set money = money +500 where name= ‘jack’;
#提交事务
COMMIT;

自动关闭和开启事务
默认情况下,每条单独的SQL语句视为一个事务
关闭默认提交状态后,可手动开启、关闭事务

SET autocommit=0|1;#值为0关闭,值为1开启

关闭自动提交后,从下一条SQL语句开始则开启新事务,需使用COMMIT 或ROLLBACK语句结束该事务。

视图

为什么需要视图

简单化
看到的就是需要的。视图不仅可以简化用户对数据的理解,也可以简 化他们的操作。那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的操作每次指定全部的条件。
安全性
通过视图用户只能查询和修改他们所能见到的数据。数据库中的其他数据既看不到也取不到。
逻辑数据的独立性

视图可以帮助用户屏蔽真实表结构变化带来的影响。
什么是视图
视图是从一个或者多个表中导出的。视图的行为与表极为类似,但视图是一张虚拟表。在视图中用户可以使用SELECT语句查询数据,以及使用INSERT、UPDATE和DELETE修改记录。
如何创建视图
#创建视图
CREATE VIEW 视图名
AS
SELECT 字句
#删除视图
DROP VIEW [IF EXISTS] 视图名;
#查看视图中的数据
SELECT 字段1,…,字段N FROM 视图名;

使用视图的注意事项
视图中可以使用多个表。
一个视图可以嵌套另一个视图。
对视图数据进行添加、更新和删除操作直接影响所引用表的数据。
当视图的数据来源于多张表时,不允许添加和删除数据。

索引

索引的含义和特点
**索引是一个单独的、存储在磁盘上的数据库结构,它们包含着对数据表里所 有记录的引用指针。使用索引用于快速找出在某个或多个列中有一特定值的行。
所有MySQL列类型都可以被索引,对相关列使用索引是提高查询速度的最佳途径
例如:数据库中有2万条记录,现在要执行这样的一个查询:SELECT * FROM table WHERE num=10000。如果没有索引,必须遍历整个表,知道num=10000
为止;如果在num列上创建索引,MySQL不需要任何扫描,直接在索引中找10000
,就可以得知这一行的位置。可见,索引的建立可以提高数据库的查询速度。
在MySQL的InnoDB和MyISAM存储引擎中,仅支持BTREE索引。

索引的优点如下

通过创建唯一索引,可以保证数据库表中每一行数据的唯一性。
可以大大加快数据的查询速度,这也是创建索引的主要原因之一。
在实现数据参考的完整性方面,可以加速表与表之间的连接。
在使用分组和排序字句进行数据查询时,也可以显著减少查询中分组和排序的时间。

增加索引也有诸多不利,主要表现在以下几个方面:
创建索引和维护索引要耗费时间,并且随着数据量的增加所耗费的时间也会增加。
索引需要占磁盘空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果有大量的索引,索引文件可能比数据文件更快达到最大文件尺寸。
当对表中的数据进行增加、删除、修改的时候,索引也要动态的维护。

MySQL索引的分类
普通索引和唯一索引
普通索引是MySQL中的基本索引类型,允许在定义索引的列中插入重复值和空值。
唯一索引,索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。主键索引是一种特殊的唯一索引,不允许有空值

单列索引和组合索引
单列索引即一个索引只包含单个列,一个表可以有多个单列索引。
组合索引指在表的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用。使用组合索引遵循最左前缀集合法。

全文索引
全文索引类型为FULLTEXT,在定义索引的列上支持值的全文查找,允许在这些索引列中插入重复值和空值。全文索引可以在CHAR、VARCHAR或者TEXT类型的列上创建。MySQL中只有MyISAM存储引擎支持全文索引。
创建普通索引
方式1:在创建表时创建索引

CREATE TABLE table_name(
#此处省略表中列的属性
INDEX(索引列名)
);

方式2:直接创建
CREATE INDEX 索引名 ON table(column(length));
方式3:修改表的方式创建
ALTER TABLE 表名 ADD INDEX索引名(列名);
给表中的一列添加索引
在这里插入图片描述
使用SHOW INDEX语句查看索引
在这里插入图片描述
再次使用DESC 语句查看详情
在这里插入图片描述
创建唯一索引
创建数据表时创建。

CREATE TABLE table_name(
#此处省略表中列的属性
UNIQUE indexName(索引列名)
);

直接创建
CREATE UNIQUE INDEX 索引名 ON table(column(length));
修改表时创建
ALTER TABLE表名 ADD UNIQUE index 索引名(列名);
创建组合索引
ALTER TABLE 表名ADD INDEX 索引名(列1,列2);
创建全文索引
CREATE FULLTEXT INDEX 索引名 ON table(column(length));
CREATE TABLE table_name(
#此处省略表中列的属性
FULLTEXT indexName(索引列名)
);

ALTER TABLE表名 ADD FULLTEXT index 索引名(列名);
删除索引
DROP INDEX 索引名 on 表名;
创建索引的原则
经常被查询的列
经常用作选择的列
经常排序,分组的列
经常用作连接的列(主键/外键)

存储过程

存储过程简介
SQL语句需要先编译然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。
** 存储过程是可编程的函数,在数据库中创建并保存,可以由SQL语句和控制结构组成。当想要在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中的存储过程可以看做是对编程中面向对象方法的模拟,它允许控制数据的访问方式。**
存储过程优点
增强SQL语言的功能和灵活性
存储过程可以用控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。
标准组件式编程
存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过 程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响。
较快的执行速度
较少的网络流量
作为一种安全机制来充分利用

MySQL存储过程的创建
语法:CREATE PROCEDURE 过程名([[IN|OUT|INOUT] 参数名 数据类型[,[IN|OUT|INOUT] 参数名 数据类型…]]) [特性 …] 过程体

  DELIMITER //
  CREATE PROCEDURE myproc(OUT s int)
    BEGIN
      SELECT COUNT(*) INTO s FROM students;
    END
    //
DELIMITER ;

分隔符:MySQL默认以";“为分隔符,如果没有声明分割符,则编译器会把存储过程当成SQL语句进行处理,因此编译过程会报错,所以要事先用“DELIMITER //”声明当前段分隔符,让编译器把两个”//"之间的内容当做存储过程的代码,不会执行这些代码;“DELIMITER ;”的意为把分隔符还原。

存储过程实例

存储过程中的if选择结构:

#声明存储过程
DROP PROCEDURE IF EXISTS `proc_if`;
DELIMITER ;;CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_if`(IN type int)BEGIN
    #Routine body goes here...
    DECLARE c varchar(500);
    IF type = 0 THEN
        set c = 'param is 0';
    ELSEIF type = 1 THEN
        set c = 'param is 1';
    ELSE
        set c = 'param is others, not 0 or 1';
    END IF;
    select c;END
;;
DELIMITER ;
#调用存储过程
set @type=1;
call proc_if(@type);

存储过程中的case语句

DROP PROCEDURE IF EXISTS `proc_case`;
DELIMITER ;;CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_case`(IN type int)BEGIN
    #Routine body goes here...
    DECLARE c varchar(500);
    CASE type
    WHEN 0 THEN
        set c = 'param is 0';
    WHEN 1 THEN
        set c = 'param is 1';
    ELSE
        set c = 'param is others, not 0 or 1';
    END CASE;
    select c;END
;;
DELIMITER ;

存储过程中的while语句

DROP PROCEDURE IF EXISTS `proc_while`;
DELIMITER ;;CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_while`(IN n int)BEGIN
    #Routine body goes here...
    DECLARE i int;
    DECLARE s int;
    SET i = 0;
    SET s = 0;
    WHILE i <= n DO
        set s = s + i;
        set i = i + 1;
    END WHILE;
    SELECT s;END
;;
DELIMITER ;

存储过程中的OUT参数

#创建带输出参数的存储过程
DELIMITER $$
CREATE PROCEDURE teste(IN my_user_id VARCHAR(32),OUT user_name1 VARCHAR(32))
BEGIN
  SELECT userName INTO user_name1 FROM easybuy_user WHERE id = my_user_id;
END;
$$
DELIMITER;

#声明输出参数
SET @user_name='';
CALL teste('2',@user_name);
SELECT @user_name AS user_nameAA

数据库设计

为什么需要数据库设计
一个良好的数据库设计能够
节省数据的存储空间
保证数据的完整性
方便进行数据库应用系统的开发

而一个糟糕的数据库开发:
会造成数据冗余,存储空间浪费
内存空间浪费
数据更新和插入操作异常

设计数据库的步骤
在这里插入图片描述

E-R图

在这里插入图片描述

映射基数

在这里插入图片描述

数据库设计的三大范式

第一范式
在这里插入图片描述
第二范式
在这里插入图片描述
第三范式
在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值