SQL基础(一)
? 經過這段時間對SQL的基礎學習,下面對自己的學習做個總結或者也可以說是個回顧吧!
我練習的是在oracle數據庫平臺上,并且安裝了PLSQL Developer工具。下面是我從小白開始一路學習的回顧:
首先這是PLSQL Developer的登陸界面:
? ? ?
SQL SELECT 查詢語法
基本查詢:
SELECT 列名稱 FROM 表名稱條件查詢:
SELECT 列名稱 FROM 表名稱 WHERE 條件條件排序查詢:
SELECT 列名稱 FROM 表名稱 WHERE 條件 ORDER BY?
INSERT INTO ?插入語句
基本插入語句:
INSERT INTO 表名稱 VALUES (值1, 值2, 值3,. . .)指定所需要插入數據的列:
INSERT INTO 表名稱(列1, 列2, 列3, . . . )VALUES (值1,值2,值3, . . .)?
UPDATE 更新語句
基本更新語句:
UPDATE 表名稱 SET 列名稱 = 新值 WHERE 列名稱 = 某值更新某一行的若干列:
UPDATE 表名稱 SET 列1 = 值1, 列2 = 值2, 列3 = 值3,. . . WHERE 條件?
DELETE 刪除語句
按條件刪除:
DELETE FROM 表名稱 WHERE 列名稱 = 值刪除表的所有行:
DELETE FROM 表名稱或者:
DELETE * FROM 表名稱;?
默認情況下,我先是以管理員身份登陸,然后創建我自己練習的用戶(jim)
那么是怎么來創建我的用戶的呢?
CREATE USER 用戶名 IDENTIFIED BY 密碼//創建新用戶jim,密碼就是changeit CREATE USER jim IDENTIFIED BY changeit
創建好的用戶是什么功能都木有的,哪怕是登陸的權限也沒有,這時候我們就要給新用戶賦予一定的權限
給用戶賦予登陸的權限:
/*給用戶賦予登陸的權限*/ GRANT CONNECT TO jim;這時候,用戶jim是可以登錄的,但是它還是沒有權限去操作數據庫,表這些對象,哪怕它自己建一個表的權利也沒有,
這時候我們再給他賦一個對象的權限,這樣他就可以創建表了:
/*給用戶賦予創建表等對象的權限*/ GRANT RESOURCE TO jim;這時候我們jim用戶就有了基本的功能了,這時候我們在退出原來的用戶,用jim用戶即可登錄。
這里順平提下刪除用戶的方法:
/*那么對應得刪除用戶我們順便提下*/ DROP USER jim一般情況下,這樣會報錯不刪除,出發jim用戶是空的,什么表也沒創建,
如果jim用戶創建表,我們可以在后面加casecode,表示把jim用戶下的所有資源全部刪除
/*如果jim用戶下有創建表,或者其他對象,這樣是刪除不了, 我們在后面加個casecode就可以*/ DROP USER jim CASECADE;好了,趕緊用我們的新用戶來登陸吧. . . .?
我們先來創建一個叫作Persons的表:
| 1 | Adams | John | Oxford Street | London |
| 2 | Bush | George | Fifth Avenue | New York |
| 3 | Carter | Thomas | Changan Street | Beijing |
對應的sql語句為:? ?
/*創建Persons表*/ CREATE TABLE Persons( Id number, LastName nvarchar2(20), FirstName nvarchar2(20), Address nvarchar2(20), City nvarchar2(20));這樣一個空的表就創建成功了,但是里面的內容是空的,這時候我們可以往表中插入數據
完整的字段插入:INSET INTO 表名 VALUES(值1,值2,值3,. . .);/*往Persons表插入數據*/ INSERT INTO Persons VALUES(1,'Adams','John','Oxford Street','London'); INSERT INTO Persons VALUES(2,'Bush','George','Fifth Avenue','New York'); INSERT INTO Persons VALUES(3,'Carter','Tomas','Changan Street','Beijing');
這樣我們插入的是完整的數據,當然我們也可以插入部分字段的數據,
部分字段插入:INSERT INTO 表名(字段1,字段2,字段3. . .) VALUES (值1,值2,值3 . . . )/*也可以給表中的部分字段添加數據*/ INSERT INTO Persons(Id,LastName,Firstname,City) VALUES(1,'Jiang','Jim','Dalian');
?當然我們也可以修改表中的數據,比如我們修改FirstName為Jim的City為Wuyuan
UPDATE 表名 SET 字段1=新值 WHERE 字段1 = '某個值'/*更新表中的數據*/ UPDATE Persons SET City = 'Wuyuan' WHERE FirstName = 'Jim';
?再后來呢,我們可以刪除我們不需要的數據,注意,刪除數據需要特別小心
比如我們想刪除某一行,一定要用WHERE加個限定,不然就真的是刪除數據庫跑路了.........
現在刪除LastName = 'Jiang'這一行,我們可以這樣寫:
/*刪除某一行數據*/ DELETE FROM Persons WHERE LastName = 'Jiang' ;當然,你真的要刪除所有,那就可以不用限定條件,直接把表中所有數據清空?
/*清空數據*/ DELETE FROM Persons;如果你要斬草除根,把數據連同表結構也一起刪除,你可以這么干
/*章草除根,直接把表結構也刪除的話就可以這么干*/ DROP TABLE Persons;好了,三個單詞一夜回到解放前,一無所有了 . . . . ?
In操作符
SELECT 字段名 FROM 表名稱 WHERE 字段 IN (值1,值2,值3,值4, . . .)BETWEEN. . .AND. . .區間語法
SELECT 字段名 FROM 表名稱 WHERE 字段名 BETWEEN 值1 AND 值n?
?下面我們來創建一個時間維度表,假設表的名稱為DIM_DATE
| ? ? ?D_ID | ? ? ?D_DATE ? ? | ? ? ? ? D_YEAR ?? | ? ? ? ?D_QUARTER | ? ?D_MONTH | ? ? D_WEEK |
| 20160723 | ? ?2016/7/23 | ? ? ? ? ? 2016 | ? ? ? ? ? ? ?Q3 | ? ? ? ?JULE | ? ? SATURDAY |
接下來我們可以往表中差數據,如果手工一條一條的插入數據,那將會要人命的,因此,我們可以寫一個存儲過程,可以從起始日期到結束日期
插入到數據表中,對對應的存儲過程如下:
--創建存儲過程,插入時間,從起止日期到結束日期 CREATE OR REPLACE PROCEDURE P_INSERTDATE(startDate NVARCHAR2,endDate nvarchar2)ASBEGIN MERGE INTO DIM_DATE t1USING (select to_number(to_char(to_date(startDate,'YYYY-MM-DD')+(rownum-1),'yyyymmdd')) t_date from dual connect by rownum<=(to_date(endDate,'YYYY-MM-DD')-to_date(startDate,'YYYY-MM-DD'))) temp_dateON(t1.d_id=temp_date.t_date)when matched then update set t1.d_date=to_date(temp_date.t_date,'YYYY-MM-DD'),t1.d_year=to_number(substr(to_char(temp_date.t_date),1,4)),t1.d_quarter='Q'||to_char(to_date(temp_date.t_date,'YYYY-MM-DD'),'Q'),t1.d_month=to_char(to_date(temp_date.t_date,'YYYY-MM-DD'),'MONTH'),t1.d_week=to_char(to_date(temp_date.t_date,'YYYY-MM-DD'),'DAY')when not matched then insert (t1.d_id,t1.d_date,t1.d_year,t1.d_quarter,t1.d_month,t1.d_week) values( temp_date.t_date,to_date(temp_date.t_date,'YYYY-MM-DD'),to_number(substr(to_char(temp_date.t_date),1,4)),'Q'||to_char(to_date(temp_date.t_date,'YYYY-MM-DD'),'Q'),to_char(to_date(temp_date.t_date,'YYYY-MM-DD'),'MONTH'),to_char(to_date(temp_date.t_date,'YYYY-MM-DD'),'DAY')); END;其中注意的幾點,我們先要獲取某段時間,這時候我們可以這么寫,
比如獲取從2016年7月23日至2017年7月22日這段日期:
SELECT to_date('2016-07-23','YYYY-MM-DD')+ROWNUM-1 FROM DUAL CONNECT BY ROWNUM <= to_date('2017-07-23','YYYY-MM-DD')-to_date('2016-07-23','YYYY-MM-DD');結果:
在利用merge into即可在我們的時間維度表進行更新和插入。
1.用一條語句查出每門課都大于80分的學生姓名
| NAME | SUBJECT | SCORE |
| 張三 | 語文 | 85 |
| 張三 | 數學 | 90 |
| 李四 | 語文 | 76 |
| 李四 | 數學 | 100 |
| 王五 | 語文 | 69 |
| 王五 | 數學 | 95 |
| 王五 | 英語 | 88 |
?
?
?
?
?
?
?
?
--創建學生成績表 CREATE TABLE SCORES( NAME VARCHAR2(10), SUBJECT VARCHAR2(10), SCORE NUMBER); --插入數據 INSERT INTO SCORES VALUES('張三','語文',85); INSERT INTO SCORES VALUES('張三','數學',90); INSERT INTO SCORES VALUES('李四','語文',76); INSERT INTO SCORES VALUES('李四','數學',100); INSERT INTO SCORES VALUES('王五','語文',69); INSERT INTO SCORES VALUES('王五','數學',95); INSERT INTO SCORES VALUES('王五','英語',88);思路:先對學生按姓名進行分組(group by),然后過濾(having)
--用一條語句查出每門課都大于80分的學生姓名 SELECT t1.name FROM SCORES t1 GROUP BY T1.NAME HAVING MIN(t1.score)>80;也可以這么寫,先把成績低于80的學生姓名查找出來,然后再篩選(not in)
--查出每門課都大于80分的學生姓名(2) WITH temp AS(SELECT DISTINCT t1.name FROM SCORES t1 WHERE t1.score<80) --先找出成績有低于80的學生姓名SELECT DISTINCT t1.name FROM SCORES t1 WHERE t1.name NOT IN(SELECT * FROM TEMP);?2.對下表進行轉換
| NAME | SUBJECT | SCORE |
| 張三 | 語文 | 85 |
| 張三 | 數學 | 90 |
| 李四 | 語文 | 76 |
| 李四 | 數學 | 100 |
| 王五 | 語文 | 69 |
| 王五 | 數學 | 95 |
| 王五 | 英語 | 88 |
| NAME | 語文 | 數學 | 英語 |
| 張三 | 85 | 90 | 0 |
| 李四 | 76 | 100 | 0 |
| 王五 | 69 | 95 | 88 |
?
?
?
?
SELECT t1.name,sum(decode('語文',t1.subject,t1.score)) ,sum(decode('數學',t1.subject,t1.score)),sum(decode('英語',t1.subject,t1.score))FROM SCORES t1 group by t1.name order by 1;SELECT t1.name,SUM(CASE WHEN t1.subject='語文' THEN t1.score ELSE 0 END),SUM(CASE WHEN t1.subject='數學' THEN t1.score ELSE 0 END),SUM(CASE WHEN t1.Subject='英語' THEN t1.score ELSE 0 END)FROM SCORES t1 group by t1.name; --進行表的轉換(pivot) SELECT * FROM (SELECT t1.name ,t1.subject,t1.score from SCORES t1 group by t1.name,t1.subject,t1.score)PIVOT(SUM(score) FOR subject IN('語文','數學','英語'));
?
轉載于:https://www.cnblogs.com/Jims2016/p/5678631.html
總結
- 上一篇: 网络编程(发送get和post请求到服务
- 下一篇: linux网络配置及IP绑定