SQL學(xué)習(xí)筆記
目錄
增刪改查關(guān)鍵字
SELECT
COUNT(*) 統(tǒng)計(jì)所有值
COUNT(*) 統(tǒng)計(jì)所有值,一般用于統(tǒng)計(jì)符合條件有多少條數(shù)據(jù),相比于SELECT * FROM TABLE; 可以提高效率
SELECT * FROM TABLE;


SELECT COUNT(*) FROM student;


兩相比較看到效率大大提高了,如果僅僅是想要判斷符合條件的多少條數(shù)據(jù)完全可以使用COUNT關(guān)鍵字
DISTINCT 返回唯一值
寫(xiě)法:
SELECT DISTINCT student.student_sex FROM student;
結(jié)果:
查找前:

查找后:

DELETE
DELETE
delect 是刪除表內(nèi)的數(shù)據(jù),可以根據(jù)條件刪除要?jiǎng)h除的數(shù)據(jù);
寫(xiě)法:
DELETE FROM student WHERE student_age = 26;
結(jié)果:
刪除前:

刪除后:


顯示數(shù)據(jù)已經(jīng)刪除了
TRUNCATE
TRUNCATE 會(huì)直接將表中的數(shù)據(jù)清除
寫(xiě)法:
TRUNCATE teacher;
先查找表內(nèi)數(shù)據(jù)條數(shù)

運(yùn)行后結(jié)果:


DROP
drop 語(yǔ)句會(huì)直接把表刪除,
語(yǔ)句:
DROP TABLE teacher;
結(jié)果:


