目录

一、数据库介绍

1.1 数据库简介

什么是数据库

  • 存储数据的仓库:数据库是用于存储、管理和维护数据的系统。
  • 传统数据仓库应用:现在市面上有些公司将MySQL当作数据仓库来使用,关键原因就是数据库可以存储大量数据(这种属于传统数仓)。
  • 本质:数据最终存储在文件系统中,如:
    • Windows文件系统
    • Linux文件系统
    • HDFS文件系统(分布式文件系统)

1.2 数据库分类

关系型数据库(Relational Database,SQL)

  • MySQL:大部分企业使用
  • Oracle:政府部门、金融行业
  • DB2:IBM公司产品
  • SQLite:轻量级,常用于手机端

非关系型数据库(Non-relational Database,NoSQL)

  • HBase:RowKey-Value存储,列式存储,基于B+树和跳表
  • Redis:Key-Values键值对数据库,数据存储在内存中
  • Elasticsearch:搜索引擎
  • SolrCloud:搜索引擎
  • MongoDB:文档数据库,适合存储大文件

1.3 进入MySQL终端

两种连接方式

  1. 使用用户名和密码连接:
    mysql -u root -p123456
  2. 指定主机连接:
    mysql --host=192.168.88.100 --user=root --password=123456

二、MySQL基础

2.1 SQL语言介绍

SQL语言分类

  • DDL(Data Definition Language):数据定义语言
  • DML(Data Manipulation Language):数据操作语言
  • DCL(Data Control Language):数据控制语言(权限控制)
  • DQL(Data Query Language):数据查询语言

数据类型

  • 数字类型
    • 整数:INT(常用)、TINYINT、SMALLINT
    • 小数:FLOAT、DOUBLE、DECIMAL(m,n)
      • m:整个数字的长度(位数)
      • n:小数位数
  • 日期类型
    • TIMESTAMP
    • DATETIME
      • 常用函数:YEAR()、MONTH()、DAY()、WEEKOFYEAR()
  • 字符串类型
    • VARCHAR(m):m表示字符长度

2.2 DataGrip使用

DataGrip是JetBrains推出的数据库管理工具,支持多种数据库,提供智能代码补全、SQL格式化、版本控制集成等功能。

三、DDL数据定义语言

3.1 DDL之数据库操作

  • 创建数据库
    CREATE DATABASE bigdata9;
  • 查看所有数据库
    SHOW DATABASES;
  • 使用数据库
    USE bigdata_9;
  • 查看当前使用的数据库
    SELECT DATABASE();
  • 删除数据库
    DROP DATABASE bigdata_9;

3.2 DDL之表操作

创建表

CREATE TABLE IF NOT EXISTS 表名称(
    字段1 字段类型,
    字段2 字段类型,
    字段3 字段类型
);

IF NOT EXISTS:如果表存在就不动,如果不存在就创建这个表

示例

CREATE TABLE student(
    name VARCHAR(200),
    sid VARCHAR(20),
    gender VARCHAR(5),
    age INT
);

表命名规范:项目名称_模块_业务_指标

  • 查看数据库中的表
    SHOW TABLES;
  • 查看表结构
    DESC student;
  • 删除表
    DROP TABLE student;

3.3 DDL之表结构修改

  • 添加新字段
    ALTER TABLE 表名称 ADD 字段名称 字段类型;
    -- 示例
    ALTER TABLE student ADD score INT;
  • 修改字段
    ALTER TABLE 表名称 CHANGE 旧字段 新字段 字段类型;
    -- 示例
    ALTER TABLE student CHANGE `desc` description INT;
  • 删除字段
    ALTER TABLE 表名称 DROP 字段名称;
    -- 示例
    ALTER TABLE student DROP description;
  • 表重命名
    RENAME TABLE 表名称 TO 新表名称;
    -- 示例
    RENAME TABLE student TO stu;

四、DML数据操作语言

注意:DML操作都不需要加TABLE关键字

4.1 插入数据

语法

-- 方式1:按表字段顺序插入所有值
INSERT INTO 表名称 VALUES(字段1值, 字段2值, 字段3值...);

-- 方式2:指定字段插入
INSERT INTO 表名称(字段1, 字段2, 字段3...) VALUES(字段1值, 字段2值, 字段3值);

注意事项

  • 字符串类型:加双引号或单引号
  • 数值类型:不加引号
  • 字段和字段值必须保持对应关系
  • 字符串类型不应当作数值类型输入

