MySql
数据库基础
什么是数据库
数据库(Database)是一种用于高效存储、管理和组织数据的系统。
它通过特定的数据结构将数据有序存储,并提供强大的查询、修改、删除和安全控制功能,确保数据的一致性、完整性和可访问性。
数据库是“数据的仓库”,但远不止于简单的存储,更强调对数据的高效管理与利用。
常见数据库类型
- 数据模型:基于数学中的“关系理论”,数据以二维表格(关系表)形式存储,表之间通过“键”(如主键、外键)关联。
- 特点:严格的结构化、支持复杂查询(如多表关联)、强一致性。
- 典型产品:MySQL、Oracle、PostgreSQL、SQL Server。
- 适用场景:需要精确数据关联和事务的场景(如银行交易、财务系统、电商订单管理)。
类似于 excel 存储数据的方式
- 数据模型:打破传统表结构,采用更灵活的模型(如键值对、文档、列族、图),适合存储非结构化或半结构化数据(如JSON文档、日志、社交关系)。
- 特点:高扩展性、高吞吐量、弱一致性(支持最终一致性),适合处理海量数据和高并发场景。
- 典型类型与产品:
- 键值(Key-Value):Redis(缓存)、Memcached;
- 文档(Document):MongoDB(存储JSON格式的用户资料);
- 列族(Column-Family):HBase(大数据场景下的日志存储);
- 图(Graph):Neo4j(社交关系网络分析)。
- 适用场景:实时推荐、日志分析、物联网设备数据、高并发的互联网应用(如短视频APP的用户行为记录)。
类似于 word/ppt 存储数据的方式
什么是SQL
SQL是结构化查询语言(Structured Query Language)的简称,是用于存取数据以及查询、更新和管理数据的编程语言;
命名规范
基本规则
见名知意的情况下,尽量遵守如下规则
- 下划线命名法 (snake_case):【推荐】
- 示例:
user_account
,order_details
- 特点:单词间用下划线连接,全小写
- 示例:
- 驼峰命名法 (CamelCase):
- 示例:
userAccount
,orderDetails
- 特点:单词首字母小写,无分隔符
- 示例:
建议规范
表(Table)命名
- 使用复数形式或单数形式(保持一致)
- 示例:
users
或user
- 关联表:
user_role
(多对多关系表)
列(Column)命名
- 使用单数形式
- 主键:
id
或表名_id
(如user_id
); 全表唯一的字段才能是主键; - 外键:
关联表名_id
(如department_id
) - 布尔字段:
is_active
,has_permission
- 日期字段:
created_at
,updated_at
索引(Index)命名
- 前缀:
idx``_
或ix_
- 示例:
idx_user_email
,ix_order_date
视图(View)命名
- 前缀:
v_
或vw_
- 示例:
v_user_summary
,vw_sales_report
存储过程(Stored Procedure)命名
- 前缀:
sp_
或proc_
- 示例:
sp_calculate_totals
,proc_generate_report
函数(Function)命名
- 前缀:
fn_
或func_
- 示例:
fn_calculate_age
,func_format_date
触发器(Trigger)命名
- 前缀:
trg_
或t_
- 示例:
trg_user_audit
,t_order_update
SQL语言
DDL – Data Definition Language(数据定义语言)
语法
-- 创建数据库 |
库操作
-- 创建数据库 |
表操作
创建表
-- 创建部门表 |
修改表
-- 添加新列 |
删除表
-- 删除键 |
索引操作
-- 创建索引 |
DML – Data Manipulation Language(数据操作语言)
-- 插入单行, 可以省略列名 |
DCL – Data Control Language(数据控制语言)
语法
-- 授权 |
SQL核心
DQL(Data Query Language)
语法结构
(9) SELECT |
- FROM:首先执行的是FROM子句,它从指定的表中获取数据,并执行笛卡尔积(交叉连接),生成虚拟表VT1。
- ON:接下来对虚拟表VT1应用ON筛选器,筛选出满足ON条件的行,生成虚拟表VT2。
- JOIN:如果指定了OUTER JOIN,会将未匹配的行添加到虚拟表VT2中,生成虚拟表VT3。
- WHERE:对虚拟表VT3应用WHERE筛选器,筛选出满足条件的行,生成虚拟表VT4。
- GROUP BY:将虚拟表VT4中的行按GROUP BY子句中的列进行分组,生成虚拟表VT5。
- AGG_FUNC:对虚拟表VT5计算聚合函数(如SUM、AVG等)。生成虚拟表 VT6
- WITH CUBE|ROLLUP:对虚拟表 VT5应用ROLLUP或CUBE选项,生成虚拟表 VT6。
- 注意:MySQL只支持 WITH ROLLUP语法; 很少使用,一般忽略
- HAVING:对虚拟表VT6应用HAVING筛选器,筛选出满足条件的行,生成虚拟表VT7。
- SELECT:从虚拟表VT7中选出指定的列,生成虚拟表VT8。
- DISTINCT:去除虚拟表VT8中的重复行,生成虚拟表VT9。
- ORDER BY:将虚拟表VT9中的行按ORDER BY子句中的列进行排序,生成游标VC10。
- LIMIT/OFFSET:从VC10中选择指定数量的行,生成虚拟表VT11,并返回给调用者
- FOR UPDATE:锁定符合条件的行;
- FOR UPDATE 是排他锁(所有情况都有锁)
- LOCK IN SHARE MODE 是共享锁(读读模式相当于无锁,其他情况有锁)
单表查询
-- 基础查询 |
比较运算符
排序、分页
分页
#查询订单表的数据,分页显示,每页显示5条记录 |
子查询
在SQL语句中,一句被括号包住的完整查询语句可以视为一个虚拟的表,这个表的内容是这句SQL的查询
结果,别人可以基于这张虚拟表继续查询,这种查询语句被称为一个子查询
子查询中的语句不需要写英文分号,
子查询内部如果进行了使用AS的字段重命名,则在外层查询的SELECT或者WHERE条件中,需要写重命名后的字段
-- from 后子查询 |
练习
查询出没有被张三购买过的商品,其商品编码、商品名称、商品价格和原产国
思路:
- 明确要查询的表和字段。根据描述,我们要查询商品
- 明确递进的查询条件。根据描述,我们先要去订单明细表中,找到张三购买的所有商品
- 组合查询层次;递进条件为子查询内容,外层查询为最终的目标数据
select * from sku_info |
HAVING
-- 找出订单数超过5个的客户 |
关联查询(JOIN)
CREATE TABLE `t_dept` ( |
select * from t_emp, t_dept |
LEFT JOIN:左连接
select * from t_emp a |
RIGHT JOIN:右连接
SELECT b.*,a.* |
INNER JOIN:内连接
SELECT * FROM t_emp a INNER JOIN t_dept b ON a.deptid = b.id; |
常用函数
略
窗口函数
row_number() |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Hexo!