⭐这是黑马Python数据分析笔记

补充:DataGrip软件中查询控制台和“.sql脚本文件”的区别

功能 查询控制台 SQL 脚本文件
是否持久化 ❌ 临时,关闭后可能丢失 ✅ 保存在磁盘,可长期保留
是否支持多语句 ✅ 支持 ✅ 支持
是否支持版本控制 ❌ 不支持 ✅ 支持(Git 等)
是否适合复杂逻辑 ⚠️ 适合简单测试 ✅ 适合完整流程
是否可重复执行 ✅ 可快速重试 ✅ 可批量运行

⭐SQL语言不区分大小写

/**/多行注释、--单行注释,#单行注释

一、DDL语句(数据定义语言) 

1、操作数据库(database)

# 1. 查看(已创建的)所有数据库.
show databases ;

# 2. 创建数据库.
create database day01;                          # 以默认码表(这里是: UTF8),没有s
create database day02 character set 'gbk';      # 以GBK码表, 创建数据表.
# create database day01;            # 会报错, 因为数据库存在.
create database if not exists day01;            # 数据库day01不存在, 就创建, 存在就: 什么都不做.

# 完整建库格式.
create database if not exists day03 charset 'utf8';          # 采用utf8码表, 创建day03数据库, 如果存在就什么都不做.

# 3. 修改数据库 -> 码表, 把day02数据库的码表从 gbk -> utf8
alter database day02 charset 'utf8';

# 4. 删除数据库.
drop database day01;
drop database day02;
drop database day03;

# 5. 查看当前用的是哪个数据库.
select database();

# 6. 切换数据库.
use day02;

# 7. 查看某个指定数据库的数据库的码表.
show create database day01;     # 默认: utf-8码表
show create database day02;     # 默认: gbk码表

2、操作数据表(table)

# 1. 切库,只有切进去了,后面的表才都是这里面的
use day01;
# 2. 查看(当前数据库中)所有的数据表.
show tables;
# 3. 创建数据表, 学生表: student, 字段为: sid, 学生id    name, 学生姓名,   age, 学生年龄
/*
[]是可选项
格式:
    create table [if not exists] 数据表名(
        字段名 数据类型 [约束],
        字段名 数据类型 [约束],
        字段名 数据类型 [约束],
        ......
    );
*/
create table if not exists student(
    sid int,            # 学生学号,别忘了逗号!
    name varchar(20),   # 学生姓名,varchar和string差不多
    age int             # 学生年龄
);

# 4.修改数据表(名), 从 student -> stu
# 格式: rename table 旧表名 to 新表名;
rename table student to stu;

# 5. 删除数据表.
# 格式: drop table [if exists] 数据表名;
drop table if exists stu;

# 6. 如何查看表结构.
# 格式: desc 数据表名
# show create table student;
desc student;
#desc有查看表结构,也有降序排列

常见的数据类型

🧱 1、数值类型(Numeric)

