日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

SQL基础(一)

發(fā)布時(shí)間:2025/7/14 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQL基础(一) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

? 經(jīng)過這段時(shí)間對(duì)SQL的基礎(chǔ)學(xué)習(xí),下面對(duì)自己的學(xué)習(xí)做個(gè)總結(jié)或者也可以說是個(gè)回顧吧!

我練習(xí)的是在oracle數(shù)據(jù)庫平臺(tái)上,并且安裝了PLSQL Developer工具。下面是我從小白開始一路學(xué)習(xí)的回顧:

首先這是PLSQL Developer的登陸界面:

? ? ?

SQL SELECT 查詢語法

基本查詢:

SELECT 列名稱 FROM 表名稱

條件查詢:

SELECT 列名稱 FROM 表名稱 WHERE  條件

條件排序查詢:

SELECT 列名稱 FROM 表名稱 WHERE 條件 ORDER BY

?

INSERT INTO ?插入語句

基本插入語句:

INSERT INTO 表名稱 VALUES (值1, 值2, 值3,. . .)

指定所需要插入數(shù)據(jù)的列:

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 表名稱;

?

默認(rèn)情況下,我先是以管理員身份登陸,然后創(chuàng)建我自己練習(xí)的用戶(jim)

那么是怎么來創(chuàng)建我的用戶的呢?

CREATE USER 用戶名 IDENTIFIED BY 密碼
//
創(chuàng)建新用戶jim,密碼就是changeit CREATE USER jim IDENTIFIED BY changeit

創(chuàng)建好的用戶是什么功能都木有的,哪怕是登陸的權(quán)限也沒有,這時(shí)候我們就要給新用戶賦予一定的權(quán)限

給用戶賦予登陸的權(quán)限:

/*給用戶賦予登陸的權(quán)限*/ GRANT CONNECT TO jim;

這時(shí)候,用戶jim是可以登錄的,但是它還是沒有權(quán)限去操作數(shù)據(jù)庫,表這些對(duì)象,哪怕它自己建一個(gè)表的權(quán)利也沒有,

這時(shí)候我們?cè)俳o他賦一個(gè)對(duì)象的權(quán)限,這樣他就可以創(chuàng)建表了:

/*給用戶賦予創(chuàng)建表等對(duì)象的權(quán)限*/ GRANT RESOURCE TO jim;

這時(shí)候我們jim用戶就有了基本的功能了,這時(shí)候我們?cè)谕顺鲈瓉淼挠脩?#xff0c;用jim用戶即可登錄。

這里順平提下刪除用戶的方法:

/*那么對(duì)應(yīng)得刪除用戶我們順便提下*/ DROP USER jim

一般情況下,這樣會(huì)報(bào)錯(cuò)不刪除,出發(fā)jim用戶是空的,什么表也沒創(chuàng)建,

如果jim用戶創(chuàng)建表,我們可以在后面加casecode,表示把jim用戶下的所有資源全部刪除

/*如果jim用戶下有創(chuàng)建表,或者其他對(duì)象,這樣是刪除不了, 我們?cè)诤竺婕觽€(gè)casecode就可以*/ DROP USER jim CASECADE;

好了,趕緊用我們的新用戶來登陸吧. . . .?

我們先來創(chuàng)建一個(gè)叫作Persons的表:

IdLastNameFirstNameAddressCity
1AdamsJohnOxford StreetLondon
2BushGeorgeFifth AvenueNew York
3CarterThomasChangan StreetBeijing

對(duì)應(yīng)的sql語句為:? ?

/*創(chuàng)建Persons表*/ CREATE TABLE Persons( Id number, LastName nvarchar2(20), FirstName nvarchar2(20), Address nvarchar2(20), City nvarchar2(20));

這樣一個(gè)空的表就創(chuàng)建成功了,但是里面的內(nèi)容是空的,這時(shí)候我們可以往表中插入數(shù)據(jù)

完整的字段插入:INSET INTO 表名 VALUES(值1,值2,值3,. . .);
/*
往Persons表插入數(shù)據(jù)*/ 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');

這樣我們插入的是完整的數(shù)據(jù),當(dāng)然我們也可以插入部分字段的數(shù)據(jù),

部分字段插入:INSERT INTO 表名(字段1,字段2,字段3. . .) VALUES (值1,值2,值3 . . . )
/*
也可以給表中的部分字段添加數(shù)據(jù)*/ INSERT INTO Persons(Id,LastName,Firstname,City) VALUES(1,'Jiang','Jim','Dalian');

?當(dāng)然我們也可以修改表中的數(shù)據(jù),比如我們修改FirstName為Jim的City為Wuyuan

UPDATE 表名 SET 字段1=新值 WHERE 字段1 = '某個(gè)值'
/*
更新表中的數(shù)據(jù)*/ UPDATE Persons SET City = 'Wuyuan' WHERE FirstName = 'Jim';

?再后來呢,我們可以刪除我們不需要的數(shù)據(jù),注意,刪除數(shù)據(jù)需要特別小心

比如我們想刪除某一行,一定要用WHERE加個(gè)限定,不然就真的是刪除數(shù)據(jù)庫跑路了.........

現(xiàn)在刪除LastName = 'Jiang'這一行,我們可以這樣寫:

