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