示例

-- 插入单条数据
INSERT INTO stu VALUES("秀儿", 'a0001010', '男', 20, 99);

-- 插入多条数据
INSERT INTO stu VALUES("秀儿2", 'a0001012', '男', 20, 99), 
                     ("秀儿3", 'a0001012', '男', 20, 99);

-- 指定字段插入
INSERT INTO stu(name, sid) VALUES("huluwa", 'a001');

4.2 更新数据

语法

UPDATE 表名 SET 字段=值 WHERE 条件;

示例

-- 更新所有记录(谨慎使用)
UPDATE student SET name="xiuer";

-- 带条件更新(推荐)
UPDATE student SET name="hehe" WHERE age > 10;

4.3 删除数据

DELETE FROM

DELETE FROM 表名 WHERE 条件;
-- 示例
DELETE FROM stu WHERE id > 5;

主要目的是删除部分数据,最好加上WHERE条件进行限制

TRUNCATE:清空表

TRUNCATE TABLE 表名;

TRUNCATE会先删除整个表,再新建一个一模一样的空表,与DELETE有区别

五、约束

5.1 主键(PRIMARY KEY)

  • 被修饰字段的值不能为空(NOT NULL)
  • 被修饰字段的值不能重复(UNIQUE)

联合主键:PRIMARY KEY修饰多个字段,当作一个主键使用

注意:是多个字段拼接的值进行比较

删除主键

ALTER TABLE 表名 DROP PRIMARY KEY;

注意:删除主键后,该字段的非空约束仍然存在,不能输入NULL

5.2 自增(AUTO_INCREMENT)

  • 一般与主键结合使用
  • 必须与数值类型字段结合使用
  • 被自增修饰的字段在插入数据时不需要手动管理

示例

CREATE TABLE log(
    id INT PRIMARY KEY AUTO_INCREMENT,
    ip VARCHAR(20),
    etl_date VARCHAR(20)
);

5.3 非空约束(NOT NULL)

  • 被修饰字段的值不能为空
  • 一个表可以有多个NOT NULL修饰的字段

示例

CREATE TABLE student(
    id INT NOT NULL,
    name VARCHAR(20) NOT NULL
);

5.4 唯一约束(UNIQUE)

  • 被修饰字段的值不能重复
  • 一个表可以有多个字段被UNIQUE修饰
  • 可以对NOT NULL和UNIQUE同时使用在一个字段上
  • NULL和NULL不能比较,所以可以重复

示例

CREATE TABLE student(
    id INT NOT NULL UNIQUE,
    name VARCHAR(20) UNIQUE
);

六、DQL数据查询语言

6.1 基本查询语句

基本语法

SELECT DISTINCT *|字段1, 字段2 FROM 表名称 WHERE 条件;

DISTINCT去重

-- 单字段去重
SELECT DISTINCT price FROM product;

-- 多字段去重
SELECT DISTINCT price, category_id FROM product;

注意:DISTINCT只能放在所有字段的最前面

查询示例

-- 查询所有字段
SELECT * FROM product;

-- 查询指定字段
SELECT price, category_id FROM product;

-- 字段别名
SELECT category_id AS cid FROM product;
SELECT price pdd FROM product;  -- 省略AS

-- 表别名
SELECT price FROM product p;
SELECT p.price FROM product p;  -- 使用别名访问字段

-- 四则运算(不影响原表数据)
SELECT price+1000, price FROM product;

6.2 条件查询

比较运算符:>、<、>=、<=、!=、<>、=、BETWEEN x AND y

-- 等于
SELECT * FROM product WHERE category_id = "c001";

-- 大于等于
SELECT * FROM product WHERE price >= 5000;

-- 不等于
SELECT * FROM product WHERE category_id != 'c001';
SELECT * FROM product WHERE category_id <> 'c001';

-- 范围查询
SELECT * FROM product WHERE price >= 2000 AND price <= 4000;
SELECT * FROM product WHERE price BETWEEN 2000 AND 4000;

IN运算符

-- 使用OR
SELECT * FROM product WHERE category_id = 'c001' OR category_id = 'c002';

-- 使用IN(更简洁)
SELECT * FROM product WHERE category_id IN ('c001', 'c002');

模糊匹配

  • %:任意长度的任意字符
  • _:一个长度的任意字符
