MySQL——复习

关系数据库:MySQL、Oracle、SQLServer、PgSql

NoSQL系统:MongoDB、Memcache、Redis

DBMS(数据库管理系统):为业务系统构造出最优的数据存储模型,并建立好数据库中的表结构及表与表之间的关联关系的过程。使之能有效的对应用系统中的数据进行存储,并可以高效的对已经存储的数据进行访问;

MySQL——复习_第1张图片

需求分析——逻辑设计——物理设计——维护优化

根据数据库自身的特点把逻辑设计转换为物理设计,达到效率的最优化(新的需求进行建表、索引优化、大表拆分)

需求分析:

1、了解系统中所要存储的数据

2、了解数据的存储特点(如:时效性:过期、清理、归档等;永久存储:分库、分表)

3、了解数据的生命周期

逻辑设计:

1、将需求转化为数据库的逻辑模型

2、通过ER图的型式对逻辑模型进行展示

3、同所用的具体的DBMS系统无关

MySQL——复习_第2张图片

设计范式:

常见的数据库设计范式:第一范式、第二范式、第三范式及BC范式…

MySQL——复习_第3张图片

MySQL——复习_第4张图片

1、第一范式1NF

定义:数据库表中的字段都是单一属性的,不可再分。

简单的说,每一个属性都是原子项,不可分割。

2、第二范式2NF

定义:数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖,即符合第二范式。

3、第三范式3NF

定义:在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合3NF。

4、BC范式

在第三范式的基础之上,数据库表中如果不存在任何字段对任一候选关键字段的传递函数依赖则符合BC范式。也就是说,如果是复合关键字,则复合关键字之间也不能存在函数依赖关系。

物理设计:

1、选择合适的数据库管理系统。

2、定义数据库、表及字段的命名规范。

3、根据所选的DBMS系统选择合适的字段类型。

4、反范式化设计。(空间换时间)

存储引擎:

MySQL可以将数据以不同的技术存储在文件(内存)中,这种技术就称为存储引擎。每一种存储引擎使用不同的存储机制、索引技巧、锁定水平,最终提供广泛且不同的功能。

MySQL——复习_第5张图片

MySQL——复习_第6张图片

MySQL——复习_第7张图片

MySQL——复习_第8张图片

存在SQL通用框架(由对象管理数据库),正确使用SQL的重要性:

  1. 增加数据库处理效率,减少应用相应的时间
  2. 减少数据库服务器负载,增加服务器稳定性
  3. 减少服务器间通讯的网络流量

数据库的SQL语言

1、数据库的启动与关闭

net start mysql(这里指数据库服务名,也许安装注册的服务名不是mysql, 例如我的服务名为 MySQL800) 

net start MySQL800

注意在windows powershell (管理员权限下运行)

Windows PowerShell
版权所有 (C) Microsoft Corporation。保留所有权利。

PS C:\Windows\system32> net start MySQL800
MySQL800 服务正在启动 ..
MySQL800 服务已经启动成功。

PS C:\Windows\system32> net stop MySQL800
MySQL800 服务正在停止.
MySQL800 服务已成功停止。

2、数据库的登录及退出

shell> mysql -u用户名 -p密码 -P3306 -h127.0.0.1

连接客户端时通过参数指定

shell>mysql -u用户名 -p密码 --prompt 提示符

连上客户端后,通过prompt 命令修改提示符

mysql> prompt 提示符

mysql提示符:

参数 描述

\D 完整的日期

\d 当前数据库

\h 服务器名称

\u 当前用户

关键字与函数名称全部大写(小写也可以识别) 数据库名称、表名称、字段名称全部小写 SQL语句必须以分号结尾 mysql> SELECT VERSION(); # 显示当前服务器版本 mysql> SELECT NOW(); # 显示当前日期时间 mysql> SELECT USER(); # 显示当前用户

3、数据库的操作

创建数据库:花括号的参数代表必须有,方括号代码可选

CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [DEFAULT] CHARACTER SET [=] charset_name;

查看当前服务器下的数据库列表

SHOW {DATABASES | SCHEMAS} [LIKE 'PATTERN' | WHERE expr];

修改数据库

ALTER {DATABASE | SHCAEMA} [db_name] [DEFAULT] CHERACTER SET [=] charset_name;

删除数据库

DROP {DATABASE | SCHEMA} [IF EXISTS] db_name;

4、数据表的操作

创建数据表

CREATE TABLE [IF NOT EXISTS] table_name(column_name data_type, …… );

查看数据表列表

SHOW TABLES [FROM db_name] [LIKE 'pattern' | WHERE expr];

查看数据表结构

SHOW COLUMNS FROM tbl_name;

插入记录

INSERT [INFO] tbl_name [(col_name,……)] VALUES(val,……);

AUTO_INCREMENT

自动编号,且必须与主键组合使用,默认情况下,起始值为1,每次的增量为1

主键:主键约束,每张数据表只能存在一个主键,保证记录的唯一性,主键自动为NOT NULL

UNIQUE KEY

唯一约束,唯一约束可以保证记录的唯一性,唯一约束的字段可以为空值(NULL)每张数据表可以存在多个唯一约束

DEFAULT

默认值, 当插入记录时,如果当时没有明确为字段赋值,则自动赋予默认值;

FOREIGN KEY

保证数据的一致性,完整性,实现一对一或一对多的关系;

外键约束的要求

1、父表和子表必须使用相同的存储引擎(数据表的存储引擎只能为InnoDB),而且禁止使用临时表。

2、外键列和参照列必须具有相似的数据类型,其中数字的长度或者是否有符号位必须相同;而字符的长度则可以不同;

3、外键列he参照列必须创建索引;如果外键列不存在索引的话,MySQL将自动创建索引;

5、约束

约束保证数据的完整性和一致性;约束分为表级约束和列级约束;

约束类型包括:NOT NULL(非空约束)PRIMARY KEY(主键约束)UNIQUE KEY(唯一约束)DEFAULT(默认约束)FOREIGN KEY(外键约束)

外键约束的参照操作

1、CASCADE:从父表删除或更新且自动删除或更新子表中匹配的行;

2、SET NULL:从父表删除或更新行,并设置子表中的外键列NULL;

3、RESTRICT:拒绝对父表的删除或更新操作;

4、NO ACTION:标准SQL的关键字,在MySQL中与RESRRICT相同;

注意在插入数据的时候,一定要先插入父表的记录,子表记录才可以插入成功;SET NULL关键字,如果子表的外键列设置了不为空,则会更新失败;

表级约束与列级约束:

对一个数据列建立的约束,称为列级约束;对多个数据列建立的约束,称为表级约束;列级约束既可以在列定义时声明,也可以在列定义后声明,表级约束只能在列定义后声明。

6、修改数据表

添加单列

ALTER TABLE tbl_name ADD [COLUMN] col_name column_definition [FIRST | AFTER col_name]; 如果省略插入位置,则置于最后

添加多列

ALTER TABLE tbl_name ADD [COLUMN] (col_name column_difinition,……); 添加多列不能设置位置,只能在列后面添加

删除列

ALTER TABLE tbl_name DROP [COLUMN] col_name;

添加主键约束

ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name,……);

添加唯一约束

ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] UNIQUE [INDEX | KEY] [inde_name] [index_type](index_col_name,……);

添加外键约束

ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name,……) reference_definition;

添加/删除默认约束

ALTER TABLE tbl_name ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT};

删除主键约束

ALTER TABLE tbl_name DROP PRIMARY KEY;

删除唯一约束

ALTER TABLE tbl_name DROP {INDEX | KEY} index_name;

删除外键约束

ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol;

修改列定义

ALTER TABLE tbl_name MODIFY [COLUMN] col_name column_definition [FIRST | AFTER col_name];

