你手机里那个记了三百条备忘的据库基础App,背后大概率跑着一个SQL数据库。知识每次点开微信聊天记录,据库基础服务器上就有一条
SELECT * FROM messages WHERE chat_id = ?知识在执行。SQL不是据库基础某种高深技术,它就是知识你跟数据说话的方式。数据库说白了就是据库基础一堆表。每张表像Excel,知识有行有列。据库基础列定义了存什么——姓名、知识年龄、据库基础下单时间。知识行就是据库基础一条条具体记录。建一张表用
CREATE TABLE users (id INT PRIMARY KEY,知识 name VARCHAR(50), age INT);,这行代码的据库基础意思是:我要一张叫users的表,三个字段,id是主键。主键这个设定挺关键,它保证每行数据有个唯一身份证,不会出现两条一模一样的记录。增删改查,四个动作撑起了SQL的日常。查用得最多,
SELECT name, age FROM users WHERE age > 25 ORDER BY age DESC;——从users表里捞出年龄大于25的人,按年龄从大到小排。WHERE后面跟条件,ORDER BY管排序,LIMIT 10就只看前十条。这些子句拼在一起,就是一条完整的查询语句。刚开始写容易忘分号,数据库客户端会一直等你输入,挺烦的。JOIN是SQL里最容易让人卡住的地方。假设你有一张订单表,一张用户表,订单表里存了user_id,但你想看每笔订单对应的用户名。这时候就得把两张表连起来:
SELECT orders.id, users.name FROM orders JOIN users ON orders.user_id = users.id;。JOIN的本质是按某个共同字段把两张表的数据拼到一起。INNER JOIN只保留两边都匹配的行,LEFT JOIN则保留左表所有行,右表没匹配上的地方填NULL。很多人第一次写LEFT JOIN搞不清到底保留哪边,我的经验是:把左表想成“主角”,LEFT JOIN就是主角的戏份一个不能少。索引这个东西,不撞南墙不会重视。我见过一张五百万行的用户表,查一个手机号花了六秒。加了个索引之后,同样的查询变成0.02秒。索引就像书的目录,没有它数据库就得一页页翻。但索引不是越多越好,每加一个索引,写入数据时就要多维护一份目录,INSERT和UPDATE会变慢。通常只在WHERE、JOIN ON、ORDER BY这些经常用到的列上建索引。
事务是一组要么全做、要么全不做的操作。转账是最经典的例子:A扣100块,B加100块,这两步必须绑在一起。如果扣完钱系统崩了,加钱没执行,账就平不了。
BEGIN; UPDATE accounts SET balance = balance - 100 WHERE id = 1; UPDATE accounts SET balance = balance + 100 WHERE id = 2; COMMIT;——COMMIT之前,其他连接看不到这些改动。一旦某步出错,ROLLBACK就能把之前的操作全部撤销。ACID这四个字母说的就是这件事:原子性、一致性、隔离性、持久性。写SQL有个坑:NULL不等于任何值,包括它自己。
WHERE age = NULL永远查不出东西,得用WHERE age IS NULL。这个反直觉的设计坑过不少人。另一个坑是字符串比较,MySQL默认不区分大小写,PostgreSQL区分,换数据库的时候容易翻车。学SQL不用背语法,记住大概结构,剩下的交给文档和试错。真正要练的是把业务问题翻译成表连接和条件过滤的能力。比如“找出过去七天每个城市下单最多的用户”,这句话拆开就是:时间过滤、按城市和用户分组、统计订单数、取每组最大值。写多了,这种翻译会变成条件反射。
顶: 59781踩: 14






评论专区