/*刪除某一行數(shù)據(jù)*/ DELETE FROM Persons WHERE LastName = 'Jiang' ;

當(dāng)然,你真的要?jiǎng)h除所有,那就可以不用限定條件,直接把表中所有數(shù)據(jù)清空?

/*清空數(shù)據(jù)*/ DELETE FROM Persons;

如果你要斬草除根,把數(shù)據(jù)連同表結(jié)構(gòu)也一起刪除,你可以這么干

/*章草除根,直接把表結(jié)構(gòu)也刪除的話就可以這么干*/ DROP TABLE Persons;

好了,三個(gè)單詞一夜回到解放前,一無所有了 . . . . ?

In操作符

SELECT 字段名 FROM 表名稱 WHERE 字段 IN (值1,值2,值3,值4, . . .)

BETWEEN. . .AND. . .區(qū)間語法

SELECT 字段名 FROM 表名稱 WHERE 字段名 BETWEEN 值1 AND 值n

?

?下面我們來創(chuàng)建一個(gè)時(shí)間維度表,假設(shè)表的名稱為DIM_DATE

? ? ?D_ID? ? ?D_DATE ? ?? ? ? ? D_YEAR ??? ? ? ?D_QUARTER? ?D_MONTH? ? D_WEEK
20160723? ?2016/7/23? ? ? ? ? 2016? ? ? ? ? ? ?Q3? ? ? ?JULE? ? SATURDAY
--設(shè)計(jì)日期維度表 CREATE TABLE DIM_DATE( D_ID NUMBER(8) PRIMARY KEY, --20160723 D_DATE DATE, --2016/7/23 D_YEAR NUMBER, --2016 D_QUARTER CHAR(2), --Q3 D_MONTH NVARCHAR2(15), --JULE D_WEEK NVARCHAR2(15)); --SATURDAY

接下來我們可以往表中差數(shù)據(jù),如果手工一條一條的插入數(shù)據(jù),那將會(huì)要人命的,因此,我們可以寫一個(gè)存儲(chǔ)過程,可以從起始日期到結(jié)束日期

插入到數(shù)據(jù)表中,對(duì)對(duì)應(yīng)的存儲(chǔ)過程如下:

--創(chuàng)建存儲(chǔ)過程,插入時(shí)間,從起止日期到結(jié)束日期 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;

其中注意的幾點(diǎn),我們先要獲取某段時(shí)間,這時(shí)候我們可以這么寫,

比如獲取從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');

結(jié)果:

在利用merge into即可在我們的時(shí)間維度表進(jìn)行更新和插入。

1.用一條語句查出每門課都大于80分的學(xué)生姓名

NAMESUBJECTSCORE
張三語文85
張三數(shù)學(xué)90
李四語文76
李四數(shù)學(xué)100
王五語文69
王五數(shù)學(xué)95
王五英語88

?

?

?

?

?

?

?

?

--創(chuàng)建學(xué)生成績(jī)表 CREATE TABLE SCORES( NAME VARCHAR2(10), SUBJECT VARCHAR2(10), SCORE NUMBER); --插入數(shù)據(jù) INSERT INTO SCORES VALUES('張三','語文',85); INSERT INTO SCORES VALUES('張三','數(shù)學(xué)',90); INSERT INTO SCORES VALUES('李四','語文',76); INSERT INTO SCORES VALUES('李四','數(shù)學(xué)',100); INSERT INTO SCORES VALUES('王五','語文',69); INSERT INTO SCORES VALUES('王五','數(shù)學(xué)',95); INSERT INTO SCORES VALUES('王五','英語',88);

思路:先對(duì)學(xué)生按姓名進(jìn)行分組(group by),然后過濾(having)

--用一條語句查出每門課都大于80分的學(xué)生姓名 SELECT t1.name FROM SCORES t1 GROUP BY T1.NAME HAVING MIN(t1.score)>80;

也可以這么寫,先把成績(jī)低于80的學(xué)生姓名查找出來,然后再篩選(not in)

--查出每門課都大于80分的學(xué)生姓名(2) WITH temp AS(SELECT DISTINCT t1.name FROM SCORES t1 WHERE t1.score<80) --先找出成績(jī)有低于80的學(xué)生姓名SELECT DISTINCT t1.name FROM SCORES t1 WHERE t1.name NOT IN(SELECT * FROM TEMP);

?2.對(duì)下表進(jìn)行轉(zhuǎn)換

NAMESUBJECTSCORE
張三語文85
張三數(shù)學(xué)90
李四語文76
李四數(shù)學(xué)100
王五語文69
王五數(shù)學(xué)95
王五英語88
NAME語文數(shù)學(xué)英語
張三85900
李四761000
王五699588

?

?

?

?

SELECT t1.name,sum(decode('語文',t1.subject,t1.score)) ,sum(decode('數(shù)學(xué)',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='數(shù)學(xué)' THEN t1.score ELSE 0 END),SUM(CASE WHEN t1.Subject='英語' THEN t1.score ELSE 0 END)FROM SCORES t1 group by t1.name; --進(jìn)行表的轉(zhuǎn)換(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('語文','數(shù)學(xué)','英語'));

?

轉(zhuǎn)載于:https://www.cnblogs.com/Jims2016/p/5678631.html

總結(jié)

以上是生活随笔為你收集整理的SQL基础(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。