前言
这里筑梦师,是一名正在努力学习的iOS开发工程师,目前致力于全栈方向的学习,希望可以和大家一起交流技术,共同进步,用记录下自己的学习历程.
全栈开发自学笔记 已开源
深入浅出后端开发(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官方手册
关系库三大范式
图解SQL的JoinHead 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
- 多条件查询 AND
- 位运算
- 按位与&
- 按位或|
- 按位取反~
- 按位异或^
- 按位左移<<
- 按位右移>>
数据库联结查询
- 内连接查询
- 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指令笔记).
如果您对这篇文章有什么意见或者建议,请评论与我讨论.
如果您觉得还不错的话~可以点个喜欢鼓励我哦.
如果您想和我一起学习,请毫不吝啬的私信我吧~
介个是我的个人博客,欢迎参观哦~