# 数据编码

数据编码是通过计算机程序来处理数据,借以实现数据加工、数据分析、数据应用等目的。数据开发要充分的理解项目商业目标或要求,在开发前梳理项目目标以及分析范围,最终确定分析维度。确定分析维度后要将明确对于数据的要求,根据要求查找数据源,根据分析目的确定分析指标维度的颗粒度,再根据颗粒度统计各类度量参数,制作中间表,最后合并中间表形成完整的分析数据报表。

在数据编码的过程中要注意编程质量控制,比如数据质量、程序的规范性、逻辑正确性等等。在保障开发质量的过程中要统一编程规范,尽量让程序易于复用,易于管理和维护。进行充分的数据分析,也是保障数据开发质量的必要手段。

# SQL

SQL是结构化查询语言的简称,是数据编程和数据分析的必备工具。SQL集数据定义DDL、数据操作DML和数据控制DCL于一体,可以完成关系型数据库中的全部工作。SQL既可以直接通过命令与数据进行交互,也可以嵌入到Java、Python等主流语言中使用。

# DDL

DDL(Data Definition Language)是指数据定义语言,用于创建、修改、删除数据库中的对象,常见的命令有:

  • CREATE:创建
  • ALTER:修改
  • DROP:删除
  • TRUNCATE:清空操作
  • COMMENT:备注处理
  • RENAME:重命名

使用CREATE DATABASE命令可以创建数据库,创建数据库时命名要遵循固定规则,不能与其他数据库重名,名称不能单独使用数字,最长可以为64字符,不推荐使用关键字作为数据库名和表名,如下是创建一个数据库和删除数据库的命令

CREATE DATABASE if not exists mysql_test;
DROP if exists mysql_test;

CREATE TABLE 是创建表的关键字,在建表的语法结构中,table_name 是新表的名称。括号中列出了表中的每一列,每一列由列名、数据类型和约束组成,多个列之间用逗号分隔。PRIMARY KEY 约束用于定义主键,可以由一个或多个列组成。主键列的值必须唯一且不能为空。

创建新表

CREATE TABLE if not exists table_name (
  column1 datatype constraints,
  column2 datatype constraints,
  column3 datatype constraints,
  ...
  PRIMARY KEY (one_or_more_columns)
) COMMMENT='remark';

修改表的语法结构主要使用 ALTER TABLE 关键字。常见的修改表的操作包括添加新列、修改列的数据类型、删除列以及添加约束等。

添加新列:其中,table_name 是要修改的表名,column_name 是新列的名称,data_type 是新列的数据类型,constraint 是该列的约束条件(可选)。

ALTER TABLE table_name ADD column_name data_type constraint;

修改列的数据类型:其中,table_name 是要修改的表名,column_name 是要修改的列名,new_data_type 是该列的新数据类型。

ALTER TABLE table_name MODIFY column_name new_data_type;

删除列:其中,table_name 是要修改的表名,column_name 是要删除的列名。

ALTER TABLE table_name DROP column_name;

添加约束:其中,table_name 是要修改的表名,constraint_name 是约束的名称,constraint_type 是约束的类型(如 PRIMARY KEYFOREIGN KEY 等),column_name 是要约束的列名。

ALTER TABLE table_name ADD CONSTRAINT constraint_name constraint_type(column_name);

# DML

DML(Data Manipulation Language):是指数据操作语言,常用于对数据库表中的数据进行新增、删除和修改操作。常用的命令为:

  • INSERT:插入
  • DELETE:删除
  • UPDATE:更新

使用INSERT INTO语句可以向表中插入一行数据,也可以插入多行数据,一次插入多行各行使用,进行分割,如下所示:

INSERT INTO students (name, age, gender) VALUES ('Tom', 18, 'Male');

这条语句将在 students 表中插入一行数据,该行数据包含 nameagegender 三个列的值,其中 name 列的值为 'Tom',age 列的值为 18,gender 列的值为 'Male'。需要注意的是,插入的值必须按照列的顺序对应,即第一个值对应第一个列,第二个值对应第二个列,以此类推。

UPDATE 是一条用于更新表中数据的 SQL 语句,SET 则是 UPDATE 语句中的一个子句,用于指定要更新的列以及它们的新值。下面是 UPDATE 和 SET 语句的语法结构:

UPDATE table_name SET column1 = value1, column2 = value2, ... WHERE condition;

其中,table_name 是要更新的表名,column1 = value1, column2 = value2, ... 是要更新的列和它们的新值,多个列和值之间用逗号分隔。WHERE 子句是可选的,用于指定要更新哪些行。如果省略 WHERE 子句,将更新表中的所有行。

DELETE 是一条用于删除表中数据的 SQL 语句,可以删除一行或多行数据。下面是 DELETE 语句的语法结构:

DELETE FROM table_name WHERE condition;

其中,table_name 是要删除数据的表名,WHERE 子句是可选的,用于指定要删除哪些行。如果省略 WHERE 子句,将删除表中的所有行。因此,在删除数据时,务必要谨慎使用 DELETE 语句,并确保使用 WHERE 子句来指定要删除的行,以避免意外删除了表中不需要删除的数据。此外,删除数据时需要注意表中是否存在外键约束,如果存在外键约束,需要先删除依赖该行数据的其他表中的数据,再执行删除操作,否则会因为外键约束而无法删除。

# DQL

DQL(Data Query Language)是指数据查询语言,用于查询数据库表中的数据,其提供了数据筛选、字段运算、分组聚合、多表关联等功能。SELECT 是最常用的 Data Query Language(DQL)语句,用于从一个或多个表中检索数据。下面是 SELECT 语句的基本语法:

