SQL:我能玩出這花樣兒?
本文轉(zhuǎn)載自微信公眾號「杰哥的IT之旅」,作者三笠 。轉(zhuǎn)載本文請聯(lián)系菜杰哥的IT之旅公眾號。
前言
SQL是什么?
官方解釋: SQL (Structured Query Language:結(jié)構(gòu)化查詢語言) 是用于管理關(guān)系數(shù)據(jù)庫管理系統(tǒng)(RDBMS)。
SQL能用來干什么?
通俗的講: 讓您可以訪問和處理數(shù)據(jù)庫,包括數(shù)據(jù)插入、查詢、更新和刪除。
SQL
下面讓我們看看小美是如何零基礎(chǔ)學(xué)習(xí)SQL的:
女:Lucifer,最新領(lǐng)導(dǎo)讓我負(fù)責(zé)數(shù)據(jù)庫開發(fā),需要寫SQL,但是我零基礎(chǔ)沒學(xué)過,有辦法快速入門嗎?
男:小美啊,SQL語言其實入門不難,我先來教你最簡單的增刪改查基礎(chǔ)吧。
女:好的,我試試看,奧力給。
男:Ok,那我們先來一個最簡單常用的SQL語句DUAL查詢:SELECT SYSDATE FROM DUAL;
sysdate
使用這個SQL語句可以查看數(shù)據(jù)庫當(dāng)前時間,當(dāng)然也可以把 SYSDATE 換成任意東西。
例如:
計算器:SELECT 365 * 24 FROM dual;
計算器
這個SQL我們在開發(fā)中會經(jīng)常用到,作為入門第一個SQL輕松有趣。小美,你覺得難嗎?
女:這個太實用了,以后計算器和日歷都可以省了,哈哈哈。
男:是的,其實我們剛剛已經(jīng)不經(jīng)意的學(xué)習(xí)了SQL語言增刪改查中的 查 操作了。接下來,我要介紹一個新的對象:表 :是相關(guān)的數(shù)據(jù)項的集合,它由列和行組成。通俗的講,數(shù)據(jù)庫相當(dāng)于圖書館,表就類似于其中的一個個書架,表數(shù)據(jù)就類似于一本本書。我們查詢數(shù)據(jù)庫表的數(shù)據(jù),就好比我們進入圖書館去找一本喜歡的書。我這么說,你能理解嗎?
查 的基本語法:select * from 表名;
女:可以可以,這個比喻我一下子就聽懂了,原來數(shù)據(jù)庫查詢是這樣的,那表是怎么創(chuàng)建的呢?
男:不要著急,先來介紹一下數(shù)據(jù)庫中最常用的3個數(shù)據(jù)類型:NUMBER,VARCHAR2,DATE,分別為數(shù)字型,字符型,日期型。顧名思義,即用來定義表中列字段用來存放數(shù)據(jù)的類型。
數(shù)據(jù)類型
女:嗯嗯,這個能理解,跟java,C 好像有些相似。
男:嗯嗯。理解了這個,就可以開始建表了,現(xiàn)在來創(chuàng)建一個簡單的圖書館書架表。
- CREATE TABLE bookshelf
- (
- BOOK_ID NUMBER,
- BOOK_NAME VARCHAR2(100),
- BOOK_TYPE VARCHAR2(100),
- AUTHOR VARCHAR2(100),
- INTIME DATE
- );
表名為:bookshelf,有列:圖書id,圖書名稱,圖書類型,作者,入庫時間。通過上面學(xué)習(xí)的 SELECT語法,來查詢一下這張表:
SELECT * FROM bookshelf;
查詢圖書表
可以發(fā)現(xiàn),新建的bookshelf表沒有任何記錄。現(xiàn)在,圖書館里已經(jīng)增加一個空的書架,是不是需要將書放入書架上呢?這時就需要用到 增 操作了。
女:嗯嗯,很形象,感覺自己就像個圖書管理員一樣,哈哈哈。
男:哈哈,沒錯,我們數(shù)據(jù)庫管理員跟圖書管理員可以說是異曲同工。好了,繼續(xù)說放書吧,現(xiàn)在假設(shè)有一本書《飄》,作者:瑪格麗特·米切爾,類型:長篇小說。現(xiàn)在通過 INSERT 將這本書放入書架上:
- INSERT INTO bookshelf
- (book_id,
- book_name,
- book_type,
- author,
- intime)
- VALUES
- (1,
- '飄',
- '長篇小說',
- '瑪格麗特·米切爾',
- SYSDATE);
- COMMIT;
增 的基本語法:insert into 表名 (需要插入的列名,用逗號隔開) values (對應(yīng)列名的值);
插入數(shù)據(jù)
通過sql查詢發(fā)現(xiàn),這本書《飄》已經(jīng)放入了書架上,可供大家借用和查看。
女:太形象了,那如果我把書的作者寫錯了,那怎么辦呢?再插入一條嗎?
男:這個問題問的很好,因為人為的操作總會存在誤差,因此提出了 改 和 刪 兩種操作。
改 的基本語法:UPDATE 表名 SET 列名 = 新的值;
刪 的基本語法:DELETE FROM 表名;
現(xiàn)在來模擬一下場景:
1、修改作者名:
- UPDATE bookshelf SET author='Margaret Mitchell';
- COMMIT;
修改作者名
2、下架圖書:
- DELETE FROM bookshelf;
- COMMIT;
圖書下架
通過以上兩個場景,演示了 改 和 刪 兩種操作。
女:lucifer,你講的很明了,我現(xiàn)在已經(jīng)懂了增刪改查四種操作了,迫不及待想要動手開始操作了!
男:小美,先別急,你沒有發(fā)現(xiàn)一個嚴(yán)重的問題嗎?如果書架上不止一本書呢?那你怎么對指定的那本書進行操作呢?有思考過嗎?
女:對哦,上面都是演示的一本書,如果有多本書,是不是也有對應(yīng)的操作可以來篩選呢?
男:沒錯,很聰明。現(xiàn)在隆重有請 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;
插入數(shù)據(jù)
查看《傾城之戀》:
- SELECT * FROM bookshelf WHERE BOOK_NAME = '傾城之戀';
查看《傾城之戀》
更新《飄》:
- UPDATE bookshelf SET author='Margaret Mitchell' WHERE book_name = '飄';
- COMMIT;
更新《飄》
刪除《從你的全世界路過》:
- DELETE FROM bookshelf WHERE book_name = '從你的全世界路過';
- COMMIT;
刪除《從你的全世界路過》
通過上面的幾個栗子??,應(yīng)該能很好的理解 WHERE 查詢條件的使用了。
女:懂了懂了,lucifer,我現(xiàn)在是不是可以去開發(fā)了?好像練練手啊!!!
男:嗯。現(xiàn)在只能說是入門了,會簡單的增刪改查是數(shù)據(jù)庫開發(fā)的第一部,所有的數(shù)據(jù)庫操作都是基于SQL語言的。
女:好的好的。有問題了,我在繼續(xù)問你,謝謝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;
五角星
調(diào)整期中數(shù)字5, 你還可以輸出7角星, 9角星。
奧運五環(huán):
- 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;
奧運五環(huán)
打印當(dāng)月日歷:
- 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;
打印日歷