数据库_SQL基础_笔记
MySQL数据库
数据库范式
第一范式
指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值,或不能有重复的属性。如果出现重复的属性,可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。
简而言之,第一范式遵从原子性,字段不可再分,否则就不是关系型数据库
第二范式(依赖于第一范式)
要求实体的属性完全依赖于主键。所谓完全依赖,是指不能存在仅依赖主键一部分的属性,如果存在,那么这个属性和主键的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实体的唯一标识。
简而言之,第二范式遵从唯一性,就是非主键字段需依赖主键
第三范式(依赖于第二范式)
要求一个数据表中的每一列数据都和主键直接相关,而不能间接相关。
简而言之,第三范式就是非主键字段不能互相依赖
按照三范式设计的数据库能很大程度上减小数据冗余
数据库基本操作
创建数据库:
CREATE DATABASE 数据库名称;
// 创建数据库
CREATE DATABASE IF NOT EXISTS 数据库名称;
// 通过使用 IF NOT EXISTS 防止要创建的数据库已经存在
查看数据库:
SHOW CREATE DATABASE 数据库名称;
// 创建并查看数据库
SHOW DATABASE;
// 查看已经存在的数据库
选择数据库:
USE 数据库名称;
// 选择一个数据库
删除数据库:
DROP DATABASE 数据库名称;
// 删除并回收已分配的存储空间
DROP IF NOT EXISTS 数据库名称;
// 防止要删除的数据库不存在
数据表操作
创建数据表:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] 数据表名
[(
col_name type [完整性约束条件],
col_name type [完整性约束条件],
...
)][table_options] [select_statement];
/**
* 完整性约束条件 指 字段的某些特殊约束条件
**/
查看数据表:
SHOW TABLES;
// 查看数据库中的表
SHOW CREATE TABLE 数据表名 \G;
// '\G'用于将显示结果纵向排列
DESCRIBE 数据表名;
// 用于查看表的字段信息,DESCRIBE可以简写成DESC
DESCRIBE 数据表名 列名;
// 可以指定查看某一列的信息
//SHOW COLUMNS 用于在MySQL数据库中,查看表结构
# 语法格式1
SHOW [FULL] COLUMNS FROM 数据表名 [FROM 数据库名];
# 语法格式2
SHOW [FULL] COLUMNS FROM 数据库名,数据表名;
修改表结构:
ALTER TABLE 数据表名
ADD [COLUMN] creat_definition [ FIRST | AFTER column_name ] # 添加新字段
| CHANGE [COLUMN] old_col_name new_col_name type # 修改字段名称及类型
| MODIFY [COLUMN] create_definition # 修改子句定义字段
| DROP [COLUMN] col_name # 删除字段
| RENAME [AS] new_tbl_name # 更改表名
// 上述语法中,ALTER TABLE 语句允许指定多个动作,动作间使用英文逗号(,)分隔。
数据约束:
字段名 数据类型 NOT NULL;
// 非空约束 NOT NULL
#列级约束
字段名 数据类型 UNIQUE;
#表级约束
UNIQUE (字段名1,字段名2,......);
// 唯一约束 UNIQUE
# 列级约束
字段名 数据类型 PRIMARY KEY;
# 表级约束
PRIMARY KEY (字段名1,字段名2,......);
// 主键约束 PRIMARY KEY
字段名 数据类型 DEFAULT 默认值;
// 默认约束
数据的管理
插入记录
INSERT INTO 表名 (字段1,字段2,...) VALUES (值1,值2,...); // 也可省略字段列表,若省略字段列表,则必须严格按照数据表定义字段时的顺序,在 值列表 中为字段指定相应的数据。 INSERT INTO 表名 SET 字段名1 = 值1,字段名2 = 值2,...; //通过 SET 的方式可以为指定字段添加数据
修改记录
UPDATE 表名 SET 字段名1 = 值1 [,字段名2 = 值2,...] [WHERE 条件表达式] // WHERE表达式用于选择哪些记录需要被更新,否则数据表中的所有记录都将被更新
删除记录
DELETE FROM 表名 [WHERE 条件表达式] // 满足条件的记录才会被删除 TRUCATE [TABLE] 表名 // 清空表中的所有记录
数据的查询
查询语句
SELECT [DISTINCT] *| {字段名1, 字段名2, 字段名3,...} FROM 表名 [where 条件表达式1] [GROUP BY 字段名 [HAVING 条件表达式2]] [ORDER BY 字段名 [ASC | DESC]] [LIMIT [OFFSET] 记录数] // DISTINCT 可选参数,用于剔除查询结果中重复的数据 SELECT * FROM 表名; // 利用通配符 * 查询出所有字段,但是字段顺序为表中定义的顺序 SELECT 字段名1,字段名2,... FROM 表名 // 查询出来的顺序与SQL语句中编写的顺序有关 SELECT 字段名称 [AS] 别名, 字段名2 [AS] 别名, ... FROM 表名; // 使用别名方便查询,通过调用AS子句,且AS可以省略
条件查询
SELECT * FROM 表名 WHERE 条件表达式; // 通过WHERE条件表达式 SELECT [DISTINCT] * | {字段名1,字段名2,字段名3,...} FROM 表名; // 使用 DISTINCT 关键字去除查询结果中重复的记录。 SELECT * | {字段名1,字段名2,字段名3,...} FROM 表名 WHERE [NOT] IN (元素1,元素2,...) // 使用 IN 关键字判断被查询出来的值是否在指定集合中 SELECT * | {字段名1,字段名2,字段名3,...} FROM 表名 WHERE 字段名 [NOT] BETWEEN 值1 AND 值2 // BETWEEN AND 用于判断某个字段的值是否在指定的范围之内 SELECT * | {字段名1,字段名2,字段名3,...} FROM 表名 WHERE 字段名 [NOT] LIKE '匹配字符串' // 带LIKE的字符匹配查询 /** 通配符: % ,可以匹配 N (N>=0)个字符, _ , 仅可匹配一个字符 **/ SELECT * | {字段名1,字段名2,字段名3,...} FROM 表名 WHERE 条件表达式1 AND 条件表达式2 [... AND 条件表达式N]; // 带AND的多条件查询 SELECT * | {字段名1,字段名2,字段名3,...} FROM 表名 WHERE 条件表达式1 OR 条件表达式2 [... OR 条件表达式N]; // 带OR的多条件查询
排序与限量
ORDER BY 排序查询
SELECT 字段名1, 字段名2, ... FROM 表名 ORDER BY 字段名1 [ASC | DECS] [, 字段名2 [ASC | DESC] ... ]; // ASC表示升序、DESC表示降序
LIMIT 限量查询
SELECT 字段名1, 字段名2, ... FROM 表名 LIMIT [OFFSET,] 记录数; // 偏移量表示第一条记录从第几条开始
聚合函数与分组
聚合函数
COUNT() // 计算表中记录的个数或者列中值的个数 SUM() // 获取符合条件所有结果的和 AVG() // 计算一列中数据值的平均值 MAX() // 获取查询数据中的最大值 MIN() // 获取查询数据中的最小值
GROUP BY分组查询
SELECT 字段名1, 字段名2, ... FROM 表名 GROUP BY 字段名1 [, 字段名2, ... [HAVING 条件表达式]]; // 使用GROUP BY进行分组,字段中值相同的为一组
多表查询
合并查询
SELECT ...... UNION [ ALL | DISTINCT ] SELECT ...... // 合并查询就是将多个SELECT语句的查询结果合并到一起
连接查询
交叉连接
SELECT 查询字段 FROM 表1 CROSS JOIN 表2; // 返回两个表中所有数据行的笛卡尔积
内连接
SELECT 查询字段 FROM 表1 [INNER] JOIN 表2 ON 表1.关系字段=表二.关系字段 WHERE 条件; // 内连接就是简单连接,作为默认连接方式,INNER可以省略
外连接
SELECT 所查字段 FROM 表1 LEFT | RIGHT [OUTER] JOIN 表2 ON 表1.关系字段 = 表2.关系字段 WHERE 条件 //外连接生成的结果集不仅可以包括符合连接条件的数据记录,而且还可以包括左表、右表或两表中所有的数据记录。
子查询
单行子查询
将一个SELECT查询语句的结果作为另一个查询语句的WHERE条件
带IN关键字的子查询
子查询返回一个结果集,作为外层SQL语句的判断条件
带EXISTS关键字的子查询
子查询不返回查询记录,而是返回一个真假值
带ANY关键字的子查询
只要其后的子查询的子查询满足其中任意一个判断条件,就返回结果作为外层SQL语句的执行条件
带ALL关键字的子查询
只有满足内层查询语句返回的所有结果,才可以执行外层查询语句
666