大家好,这里是 Lucifer三思而后行,专注于提升数据库运维效率。
前言
SQL是什么?
官方解释: SQL (Structured Query Language:结构化查询语言) 是用于管理关系数据库管理系统(RDBMS)。
SQL能用来干什么?
通俗的讲: 让您可以访问和处理数据库,包括数据插入、查询、更新和删除。

下面让我们看看小美是如何零基础学习SQL的:
👸小美:Lucifer,最新领导让我负责数据库开发,需要写SQL,但是我零基础没学过,有办法快速入门吗?
🙉Lucifer:小美啊,SQL语言其实入门不难,我先来教你最简单的增删改查基础吧。
👸小美:好的,我试试看,奥力给。
🙉Lucifer:Ok,那我们先来一个最简单常用的SQL语句DUAL查询: SELECT SYSDATE FROM DUAL;。

使用这个SQL语句可以查看数据库当前时间,当然也可以把 SYSDATE 换成任意东西。
例如:
计算器:SELECT 365 * 24 FROM dual;

这个SQL我们在开发中会经常用到,作为入门第一个SQL轻松有趣。小美,你觉得难吗?
👸小美:这个太实用了,以后计算器和日历都可以省了,哈哈哈。
🙉Lucifer:是的,其实我们刚刚已经不经意的学习了SQL语言增删改查中的 查 操作了。接下来,我要介绍一个新的对象:表 :是相关的数据项的集合,它由列和行组成。通俗的讲,数据库相当于图书馆,表就类似于其中的一个个书架,表数据就类似于一本本书。我们查询数据库表的数据,就好比我们进入图书馆去找一本喜欢的书。我这么说,你能理解吗?
查 的基本语法:select * from 表名;
👸小美:可以可以,这个比喻我一下子就听懂了,原来数据库查询是这样的,那表是怎么创建的呢?
🙉Lucifer:不要着急,先来介绍一下数据库中最常用的3个数据类型:NUMBER,VARCHAR2,DATE,分别为数字型,字符型,日期型。顾名思义,即用来定义表中列字段用来存放数据的类型。

👸小美:嗯嗯,这个能理解,跟java,C 好像有些相似。
🙉Lucifer:嗯嗯。理解了这个,就可以开始建表了,现在来创建一个简单的图书馆书架表。
1CREATE TABLE bookshelf
2(
3BOOK_ID NUMBER,
4BOOK_NAME VARCHAR2(100),
5BOOK_TYPE VARCHAR2(100),
6AUTHOR VARCHAR2(100),
7INTIME DATE
8);
表名为:bookshelf,有列:图书id,图书名称,图书类型,作者,入库时间。通过上面学习的 SELECT语法,来查询一下这张表:
SELECT * FROM bookshelf;

可以发现,新建的bookshelf表没有任何记录。现在,图书馆里已经增加一个空的书架,是不是需要将书放入书架上呢?这时就需要用到 增 操作了。
👸小美:嗯嗯,很形象,感觉自己就像个图书管理员一样,哈哈哈。
🙉Lucifer:哈哈,没错,我们数据库管理员跟图书管理员可以说是异曲同工。好了,继续说放书吧,现在假设有一本书《飘》,作者:玛格丽特·米切尔,类型:长篇小说。现在通过 INSERT 将这本书放入书架上:

1INSERT INTO bookshelf
2(book_id,
3book_name,
4book_type,
5author,
6intime)
7VALUES
8(1,
9'飘',
10'长篇小说',
11'玛格丽特·米切尔',
12SYSDATE);
13COMMIT;
增 的基本语法:insert into 表名 (需要插入的列名,用逗号隔开) values (对应列名的值);