-- 包含"想"的产品
SELECT * FROM product WHERE pname LIKE '%想%';

-- 第二个字是"想"的产品
SELECT * FROM product WHERE pname LIKE '_想%';

-- 以"香"开头的产品
SELECT * FROM product WHERE pname LIKE '香%';

NULL值判断

-- 查询空值
SELECT * FROM product WHERE pname IS NULL;

-- 查询非空值
SELECT * FROM product WHERE pname IS NOT NULL;

逻辑运算符:AND、OR、NOT

-- AND:同时满足
SELECT * FROM product WHERE price > 50 AND category_id = 'c003';

-- OR:至少满足一个
SELECT * FROM product WHERE category_id = 'c002' OR price >= 3000;

-- NOT:条件取反
SELECT * FROM product WHERE NOT (category_id = 'c001');
SELECT * FROM product WHERE NOT price >= 2000;

6.3 排序

  • ASC:升序(默认)
  • DESC:降序
-- 升序排序
SELECT * FROM product WHERE price >= 200 ORDER BY price ASC;

-- 降序排序
SELECT * FROM product WHERE price >= 200 ORDER BY price DESC;

-- 多字段排序
SELECT * FROM product WHERE price >= 200 ORDER BY price, category_id ASC;

注意:多字段排序时,先根据第一个字段排序,当第一个字段值相等时,再根据第二个字段排序

七、复杂查询语句

7.1 聚合函数

MySQL 中常用的聚合函数一共有 5 个:

  • COUNT:求个数
  • MAX:求最大值
  • SUM:求和
  • AVG:求平均值
  • MIN:求最小值

在 MySQL 中,普通查询是一行一行返回数据的,而聚合函数是根据一个或多个字段的值进行统计(求值)。

注意:聚合函数只会返回一个值

示例

-- 统计记录条数
SELECT COUNT(*), COUNT(1) FROM product;

-- 求和
SELECT SUM(price) FROM product;

-- 求最大值(取别名)
SELECT MAX(price) max_p FROM product;

-- 求最小值
SELECT MIN(price) FROM product;

-- 求平均值(两种写法等价)
SELECT AVG(price), SUM(price)/COUNT(price) FROM product;

7.2 分组统计 GROUP BY

核心要点:根据什么字段进行分组,SELECT 就只能写什么字段,除了聚合函数。

示例

-- 统计每个分类下的商品数量
SELECT category_id, COUNT(1) AS cn
FROM product
WHERE category_id IS NOT NULL
GROUP BY category_id;

-- 统计每个分类下的商品总金额
SELECT category_id, SUM(price) AS total_money
FROM product
GROUP BY category_id;

常见需要 GROUP BY 的描述

  • 根据什么统计什么
  • 根据什么维度统计什么指标
  • 每个什么的个数
  • 不同什么的个数

7.3 HAVING 二次过滤

  • HAVING 是对 GROUP BY 分组统计之后的结果进行二次过滤
  • HAVING 可以写聚合函数
  • 可以使用 SELECT 里面的字段
  • 与 WHERE 有本质区别

SQL 执行顺序示例

-- 先过滤 id<13,再按 sex 分组统计,再过滤数量>3,最后排序
SELECT sex, COUNT(1) AS cn
FROM student
WHERE id < 13
GROUP BY sex
HAVING COUNT(1) > 3
ORDER BY cn;

-- 综合示例:过滤价格<4000,分组统计后过滤数量>2,排序并分页
SELECT category_id, COUNT(1) AS cn
FROM product
WHERE price < 4000
GROUP BY category_id
HAVING cn > 2
ORDER BY cn
LIMIT 10;

7.4 LIMIT 分页

  • 限制显示条数
  • 分页:LIMIT M, N
    • M 代表起始条数 + 1
    • N 代表一页显示多少条

7.5 INSERT INTO 结合查询结果

一般会将计算的结果写入一个结果表保存起来。

示例

-- 方式1:先建表,再把查询结果插入新表
CREATE TABLE pro_tmp(
    ppid INT,
    price INT,
    pname VARCHAR(20)
);

INSERT INTO pro_tmp
SELECT pid, price, pname
FROM product;

-- 方式2:创建临时表并直接插入查询结果
CREATE TABLE tmp_pro
AS
SELECT pid, price, pname
FROM product;

八、多表查询

8.1 主外键关系

  • 一个 A 表的字段指向另外一个 B 表的主键
    • B 称为主表(主键)
    • A 称为从表(外键)

