SQL 核心对象学习

本文讲解 SQL 基础语句、索引、视图、触发器核心用法,基于 MySQL 环境,极简实操。

一、基础 SQL 语句

1. 库表操作

sql 复制代码
-- 创建数据库
CREATE DATABASE test_db;
-- 使用数据库
USE test_db;
-- 创建用户表
CREATE TABLE user (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(20) NOT NULL,
    age INT,
    create_time DATETIME DEFAULT NOW()
);
-- 查看表结构
DESC user;
-- 删除表
DROP TABLE user;
-- 删除数据库
DROP DATABASE test_db;

2. 增删改查(CRUD)

sql 复制代码
-- 插入单条数据
INSERT INTO user(username, age) VALUES('zhangsan', 22);
-- 插入多条数据
INSERT INTO user(username, age) VALUES('lisi', 25),('wangwu', 23);

-- 查询全表
SELECT * FROM user;
-- 条件查询
SELECT username,age FROM user WHERE age>22;
-- 排序+分页
SELECT * FROM user ORDER BY age DESC LIMIT 2;
-- 聚合查询
SELECT COUNT(*) AS total,AVG(age) AS avg_age FROM user;

-- 修改数据
UPDATE user SET age=26 WHERE username='lisi';
-- 删除数据
DELETE FROM user WHERE id=1;

3. 高级查询

sql 复制代码
-- 去重
SELECT DISTINCT age FROM user;
-- 模糊查询
SELECT * FROM user WHERE username LIKE 'z%';
-- 分组筛选
SELECT age,COUNT(*) FROM user GROUP BY age HAVING COUNT(*)>1;
-- 内连接
CREATE TABLE order_tb(
    oid INT PRIMARY KEY AUTO_INCREMENT,
    uid INT,
    money DECIMAL(10,2),
    FOREIGN KEY(uid) REFERENCES user(id)
);
SELECT u.username,o.money FROM user u INNER JOIN order_tb o ON u.id=o.uid;
-- 左连接
SELECT u.username,o.money FROM user u LEFT JOIN order_tb o ON u.id=o.uid;

二、索引

1. 索引类型与创建

sql 复制代码
-- 普通索引
CREATE INDEX idx_username ON user(username);
-- 唯一索引
CREATE UNIQUE INDEX idx_age ON user(age);
-- 主键索引(建表时自动创建)
-- 复合索引
CREATE INDEX idx_name_age ON user(username,age);
-- 全文索引
CREATE FULLTEXT INDEX idx_ft_username ON user(username);

2. 索引管理

sql 复制代码
-- 查看表索引
SHOW INDEX FROM user;
-- 删除索引
DROP INDEX idx_username ON user;
-- 执行计划(查看是否使用索引)
EXPLAIN SELECT * FROM user WHERE username='zhangsan';

3. 索引使用规则

sql 复制代码
-- 生效:索引列直接查询
SELECT * FROM user WHERE username='zhangsan';
-- 失效:索引列运算/函数/模糊查询前置%
SELECT * FROM user WHERE age+1=23;
SELECT * FROM user WHERE username LIKE '%zhang';
SELECT * FROM user WHERE SUBSTRING(username,1,1)='z';

三、视图

1. 视图创建与查询

sql 复制代码
-- 创建单表视图
CREATE VIEW v_user AS SELECT id,username,age FROM user WHERE age>20;
-- 查询视图
SELECT * FROM v_user;
-- 创建多表联合视图
CREATE VIEW v_user_order AS
SELECT u.id,u.username,o.money FROM user u
LEFT JOIN order_tb o ON u.id=o.uid;

2. 视图管理

sql 复制代码
-- 修改视图
CREATE OR REPLACE VIEW v_user AS SELECT id,username FROM user;
-- 删除视图
DROP VIEW v_user;
-- 查看视图定义
SHOW CREATE VIEW v_user;

3. 视图更新

sql 复制代码
-- 简单视图可更新
UPDATE v_user SET username='zhangsan_new' WHERE id=1;
-- 复杂视图(聚合/分组/连接)不可更新

四、触发器

1. 插入触发器

sql 复制代码
-- 创建日志表
CREATE TABLE user_log(
    lid INT PRIMARY KEY AUTO_INCREMENT,
    info VARCHAR(50),
    create_time DATETIME DEFAULT NOW()
);
-- 插入后触发
DELIMITER //
CREATE TRIGGER tri_user_after_insert
AFTER INSERT ON user FOR EACH ROW
BEGIN
    INSERT INTO user_log(info) VALUES(CONCAT('新增用户:',NEW.username));
END //
DELIMITER ;
-- 测试
INSERT INTO user(username,age) VALUES('zhaoliu',24);
SELECT * FROM user_log;

2. 更新 / 删除触发器

sql 复制代码
-- 更新后触发
DELIMITER //
CREATE TRIGGER tri_user_after_update
AFTER UPDATE ON user FOR EACH ROW
BEGIN
    INSERT INTO user_log(info)
    VALUES(CONCAT('修改用户:旧名',OLD.username,'->新名',NEW.username));
END //
-- 删除前触发
CREATE TRIGGER tri_user_before_delete
BEFORE DELETE ON user FOR EACH ROW
BEGIN
    INSERT INTO user_log(info) VALUES(CONCAT('删除用户:',OLD.username));
END //
DELIMITER ;
-- 测试
UPDATE user SET username='zhaoliu_new' WHERE id=4;
DELETE FROM user WHERE id=4;

3. 触发器管理

sql 复制代码
-- 查看触发器
SHOW TRIGGERS;
-- 删除触发器
DROP TRIGGER IF EXISTS tri_user_after_insert;

总结

  1. SQL 基础:库表操作 + 增删改查 + 连接查询,核心数据操作基础
  2. 索引:提升查询速度,避免索引失效,按需创建
  3. 视图:简化复杂查询,保障数据安全,简单视图可更新
  4. 触发器:自动触发业务逻辑,基于表增删改事件联动操作

https://github.com/0voice

相关推荐
麦聪聊数据2 小时前
企业数据流通与敏捷API交付实战(五):异构数据跨库联邦与零代码发布
数据库·sql·低代码·restful
Elastic 中国社区官方博客2 小时前
当 TSDS 遇到 ILM:设计不会拒绝延迟数据的时间序列数据流
大数据·运维·数据库·elasticsearch·搜索引擎·logstash
嵌入式小企鹅2 小时前
蓝牙学习系列(七):BLE GATT 数据模型详解
学习·蓝牙·ble·蓝牙协议栈·蓝牙开发·gatt
Omics Pro2 小时前
虚拟细胞:开启HIV/AIDS治疗新纪元的关键?
大数据·数据库·人工智能·深度学习·算法·机器学习·计算机视觉
J2虾虾2 小时前
MySQL的基本操作
数据库·mysql
arvin_xiaoting2 小时前
OpenClaw学习总结_III_自动化系统_3:CronJobs详解
数据库·学习·自动化
杨云龙UP2 小时前
Oracle 中 NOMOUNT、MOUNT、OPEN 怎么理解? 在不同场景下如何操作?_20260402
linux·运维·数据库·oracle
少许极端3 小时前
算法奇妙屋(四十一)-贪心算法学习之路 8
学习·算法·贪心算法
jzwugang3 小时前
postgresql链接详解
数据库·postgresql
2601_949815333 小时前
MySQL输入密码后闪退?
数据库·mysql·adb