本文转载自微信公众号「杰哥的IT之旅」,作者三笠 。转载本文请联系菜杰哥的IT之旅公众号。
前言
SQL是什么?
官方解释: SQL (Structured Query Language:结构化查询语言) 是用于管理关系数据库管理系统(RDBMS)。
SQL能用来干什么?
通俗的讲: 让您可以访问和处理数据库,包括数据插入、查询、更新和删除。
SQL
下面让我们看看小美是如何零基础学习SQL的:
女:Lucifer,最新领导让我负责数据库开发,需要写SQL,但是我零基础没学过,有办法快速入门吗?
男:小美啊,SQL语言其实入门不难,我先来教你最简单的增删改查基础吧。
女:好的,我试试看,奥力给。
男:Ok,那我们先来一个最简单常用的SQL语句DUAL查询:SELECT SYSDATE FROM DUAL;
sysdate
使用这个SQL语句可以查看数据库当前时间,当然也可以把 SYSDATE 换成任意东西。
例如:
计算器:SELECT 365 * 24 FROM dual;
计算器
这个SQL我们在开发中会经常用到,作为入门第一个SQL轻松有趣。小美,你觉得难吗?
女:这个太实用了,以后计算器和日历都可以省了,哈哈哈。
男:是的,其实我们刚刚已经不经意的学习了SQL语言增删改查中的 查 操作了。接下来,我要介绍一个新的对象:表 :是相关的数据项的集合,它由列和行组成。通俗的讲,数据库相当于图书馆,表就类似于其中的一个个书架,表数据就类似于一本本书。我们查询数据库表的数据,就好比我们进入图书馆去找一本喜欢的书。我这么说,你能理解吗?
查 的基本语法:select * from 表名;
女:可以可以,这个比喻我一下子就听懂了,原来数据库查询是这样的,那表是怎么创建的呢?
男:不要着急,先来介绍一下数据库中最常用的3个数据类型:NUMBER,VARCHAR2,DATE,分别为数字型,字符型,日期型。顾名思义,即用来定义表中列字段用来存放数据的类型。
数据类型
女:嗯嗯,这个能理解,跟java,C 好像有些相似。
男:嗯嗯。理解了这个,就可以开始建表了,现在来创建一个简单的图书馆书架表。
- CREATE TABLE bookshelf
- (
- BOOK_ID NUMBER,
- BOOK_NAME VARCHAR2(100),
- BOOK_TYPE VARCHAR2(100),
- AUTHOR VARCHAR2(100),
- INTIME DATE
- );
表名为:bookshelf,有列:图书id,图书名称,图书类型,作者,入库时间。通过上面学习的 SELECT语法,来查询一下这张表:
SELECT * FROM bookshelf;
查询图书表
可以发现,新建的bookshelf表没有任何记录。现在,图书馆里已经增加一个空的书架,是不是需要将书放入书架上呢?这时就需要用到 增 操作了。
女:嗯嗯,很形象,感觉自己就像个图书管理员一样,哈哈哈。
男:哈哈,没错,我们数据库管理员跟图书管理员可以说是异曲同工。好了,继续说放书吧,现在假设有一本书《飘》,作者:玛格丽特·米切尔,类型:长篇小说。现在通过 INSERT 将这本书放入书架上:
- INSERT INTO bookshelf
- (book_id,
- book_name,
- book_type,
- author,
- intime)
- VALUES
- (1,
- '飘',
- '长篇小说',
- '玛格丽特·米切尔',
- SYSDATE);
- COMMIT;
增 的基本语法:insert into 表名 (需要插入的列名,用逗号隔开) values (对应列名的值);
插入数据
通过sql查询发现,这本书《飘》已经放入了书架上,可供大家借用和查看。
女:太形象了,那如果我把书的作者写错了,那怎么办呢?再插入一条吗?
男:这个问题问的很好,因为人为的操作总会存在误差,因此提出了 改 和 删 两种操作。
改 的基本语法:UPDATE 表名 SET 列名 = 新的值;
删 的基本语法:DELETE FROM 表名;
现在来模拟一下场景:
1、修改作者名:
- UPDATE bookshelf SET author='Margaret Mitchell';
- COMMIT;
修改作者名
2、下架图书:
- DELETE FROM bookshelf;
- COMMIT;
图书下架
通过以上两个场景,演示了 改 和 删 两种操作。
女:lucifer,你讲的很明了,我现在已经懂了增删改查四种操作了,迫不及待想要动手开始操作了!
男:小美,先别急,你没有发现一个严重的问题吗?如果书架上不止一本书呢?那你怎么对指定的那本书进行操作呢?有思考过吗?
女:对哦,上面都是演示的一本书,如果有多本书,是不是也有对应的操作可以来筛选呢?
男:没错,很聪明。现在隆重有请 WHERE 查询条件登场。正如上面所说,WHERE 子句用于提取那些满足指定条件的记录
先上架3本书:
- INSERT INTO bookshelf (book_id,book_name,book_type,author,intime) VALUES (1,'飘','长篇小说','玛格丽特·米切尔',SYSDATE);
- INSERT INTO bookshelf (book_id,book_name,book_type,author,intime) VALUES (2,'倾城之恋','爱情小说','张爱玲',SYSDATE);
- INSERT INTO bookshelf (book_id,book_name,book_type,author,intime) VALUES (3,'从你的全世界路过','短篇小说','张嘉佳',SYSDATE);
- COMMIT;
插入数据
查看《倾城之恋》:
- SELECT * FROM bookshelf WHERE BOOK_NAME = '倾城之恋';
查看《倾城之恋》
更新《飘》:
- UPDATE bookshelf SET author='Margaret Mitchell' WHERE book_name = '飘';
- COMMIT;
更新《飘》
删除《从你的全世界路过》:
- DELETE FROM bookshelf WHERE book_name = '从你的全世界路过';
- COMMIT;
删除《从你的全世界路过》
通过上面的几个栗子??,应该能很好的理解 WHERE 查询条件的使用了。
女:懂了懂了,lucifer,我现在是不是可以去开发了?好像练练手啊!!!
男:嗯。现在只能说是入门了,会简单的增删改查是数据库开发的第一部,所有的数据库操作都是基于SQL语言的。
女:好的好的。有问题了,我在继续问你,谢谢lucifer!!!Thanks?(?ω?)?。
另外,这跟大家分享三个一句SQL画图的趣味小玩意儿:
五角星:
- WITH a AS
- (SELECT DISTINCT round(SUM(x) over(ORDER BY n)) x,
- round(SUM(y) over(ORDER BY n)) y
- FROM (SELECT n,
- cos(trunc(n / 20) * (1 - 1 / 5) * 3.1415926) * 2 x,
- sin(trunc(n / 20) * (1 - 1 / 5) * 3.1415926) y
- FROM (SELECT rownum - 1 n
- FROM all_objects
- WHERE rownum <= 20 * 5)))
- SELECT REPLACE(sys_connect_by_path(point,
- '/'),
- '/',
- NULL) star
- FROM (SELECT b.y,
- b.x,
- decode(a.x,
- NULL,
- ' ',
- '*') point
- FROM a,
- (SELECT *
- FROM (SELECT rownum - 1 + (SELECT MIN(x)
- FROM a) x
- FROM all_objects
- WHERE rownum <= (SELECT MAX(x) - MIN(x) + 1
- FROM a)),
- (SELECT rownum - 1 + (SELECT MIN(y)
- FROM a) y
- FROM all_objects
- WHERE rownum <= (SELECT MAX(y) - MIN(y) + 1
- FROM a))) b
- WHERE a.x(+) = b.x
- AND a.y(+) = b.y)
- WHERE x = (SELECT MAX(x)
- FROM a)
- START WITH x = (SELECT MIN(x)
- FROM a)
- CONNECT BY y = PRIOR y
- AND x = PRIOR x + 1;
五角星
调整期中数字5, 你还可以输出7角星, 9角星。
奥运五环:
- WITH a AS
- (SELECT DISTINCT round(a.x + b.x) x,
- round(a.y + b.y) y
- FROM (SELECT (SUM(x) over(ORDER BY n)) x,
- round(SUM(y) over(ORDER BY n)) y
- FROM (SELECT n,
- cos(n / 30 * 3.1415926) * 2 x,
- sin(n / 30 * 3.1415926) y
- FROM (SELECT rownum - 1 n
- FROM all_objects
- WHERE rownum <= 30 + 30))) a,
- (SELECT n,
- (SUM(x) over(ORDER BY n)) x,
- round(SUM(y) over(ORDER BY n)) y
- FROM (SELECT n,
- cos(m / 3 * 3.1415926) * 2 * 15 x,
- sin(m / 3 * 3.1415926) * 15 y
- FROM (SELECT CASE
- WHEN rownum <= 2 THEN
- 3
- WHEN rownum = 3 THEN
- -2
- ELSE
- -6
- END m,
- rownum - 1 n
- FROM all_objects
- WHERE rownum <= 5))) b)
- SELECT REPLACE(sys_connect_by_path(point,
- '/'),
- '/',
- NULL) star
- FROM (SELECT b.y,
- b.x,
- decode(a.x,
- NULL,
- ' ',
- '*') point
- FROM a,
- (SELECT *
- FROM (SELECT rownum - 1 + (SELECT MIN(x)
- FROM a) x
- FROM all_objects
- WHERE rownum <= (SELECT MAX(x) - MIN(x) + 1
- FROM a)),
- (SELECT rownum - 1 + (SELECT MIN(y)
- FROM a) y
- FROM all_objects
- WHERE rownum <= (SELECT MAX(y) - MIN(y) + 1
- FROM a))) b
- WHERE a.x(+) = b.x
- AND a.y(+) = b.y)
- WHERE x = (SELECT MAX(x)
- FROM a)
- START WITH x = (SELECT MIN(x)
- FROM a)
- CONNECT BY y = PRIOR y
- AND x = PRIOR x + 1;
奥运五环
打印当月日历:
- SELECT MAX(decode(dow,
- 1,
- d,
- NULL)) sun,
- MAX(decode(dow,
- 2,
- d,
- NULL)) mon,
- MAX(decode(dow,
- 3,
- d,
- NULL)) tue,
- MAX(decode(dow,
- 4,
- d,
- NULL)) wed,
- MAX(decode(dow,
- 5,
- d,
- NULL)) thu,
- MAX(decode(dow,
- 6,
- d,
- NULL)) fri,
- MAX(decode(dow,
- 7,
- d,
- NULL)) sat
- FROM (SELECT rownum d,
- rownum - 2 + to_number(to_char(trunc(SYSDATE,
- 'MM'),
- 'D')) p,
- to_char(trunc(SYSDATE,
- 'MM') - 1 + rownum,
- 'D') dow
- FROM all_objects
- WHERE rownum <=
- to_number(to_char(last_day(to_date(SYSDATE)),
- 'DD')))
- GROUP BY trunc(p / 7)
- ORDER BY sun NULLS FIRST;
打印日历