乐趣区

关于sql:初级程序员的SQL拾遗增删改查

前言

尽管平时开发中常常接触 MySQL,但大多数的数据库操作都是通过 ORM 实现的(SpringDataJPA),本人并没有从底层接触 SQL。
再加上笔者非专业的身份,对于原生的 SQL 语句简直齐全不理解。
本文是写给本人的,对于原生 SQL 的一篇笔记。

小 Tip:

初学者如何调试 SQL 代码呢?能够用 Navicat 或 PHPMyAdmin 可视化练习。
先用图形界面建几张表,再练习用 SQL 语句操作数据表即可。
这样就防止了后期就用纯命令行难度过高。

一、增删改查(CRUD)

在 REST 标准中写到:查问应用 GET、减少应用 POST、批改应用 UPDATE、删除应用 DELETE。增删改查是最常见的搬砖了,那么它们的 SQL 代码是什么呢?

咱们先以单表为例(也就是无外键状况)。

单表操作的命令具备很强的法则。包含以下因素:

  • 指令
  • 字段
  • 指标表
  • 参数
  • 分号

指令通知 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 的逻辑运算

在编程语言中肯定会用到逻辑用语(与、或、非),而 SQL 中也有与、或。

逻辑运算符连贯两个条件。
与运算应用 AND,示意两个条件都满足才无效。
或运算应用 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)

其中,一对一、一对多、多对一应用外键关联,而多对多应用两头表关联。

对于外键关联的三种状况,在查问时,往往须要通过 table1 把与之关联的 table2 一并查出来。

这时候能够应用 JOIN,把两张表拼成一张表。

关联表就像两个汇合,别离是表一和表二,
他们的交加就是两张表中有外键关联的那局部记录。

班级有多个学生,每个学生属于一个班级。所以学生和班级是多对一。
如果想在查问学生的时候,一并显示他们所在班级的信息:

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,也就是取并集。

四、总结

借助编程语言弱小的 ORM(实体关系映射),增删改查的操作简直不再须要手写 SQL 来实现,但咱们不能对 ORM 造成依赖而遗记了原生 SQL 怎么写。

这也是一门必修课,至多能看懂增删改查的根本写法,能力在一些非凡需要中晓得如何变通,也能在 JPA 出问题时通过查看生成的 SQL 语句来顺利的 Debug。

文章中提到的内容根本笼罩日常增删改查的须要,而对于如何定义主键、外键,如何建表、删表,如何增加、编辑字段,这些非高频操作,当前再说。

参考资料:

菜鸟教程:https://www.runoob.com/sql/sq…

退出移动版