前言
尽管平时开发中常常接触 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…