SQL语法速成

SQL语法速成 SQL 语法结构 子句 - 是语句和查询的组成成分。(在某些情况下,这些都是可选的。) 表达式 - 可以产生任何标量值,或由列和行的数据库表 谓词 - 给需要评估的 SQL 三值逻辑(3VL)(true/false/unknown)或布尔真值指定条件,并限制语句和查询的效果,或改变程序流程。 查询 - 基于特定条件检索数据。这是 SQL 的一个重要组成部分。 语句 - 可以持久地影响纲要和数据,也可以控制数据库事务、程序流程、连接、会话或诊断。 SQL 语法要点 SQL 语句不区分大小写,但是数据库表名、列名和值是否区分,依赖于具体的 DBMS 以及配置。 例如:SELECT 与 select 、Select 是相同的。 多条 SQL 语句必须以分号 ; 分隔。 处理 SQL 语句时,所有空格都被忽略。SQL 语句可以写成一行,也可以分写为多行。 SQL 支持三种注释 ## 注释1 -- 注释2 /* 注释3 */ 增删改查,又称为 CRUD,数据库基本操作中的基本操作。 插入数据 INSERT INTO 语句用于向表中插入新记录。 插入完整的行 INSERT INTO user VALUES (10, 'root', 'root', '[email protected]'); 插入行的一部分 INSERT INTO user(username, password, email)VALUES ('admin', 'admin', 'xxxx@163....

2023年09月01日 · 2 min · Leanku

MySQL EXPLAIN 妙用:执行计划分析与优化技巧

MySQL EXPLAIN 妙用:执行计划分析与优化技巧 在 MySQL 开发中,遇到 SQL 执行缓慢时,最常用的分析工具之一就是 EXPLAIN。 它可以帮助我们回答几个关键问题: MySQL 使用了哪个索引? SQL 是全表扫描还是索引扫描? 预计扫描多少行? 多表 JOIN 的执行顺序是什么? 是否发生了额外排序或临时表? 优化器的估算是否准确? MySQL 8.x 还提供了 EXPLAIN ANALYZE,可以进一步查看实际执行情况。 官方文档:MySQL EXPLAIN 官方文档 一、EXPLAIN 基本用法 最简单的使用方式: EXPLAIN SELECT * FROM users WHERE id = 10001; 也可以分析复杂 SQL: EXPLAIN SELECT o.id, o.amount, u.name FROM orders o JOIN users u ON u.id = o.user_id WHERE o.status = 1 ORDER BY o.created_at DESC LIMIT 20; 常见输出: +----+-------------+-------+------+---------------+---------+---------+-------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+---------------+---------+---------+-------+------+-------------+ | 1 | SIMPLE | users | const| PRIMARY | PRIMARY | 8 | const | 1 | | +----+-------------+-------+------+---------------+---------+---------+-------+------+-------------+ 实际分析时,不需要一开始记住所有字段,重点关注以下列:...

2023年09月01日 · 4 min · Leanku

MySQL JOIN 原理与优化

MySQL JOIN 原理与优化 JOIN 是关系型数据库中最常见的操作之一。用户、订单、商品、文章、评论等业务数据通常分散在不同表中,查询时再通过关联关系组合起来。 例如: SELECT o.id, o.order_no, u.username FROM orders o JOIN users u ON u.id = o.user_id WHERE o.status = 1; 这条 SQL 看起来很简单,但 MySQL 实际需要解决几个问题: 使用哪张表作为驱动表? ↓ 如何找到另一张表对应的数据? ↓ 是否能够使用索引? ↓ 需要扫描多少行? ↓ 最终执行成本是多少? 因此,JOIN 优化并不是简单地“少 JOIN 几张表”,真正重要的是理解 JOIN 的执行方式、数据访问路径以及索引设计。 1. JOIN 的基本原理 假设有两张表: users +----+----------+ | id | username | +----+----------+ | 1 | Alice | | 2 | Bob | | 3 | Tom | +----+----------+ orders +----+---------+---------+ | id | user_id | amount | +----+---------+---------+ | 1 | 1 | 100....

