初级程序员的SQL拾遗(增删改查)
作者:LYX6666
来源:SegmentFault 思否社区
前言
虽然平时开发中经常接触MySQL,但大多数的数据库操作都是通过ORM实现的(SpringDataJPA),自己并没有从底层接触SQL。
再加上笔者非专业的身份,对于原生的SQL语句几乎完全不了解。
本文是写给自己的,关于原生SQL的一篇笔记。
学习应该掌握边界,由于这部分不是编程核心,所以不需要背代码,只需要能理解会粘贴修改即可。
先用图形界面建几张表,再练习用SQL语句操作数据表即可。
这样就避免了前期就用纯命令行难度过高。
一、增删改查(CRUD)
在REST规范中写到:查询使用GET、增加使用POST、修改使用UPDATE、删除使用DELETE。增删改查是最常见的搬砖了,那么它们的SQL代码是什么呢?
指令 字段 目标表 参数 分号
字段告诉SQL要操作哪几个列,比如查出所有学生的姓名和年龄。
目标表告诉SQL要操作哪张表,比如删除班级表某个班级?
查——SELECT
SELECT 字段1,字段2,... FORM 表名 WHERE 条件;
// 从学生表查找ID为1的姓名和年龄
SELECT name, age FORM student where id=1;
此时的指令为SELECT
目标表使用FORM 表名来确定
参数主要是增加筛选的条件,准确查到想要的数据
分页查——LIMIT参数(对于MySQL)
SELECT 字段1,字段2,... FORM 表名 WHERE 条件 LIMIT 条数;
// 从学生表查找10条性别是女的学生的所有字段
SELECT * FORM student where sex=1 LIMIT 10;
LIMIT不属于原生SQL的语法,对于不同的发行版有着不同的实现。
其中MySQL使用的是LIMIT语句,作用是只取出十条。
这种查询方法常用于Web的分页查询。
增加——INSERT
INSERT INTO 表名 (字段1,字段2,...) VALUES (值1,值2,...);
// 向学生表插入姓名为张三、性别为女、年龄20岁的学生
INSERT INTO student (name, sex, age) VALUES (zhangsan, 1, 20);
对于增加操作,指令就变成了INSERT。
增加操作不仅要给出字段还要给出值,所以需要VALUES。
此时作用表的前缀有一些变化,想象一下:
执行查询时,数据从数据库到用户,所以用FORM;
但插入时,数据从用户到数据库,所以是INTO。
而由于插入会直接插到最后一条数据,所以没有WHERE参数。
修改——UPDATE
UPDATE 表名 SET 字段1=值1,字段2=值2,字段3=值3,... WHERE 条件;
// 在学生表中找到id为1的学生,然后更新姓名=张三、年龄=20、性别=男
UPDATE student SET name=zhangsan,age=20,sex=0,... WHERE id=1;
此时的指令为UPDATE。
由于需要修改字段,需要使用SET
修改只针对一条或几条数据,必须使用WHERE条件进行限制,否则会修改整张表的数据!
删除——DELETE
DETELE FORM 表名 WHERE 条件;
删除的指令为DELETE
由于数据从表中被拿出来,所以是FROM
删除只针对一条或几条数据,必须使用WHERE条件进行限制,否则会删除整张表的数据!
二、WHERE参数
WHERE在SQL定义了查询条件,但有以下几个注意的地方:
WHERE搭配的操作符
= 字段等于值 > 字段大于值 < 字段小于值 >= 字段大于等于值 <= 字段小于等于值
LIKE 模糊查询(字段包含值) IN 属于(字段的值属于给定的集合) BETWEEN 区间(字段的值属于给定的区间)
例如,使用LIKE '%zhang%'作为条件,'zhangsan'包括了'zhang',就会被查出来。
模糊查询又分为三种:
前缀匹配 开头必须相同:zhangsan% 中缀匹配 中间相同即可:%zhangsan% 后缀匹配 结尾必须相同:%zhangsan
WHERE的逻辑运算
或运算使用OR,表示任一个条件满足则有效。
SELECT 字段 FROM 表名 WHERE 条件1 AND/OR 条件2;
// 在学生表取出年龄大于18岁的女生的所有字段
SELECT * FROM student WHERE sex=1 AND age > 18;
三、多表查询(连接/JOIN)
软件开发中常见的实体关系包括:
一对一(0…1 : 0…1) 一对多/多对一(0…1 : 0…n) 多对多(0…n : 0…n)
他们的交集就是两张表中有外键关联的那部分记录。
SELECT student.id, student.name, klass.name, klass.count
FROM Students
INNER JOIN Klass
ON Klass.id=Student.klass_id;
我们把使用FORM字段的表定义为左表 把使用JOIN字段的表定义为右表
INNER JOIN 一般连接:只查外键关联的数据,也就是取交集 LEFT JOIN 左连接:左表全查,右表随缘,空数据置NULL,也就是取集合A RIGHT JOIN 右连接:右表全查,左表随缘,空数据置NULL,也就是取集合B FULL JOIN 全连接:左右表都全查,两侧空数据都置NULL,也就是取并集。
四、总结
参考资料
评论