MySQL数据库入门:从基础概念到SQL查询实战
目录
一、数据库介绍
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终端
两种连接方式
- 使用用户名和密码连接:
mysql -u root -p123456 - 指定主机连接:
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('浦东')), '供电公司');
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)