特点

  • 添加数据的时候从表受主表影响,从主表开始
  • 删除数据的时候从从表开始

8.2 多表联查

内连接

隐式内连接:

-- 笛卡尔积的结果:M、N 两表 = M*N
SELECT * FROM products, category;

-- 隐式内连接(加条件过滤)
SELECT * FROM products, category
WHERE products.category_id = category.cid;

显式内连接:

-- 显式内连接(推荐)
SELECT * FROM products t1
INNER JOIN category t2 ON t1.category_id = t2.cid;

-- 不推荐:ON 条件写在 WHERE 中
SELECT * FROM category t1
INNER JOIN products t2
WHERE t1.cid = t2.category_id;

外连接

左外连接(LEFT OUTER JOIN / LEFT JOIN):

  • 左边表的数据全部显示
  • 如果与右边表连接上了,则显示右边表的数据
  • 如果与右边表没有连接上,右边表对应字段的值就为 NULL
-- 左外连接
SELECT * FROM products p
LEFT JOIN category c ON p.category_id = c.cid;

-- 求差集:左表有、右表没有的数据
SELECT * FROM products p
LEFT JOIN category c ON p.category_id = c.cid
WHERE c.cid IS NULL;

右外连接(RIGHT OUTER JOIN / RIGHT JOIN):

  • 先写的表显示在左边,后写的表显示在右边
  • 右边表的数据全部显示,共有的数据也会显示
SELECT * FROM products p
RIGHT JOIN category c ON p.category_id = c.cid;

8.3 子查询

将一个查询的结果当做一个值、一个集合或者一张表来使用。

示例

-- 将查询结果当做值
SELECT * FROM products
WHERE category_id = (SELECT cid FROM category WHERE cname = "家电");

-- 将查询结果当做集合
SELECT * FROM products
WHERE category_id IN
    (SELECT cid FROM category WHERE cname = "家电" OR cname = "化妆品");

-- 将查询结果当做表(必须给表取别名)
SELECT p.* FROM products p
INNER JOIN (SELECT cid FROM category WHERE cname = "家电") t1
ON p.category_id = t1.cid;

注意:将一个子查询的结果当做一张表时,一定要给表取别名

COUNT(DISTINCT 字段) 与 GROUP BY 优化

-- 统计去重后的分类数量
SELECT COUNT(DISTINCT category_id) FROM products;

-- 查看去重后的分类
SELECT DISTINCT category_id FROM products;

-- 使用子查询 + GROUP BY 统计
SELECT COUNT(1)
FROM
    (SELECT category_id FROM products GROUP BY category_id) t1;

九、索引介绍(了解)

索引的好处:提高查询速度

索引的注意点

  • 不要对所有字段添加索引
  • 因为当数据更新的时候,索引文件也会进行更新操作
  • 而且索引文件是加载到内存里面的,会占用资源

索引操作

-- 创建索引
CREATE INDEX index_cname ON category(cname(20));

ALTER TABLE products ADD INDEX index_comment(price);

-- 删除索引
DROP INDEX index_comment ON products;

-- 查看表索引
SHOW INDEX FROM products;

日常函数使用

1、字段取小数后几位

  • ROUND() 函数(四舍五入):ROUND(字段名, 小数位数)
  • TRUNCATE() 函数(直接截断,不四舍五入):TRUNCATE(字段名, 小数位数)

2、字段截取位数

  • SUBSTR(字段, 起始位, 结束位)
  • SUBSTRING(字段, 起始位, 结束位)
  • LEFT(字段, 从左到右截取位数)
  • RIGHT(字段, 从右到左截取位数)

3、32位随机数(SYS_GUID())

SELECT SYS_GUID() AS id;

4、20260825 转换为 2026-08-25

SELECT REGEXP_REPLACE('20260825', '(\\d{4})(\\d{2})(\\d{2})', '\\1-\\2-\\3');

5、行转列、列转行

  • 行转列:CASE WHEN
  • 列转行:UNION ALL

6、CONCAT 拼接字段

SELECT CONCAT(字段1, 字段2);

7、计算字符串长度

SELECT CHAR_LENGTH('浦东');

-- 示例:拼接公司名称
SELECT CONCAT('国网上海市电力公司', LEFT(a.mgt_org_name, CHAR_LENGTH('浦东')), '供电公司');
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