
目录一、数据库介绍1.1 数据库简介1.2 数据库分类1.3 进入MySQL终端二、MySQL基础2.1 SQL语言介绍2.2 DataGrip使用三、DDL数据定义语言3.1 DDL之数据库操作3.2 DDL之表操作3.3 DDL之表结构修改四、DML数据操作语言4.1 插入数据4.2 更新数据4.3 删除数据五、约束5.1 主键PRIMARY KEY5.2 自增AUTO_INCREMENT5.3 非空约束NOT NULL5.4 唯一约束UNIQUE六、DQL数据查询语言6.1 基本查询语句6.2 条件查询6.3 排序七、复杂查询语句7.1 聚合函数7.2 分组统计 GROUP BY7.3 HAVING 二次过滤7.4 LIMIT 分页7.5 INSERT INTO 结合查询结果八、多表查询8.1 主外键关系8.2 多表联查8.3 子查询九、索引介绍了解日常函数使用1、字段取小数后几位2、字段截取位数3、32位随机数SYS_GUID()4、20260825 转换为 2026-08-255、行转列、列转行6、CONCAT 拼接字段7、计算字符串长度一、数据库介绍1.1 数据库简介什么是数据库存储数据的仓库数据库是用于存储、管理和维护数据的系统。传统数据仓库应用现在市面上有些公司将MySQL当作数据仓库来使用关键原因就是数据库可以存储大量数据这种属于传统数仓。本质数据最终存储在文件系统中如Windows文件系统Linux文件系统HDFS文件系统分布式文件系统1.2 数据库分类关系型数据库Relational DatabaseSQLMySQL大部分企业使用Oracle政府部门、金融行业DB2IBM公司产品SQLite轻量级常用于手机端非关系型数据库Non-relational DatabaseNoSQLHBaseRowKey-Value存储列式存储基于B树和跳表RedisKey-Values键值对数据库数据存储在内存中Elasticsearch搜索引擎SolrCloud搜索引擎MongoDB文档数据库适合存储大文件1.3 进入MySQL终端两种连接方式使用用户名和密码连接mysql -u root -p123456指定主机连接mysql --host192.168.88.100 --userroot --password123456二、MySQL基础2.1 SQL语言介绍SQL语言分类DDLData Definition Language数据定义语言DMLData Manipulation Language数据操作语言DCLData Control Language数据控制语言权限控制DQLData Query Language数据查询语言数据类型数字类型整数INT常用、TINYINT、SMALLINT小数FLOAT、DOUBLE、DECIMAL(m,n)m整个数字的长度位数n小数位数日期类型TIMESTAMPDATETIME常用函数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 namexiuer; -- 带条件更新推荐 UPDATE student SET namehehe WHERE age 10;4.3 删除数据DELETE FROMDELETE 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;注意删除主键后该字段的非空约束仍然存在不能输入NULL5.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 price1000, 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 执行顺序示例-- 先过滤 id13再按 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, NM 代表起始条数 1N 代表一页显示多少条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-25SELECT REGEXP_REPLACE(20260825, (\\d{4})(\\d{2})(\\d{2}), \\1-\\2-\\3);5、行转列、列转行行转列CASE WHEN列转行UNION ALL6、CONCAT 拼接字段SELECT CONCAT(字段1, 字段2);7、计算字符串长度SELECT CHAR_LENGTH(浦东); -- 示例拼接公司名称 SELECT CONCAT(国网上海市电力公司, LEFT(a.mgt_org_name, CHAR_LENGTH(浦东)), 供电公司);