mysql中如何進行查詢?下面本篇文章給大家總結分享15個mysql中常用的查詢子句,值得收藏,希望對大家有所幫助!
對于數據分析,MySQL多采用查詢,如數據的排序、分組、去重、匯總、字符串匹配等。如果查詢的數據涉及多個表,則需要連接這些表。本文將談談MySQL中常用的查詢子句,共15個。【相關推薦:mysql視頻教程】
*1、 *排序:order by
排序是通過順序實現的,例如,從stuinfo表中查詢數據并按年齡排序。sql語句是:
select?*?from?stuinfo?order?by?age;
查詢結果:
可以看到,查詢結果是按照年齡進行升序排列的,如果要實現降序排列,只需要在后面加上desc即可,sql語句為:
select?*?from?stuinfo?order?by?age?desc;
查詢結果:
此時的查詢結果按照年齡降序排列。
以上是針對數值型數據排序,如果是字符串,也可以用order by進行排序,例如,按照姓名排序,sql語句為:
select?*?from?stuinfo?order?by?stuname;
查詢結果:
從上面可以看到,字符串排序其實是按照首字母進行升序排列,當然還可以對日期進行排序,請自行思考。
*2、 *分組:group by
分組通過group by子句實現,例如,按照性別分組,sql語句為。
select?gender,count(*)?from?stuinfo?group?by?gender;
查詢結果:
以上sql語句按照性別分組,并給出每組的人數,按照其他字段分組也是類似的。
*3、 *去重:distinct
去重是數據處理中常見的操作,通過distinct子句實現,例如查詢學員所在的所有城市,這就需要去重,因為有些學員在同一個城市。
sql語句為:
select?distinct?city?from?stuinfo;
查詢結果:
可以看到,去重就是在去重字段前加上distinct即可。
*4、 *空值:is NULL/is not null
空值就是判斷某個字段為空或者不為空的記錄,例如,查詢城市為空的記錄,sql語句為:
select?*?from?stuinfo?where?city?is?null;
查詢結果:
可以看到,查詢為空的記錄其實就是where條件后跟is null。
反過來,如果查詢城市不為空的記錄,跟上is not null即可,sql語句為:
select?*?from?stuinfo?where?city?is?not?null;
查詢結果:
*5、 *匯總:計數、最值、求和、均值
匯總其實就是計數、求最大值/最小值、求和、求均值等。
最常用的統計表中有多少記錄,通過count實現,sql語句為:
select?count(*)?from?stuinfo;
查詢表中某個字段的最大值/最小值,通過max/min實現,例如查詢最大年齡,sql語句為:
select?max(age)?from?stuinfo;
查詢結果:
接下來的一個問題:查詢年齡最大的學員的姓名,sql語句怎么寫?
這是一個條件查詢,條件就是年齡要等于最大的年齡,按照這個思路,寫出sql語句:
select?stuname,age?from?stuinfo?where?age=(select?max(age)?from?stuinfo);
查詢結果:
從上面可以看到,其實是把最大的年齡查詢出來作為條件,再查詢對應的姓名和年齡。
留個思考題: 如何查詢年齡最小的學員姓名?
求和,用sum即可,一定是對數值型數據求和,跟count類似,這樣不做演示。
最后是均值,用avg,例如,查詢所有學員的平均年齡,sql語句為:
select?avg(age)?from?stuinfo;
查詢結果:
*6、 *別名:as
別名,就是as,意為用作,例如,查詢出年齡的最大值、最小值和均值,sql語句為:
select?max(age),min(age),avg(age)?from?stuinfo;
查詢結果:
這樣顯示字段名不太好看,我們可以用as起一個別名,sql語句為:
select?max(age)?as?age_max,min(age)?as?age_min,avg(age)?as?age_avg?from?stuinfo;
查詢結果:
*7、 *表的連接
當要查詢的記錄涉及兩個或者兩個以上的表時,就需要表的連接。
表的連接有三種:內連接、左連接和右連接。
(1)內連接:inner join
內連接相當于兩個表的交集,如下圖所示。
例如,有兩個表:學員信息表和成績表,有一個共同的列:學號。
現在想查詢出每個學員的姓名和成績,查詢結果如下圖所示。
以上查詢結果中的姓名需要從第一個表中提取,成績需要從第二個表中提取,這叫表的連接。
因為學號是共同的列,所以根據學號連接,以上的這種連接方式是獲取兩個表中學號相同的記錄,叫作內連接。
具體的sql語句為:
select?sname,score?fromtb1?inner?join?tb2?on?tb1.sid=tb2.sid;
查詢結果:
需要注意的是,連接條件用on。
(2)左連接:left join
左連接是以左表為基準,去匹配右表中的記錄,如果右表中沒有對應匹配記錄則為空。
左連接用集合中的文氏圖表示如下。
還是用以上提到的學員信息表和成績表,左連接的示意圖如下。
左連接的sql語句為:
select?sname,score?fromtb1?left?join?tb2?on?tb1.sid=tb2.sid;
查詢結果:
(3)右連接:right join
右連接是以右表為基準,去匹配左表中的記錄,如果左表中沒有對應匹配記錄則為空。
右連接用集合中的文氏圖表示如下。
還是用以上提到的學員信息表和成績表,右連接的示意圖如下。
右連接的sql語句為:
select?sname,score?fromtb1?right?join?tb2?on?tb1.sid=tb2.sid;
查詢結果:
*8、 *字符串匹配:like
有時候在字符串查找時,需要查找符合某個匹配模式的字符串。
例如,在表stuinfo中,查找城市中含有字符串‘an’的記錄,sql語句為:
select?*?from?stuinfo?where?city?like?'%an%';
注意:匹配模式中的%表示匹配任意長度的任意字符串。
*9、 *集合:in
查找屬于某個集合的記錄用in。
例如,查找城市為北京或者天津的記錄,sql語句為:
select?*?from?stuinfo?where?city?in('Beijing','Tianjin');
查詢結果:
*10、 *條件語句:having
這里說的條件語句是having,跟where類似,但是一般和統計函數連用。
比如,查找平均年齡小于25歲的城市,sql語句為:
select?city?from?stuinfo?group?by?city?having?avg(age)<p>查詢結果:</p><p><img src="https://img.php.cn/upload/image/897/826/935/1639991958380427.png" title="1639991958380427.png" alt="25.png"></p><p>以上sql語句先按照城市分組,再跟條件語句having。</p><p>*<strong>11、</strong> *<strong>區間查找:between and</strong></p><p>between and用于查找符合某個區間(包含兩個邊界的值)的記錄。</p><p>例如,查找年齡介于20到30歲之間的記錄,sql語句為:</p><pre class="brush:sql;toolbar:false;">select?*?from?stuinfo?having?age?between?20?and?30;
查詢結果:
*12、 *聯結:union
聯結,也叫聯合,用于連接兩個查詢的結果,并且去重。
例如,兩個表中都有學號,用sql語句分別從這兩個表中查詢出學號,然后聯結。
select?sid?from?tb1unionselect?sid?from?tb2;
查詢結果:
以上sql語句相當于將兩個select語句的查詢結果用union合并,并且是去重合并。
如果不想去重,用union all即可,sql如下。
select?sid?from?tb1union?allselect?sid?from?tb2;
查詢結果:
*13、 *日期格式化:date_format
在SQL中,對于日期時間的處理也是很常見的問題。
例如,按照年份、月份或者日期等對數據進行分組匯總,就需要從日期時間中提取年份、月份及日期等。
舉個例子,獲取每個學員的出生年份,sql語句為:
select?date_format(birthdate,'%Y')?as?birth_year?from?stuinfo;
查詢結果:
獲取出生月份也是如此,只是參數用’%m’,sql語句為:
select?date_format(birthdate,'%m')?as?birth_year?from?stuinfo;
查詢結果:
獲取到年份、月份后,就可以按照年份、月份進行分組查詢統計了。
*14、 *條件分支:case語句
條件分支是數據統計中的一個很重要的應用,在MySQL中用case語句表達條件分支,case語句有以下兩種用法。
用法一:
例如,根據學員所處的城市,將記錄標記為一線城市及其他,sql語句為:
select?distinct?city, ??case?city ????when?'Beijing'?then?'一線城市' ????when?'Shanghai'?then?'一線城市' ????else?'其他'?end?as?city_level from?stuinfo;
查詢結果:
從上面看到,case后面跟的是要判斷的字段,when后跟的是不同的情況,then則是不同情況對應的類別,最后的else表示其他情況。
整個case語句相當于給原來的表增加一個字段:city_level,然后我們可以根據這個字段進行分組查詢。
用法二:
例如,根據學員的年齡進行分層,青年、中年及其他,sql語句為:
select?stuname,age, ??case?when?age=30?and?age<p>查詢結果:</p><p><img src="https://img.php.cn/upload/image/491/448/684/1639992030710211.png" title="1639992030710211.png" alt="32.png"><a href="https://www.php.cn/course/list/51.html" target="_blank" textvalue="mysql視頻教程">mysql視頻教程</a></p><p>從上面可以看到,case后面跟的是條件when,即年齡滿足什么條件時,將其劃分到對應的類別,最后的else表示其他情況。</p><p>整個case語句相當于給原來的表增加一個字段:age_level,然后我們可以根據這個字段進行分組查詢。</p><p>*<strong>15、</strong> *<strong>變量</strong></p><p>最后,談談MySQL中的變量,當然,MySQL中的變量有好幾種類型,這里只說用戶變量,像@var這種。</p><p>例如,我們希望根據學員的年齡計算出每個人到35歲還有幾年,這里可以定義一個變量并賦值為35,然后利用這個變量減去年齡就得到結果。</p><p>首先,定義變量var,sql語句為:</p><pre class="brush:sql;toolbar:false;">set?@var:=35;
接著,使用這個變量,sql語句為:
select?@var-age?as?age_gap?from?stuinfo;
查詢結果:
當然,關于變量還有很多更復雜的用法,多用于計算連續登陸天數這種問題或者存儲過程中。
更多編程相關知識,請訪問:mysql視頻教程!!