SELECT column1, column2, ... FROM table_name WHERE condition ORDER BY column_name ASC/DESC;

column1, column2, ... 是要查询的列,可以指定多个列,用逗号分隔。table_name 是要查询的表名,WHERE 子句是可选的,用于指定查询条件,可以使用各种运算符和函数来构造查询条件。ORDER BY 子句也是可选的,用于指定查询结果的排序方式,可以按升序(ASC)或降序(DESC)排序。在 SELECT 语句中,还可以使用聚合函数(例如 SUM、AVG、MIN、MAX 和 COUNT)对数据进行汇总计算,也可以使用 GROUP BY 子句对查询结果进行分组。此外,还可以使用 JOIN 语句将多个表连接起来,从而获取更多的数据。

AS 关键字用于为查询结果中的列指定别名,从而方便后续处理。column_name 是要查询的列名,alias_name 是为该列指定的别名。使用 AS 关键字是可选的,也可以直接在列名后面加上空格和别名,其语法为:

SELECT column_name AS alias_name FROM table_name;
SELECT column_name alias_name FROM table_name;

DISTINCT 关键字用于去除查询结果中的重复行,只返回不同的行,DISTINCT 关键字只能应用于整个行的比较,不能只针对某一列去重。另外,使用 DISTINCT 会增加查询的计算量,可能会影响查询性能。其语法为:

SELECT DISTINCT column1, column2, ... FROM table_name;

LIKE 关键字用于模糊搜索,使用LIKE关键字搜索条件时,模式字符中的所有字符都有意义,LIKE主要用于字符型数据,字符串内的英文和汉字都算一个字符,使用通配符%和下划线_匹配多个或一个字符,其语法为:

SELECT column1, column2, ... FROM table_name WHERE column_name LIKE pattern;

GROUP BY 关键字用于将查询结果按照指定的列进行分组,从而对分组后的数据进行聚合操作,HAVING 关键字用于在分组后的数据上进行过滤操作,只返回符合条件的分组结果,HAVING 关键字只能应用于分组后的数据上,如果要过滤掉不符合条件的行,应该使用 WHERE 关键字。此外,由于 GROUP BYHAVING 操作会对数据进行聚合和排序,可能会影响查询性能。因此,在使用这些操作时需要注意性能问题。其语法为:

SELECT column1, column2, ..., aggregate_function(column_name)
FROM table_name
GROUP BY column_name
HAVING condition;

CASE 表达式用于在查询结果中根据条件返回不同的值,它按顺序逐个判断条件,并返回第一个符合条件的结果。如果没有符合条件的结果,则返回 ELSE 子句中指定的默认结果。下面是一个示例,查询 students 表中每个学生的成绩等级:

SELECT name, score,
    CASE 
        WHEN score >= 90 THEN '优秀'
        WHEN score >= 80 THEN '良好'
        WHEN score >= 60 THEN '及格'
        ELSE '不及格'
    END AS grade
FROM students;

此查询将查询 students 表中每个学生的姓名和成绩,并根据成绩判断其等级,返回一个新的名为 grade 的列。如果成绩大于等于 90 分,返回字符串 '优秀',如果成绩大于等于 80 分但小于 90 分,返回字符串 '良好',如果成绩大于等于 60 分但小于 80 分,返回字符串 '及格',否则返回字符串 '不及格'。

UNION 用于将多个 SELECT 查询的结果合并成一个结果集。当我们需要查询两个或多个表的数据,且这些表具有相同的字段结构,那么可以使用 UNION 操作符来合并它们的查询结果。假设有两个表employees1employees2,它们的字段结构相同,每个表中都包含了员工的 ID、姓名和薪资信息,我们希望将它们的数据合并成一个结果集,可以使用 UNION 操作符:

SELECT id, name, salary FROM employees1
UNION
SELECT id, name, salary FROM employees2;

上述查询首先从 employees1 表中选取 ID、姓名和薪资这三个列,然后将其和从 employees2 表中选取的相同三个列的数据合并起来,去除其中的重复行,最后返回一个包含了所有记录的结果集。需要注意的是,UNION 操作符要求两个查询返回的列数和数据类型必须相同。如果想要保留重复行,可以使用 UNION ALL

JOIN 是最常用的用于连接多个表的关键字之一。它允许我们在不同的表之间建立关联关系,并且可以根据指定的条件将这些表中的数据进行组合,返回一个包含所有相关数据的结果集。JOIN 关键字可以与其他几个关键字组合使用,主要包括以下几种类型的 JOIN

  • INNER JOIN: 返回两个表中满足指定条件的交集。
  • LEFT JOIN: 返回左表中的所有记录,以及右表中满足指定条件的匹配记录(如果有)。
  • RIGHT JOIN: 返回右表中的所有记录,以及左表中满足指定条件的匹配记录(如果有)。
  • FULL OUTER JOIN(MySQL 不支持):返回左表和右表中的所有记录,如果某个记录在另一个表中没有匹配记录,则用 NULL 填充。

假设有两个表 employeesdepartmentsemployees 表包含了员工的信息,包括 ID、姓名、所属部门的 ID 等信息,而 departments 表包含了部门的信息,包括 ID 和名称等信息。我们需要查询出所有员工的姓名和所在部门的名称,可以使用 INNER JOIN 关键字连接两个表,查询语句如下:

SELECT employees.name, departments.department_name
FROM employees
INNER JOIN departments
ON employees.department_id = departments.id;