今天是劉小愛自學Java的第62天。
感謝你的觀看,謝謝你。
話不多說,繼續(xù)數(shù)據庫的學習:
比在DOS窗口中操作方便多了,那個黑乎乎的窗口真心不習慣,并且也沒有提示。
今天詳細地學習下數(shù)據記錄的查詢,同時最后對這幾天的知識點做一個總結。
select,選擇選取的意思,在數(shù)據庫之中可以理解成查詢。
①查詢所有數(shù)據
select * from student;
*即代表了所有數(shù)據的意思,格式為:
select * from+表名
②查詢指定列的信息
select name,gender from student;
查詢表中name,gender這兩列的所有數(shù)據,格式為:select+列名,列名,列名+from+表名
列名之間用逗號隔開。
③條件查詢
select * from student where name="比企谷八幡";
查詢表中name為“比企谷八幡”的所有數(shù)據,其中也可以選擇部分列的數(shù)據,格式不再贅述。
總之where后面填寫判斷條件。
其中還有運算符相關的查詢操作:
①查詢成績不及格的同學
select * from student where score<60;
即score<60的所有數(shù)據。
②查詢成績不等于90的同學
不等于在SQL中有三種表示方式:
not score=90;
score!=90;
score<>90;
③查詢成績在80和90之間的數(shù)據
也就是80<=score<=90,在SQL中有兩種方式:
between 80 and 90;
score>=80 and score<=90;
and,即并且的意思。
④查詢成績?yōu)?8,95,100的同學
在SQL中有兩種方式:
score in(88,95,100);
score=88 or score=95 or score=100;
or,即或者的意思。上述均為條件查詢,也就是用where來說明判斷條件,只不過條件中設計到了運算。
除了上述的基本查詢之外,還有模糊查詢:
①模糊查詢
like,像的意思,可以用來模糊查詢:
name like ‘劉%’;其中%表示1個或多個;
name like '劉_';其中_表示1個。
其中第一個只要以劉開頭即可以,第二個以劉開頭的兩個字。
②查詢成績不為null的學生
score is not null;
這很好理解,從字面意思就能看出來。
③查詢成績?yōu)閚ull的學生
score is null;
①過濾掉重復的數(shù)據
distinct,清楚的、不同的意思,在這里可以理解成過濾,格式如下:
select distinct+列名+from+表名
其中列名可以有多個。
②給列名起別名
可以給列名起一個別名,格式如下:
select 列名 as 別名+from+表名
就算取別名了,數(shù)據庫里的列名是沒有改變的。
它就是一個渲染效果,所以as后面接什么都可以,字符串也不用加引號。
其中as也可以省略,但最好不省略。
③列運算
這個也好理解,直接在查詢列名上+10即可。
其中有一行數(shù)據score=null,在SQL中:null與任何數(shù)相加都為null。(有點類似于Java中的字符串)
④關于null的處理
ifnull(列名,默認值) ,如果列名為空,給它一個默認值,圖中默認值為0,這樣就能參與運算了。
1排序查詢
order,訂單、排序的意思,在數(shù)據庫中order就是排序的意思,和前面我們學的sort是一樣的。
①根據score排序查詢
select * from+表名+order by+列名+desc
desc,在這里是降序的意思。
asc,即為升序。
②根據指定條件排序
現(xiàn)在只對男生排序,故加一個where條件判斷。
注意:where是緊接著from+表名后面的。
其中排序默認是升序,所以可以省略不寫。
②根據年齡、分數(shù)組合排序
多重排序,先根據前面的條件排序,再根據后面的條件排序。
2聚合函數(shù)
SQL語言中定義了部分的函數(shù),可以對查詢結果進行操作,也就是聚合函數(shù)。
①統(tǒng)計數(shù)量
count,數(shù)數(shù)的意思,即統(tǒng)計表示數(shù)據數(shù)量。
count(*):*代表所有,即查詢所有數(shù)據,結果為5。
count(score):score這一列因為有一行數(shù)據為null,所以不計算在內,
②統(tǒng)計班上的總分
sum,求和的意思。
sum(score):分數(shù)這一列所有的數(shù)據求和。
sum(score+age):(分數(shù)+年齡這兩列)所有的數(shù)據求和。
③統(tǒng)計班上的平均分
avg,求平均數(shù)的意思,很好理解。
avg(score):分數(shù)這一列求平均值。
avg(score+age):分數(shù)+年齡這兩列求平均值。
sum(score)/count(*):總分除以總人數(shù)求平均值。
這兩種的區(qū)別在于第一種如果數(shù)據為null,不加入運算,第二種將nul的數(shù)據也加入運算了。
④保留小數(shù)點數(shù)
round(avg(score),2);2,即表示保留小數(shù)點數(shù)為2位,可自行設點想要保留的小數(shù)點數(shù)。
此外,還有兩個聚合函數(shù):
max(score):求分數(shù)這列的最大值。
min(score):求分數(shù)這列的最小值。
用法和上述一樣,就不再贅述了。
再次強調:
null是不參與運算的。
可以使用ifnull(列名,默認值)給null設定一個默認值。
1分組查詢
group,分組的意思,關鍵單詞為group by。
①分男女組查詢平均分
根據性別gender分組查詢。
格式為:select+列名+from+表名+group by+列名
②根據特定條件分組查詢平均分
前面的學習也知道了,where后面專門是接查詢條件的,但是在分組查詢中一般用having代替,其放在group by后面。
2查詢語句執(zhí)行順序
用一個例子來說明執(zhí)行順序,如下圖:
①from+表名
這是第1步,表中的所有數(shù)據。
②where+指定條件
這是第2步,查詢出指定條件的數(shù)據。
其中起別名:as+別名
這是第2.5步,介于第1步和第2步之間。
所以where后不能接別名,因為別名都沒執(zhí)行。
③group by+列名
這是第3步,按照指定列名分組。
其中聚合函數(shù):avg(列名)
這是第3.5步,介于第3步和第4步之間。
所以分組不能接聚合函數(shù)。
④having+條件
這是第4步,所以having后的查詢條件,既可以有別名,也可以有聚合函數(shù)。
而where就不行,因為where執(zhí)行的太早了。
⑤select+查詢語句
這是第5步,查詢出對應的數(shù)據,也就是結果集。
⑥order by+列名+desc|asc
查詢語句是最后執(zhí)行的,所以也可以接別名。
面試題:where 和 having 的區(qū)別
having通常與group by結合使用。
where是在分組之前進行過濾的,having 是在分組之后進行過濾的。
having可以接聚合函數(shù)和別名,where都不可以,也就是說having查詢條件比where廣。
查詢時,如非必要,用where的效率更高。
為什么?
where先執(zhí)行,先將數(shù)據篩選之后會減少計算量。
后續(xù)再進行其他條件判斷,可以提高查詢效率。
對這幾天知識點做一個總結:
謝謝你的觀看。
如果可以的話,麻煩幫忙點個贊,謝謝你。