SQL:我能玩出這花樣兒?
本文轉載自微信公眾號「杰哥的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;
打印日歷