通过sql查询发现,这本书《飘》已经放入了书架上,可供大家借用和查看。
👸小美:太形象了,那如果我把书的作者写错了,那怎么办呢?再插入一条吗?
🙉Lucifer:这个问题问的很好,因为人为的操作总会存在误差,因此提出了 改 和 删 两种操作。
改 的基本语法: UPDATE 表名 SET 列名 = 新的值;
删 的基本语法: DELETE FROM 表名;
现在来模拟一下场景:
1、修改作者名:
1UPDATE bookshelf SET author='Margaret Mitchell';
2COMMIT;

2、下架图书:
1DELETE FROM bookshelf;
2COMMIT;

通过以上两个场景,演示了 改 和 删 两种操作。
👸小美:lucifer,你讲的很明了,我现在已经懂了增删改查四种操作了,迫不及待想要动手开始操作了!
🙉Lucifer:小美,先别急,你没有发现一个严重的问题吗?如果书架上不止一本书呢?那你怎么对指定的那本书进行操作呢?有思考过吗?
👸小美:啊!对哦,上面都是演示的一本书,如果有多本书,是不是也有对应的操作可以来筛选呢?
🙉Lucifer:没错,很聪明。现在隆重有请 WHERE 查询条件登场。正如上面所说,WHERE 子句用于提取那些满足指定条件的记录。

先上架3本书:
1INSERT INTO bookshelf (book_id,book_name,book_type,author,intime) VALUES (1,'飘','长篇小说','玛格丽特·米切尔',SYSDATE);
2INSERT INTO bookshelf (book_id,book_name,book_type,author,intime) VALUES (2,'倾城之恋','爱情小说','张爱玲',SYSDATE);
3INSERT INTO bookshelf (book_id,book_name,book_type,author,intime) VALUES (3,'从你的全世界路过','短篇小说','张嘉佳',SYSDATE);
4COMMIT;

查看《倾城之恋》:
1SELECT * FROM bookshelf WHERE BOOK_NAME = '倾城之恋';

更新《飘》:
1UPDATE bookshelf SET author='Margaret Mitchell' WHERE book_name = '飘';
2COMMIT;

删除《从你的全世界路过》:
1DELETE FROM bookshelf WHERE book_name = '从你的全世界路过';
2COMMIT;

通过上面的几个栗子🌰,应该能很好的理解 WHERE 查询条件的使用了。
👸小美:懂了懂了,lucifer,我现在是不是可以去开发了?好像练练手啊!!!
🙉Lucifer:嗯。现在只能说是入门了,会简单的增删改查是数据库开发的第一部,所有的数据库操作都是基于SQL语言的。
👸小美:好的好的。有问题了,我在继续问你,谢谢lucifer!!!Thanks♪(・ω・)ノ。

文末,赠送给各位看官几个一句SQL画图的趣味小SQL:
五角星:
1WITH a AS
2 (SELECT DISTINCT round(SUM(x) over(ORDER BY n)) x,
3 round(SUM(y) over(ORDER BY n)) y
4 FROM (SELECT n,
5 cos(trunc(n / 20) * (1 - 1 / 5) * 3.1415926) * 2 x,
6 sin(trunc(n / 20) * (1 - 1 / 5) * 3.1415926) y
7 FROM (SELECT rownum - 1 n
8 FROM all_objects
9 WHERE rownum <= 20 * 5)))
10SELECT REPLACE(sys_connect_by_path(point,
11 '/'),
12 '/',
13 NULL) star
14 FROM (SELECT b.y,
15 b.x,
16 decode(a.x,
17 NULL,
18 ' ',
19 '*') point
20 FROM a,
21 (SELECT *
22 FROM (SELECT rownum - 1 + (SELECT MIN(x)
23 FROM a) x
24 FROM all_objects
25 WHERE rownum <= (SELECT MAX(x) - MIN(x) + 1
26 FROM a)),
27 (SELECT rownum - 1 + (SELECT MIN(y)
28 FROM a) y
29 FROM all_objects
30 WHERE rownum <= (SELECT MAX(y) - MIN(y) + 1
31 FROM a))) b
32 WHERE a.x(+) = b.x
33 AND a.y(+) = b.y)
34 WHERE x = (SELECT MAX(x)
35 FROM a)
36 START WITH x = (SELECT MIN(x)
37 FROM a)
38CONNECT BY y = PRIOR y
39 AND x = PRIOR x + 1;