顯示表不存在,說(shuō)明表已經(jīng)被刪除完成了
DELETE、TRUNCATE 、DROP的區(qū)別
從執(zhí)行速度上來(lái)說(shuō)
DROP> TRUNCATE > DELETE
原理
DELETE:
1、DELETE屬于數(shù)據(jù)庫(kù)DML操作語(yǔ)言,只刪除數(shù)據(jù)不刪除表的結(jié)構(gòu),會(huì)走事務(wù),執(zhí)行時(shí)會(huì)觸發(fā)trigger;
2、在 InnoDB 中,DELETE其實(shí)并不會(huì)真的把數(shù)據(jù)刪除,mysql 實(shí)際上只是給刪除的數(shù)據(jù)打了個(gè)標(biāo)記為已刪除, 因此 delete 刪除表中的數(shù)據(jù)時(shí),表文件在磁盤(pán)上所占空間不會(huì)變小,存儲(chǔ)空間不會(huì)被釋放,只是把刪除的數(shù)據(jù)行設(shè)置為不可見(jiàn)。雖然未釋放磁盤(pán)空間,但是下次插入數(shù)據(jù)的時(shí)候,仍然可以重用這部分空間(重用 → 覆蓋)。
3、DELETE執(zhí)行時(shí),會(huì)先將所刪除數(shù)據(jù)緩存到rollback segement中,事務(wù)commit之后生效;
4、delete from table_name刪除表的全部數(shù)據(jù), 對(duì)于MyISAM 會(huì)立刻釋放磁盤(pán)空間,InnoDB 不會(huì)釋放磁盤(pán)空間;
5、對(duì)于delete from table_name where xxx 帶條件的刪除, 不管是InnoDB還是MyISAM都不會(huì)釋放磁盤(pán)空間;
6、delete操作以后使用 optimize table table_name 會(huì)立刻釋放磁盤(pán)空間。不管是InnoDB還是MyISAM 。所以要想達(dá)到釋放磁盤(pán)空間的目的,delete以后執(zhí)行optimize table 操作。
7、delete 操作是一行一行執(zhí)行刪除的,并且同時(shí)將該行的的刪除操作日志記錄在redo和undo表空間中以便進(jìn)行回滾(rollback)和重做操作,生成的大量日志也會(huì)占用磁盤(pán)空間。
TRUNCATE:
1、truncate屬于數(shù)據(jù)庫(kù)DDL定義語(yǔ)言,不走事務(wù),原數(shù)據(jù)不放到 rollback segment 中,操作不觸發(fā) trigger。(不能夠回滾撤回!!!)
2、truncate table table_name 立刻釋放磁盤(pán)空間 ,不管是 InnoDB和MyISAM 。truncate table其實(shí)有點(diǎn)類似于drop table 然后creat,只不過(guò)這個(gè)create table 的過(guò)程做了優(yōu)化,比如表結(jié)構(gòu)文件之前已經(jīng)有了等等。所以速度上應(yīng)該是接近drop table的速度;
3、truncate能夠快速清空一個(gè)表。并且重置auto_increment的值。
DROP:
1、drop屬于數(shù)據(jù)庫(kù)DDL定義語(yǔ)言,同truncate;(不能夠回滾撤回!!!)
2、drop table table_name 立刻釋放磁盤(pán)空間 ,不管是 InnoDB 和 MyISAM; drop 語(yǔ)句將刪除表的結(jié)構(gòu)被依賴的約束(constrain)、觸發(fā)器(trigger)、索引(index); 依賴于該表的存儲(chǔ)過(guò)程/函數(shù)將保留,但是變?yōu)?invalid 狀態(tài)。
UPDATE
condition 條件
WHERE
CASE
函數(shù)方法關(guān)鍵字
TO_CHAR
TO_CHAR 是一種轉(zhuǎn)換函數(shù),意在將不指定格式的的內(nèi)容轉(zhuǎn)換成簡(jiǎn)單的字符串形式,存在多種用法:
簡(jiǎn)單用法:
- 不指定格式的 TO_CHAR函數(shù)將數(shù)值轉(zhuǎn)換成簡(jiǎn)單字符串形式。
TO_CHAR(123) 結(jié)果 123
TO_CHAR(-123) 結(jié)果 -123
- 用元素9的格式
TO_CHAR(1234,'9999') 結(jié)果 1234
TO_CHAR(567,'9999') 結(jié)果 567
TO_CHAR(-567,'9999') 結(jié)果 -567
TO_CHAR(1234567,'9999') 結(jié)果 ####
TO_CHAR(45.789,'9999') 結(jié)果 46
TO_CHAR(567,'9999.99') 結(jié)果 567.00
TO_CHAR(-567,'9999.99') 結(jié)果 -567.00
TO_CHAR(1234567,'9999.99') 結(jié)果 #######
TO_CHAR(45.789,'9999.99') 結(jié)果 45.79
TO_CHAR(567,'9,999,999') 結(jié)果 567
TO_CHAR(-567,'9,999,999') 結(jié)果 -567
TO_CHAR(1234567,'9,9999,999') 結(jié)果 1,234,567
TO_CHAR(0.44,'9,999,999') 結(jié)果 0
- 用元素$的格式
TO_CHAR(1234,'$9999') 結(jié)果 $1234
TO_CHAR(-567,'$9999') 結(jié)果 -$567
- 用元素B的格式 如果被轉(zhuǎn)換數(shù)值整數(shù)部分是0就顯示為空格
TO_CHAR(567,'B999.9') 結(jié)果 567.0
TO_CHAR(-567,'B999.9') 結(jié)果 -567.0
TO_CHAR(0.44,'B999.9') 結(jié)果 .4
- 用元素MI的格式 負(fù)數(shù)則轉(zhuǎn)換成末尾帶減號(hào)的數(shù)
TO_CHAR(567,'999MI') 結(jié)果 567
TO_CHAR(-567,'999MI') 結(jié)果 567-
- 用元素S的格式 轉(zhuǎn)換成帶有正負(fù)號(hào)的數(shù)字字符
TO_CHAR(567,'S999') 結(jié)果 +567
TO_CHAR(-567,'S999') 結(jié)果 -567
TO_CHAR(567,'999S') 結(jié)果 567+
TO_CHAR(-567,'999S') 結(jié)果 567-
- 用元素PR的格式 用尖括號(hào)包圍負(fù)數(shù)
TO_CHAR(567,'9999PR') 結(jié)果 567
TO_CHAR(-567,'9999PR') 結(jié)果 <567>
- 用元素D的格式 在指定位置插入小數(shù)點(diǎn)
TO_CHAR(567,'9999D99') 結(jié)果 567.00
TO_CHAR(-567,'9999D99') 結(jié)果 -567.00
TO_CHAR(567.866,'9999D99') 結(jié)果 567.87
- EEEE 科學(xué)計(jì)數(shù)法
TO_CHAR(567,'9.9EEEE') 結(jié)果 5.7E+02
TO_CHAR(45,'9.9EEEE') 結(jié)果 4.5E+01
TO_CHAR(0.0666,'9.9EEEE') 結(jié)果 6.7E-02
加深學(xué)習(xí):
-
TO_CHAR(date[,format[,nlsparams]]):將日期date轉(zhuǎn)化為VARCHAR2字符串, format缺省日期格式為Oracle的缺省日期格式(NLS_DATE_FORMAT)。
-
TO_CHAR(number[,format[,nlsparams]]):將數(shù)值number轉(zhuǎn)化為VARCHAR2字符串, format缺省,結(jié)果字符串包含有和number中有效位數(shù)相同位數(shù)的字符。
① 0與9:每一個(gè)0或9都表示一個(gè)有效位,轉(zhuǎn)換值得有效位與0或9的各位相同。負(fù)數(shù)有前導(dǎo)負(fù)號(hào),前導(dǎo)為0時(shí),使用0,保持不變,使用9則視為空格。如果精度減小,自動(dòng)四舍五入。
TO_CHAR(0.37,'00.000') ---值:" 00.370",一個(gè)空格
TO_CHAR(0.37,'90.000') ---值:" 0.370",兩個(gè)空格
② 千分位與小數(shù)位:
逗號(hào)",“:在指定位置返回一個(gè)逗號(hào)(可以不在千分位位置)。不能與G,D等格式元素同時(shí)使用
G:返回千分位分隔符,不一定是”,“,要看Oracle數(shù)據(jù)庫(kù)的默認(rèn)設(shè)置或nlsparams的值。
句點(diǎn)”.“:在指定位置返回一個(gè)句點(diǎn)(可以不在小數(shù)位位置)。不能與G,D等格式元素同時(shí)使用
D:返回小數(shù)位分隔符,不一定是”.",要看Oracle數(shù)據(jù)庫(kù)的默認(rèn)設(shè)置或nlsparams的值
PARTITION BY
partition by是分區(qū)函數(shù)像(sum()等是聚合函數(shù):聚合函數(shù)對(duì)一組值執(zhí)行計(jì)算并返回單一的值。)
DECODE
decode(條件,值1,返回值1,值2,返回值2,…值n,返回值n,缺省值)
這個(gè)是decode的表達(dá)式,具體的含義解釋為:
IF 條件=值1 THEN
RETURN(翻譯值1)
ELSIF 條件=值2 THEN
RETURN(翻譯值2)
......
ELSIF 條件=值n THEN
RETURN(翻譯值n)
ELSE
RETURN(缺省值)
END IF
簡(jiǎn)單用法
一、判斷前面的條件,如果值為1則是男生,值為2則是女生
SELECT
t.id,
t.NAME,
t.age,
decode( t.sex, '1', '男生', '2', '女生', '其他' ) AS sex
FROM
STUDENT2 t
二、decode比較大小
sign(value)函數(shù)會(huì)根據(jù)value的值為0,正數(shù),負(fù)數(shù),分別返回0,1,-1
年齡在20以上的顯示20以上,20以下的顯示20以下,20的顯示正好20
select t.id,
t.name,
t.age,
decode(sign(t.age - 20),
1,
'20以上',
-1,
'20以下',
0,
'正好20',
'未知') as sex
from STUDENT2 t

浙公網(wǎng)安備 33010602011771號(hào)