修改列名称

ALTER TABLE tbl_name CHANGE [COLUMN] old_col_name new_col_name column_definition [FIRST | AFTER col_name];

数据表更名

ALTER TABLE tbl_name RENAME [TO | AS] new_tbl_name; RENAME TABLE tbl_name TO new_tbl_name [,tbl_name@ TO new_tbl_name2]……;

尽量的少使用数据列的更名以及数据表的更名,创建过索引或者使用过存储过程的话,表名或列名曾经被引用的情况下,如果将表名或列名修改了,可能会导致某些视图或存储过程无法正常来工作,所以不要随意的更改列名及表名;

插入记录

INSERT [INTO] tbl_name [(COL_NAME,……)] {VALUES | VALUE} ({expr | DEFAULT},……),(……),…;

与第一钟方法的区别在于,此方法可以使用子查询(SubQuery)

INSERT [INTO] tbl_name SET col_name = {expr | DEFAULT},……

此方法可以将查询结果插入到指定数据表

INSERT [INTO] tbl_name [(col_name,……)] SELECT ……;

更新记录(单表更新)

UPDATE [LOW_PRIORITY] [IGNORE] table_reference SET col_name1 = {expr1 | DEFAULT} [, col_name2 = {expr2 | DEFAULT}]…… [WHERE where_condition];

删除记录(单表删除)

DELETE FROM tbl_name [WHERE where_condition];

查找记录

SELECT select_expr [, select_expr……] [ FROM table_reference [WHERE where_condition] [GROUP BY {col_name | position} [ASC | DESC],……] [HAVING where_conditon] [ORDER BY {col_name | expr | position} [ASC | DESC],……] [LIMIT {[offset,]row_count | row_count OFFSET offset}] ]

查询表达式:每一个表达式表示想要的一列,必须有至少一个。

多个列之间以英文逗号分隔;

星号(*)表示所有列。tbl_name.* 可以表示命名表的所有列;

查询表达式可以使用 [AS] alias_name为其赋予别名;

别名可以用于 GROUP BY ,ORDER BY 或 HAVING 子句;

条件表达式 WHERE

对记录进行过滤,如果没有指定WHERE 子句,则显示所有记录。

在WHERE表达式中,可以使用MySQL支持的函数或运算符;

 

GROUP BY

查询结果分组

[GROUP BY {col_name | position} [ASC | DESC],……]

 

HAVING

分组条件:

[HAVING where_condition]

 

ORDER BY

对查询结果进行排序

[ORDER BY {col_name | expr | position} [ASC | DESC],……]

 

LIMIT

限制查询结果返回的数量

[LIMIT {[offset,] row_count | row_count OFFSET offset }]

1.子查询是指在另一个查询语句中的SELECT子句。

例句:

SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);

其中,SELECT * FROM t1 ...称为Outer Query[外查询](或者Outer Statement),

SELECT column1 FROM t2 称为Sub Query[子查询]。

所以,我们说子查询是嵌套在外查询内部。而事实上它有可能在子查询内部再嵌套子查询。

子查询必须出现在圆括号之间。

语法结构:

table_reference {[INNER | CROSS] JOIN | {LEFT|RIGHT} [OUTER] JOIN} table_reference ON conditional_expr

多表更新

UPDATE table_reference SET col_name1 = {expr1 | DEFAULT} [,col_name2 = {expr2|DEFAULT}]…… [WHERE where_condition]

CREAT …… SELECT

创建数据表同时将查询结果写入到数据表

CREATE TABLE [IF NOT EXISTS] tbl_name [(create_definition,……)] select_statement

数据表参照

table_reference tbl_name[[AS] alias] | table_subquery [AS] alias 数据表可以使用 tbl_name AS alias_name 或 tbl_name alias_name 赋予别名 table_subquery 可以作为子查询使用在FROM 子句中,这样的子查询必须 为其赋予别名;

连接类型