调整期中数字5, 你还可以输出7角星, 9角星。
奥运五环:
1WITH a AS
2 (SELECT DISTINCT round(a.x + b.x) x,
3 round(a.y + b.y) y
4 FROM (SELECT (SUM(x) over(ORDER BY n)) x,
5 round(SUM(y) over(ORDER BY n)) y
6 FROM (SELECT n,
7 cos(n / 30 * 3.1415926) * 2 x,
8 sin(n / 30 * 3.1415926) y
9 FROM (SELECT rownum - 1 n
10 FROM all_objects
11 WHERE rownum <= 30 + 30))) a,
12 (SELECT n,
13 (SUM(x) over(ORDER BY n)) x,
14 round(SUM(y) over(ORDER BY n)) y
15 FROM (SELECT n,
16 cos(m / 3 * 3.1415926) * 2 * 15 x,
17 sin(m / 3 * 3.1415926) * 15 y
18 FROM (SELECT CASE
19 WHEN rownum <= 2 THEN
20 3
21 WHEN rownum = 3 THEN
22 -2
23 ELSE
24 -6
25 END m,
26 rownum - 1 n
27 FROM all_objects
28 WHERE rownum <= 5))) b)
29SELECT REPLACE(sys_connect_by_path(point,
30 '/'),
31 '/',
32 NULL) star
33 FROM (SELECT b.y,
34 b.x,
35 decode(a.x,
36 NULL,
37 ' ',
38 '*') point
39 FROM a,
40 (SELECT *
41 FROM (SELECT rownum - 1 + (SELECT MIN(x)
42 FROM a) x
43 FROM all_objects
44 WHERE rownum <= (SELECT MAX(x) - MIN(x) + 1
45 FROM a)),
46 (SELECT rownum - 1 + (SELECT MIN(y)
47 FROM a) y
48 FROM all_objects
49 WHERE rownum <= (SELECT MAX(y) - MIN(y) + 1
50 FROM a))) b
51 WHERE a.x(+) = b.x
52 AND a.y(+) = b.y)
53 WHERE x = (SELECT MAX(x)
54 FROM a)
55 START WITH x = (SELECT MIN(x)
56 FROM a)
57CONNECT BY y = PRIOR y
58 AND x = PRIOR x + 1;

打印当月日历:
1SELECT MAX(decode(dow,
2 1,
3 d,
4 NULL)) sun,
5
6 MAX(decode(dow,
7 2,
8 d,
9 NULL)) mon,
10
11 MAX(decode(dow,
12 3,
13 d,
14 NULL)) tue,
15
16 MAX(decode(dow,
17 4,
18 d,
19 NULL)) wed,
20
21 MAX(decode(dow,
22 5,
23 d,
24 NULL)) thu,
25
26 MAX(decode(dow,
27 6,
28 d,
29 NULL)) fri,
30
31 MAX(decode(dow,
32 7,
33 d,
34 NULL)) sat
35
36 FROM (SELECT rownum d,
37
38 rownum - 2 + to_number(to_char(trunc(SYSDATE,
39 'MM'),
40 'D')) p,
41
42 to_char(trunc(SYSDATE,
43 'MM') - 1 + rownum,
44 'D') dow
45
46 FROM all_objects
47
48 WHERE rownum <=
49
50 to_number(to_char(last_day(to_date(SYSDATE)),
51 'DD')))
52
53 GROUP BY trunc(p / 7)
54
55 ORDER BY sun NULLS FIRST;

往期精彩文章
本章目标:掌握本章核心知识点
前置要求:完成前序章节学习
预计时长:60 分钟
感谢您的阅读,这里是 Lucifer三思而后行,欢迎点赞+关注,我会持续分享数据库知识、运维技巧。