类型 说明 常见用途
INT / INTEGER 整数,通常 4 字节(-21 亿 ~ +21 亿) 用户 ID、订单数量、计数器
BIGINT 大整数,8 字节(范围极大) 高并发 ID、时间戳(毫秒)、大金额计数
SMALLINT 小整数,2 字节(-32,768 ~ 32,767) 状态码、评分(1~5)、年龄
TINYINT 微小整数,1 字节(0~255 或 -128~127) 布尔标志(0/1)、性别(0=女,1=男)
DECIMAL(M,D) / NUMERIC 精确小数,M=总位数,D=小数位数 金额、利率、科学计算(不会丢失精度
FLOAT / REAL 单精度浮点数(约 7 位有效数字) 温度、坐标、近似值
DOUBLE / DOUBLE PRECISION 双精度浮点数(约 15 位有效数字) 科学计算、高精度测量

🔤 2、字符串类型(String / Text)

类型 说明 常见用途
CHAR(n) 定长字符串,最多 255 字符 国家代码(CHAR(2))、MD5(CHAR(32)
VARCHAR(n) 变长字符串,节省空间 用户名、邮箱、地址、标题
TEXT 长文本(MySQL 中最大 65KB) 评论、简介、日志片段
MEDIUMTEXT 中等长文本(约 16MB) 文章正文、JSON 数据
LONGTEXT 超长文本(约 4GB) 富文本内容、备份数据
CLOB(Oracle/PostgreSQL) Character Large Object,类似 TEXT 大文本存储

注意区分varchar和char的区别

特性 CHAR(n) VARCHAR(n)
全称 Character (固定长度) Variable Character (可变长度)
存储方式 定长:总是占用 n 个字符的空间 变长:只占用实际字符数 + 长度前缀(1~2 字节)
最大长度 通常 255 字符(MySQL) MySQL 5.0+:65,535 字节(受行总大小限制)
空间效率 ❌ 浪费空间(如存 "A" 也占 10 字节) ✅ 节省空间(存 "A" 只占 1+1=2 字节)
读写性能 ✅ 略快(无需计算长度,直接按偏移读取) ⚠️ 略慢(需读取长度前缀)
适用场景 长度固定、几乎不变的短字符串 长度变化大、不确定的字符串

📅 3、日期与时间类型(Date & Time)

类型 格式示例 说明
DATE 2025-11-24 仅日期
TIME 14:30:00 仅时间
DATETIME 2025-11-24 14:30:00 日期+时间(不带时区
TIMESTAMP 2025-11-24 14:30:00 日期+时间(带时区转换,常用于记录创建/更新时间)
YEAR 2025 年份(较少用)

🔘 4、布尔与二进制类型

类型 说明 常见用途
BOOLEAN / BOOL 真/假(实际常映射为 TINYINT(1) 是否激活、是否删除、开关状态
BIT(n) 位字段(n=1~64) 权限标志(用位运算压缩存储)
BINARY(n) 定长二进制数据 加密哈希、固定长度 token
VARBINARY(n) 变长二进制数据 文件缩略图、加密数据
BLOB / LONGBLOB 二进制大对象 图片、音频、PDF 等文件(但通常建议存路径而非文件本身

🌐 5、特殊/高级类型(部分数据库支持)

类型 数据库 用途
JSON MySQL 5.7+, PostgreSQL 存储结构化 JSON 数据(支持查询内部字段)
UUID PostgreSQL, SQL Server 全局唯一标识符(替代自增 ID)
INET PostgreSQL 存储 IP 地址(IPv4/IPv6)
ARRAY PostgreSQL 存储数组(如标签列表)
ENUM MySQL 枚举类型(如 'pending', 'shipped', 'delivered'

数据约束

在数据类型上进一步做限定

约束类型 作用层级 是否可为空 是否可重复
PRIMARY KEY

行级(一张表主键只能有一个)

❌ 不可为空 ❌ 不可重复
UNIQUE 行级 ✅ 可为空 ✅不允许重复 ,NULL 可重复
NOT NULL 字段级 ❌ 不可为空 可以
CHECK 行级/字段级 取决于条件
DEFAULT 字段级(默认约束,等价于python中的缺省参数) 自动填充
FOREIGN KEY 表间关系(多表之间) 可为空(除非同时设 NOT NULL) 可重复(多个订单可属于同一用户)

可以理解为:PRIMARY KEY=UNIQUE+NOT NULL

3、操作字段(Field)

# 细节: 实际开发中, 建表时一般都会多预留2 ~ 7个字段, 当做扩展字段, 将来业务扩展变更等, 可以启用新的字段.
# 1. 切库, 查表.
use day01;
show tables;

# 2. 查看表结构.
desc student;

# 3.给 student表添加字段 address varchar(20)v
# 格式: alter table 表名 add 新列名 数据类型 [约束];
alter table student add address varchar(20) not null;

# 4.修改字段
# 场景1: 只修改数据类型 和 约束.
# 格式: alter table 表名 modify 旧列名 新的数据类型 [新的约束];
alter table student modify address int;

# 场景2: 即修改数据类型 和 约束, 还修改 字段名.  address -> addr, varchar(10)
# 格式: alter table 表名 change 旧列名 新列名 新的数据类型 [新的约束];
alter table student change address addr varchar(10) not null;

# 5. 删除字段.
# 格式: alter table 表名 drop 旧列名;
alter table student drop addr;

desc student;

alter table student add `desc` varchar(20) not null;

二、DML语句(数据操作语言) 

DML语句详解:
    概述:
        它叫数据操作语言, 主要是 操作 表数据, 进行 增删改操作的.
        实际开发中, 增删改统称为 -> 更新语句.
    ⭐细节:
        进行删除, 修改前, 一定一定一定要备份(或者加where条件), 一个过来人的含泪忠告!
    添加数据:
        格式:
            insert into 数据表名(列名1, 列名2...) values(值1, 值2...);
            insert into 数据表名 values(值1, 值2...);

            insert into 数据表名 values(值1, 值2...), (值1, 值2..)...;
        细节:
            1. 要添加的值的个数, 必须和 列名及其类型对应.
            2. 如果不写列名, 默认是: 全列名.

    修改数据:
        格式:
            update 数据表名 set 字段名=值, 字段名=值... where 条件;

    删除数据:
        格式:
            delete from 数据表名 where 条件;         不会重置主键id.
            truncate table 数据表名;                相当于把表摧毁了, 然后再创建一张一模一样的表, 即: 会重置主键id

1、表数据(data) 增

⭐Ctrl+Alt+L:全部格式化(选中,部分格式化)

# 1. 切库, 查表.
use day01;
show tables;

# 2.创建分类表, 分类id, 分类名, 描述信息.
create table category(
    cid int,                # 分类id
    cname varchar(20),      # 分类名
    info varchar(100)       # 描述信息
);

# 3. 往表中添加数据.
insert into category(cid, cname) values(1, '电脑');
# insert into category(cid, cname) values(1, '电脑', 3);    # 报错, 列的个数 和 值的个数不匹配

# insert into category values(2, '手机');       # 报错, 列的个数 和 值的个数不匹配
# insert into category values(3, '拉杆箱');       # 报错, 列的个数 和 值的个数不匹配
insert into category values(2, '手机', '华为手机666');

# 4. 查看表数据.
insert into
    category
values
    (3, '汽车', '小米'),
    (4, '平板', '华为');

# 5. 如何查看全表数据.
select * from category;     # * 代表表中 所有的列(列名)

2、表数据(data) 改

# 1. 查看表数据.
select * from category;


# 2. 修改cname='空调', info='格力', cid=3
update category set cname='空调', info='格力';      # 危险, 一次性改所有
update category set cname='汽车', info=null where cid = 1;

3、表数据(data) 删

# 演示 delete from
delete from category where cid = 4;
delete from category;           # 一次性删除所有, 不会重置主键id


# 演示 truncate table
truncate table category;       # 依次删除所有, 会重置主键id(明天讲解, 目前先了解)

4、扩展_如何备份数据表

# 0. 查看数据表.
show tables;

# 1. 原表
select * from category;

# 2. 场景1: 备份表不存在.
# 格式: create table 备份表名 select * from 原表名 where ...;
create table category_tmp select * from category;

# 3. 场景2: 备份表存在.
# 格式: insert into 备份表名 select * from 原表名 where ...;
insert into category_tmp select * from category where cid <= 3;

# 4. 查看备份表数据.
select * from category_tmp;

# 5. 清空备份表.
delete from category_tmp;
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