前言
这里筑梦师, 是一名正在努力学习的 iOS 开发工程师, 目前致力于全栈方向的学习, 希望可以和大家一起交流技术, 共同进步, 用简书记录下自己的学习历程.
全栈开发自学笔记 已开源 https://github.com/DreamerWinston/Full-Stack-Developer-Note
深入浅出后端开发(SQL 指令笔记)
本文阅读建议
1. 一定要辩证的看待本文.
2. 本文并不会涉及到 MySQL 详细知识点, 只陈述在学习 MySQL 过程中遇到的关键点.
3.MySQL 依照其开发应用分为'基础篇, 高级篇, 实际应用', 根据本人学习进度更新.
4. 本文只阐述学习路线和学习当中的重点问题. 需要读者自己使用百度进行拓展学习.
5. 本文所表达观点并不是最终观点, 还会更新, 因为本人还在学习过程中, 有什么遗漏或错误还望各位指出.
6. 觉得哪里不妥请在评论留下建议~
7. 觉得还行的话就点个小心心鼓励下我吧~
目录
1. 数据库介绍及概念
2. 数据库存储引擎和数据类型
3. 结构化查询语言 SQL
3. 数据库基本操作
4. 数据表基本操作
5. 数据基本操作
6. 数据库聚合函数
7. 数据库逻辑运算符 & 比较运算符
8. 数据库联结查询
9. 数据库联结查询思想
10. 数据库范式建表思想
推荐书籍 & 网站推荐
MySQL5.7 官方手册 https://dev.mysql.com/doc/refman/5.7/en/preface.html
关系库三大范式
图解 SQL 的 Join https://coolshell.cn/articles/3463.html
Head First SQL: 本书全部案例以 MySQL 作为素材, 详细介绍了 SQL 的各种语句使用
Head First PHP & MySQL: 这本书从第一章就开始讲 PHP 如何操纵 MySQL, 根据书中真是案例一步步带入 PHP 和 MySQL 的聚合函数, PHP 的内置函数以及如何联合进行调试
PHP+MySQL 开发实战: 本书针对方向为实操, 里面详细讲述了每个 SQL 语句如何使用, 使用所需要的参数规范等. 每个章节后都有项目可以进行练习, 物流系统和论坛等. 这本书可以当做工具书(推荐入手, 方便查询).
PHP 和 MySQL web 开发(第五版): 目前实体书为第五版, 电子书为第四版, 第五版多了 php7.0 的讲解, 本书注重方向为概念, 结合上一本实操书便可以灵活运用 PHP 和 MySQL 进行项目开发.
PHP,MySQL 与 JavaScript 学习手册第 4 版: 实体书有最新版, 本书详细阐述了一个网络项目中所担当的所有角色(包括 Ajax 和 jQuery 都有提到), 适合在学习完 PHP&MySQL 后进行学习.
数据库系统设计, 实现与管理原书第 8 版: 本书为拓展书, 如果你想详细了解数据库的起源, 原理, 以及对 1NF,2NF,BCNF,3NF 等的定义, 创建更为成熟的数据库. 这是一本原理书.
本来这篇文章, 在我学习了数据库的增删改查操作以后, 我就想写出来, 结果经过 6 本书的研读, 才发现, 自己所谓的增删改查, 只是 MySQL 的冰山一角.
本人强烈建议在进行视频学习之前, 首先看一下 Head First 系列对 SQL 的讲述, 因为有些视频的讲述顺序并不适合入门. 并且要结合 PHP 一起进行学习(或者可以学习 Java).
数据库介绍及概念
数据库服务器
安装了数据库软件的计算机, 就是数据库服务器.
数据库管理系统(DBMS)
DBMS,Database management System 数据库库管理系统, 是一款操作数据库的管理软件.
数据库
数据库 (Database) 是用来组织, 存储和管理数据的仓库. 简单来说是可视为电子化的文件柜 -- 存储电子文件的处所, 相当于文件夹.
数据表
数据表是存放数据的地方.
记录, 字段(列), 数据(值)
记录: 一行数据就是一条记录;
字段(列): 每个表由多个列构成, 每个列就是一个字段.
数据: 行列交叉处的值, 就是数据.
数据库访问流程图
很多牌子的数据库 (Oracle,DB2,SQL Server,MySQL 等)-> 选择安装 MySQL->数据库 Database->数据表 TABLE->数据 DATA
关系型数据库
所谓关系数据库, 是建立在关系模型基础上的数据库, 现实世界中的各种实体以及实体之间的各种联系均可用关系模型来表示. 例如: 教师实体, 学生实体等;
目前主流的关系数据库有 Oracle,MySQL,DB2,SQLServer,sybase 等;
简单说, 关系型数据库是由多张能互相联接的二维行列表格组成的数据库;
通俗说, 一个关系模型其实就是一张规范的二维表格.
结构化查询语言 SQL
结构化查询语言 (Structured Query Language) 简称 SQL, 是关系数据库的标准语言, 用于对数据的存取和管理; 同时也是数据库脚本文件的扩展名(.sql), 备份文件的扩展名.
SQL 语言简洁, 易学易用. 下面会详细讲到.
数据库存储引擎和数据类型
什么是存储引擎
数据使用各种不同的技术 存储在数据库中
这些文件引用不同的存储机制, 索引技巧, 锁定水平, 形成不同的最终的广泛功能
也称作表类型.
MySQL 内置了不同的很多存储引擎, 目前流行的是 InnoDB
查看存储引擎
SHOW ENGINES 查看所支持的引擎
InnoDB 存储引擎
其优点是 事务处理 回滚 崩溃修复能力 处理多并发
第一个提供外键约束的存储引擎
缺点是读写效率差, 占用数据空间较大
MyISAM 存储引擎
基于 ISAM 引擎
存储格式为静态 动态 压缩.
静态数据 空间会占用较大空间, 但处理数据会降至最低开销.
动态数据 空间占用较小, 但数据变动会导致内存移动, 产生碎片(需要调用 碎片整理语句 OPTIMIZE TABLE)
只读数据 采取压缩空间存储
整体优势占用空间较小, 处理速度快不支持 事务和并发性处理
MEMORY 存储引擎
索引类型
哈希索引
存储周期
大小受限
生命周期短
数据类型
数据类型
数字类型
TINYINT 最小整数 (127~255)
BIT 最小整数 (127~255)
BOOL 最小整数 (127~255)
SMALLINT 小型整数 32767
MEDIUMINT 中型整数 8388607
INT 标准整数 2147683647
BIGINT 大整数 9223372036854775807
FLOAT 单精度浮点数
DOUBLE 双精度浮点数
DECIMAL 一般整数 自定义长度
字符串类型
普通字符串类型
- CHAR 0-255
- VARCHAR 0-255
TEXT 和 BLOB 类型
TINYBLOB 225 字节 小 BLOB 字段
TINYTEXT 225 字节 小 TEXT 字段
BLOB 65535 字节 常规 BLOB 字段
TEXT 65535 字节 常规 TEXT 字段
MEDIUMBLOB 16777215 字节 中型 BLOB 字段
MEDIUMTEXT 16777215 字节 中型 TEXT 字段
LONGBLOB 4294967295 字节 长 BLOB 字段
LONGTEXT 4294967295 长 TEXT 字段
特殊类型 SET 和 ENUM
- ENUM 65535
- SET 64
日期类型
- DATE
- TIME
- DATETIME
- TIMESTAMP
- YEAR
数据类型抉择
选择最小的可用类型, 如果值永远不超过 127, 则使用 TINYINT 比 INT 强
对于完全是数字的, 可用整数类型
浮点类型用于可能具有小数部分的数.
从速度方面考虑, 要选择固定的列, 可以使用 CHAR 类型
要节省空间, 使用动态的列, 可以使用 VARCHER 类型
要将列中的内容限制在一种选择, 可以使用 ENUM 类型.
允许在一个列中有多于一个的条目, 可以使用 SET 类型
如果要搜索的内容不区分大小写, 可使用 TEXT 类型
如果要搜索的内容区分大小写, 可以使用 BLOB 类型
结构化查询语言 SQL
SQL 语句自有规范, 其大致语法可以概括为: 增, 删, 改, 查.
数据库基本操作
数据库服务器启动, 停止
Mac 环境下:
确认已经使用 brew 安装 MySQL
运行指令> mysql.server start 启动数据库服务器
运行指令> mysql.server stop 停止数据库服务器
数据库登录, 退出
终端运行指令> mysql -u root -p 回车
数据库的增删改查
创建数据库 CREATE DATABASE name
查看数据库 SHOW
查看所有数据库 SHOW DATABASES
使用数据库 USE DATABASE name
删除数据库 DROP DATABASE name
数据表基本操作
添加数据表 CREATE
查看表结构 SHOW COLUMNS/DESCRIBE
查看表详细结构语句 SHOW CREATE TABLE
修改表结构 ALTER TABLE
重命名 RENAME TABLE
删除表 DROP TABLE
数据基本操作
插入数据 INSERT
查询数据 SELECT
修改数据 UPDATE
删除数据 DELETE
数据库聚合函数
COUNT(字段名) 计算非空记录数
SELECT COUNT(DISTINCT results) FROM student;
COUNT(*)全部统计
SELECT sex,count(sex) AS 人数 FROM student GROUP BY sex DESC.
AVG(字段名) 平均数
SELECT AVG(row) FROM table_name;
MIN (字段名) 最小值
SELECT MIN(row) FROM table_name;
MAX (字段名) 最大值
SELECT MAX(row) FROM table_name;
STD(字段名)指定字段标准背离值
STDTEV(字段名)指定字段标准背离值
SUM(字段名)指定字段所有记录的总合
SELECT sum(row) FROM table_name;
数据库逻辑运算符 & 比较运算符
算数运算符
加法运算 +
减法运算 -
乘法运算 *
除法运算 /
求余运算 %
除法运算 返回商 DIV 同'/'
求余运算 返回余数 MOD 同'%'
比较运算符
等于 =
大于>
小于 <大于等于 =>
小于等于 <=
不等于 != 或 <>
是否为空 IS NULL
不为空 IS NOT NULL
范围 .. 介于 BETWEEN AND
范围 .. 不在 NOT BETWEEN AND
在范围之内 IN
不在什么范围之内 NOT IN
模糊查询 包含 LIKE
模糊查询 不包含 NOT LIKE
正则表达式 REGEXP
逻辑运算符
多条件查询 AND
条件必须全部满足, 才能被查询出来
SELECT * FROM table_name WHERE condition_1 AND condition_2 ... 可以无限 AND 叠加
SELECT * FROM table_name WHERE user='mr' AND section='php'.
多条件查询 OR
满足其中一个条件就会被查出来
SELECT * FROM table_name WHERE condition_1 OR condition_2...OR 无限叠加
SELECT * FROM table_name WHERE section='php' OR section='程序开发';
非运算 NOT
异或运算 XOR
位运算
按位与 &
按位或 |
按位取反~
按位异或 ^
按位左移<<按位右移>>
数据库联结查询
内连接查询
SELECT name,books FROM table_name_1,table_name_2 WHERE table_name1.user =table_name2.user
内连接, 结果集只包含参加连接的表中与指定字段相符的行.
如果没有 WHERE 限定, 则为交叉连接或者全连接
相等联结
SELECT col_name FROM table_name INNER JOIN table_name WHERE conditions = conditions
不等联结
SELECT col_name FROM table_name INNER JOIN table_name WHERE conditions <> conditions
自然联结
SELECT col_name FROM table_name NATURAL JOIN table_name ;
左外连接
SELECT col_name FROM table_name1 LEFT JOIN table_name2 ON table_name1.col_name =table_name2.col_name;
左外链接, 是指将左表中的所有数据分别与右表的每条数据进行结合, 返回的结果除内连接的数据外, 还包括左表中不符合条件的数据, 并在右表的相应列中添加 NULL 值.
右外连接
SELECT col_name FROM table_name1 RIGHT JOIN table_name2 ON table_name1.col_name =table_name2.col_name;
右外连接, 是指将右表中的所有数据分别与左表中的每条数据进行连接组合, 返回的结果除内连接数据外, 还包括表中不符合条件的数据, 并在左表的相应列中添加 NULL.
数据库联结查询思想
a 表有的数据 b 表也必须要有
b 依赖 a
所以 b 表的数据不给删除 必须要 a 的删除了 b 才能删除
反正 外键就是维护两张或者多张表的数据一致性
关联 是两张或多张表的逻辑关系
关联不需要外键
关联只是描述逻辑
它说是外键 你想成关联字段就行了 不是说关联就一定不能是外键 关联字段也可以是外键 但是尽量不要是
文章 -> 帐户
评论 -> 帐户
这个时候有外键约束的话 帐户就不给删除
因为要保持数据的一致性 你帐户删除了 那文章 评论就找不到帐户了
要删除帐户就得把 这个帐户的 文章 以及 评论全部删除了 才能那个删除帐户
而关联 则是 查询文章的时候 看是谁发的 那 拿文章关联帐户 去查询
关联 不须要外键 这是两种东西
数据库范式建表思想
所谓范式建表思想, 就是指当获得业务需求和一大堆数据后, 按照 1NF,2NF,BCNF,3NF 等进行表关系的建立, 目前还在学习当中, 后续将会举例子出来
结束语
本文可能对 SQL 指令讲解并不详细, 还请读者自行看书理解, 或移步我的另一篇文章深入浅出后端开发(SQL 指令笔记).
如果您对这篇文章有什么意见或者建议, 请评论与我讨论.
如果您觉得还不错的话~ 可以点个喜欢鼓励我哦.
如果您想和我一起学习, 请毫不吝啬的私信我吧~
介个是我的个人博客 https://dreamerwinston.github.io/blog/ , 欢迎参观哦~
来源: http://www.jianshu.com/p/5bd2706d0d58