2023年08月04日 · 6 min · Leanku

MySQL Schema 设计与管理

MySQL Schema 设计与管理 数据库 Schema 是应用系统数据模型的基础。一个设计合理的 Schema,可以让业务开发更加简单,也能降低查询性能问题、数据不一致以及后期数据库迁移的成本。 Schema 设计并不只是“建几张表、加几个字段”,而是需要综合考虑 业务模型、数据类型、约束、索引、数据增长、查询方式以及后续变更。 本文从实际项目出发,介绍 MySQL Schema 的设计方法、管理方法,并通过一个简单的业务案例说明如何从业务模型逐步设计数据库。 1. 什么是 MySQL Schema 在 MySQL 中,Schema 通常可以理解为数据库本身,例如: CREATE DATABASE user CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; 然后在 Schema 中创建表: user ├── users ├── roles ├── permissions ├── user_roles └── audit_logs 在实际项目中,我们通常会同时讨论两个层面的设计: Schema 级设计:字符集、排序规则、数据库命名等 Table 级设计:表结构、字段、约束、索引、关联关系等 因此,Schema 设计本质上是在设计整个数据模型。 一个好的数据库设计通常需要解决几个问题: 业务数据如何存储? ↓ 表与表之间是什么关系? ↓ 字段应该使用什么类型? ↓ 哪些数据必须保证唯一? ↓ 哪些查询需要索引? ↓ 数据量增长后怎么办? ↓ 数据库结构如何持续演进? 2. Schema 设计的基本方法 数据库设计不要从“我要建哪些表”开始,而应该从业务模型开始。 例如一个简单的项目管理系统:...

2023年08月03日 · 5 min · Leanku

MySQL InnoDB 锁机制详解

MySQL InnoDB 锁机制详解 在并发业务中,多个事务可能同时修改或者读取相同的数据。如果没有并发控制,就可能出现脏写、数据覆盖、幻读等问题。 InnoDB 通过锁机制和 MVCC 等机制共同实现事务的并发控制。 例如两个事务同时修改同一条订单: UPDATE orders SET status = 2 WHERE id = 100; 如果事务 A 尚未提交,事务 B 同时执行相同的 UPDATE,那么事务 B 通常不能立即完成,而是需要等待事务 A 释放相关锁。 因此,理解 InnoDB 锁机制,对于分析以下问题非常重要: 为什么 UPDATE 会等待? 为什么 SELECT 有时候也会加锁? 为什么一个 UPDATE 影响了一行,却可能产生多个锁? 为什么会出现 Gap Lock? 为什么会发生死锁? 1. InnoDB 为什么需要锁 假设账户余额为: balance = 1000 事务 A: UPDATE accounts SET balance = balance - 100 WHERE id = 1; 同时事务 B: UPDATE accounts SET balance = balance - 200 WHERE id = 1; 如果两个事务完全不进行并发控制,就可能发生:...

2023年07月21日 · 4 min · Leanku

MySQL 运维常用脚本

MySQL 运维常用脚本 1.导出整个数据库 #mysqldump -u 用户名 -p –default-character-set=latin1 数据库名 > 导出的文件名(数据库默认编码是latin1) mysql dump -u wcnc -p smgp_apps_wcnc > wcnc.sql 2.导出一个表 #mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名 mysql dump -u wcnc -p smgp_apps_wcnc users> wcnc_users.sql 3.导出一个数据库结构 mysql dump -u wcnc -p -d –add-drop-table smgp_apps_wcnc >d:wcnc_db.sql #-d 没有数据 –add-drop-table 在每个create语句之前增加一个drop table 4.导入数据库 #A:常用source 命令 #进入mysql数据库控制台, 如 mysql -u root -p mysql>use databasename #然后使用source命令,后面参数为脚本文件(如这里用到的.sql) mysql>source wcnc_db.sql #B:使用mysqldump命令 mysqldump -u username -p dbname < filename....

2023年02月03日 · 3 min · Leanku