在MySQL中,JOIN,CROSS JOIN 和INNER JOIN是等价的; LEFT [OUTER] JOIN , 左外连接 RIGHT [OUTER] JOIN , 右外连接

连接条件

使用ON关键字来设定连接条件,也可以使用WHERE来代替,通常使用ON关键字来设定连接条件,使用WHERE关键字来进行结果集记录的过滤;

 

内连接

外连接

右外连接

MySQL——复习_第9张图片

 

MySQL——复习_第10张图片

 

MySQL——复习_第11张图片

 

MySQL——复习_第12张图片

MySQL——复习_第13张图片

 

 

字符函数

函数名称 描述

CONCAT() 字符连接

CONCAT_WS() 使用指定的分隔符进行字符连接

FORMAT() 数字格式化

LOWER() 转换成小写字母

UPPER() 转换成大写字母

LEFT() 获取左侧字符

RIGHT() 获取右侧字符

数值运算符与函数

函数名称 描述

CEIL() 进一取整

DIV() 整数除法

FLOOR() 设一取整

MOD() 取余数(取模)

POWER() 幂运算

ROUND() 四舍五入

TRUNCATE() 数字截取

比较运算符与函数

函数名称 描述

[NOT]BETWEEN...AND [不]在范围之内

[NOT]IN() [不]在列出值范围内

IS[NOT] NULL [不]为空

日期时间函数

函数名称 描述

NOW() 当前日期和时间

CURDATE() 当前日期

CURTIME() 当前时间

DATE_ADD() 日期变化

DATEDIFF() 日期差值

DATE_FORMAT() 日期格式化

信息函数

函数名称 描述

CONNECTION_ID() 连接ID

DATEBASE() 当前数据库

LAST_INSERT_ID() 最后插入记录的ID号

USER() 当前用户

VERSION() 版本信息

聚合函数

函数名称 描述

AVG() 平均值

COUNT() 计数

MAX() 最大值

MIN() 最小值

SUM() 求和

加密函数

函数名称 描述

MD5() 信息摘要算法

PASSWORD() 密码算法

自定义函数:

用户自定义函数(user-defined function,UDF)是一种对MySQL扩展的途径,其用法与内置函数相同;

自定义函数的两个必要条件:

(1)参数 (2)返回值

函数可以返回任意类型的值,同样可以接收这些类型的参数;

创建自定义函数:

CREATE FUNCTION function_name RETURNS {STRING|INTEGER|REAL|DECIMAL} routine_body

关于函数体

(1)函数体由合法的SQL语句构成;

(2)函数体也可以是简单的SELECT或INSERT语句;

 

(3)函数体如果为符合结构则使用BEGIN...END语句;

(4)复合结构可以包含声明,循环,控制结构;

MySQL——复习_第14张图片

存储过程:

存储过程是SQL语句和控制语句的预编译集合,以一个名称存储并作为一个单元处理。

存储过程的优点:

  • 增强SQL语句的功能和灵活性
  • 实现较快的执行速度
  • 减少网络流量

 

创建存储过程

CREATE [DEFINER = {user | CURRENT_USER}] PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...] routine_body proc_parameter:] [IN | OUT | INOUT] param_name type

IN ,代表该参数的值必须在调用存储过程时指定

OUT,表示该参数的值可以被存储过程改变,并且可以返回

INOUT,表示该参数的调用时指定,并且可以被改变和返回

修改定界符

DELIMITRT //

存储过程与自定义函数的区别:

  • 存储过程实现的功能要复杂一些;而函数的针对性更强;
  • 存储过程可以返回多个值;函数只能有一个返回值;
  • 存储过程一般独立的来执行;而函数可以作为其他SQL语句的组成部分来出现;

 

事务的特性:ACID

原子性 Atomicity

一致性 Consistency

隔离性 Isolation

持久性 Durability

MySQL——复习_第15张图片

 

你可能感兴趣的:(MySQL,mysql)