一、Hadoop分布式文件系统——HDFS
1.架构
-
namenode
客户端的读写请求
文件系统命名空间管理: 打开,关闭、重命名文件和目录 支持配置用户和访问权限,但不支持硬链接和软连接
元数据存储: 1) 文件、目录自身的属性信息,例如文件名,目录名,修改信息等
2) 文件记录的信息的存储相关的信息,例如存储块信息,分块情况,副本个数等
3) 记录 HDFS 的 Datanode 的信息,用于 DataNode 的管理 -
datanaode
文件块的存储(创建/删除)
2.数据可靠性的保证
-
1)多副本机制
写入程序位于datanode上时,就优先将一个副本放置在该datanode上,否则放在随机datanode上。之后在另一个远程机架上的任意一个节点上放置另一个副本,并在该机架上的另一个节点上放置最后一个副本 -
2)心跳机制和安全模式
datanode定期(3s)向namenode发送心跳消息,超过一定时间(10min)没有接收到心跳消息,就认为datanode挂掉,将其上数据新增备份到其他datanode -
3)校验和
客户端创建HDFS文件时,会计算每个块的校验和,并将其存储到同一HDFS目录下单独隐藏文件中
当客户检索文件内容时,会验证从每个datanode接收的数据是否与关联的校验和匹配,若匹配失败,则数据损坏,客户端会从其他节点获取数据 -
4)元数据的磁盘故障
FsImage(镜像文件:元数据的一个持久化的检查点) 和 EditLog(编辑日志:保存文件系统的更改操作) 是 HDFS 的核心数据
snn合并日志
1> dfs.namenode.checkpoint.period 和 dfs.namenode.checkpoint.txns两个配置,满足其中一个,snn就会执行checkpoint操作
2> namenode 生成 edits.new 文件,同时snn把 fsimage和edits 复制到本地(HTTP GET方式)
3> snn把 FsImage 载入内存,一条条执行 EditLog 的更新操作, 生成新的Fsimage.ckpt文件
4> snn把Fsimage.ckpt发送到nn节点, nn以Fsimage.ckpt替换掉fsimage文件, 同时把edits.new重命名为edits -
5)支持快照
在特定时刻存储数据副本,在数据意外损坏时,可以通过回滚操作恢复到健康的数据状态
3.读写操作
4.HDFS故障类型和其检测方法
二、分布式计算框架——MapReduce
1. mapreduce过程
-
MapTask工作机制
(1) Read阶段: 通过用户编写的RecordReader,从输入InputSplit中解析出一个个key/value。
(2) Map阶段: 将解析出的kay/value交给用户写的map()函数处理, 并产生一系列新的key/value。
(3) Collect收集阶段: 用户map函数完成后, 一般会调用OutputCollector.collect()输出结果。在该函数内部, 将生成key/value分区, 并写入环形缓冲区
(4) Spill溢写阶段: 环形缓冲区满后, MapReduce会将数据写到本地磁盘,生成临时文件。(写入前进行本地排序 必要时进行合并压缩)
溢写阶段详情:
步骤1:利用快速排序算法对缓存区内的数据进行排序(先按分区编号 再按key), 此时数据以分区聚集,且按kay有序
步骤2:按照分区编号由小到大依次将每个分区数据写入临时文件(任务工作目录下)output/spillN.out(N表示当前溢写次数)中。若设置Combiner,则先分区内聚集
步骤3:将分区数据的元信息写到内存索引数据结构SpillRecord中,其中每个分区的元信息包括在临时文件中的偏移量、压缩前数据大小和压缩后数据大小。(内存索引超过1MB,则写到文件output/spillN.out.index)
(5) Combine阶段:当所有数据处理完成后,MapTask对所有临时文件进行一次合并,以确保最终只会生成一个数据文件。 -
ReduceTask工作机制
(1) Copy阶段:ReduceTask从各个MapTask上远程拷贝一片数据,并针对某一片数据,如果其大小超过一定阈值,则写到磁盘上,否则直接放到内存中。
(2) Merge阶段:在远程拷贝数据的同时,ReduceTask启动了两个后台线程对内存和磁盘上的文件进行合并,以防止内存使用过多或磁盘上文件过多。
(3) Sort阶段:按照MapReduce语义,用户编写reduce()函数输入数据是按key进行聚集的一组数据。为了将key相同的数据聚在一起,Hadoop采用了基于排序的策略。由于各个MapTask已经实现对自己的处理结果进行了局部排序,因此,ReduceTask只需对所有数据进行一次归并排序即可。
(4) Reduce阶段:reduce()函数将计算结果写到HDFS上。
2. 其他
-
1)序列化和反序列化
1> 序列化: 把内存中的对象, 转换成字节序列(或其他), 便于存储到磁盘和网络传输
2> 反序列化: 磁盘中数据或字节序列(其他), 转换成内存中对象 -
2)为什么要序列化
1> 内存中对象断电就没了, 且只能本地进程使用(不能进行网络传输) -
3)为什么不用Java序列化
1> Java序列化(Serializable)是重量级序列化框架(附带校验信息、header、继承体系等), hadoop自己开发了一套序列化机制(Writable)(便于在网络传输)
三、集群资源管理器——YARN
1.架构
-
ResourceManager(集群资源的主要协调者和管理者)
给用户提交的所有应用程序分配资源 -
NodeManager(每个具体节点的管理者)
1> 启动时向 ResourceManager 注册并定时发送心跳消息,等待 ResourceManager 的指令
2> 维护 Container 的生命周期,监控 Container 的资源使用情况
3> 管理任务运行时的相关依赖,根据 ApplicationMaster 的需要,在启动 Container 之前将需要的程序及其依赖拷贝到本地 -
ApplicationMaster(协调来自 ResourceManager 的资源)
1> 根据应用的运行状态来决定动态计算资源需求;
2> 向 ResourceManager 申请资源,监控申请的资源的使用情况;
3> 跟踪任务状态和进度,报告资源的使用情况和应用的进度信息;
4> 负责任务的容错 -
Container
封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等资源
四、Flume
1. 概念
Flume 是 Cloudera 提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统。Flume 基于流式架构,灵活简单
2. 基础架构
-
agent
Agent 是一个 JVM 进程,它以事件的形式将数据从源头送至目的。Agent 主要有 3 个部分组成,Source、Channel、Sink。 -
source
接收数据到Flume Agent的组件;可以处理各种类型、各种格式的日志数据
avro、thrift、exec、jms、spooling directory、netcat、sequence generator、syslog、http、legacy
-
channel
位于 Source 和 Sink 之间的缓冲区,允许 Source 和 Sink 运作在不同的速率上。Channel 是线程安全的,可以同时处理几个 Source 的写入操作和几个Sink 的读取操作。
Memory Channel 和 File Channel 以及 Kafka Channel
-
sink
Sink 不断地轮询 Channel 中的事件且批量地移除,并将这些事件批量写入到存储或索引系统、或者被发送到另一个 Flume Agent
hdfs、logger、avro、thrift、ipc、file、HBase、solr、自定义
-
event
传输单元,Flume 数据传输的基本单元,以 Event 的形式将数据从源头送至目的地。Event 由 Header 和 Body 两部分组成,Header 用来存放该 event 的一些属性,为 K-V 结构, Body 用来存放该条数据,形式为字节数组。
五、Kafka
1. 概念
Kafka 是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域。
2. 使用消息队列的好处
- 解耦:
允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。 - 可恢复性:
系统的一部分组件失效时,不会影响到整个系统。降低了进程间的耦合度,即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理。 - 缓冲
有助于控制和优化数据流经过系统的速度,解决生产消息和消费消息的处理速度不一致的情况。 - 灵活性 & 峰值处理能力
在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量并不常见。如果为以能处理这类峰值访问为标准来投入资源随时待命无疑是巨大的浪费。使用消息队列能够使关键组件顶住突发的访问压力,而不会因为突发的超负荷的请求而完全崩溃。 - 异步通信
很多时候,用户不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。
3. 基础架构
- Producer :消息生产者,就是向 kafka broker 发消息的客户端
- Consumer :消息消费者,向 kafka broker 取消息的客户端
- Consumer Group(CG):消费者组,消费者组内每个消费者负责消费不同分区的数据,一个分区只能由一个组内消费者消费;消费者组之间互不影响。消费者组是逻辑上的一个订阅者
- leader:每个分区多个副本的“主”,生产者发送数据的对象,以及消费者消费数据的对象都是 leader
- follower:每个分区多个副本中的“从”,实时从 leader 中同步数据,保持和 leader 数据的同步。leader 发生故障时,某个 follower 会成为新的 follower
- Broker :一台 kafka 服务器就是一个 broker。一个集群由多个 broker 组成。一个 broker 可以容纳多个topic
- Topic :可以理解为一个队列,生产者和消费者面向的都是一个 topic
- Partition:为了实现扩展性,一个非常大的 topic 可以分布到多个broker(即服务器)上,一个 topic 可以分为多个 partition,每个 partition 是一个有序的队列
- Replica:副本,为保证集群中的某个节点发生故障时,该节点上的 partition 数据不丢失,且kafka 仍然能够继续工作,kafka 提供了副本机制,一个 topic 的每个分区都有若干个副本,一个 leader 和若干个 follower。
六、Spark
1. 概念
Spark是一种基于内存的快速、通用、可扩展的大数据分析引擎
2. 内置模块
- Spark Core:
实现了Spark的基本功能,包含任务调度、内存管理、错误恢复、与存储系统交互等模块。Spark Core中还包含了对弹性分布式数据集(Resilient Distributed DataSet,简称RDD)的API定义。 - Spark SQL:
是Spark用来操作结构化数据的程序包。通过Spark SQL,我们可以使用 SQL或者Apache Hive版本的SQL方言(HQL)来查询数据。SparkSQL支持多种数据源,比如Hive表、Parquet以及JSON等。 - Spark Streaming:
是Spark提供的对实时数据进行流式计算的组件。提供了用来操作数据流的API,并且与Spark Core中的 RDD API高度对应。 - Spark MLlib:
提供常见的机器学习(ML)功能的程序库。包括分类、回归、聚类、协同过滤等,还提供了模型评估、数据 导入等额外的支持功能。 - 集群管理器:
Spark设计为可以高效地在一个计算节点到数千个计算节点之间伸缩计算。为了实现这样的要求,同时获得最大灵活性,Spark支持在各种集群管理器(Cluster Manager)上运行,包括Hadoop YARN、Apache Mesos,以及Spark自带的一个简易调度器,叫作独立调度器。
3. 架构
-
Driver(驱动器)
Spark的驱动器是执行开发程序中的main方法的进程。它负责开发人员编写的用来创建SparkContext、创建RDD,以及进行RDD的转化操作和行动操作代码的执行。
主要负责:
1)把用户程序转为作业(JOB)
2)跟踪Executor的运行状况
3)为执行器节点调度任务
4)UI展示应用运行状况 -
Executor(执行器)
Spark Executor是一个工作进程,负责在 Spark 作业中运行任务,任务间相互独立。Spark 应用启动时,Executor节点被同时启动,并且始终伴随着整个 Spark 应用的生命周期而存在。
主要负责:
1)负责运行组成 Spark 应用的任务,并将结果返回给驱动器进程;
2)通过自身的块管理器(Block Manager)为用户程序中要求缓存的RDD提供内存式存储。RDD是直接缓存在Executor进程内的,因此任务可以在运行时充分利用缓存数据加速运算。
七、Flink
1. 概念
Apache Flink 是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算。Flink 被设计在所有常见的集群环境中运行,以内存执行速度和任意规模来执行计算。
2. 特点
-
1)事件驱动型(Event-driven)
事件驱动型应用是一类具有状态的应用, 它从一个或多个事件流提取数据,并根据到来的事件触发计算、状态更新或其他外部动作。比较典型的就是以 kafka 为代表的消息队列几乎都是事件驱动型应用。 -
2)流与批的世界观
1> 批处理的特点是有界、持久、大量, 非常适合需要访问全套记录才能完成的计算工作, 一般用于离线统计。
2> 流处理的特点是无界、实时, 无需针对整个数据集执行操作,而是对通过系统传输的每个数据项执行操作,一般用于实时统计。
3> 在 spark 的世界观中,一切都是由批次组成的, 离线数据是一个大批次, 而实时数据是由一个一个无限的小批次组成的。
4> 而在 flink 的世界观中,一切都是由流组成的,离线数据是有界限的流,实时数据是一个没有界限的流,这就是所谓的有界流和无界流。
5> 无界数据流: 无界数据流有一个开始但是没有结束,它们不会在生成时终止并提供数据,必须连续处理无界流,也就是说必须在获取后立即处理 event。对于无界数据流我们无法等待所有数据都到达,因为输入是无界的,并且在任何时间点都不会完成。处理无界数据通常要求以特定顺序(例如事件发生的顺序)获取 event,以便能够推断结果完整性。
6> 有界数据流: 有界数据流有明确定义的开始和结束,可以在执行任何计算之前通过获取所有数据来处理有界流,处理有界流不需要有序获取,因为可以始终对有界数据集进行排序,有界流的处理也称为批处理。
以流为世界观的架构,获得的最大好处就是具有极低的延迟 -
3)分层API(底层->高层)
1> 底层过程函数( Process Function(events, state, time) )
2> 有界或无界流数据( DataStream API(streams, windows) )
3> SQL/Table API(dynamic tables)
3. 其他概念(窗口 时间语义)
-
1)Window 类型
Window 可以分成两类: CountWindow(按指定数据条数生成一个 Window) 和 TimeWindow(按照时间生成 Window)
对于 TimeWindow,可以根据窗口实现原理的不同分成三类:滚动窗口(Tumbling Window)、滑动窗口(Sliding Window) 和会话窗口(Session Window) -
2)时间语义
1> Event Time:是事件创建的时间。它通常由事件中的时间戳描述,例如采集的日志数据中,每一条日志都会记录自己的生成时间,Flink 通过时间戳分配器访问事件时间戳。
2> Ingestion Time:是数据进入 Flink 的时间。(使用场景: 存在多个 Source Operator 的情况下,每个 Source Operator 可以使用自己本地系统时钟指派 Ingestion Time。后续基于时间相关的各种操作,都会使用数据记录中的 Ingestion Time。)
3> Processing Time:是每一个执行基于时间操作的算子的本地系统时间,与机器相关,默认的时间属性就是 Processing Time。(使用场景:没有事件时间的情况下,或者对实时性要求超高的情况下) -
3)Watermark(水位线 水印):
1> 由于网络、分布式等原因,导致乱序的产生,所谓乱序,就是指 Flink 接收到的事件的先后顺序不是严格按照事件的 Event Time 顺序排列的。
2> Watermark 就是触发前一窗口的“关窗时间”,一旦触发关门那么以当前时刻为准在窗口范围内的所有所有数据都会收入窗中。
3> 只要没有达到水位那么不管现实中的时间推进了多久都不会触发关窗。
八、HBase
1. 概念
HBase 是一种分布式、可扩展、支持海量数据存储的 NoSQL 数据库
2. 基本架构
-
Region Server
Region Server 为 Region 的管理者,其实现类为 HRegionServer,主要作用如下:
1> 对于数据的操作:get, put, delete;
2> 对于 Region 的操作:splitRegion、compactRegion。 -
Master
Master 是所有 Region Server 的管理者,其实现类为 HMaster,主要作用如下:
1> 对于表的操作:create, delete, alter
2>对于RegionServer 的操作:分配regions 到每个RegionServer,监控每个RegionServer的状态,负载均衡和故障转移。 -
Zookeeper
HBase 通过 Zookeeper 来做 Master 的高可用、RegionServer 的监控、元数据的入口以及集群配置的维护等工作。 -
HDFS
HDFS 为 HBase 提供最终的底层数据存储服务,同时为HBase 提供高可用的支持。
3. 与MySQL(关系型数据库)区别
来自链接(侵删): https://blog.csdn.net/joananjin/article/details/80002364
-
Hbase和传统数据库的区别
1.数据类型:Hbase只有简单的数据类型,只保留字符串;传统数据库有丰富的数据类型。
2.数据操作:Hbase只有简单的插入、查询、删除、清空等操作,表和表之间是分离的,没有复杂的表和表之间的关系;传统数据库通常有各式各样的函数和连接操作。
3.存储模式:Hbase是基于列存储的,每个列族都由几个文件保存,不同列族的文件是分离的,这样的好处是数据即是索引,访问查询涉及的列大量降低系统的I/O,并且每一列由一个线索来处理,可以实现查询的并发处理;传统数据库是基于表格结构和行存储,其没有建立索引将耗费大量的I/O并且建立索引和物化试图需要耗费大量的时间和资源。
4.数据维护:Hbase的更新实际上是插入了新的数据;传统数据库只是替换和修改。
5.可伸缩性:Hbase可以轻松的增加或减少硬件的数目,并且对错误的兼容性比较高;传统数据库需要增加中间层才能实现这样的功能。
6.事务:Hbase只可以实现单行的事务性,意味着行与行之间、表与表之前不必满足事务性;传统数据库是可以实现跨行的事务性。 -
Hbase的优点:
1.列可以动态增加,并且当列为空的时候就不存储,节省存储空间。
2.Hbase自动切分数据,使得数据存储自动具有水平扩展能力。
3.Hbase可以支持高并发顺序读写操作(因为其有内存的缓存机制)。 -
Hbase的缺点:
1.不能支持条件查询,只支持按照row key来查询(或全表扫描过滤)
九、Hive
1. 概念
Hive:由 Facebook 开源用于解决海量结构化日志的数据统计。是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类 SQL 查询功能。
本质是:将 HQL 转化成MapReduce 程序
2. 基本架构
-
1)用户接口:Client
CLI(hive shell)、JDBC/ODBC(java 访问 hive)、WEBUI(浏览器访问 hive) -
2)元数据:Metastore
元数据包括:表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等;
默认存储在自带的 derby 数据库中,推荐使用 MySQL 存储 Metastore -
3)Hadoop
使用HDFS 进行存储,使用 MapReduce 进行计算。 -
4)驱动器:Driver
1> 解析器(SQL Parser):将 SQL 字符串转换成抽象语法树 AST,这一步一般都用第三方工具库完成,比如 antlr;对 AST 进行语法分析,比如表是否存在、字段是否存在、SQL 语义是否有误。
2> 编译器(Physical Plan):将AST 编译生成逻辑执行计划。
3> 优化器(Query Optimizer):对逻辑执行计划进行优化。
4> 执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。对于 Hive 来说,就是 MR/Spark
3. 优缺点
- 优点
1)操作接口采用类 SQL 语法,提供快速开发的能力(简单、容易上手)。
2)避免了去写 MapReduce,减少开发人员的学习成本。
3)Hive 的执行延迟比较高,因此Hive 常用于数据分析,对实时性要求不高的场合。
4)Hive 优势在于处理大数据,对于处理小数据没有优势,因为Hive 的执行延迟比较高。
5)Hive 支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。 - 缺点
1)Hive 的 HQL 表达能力有限
1> 迭代式算法无法表达
2> 数据挖掘方面不擅长
2)Hive 的效率比较低
1> Hive 自动生成的 MapReduce 作业,通常情况下不够智能化
2> Hive 调优比较困难,粒度较粗
4. 与MySQL(关系型数据)比较
-
查询语言
由于 SQL 被广泛的应用在数据仓库中,因此,专门针对 Hive 的特性设计了类 SQL 的查询语言HQL。熟悉 SQL 开发的开发者可以很方便的使用 Hive 进行开发。 -
数据存储位置
Hive 是建立在 Hadoop 之上的,所有 Hive 的数据都是存储在 HDFS 中的。而数据库则可以将数据保存在块设备或者本地文件系统中。 -
数据更新
由于 Hive 是针对数据仓库应用设计的,而数据仓库的内容是读多写少的。因此,Hive 中不建议对数据的改写,所有的数据都是在加载的时候确定好的。
而数据库中的数据通常是需要经常进行修改的, 因此可以使用 INSERT INTO … VALUES 添加数据, 使用 UPDATE … SET 修改数据。 -
索引
Hive 在加载数据的过程中不会对数据进行任何处理,甚至不会对数据进行扫描,因此也没有对数据中的某些 Key 建立索引。
Hive 要访问数据中满足条件的特定值时,需要暴力扫描整个数据,因此访问延迟较高。由于MapReduce 的引入, Hive 可以并行访问数据,因此即使没有索引,对于大数据量的访问,Hive 仍然可以体现出优势。
数据库中,通常会针对一个或者几个列建立索引,因此对于少量的特定条件的数据的访问,数据库可以有很高的效率,较低的延迟。由于数据的访问延迟较高,决定了Hive 不适合在线数据查询。 -
执行
Hive 中大多数查询的执行是通过 Hadoop 提供的 MapReduce 来实现的。而数据库通常有自己的执行引擎。 -
执行延迟
Hive 在查询数据的时候,由于没有索引,需要扫描整个表,因此延迟较高。另外一个导致Hive 执行延迟高的因素是 MapReduce 框架。由于 MapReduce 本身具有较高的延迟, 因此在利用MapReduce 执行 Hive 查询时,也会有较高的延迟。
相对的,数据库的执行延迟较低。当然,这个低是有条件的,即数据规模较小,当数据规模大到超过数据库的处理能力的时候,Hive 的并行计算显然能体现出优势。 -
可扩展性
由于 Hive 是建立在 Hadoop 之上的,因此 Hive 的可扩展性是和 Hadoop 的可扩展性是一致的(世界上最大的 Hadoop 集群在 Yahoo!,2009 年的规模在 4000 台节点左右)。
而数据库由于ACID 语义的严格限制,扩展行非常有限。目前最先进的并行数据库 Oracle 在理论上的扩展能力也只有 100 台左右。 -
数据规模
由于Hive 建立在集群上并可以利用 MapReduce 进行并行计算,因此可以支持很大规模的数据;对应的,数据库可以支持的数据规模较小。
十、Zookeeper
1. 概念
Zookeeper是一个开源的分布式的,为分布式应用提供协调服务的Apache项目
2. 选举机制
- 半数机制:集群中半数以上机器存活,集群可用。所以Zookeeper适合安装奇数台服务器。
- Zookeeper虽然在配置文件中并没有指定Master和Slave。但是,Zookeeper工作时,是有一个节点为Leader,其他则为Follower,Leader是通过内部的选举机制临时产生的。
- 以一个简单的例子来说明整个选举的过程(五台服务器组成的Zookeeper集群 假设这些服务器依序启动)
(1)服务器1启动,此时只有它一台服务器启动了,它发出去的报文没有任何响应,所以它的选举状态一直是LOOKING状态。
(2)服务器2启动,它与最开始启动的服务器1进行通信,互相交换自己的选举结果,由于两者都没有历史数据,所以id值较大的服务器2胜出,但是由于没有达到超过半数以上的服务器都同意选举它(这个例子中的半数以上是3),所以服务器1、2还是继续保持LOOKING状态。
(3)服务器3启动,根据前面的理论分析,服务器3成为服务器1、2、3中的老大,而与上面不同的是,此时有三台服务器选举了它,所以它成为了这次选举的Leader。
(4)服务器4启动,根据前面的分析,理论上服务器4应该是服务器1、2、3、4中最大的,但是由于前面已经有半数以上的服务器选举了服务器3,所以它只能接收当小弟的命了。
(5)服务器5启动,同4一样当小弟。
3. 部署方式
(1)部署方式单机模式、集群模式
(2)角色:Leader和Follower
(3)集群最少需要机器数:3
- 监听器原理
十一、Sqoop(SQL TO HADOOP)
1. 概念
Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql等)间进行数据的传递
十二、MySQL常用关键字(dml)
insert into 插入数据
delete 删除数据
update 修改数据
select 查询数据
where 有条件地从表中选取数据
as 给表或列起别名
and/or 用于基于一个以上的条件对记录进行过滤
like 模糊查询 通配符(% _)
distinct 去除重复记录
between...and 在...之间(范围)
in/not in 允许我们在 WHERE 子句中规定多个值(散点值)
limit 分页查询(topn)
order by 按一或多列排序(默认asc升序 desc降序)
group by 按一或多列分组
having 分组后筛选(与where用法相似,having后能用聚合函数 where不行,分组筛选后建议用having关键字)
inner join: 在表中存在至少一个匹配时,INNER JOIN 关键字返回行(同join)
left join: 即使右表中没有匹配,也从左表返回所有的行
right join: 即使左表中没有匹配,也从右表返回所有的行
full join: 只要其中一个表中存在匹配,就返回行
nuion 用于合并两个或多个 SELECT 语句的结果集
union all UNION ALL 命令和 UNION 命令几乎是等效的,如果允许重复的值,使用 UNION ALL
select into 从一个表中选取数据,然后把数据插入另一个表中
基本函数: count() sum() max() min() avg()
is [not] null 测试 NULL 值
ISNULL()、NVL()、IFNULL() 和 COALESCE() 函数 参考:https://www.w3school.com.cn/sql/sql_isnull.asp
case when then else end:类似于switch
case :指定字段
when:当什么条件
then:满足上面的条件 就干什么
else:前面的条件都不满足
end:结束语
MySQL Date 函数
NOW() 返回当前的日期和时间
CURDATE() 返回当前的日期
CURTIME() 返回当前的时间
DATE() 提取日期或日期/时间表达式的日期部分
EXTRACT() 返回日期/时间按的单独部分
DATE_ADD() 给日期添加指定的时间间隔
DATE_SUB() 从日期减去指定的时间间隔
DATEDIFF() 返回两个日期之间的天数
DATE_FORMAT() 用不同的格式显示日期/时间