MYSQL-----數據查詢(續)

3.使用集合函數查詢。經常和group by連用

1)sum() 字段值的總和

sum只能進行數值類型的計算,int,float,double,decimal類型等,如果計算字符類型字段時,結果均爲0.
eg:select num ,sum(score) from grade where num=’1001’;//學號爲1001學生的總成績

2)avg() 字段值的平均值

eg:select num ,avg(score) from grade where num=’1001’;//學號爲1001學生的平均成績

3)count() 記錄的條數

eg: select depart_id ,count(*) from employee group by depart_id;//查看每個部門的人數

4)min() 字段的最小值

eg:select course,min(score) from grade group by course;//計算每門課程最低成績
用法和max()類似。

5)max() 字段的最大值

eg:select course,max(score) from grade group by course;//計算每門課程最高成績
如果按照班級和科目兩個字段分組,可以查詢不同班級的不同科目最高成績
max()不僅適合數值也適合字符型,使用字符的ASCLL值來計算,當第一個值相等時,繼續往下比較第二個字符,直到比較出結果。

4.使用連接查詢

連接查詢:
將兩個或兩個以上的表按某個條件連接起來,從中選取需要的數據。
連接查詢是同時查詢兩個或兩個以上的表使用的。當不同的表中存在相同意義的字段時,可以通過該字段連接這幾個表。

1)內連接查詢

內連接查詢是一種最常用的連接查詢,可以查詢兩個或兩個以上的表,當兩個表中存在相同意義的字段時,可以通過該字段連接這兩個表。只有當該字段的值相等時,纔可查出該記錄。
相同意義的字段可以是父表的主鍵和子表的外鍵。
eg:select num,sex,age from employee,department where department.depart_id=employee.employ_id;

2)外連接查詢
內連接查詢是一種最常用的連接查詢,可以查詢兩個或兩個以上的表,當兩個表中存在相同意義的字段時,可以通過該字段連接這兩個表。
當該字段的值相等時,可查出該記錄。字段的值不等時,也可查出該記錄。
外連接查詢包括左連接查詢(LEFT)和右連接(RIGHT)查詢。

select 屬性名列表(來自不同表的屬性)
from 表名1 LEFT | RIGHT JOIN 表名2
on 表名1.屬性1=表名2.屬性2;

a)在進行左連接時,可以查詢出表1的所有記錄,而只能查詢出表2匹配的記錄。
b)在進行右連接時,可以查詢出表2的所有記錄,而只能查詢出表1匹配的記錄。

3)複合條件連接查詢
在連接查詢時,可以增加其他的限制條件。通過多個條件的複合查詢,可以使查詢結果更加準確。
如在將employee表和 department連接查詢時,可以添加age>24或 order by grade asc等限制條件。

eg:select num,sex,age from employee,department where department.depart_id=employee.employ_id and age>24;

一般使用內連接比較多,使用外連接的頻率很小,通常在進行連接查詢時,會加一定的限制條件來查詢滿足條件的記錄。

5 .子查詢
子查詢是將一個查詢語句嵌套在另一個查詢語句中。內層語句的查詢結果可以爲外層查詢語句提供查詢條件。
在特定情況下,一個查詢語句的條件需要另一個查詢語句來獲取。通過子查詢可以實現多表之間的查詢。
子查詢包括in,not in,any,all,exists,not exists 等關鍵字,包括比較運算符,如= ,!=,< , >;

1)帶In關鍵字的子查詢
一個查詢語句的條件可能落在另一個查詢語句查詢結果中,這個可以用IN關鍵字來判斷。
比如要查詢哪些同學選擇了計算機系開設的課程,可以先查詢出計算機系開設的課程,再查詢學生所選的課程在查詢的課程的記錄。
eg: select * from Stu where courseid in (select courseid from course);

2)帶比較運算符的子查詢
比較運算符包括= ,!=(<>),< , >,>=,<=;在子查詢時使用特別廣泛。如查詢分數,價格,年齡,收入等。
eg:從computer_stu中查詢獲得一等獎的學生的學號,姓名,成績。一等獎學金的最低分爲90.
select id,name,score from compture_stu where score>=(select score from scholarship where level=1)

3)帶exists關鍵字的子查詢。
exists關鍵字表示存在,使用exists關鍵字時,內層查詢語句不返回查詢的記錄,而是返回真假值,
如果內層查詢語句查詢到滿足條件的記錄,返回一個true,否則返回false.
當返回值爲true時,外層查詢語句將進行查詢,當返回值爲tfalse時,外層查詢語句不進行查詢或者查詢不出任何記錄。
查詢員工表中是否存在id爲1001的僱員姓名。
eg: select * from employee where exists (select name from employee where id=1001);
exists關鍵字可以與其他的查詢條件一起使用,條件表達式與exists之間用and 或 or來連接。

3)帶any關鍵字的子查詢。
表示滿足其中任一條件,使用any關鍵字時,只要滿足內層查詢語句的任何一個,即可通過該條件來執行外層查詢語句。
比如,需要查詢哪些同學能獲得獎學金,必須從獎學金錶中查詢出各種獎學金的最低分,
只要一個同學的成績高於不同獎學金分數最低的任何一個即可獲得獎學金。
any通常和比較運算符一起使用,>any表示大於任何一個值,=表示等於任何一個值。
eg: select * from compture_stu where score >=any(select score from scholar);

4)帶all關鍵字的子查詢
表示滿足所有條件,只要滿足內層查詢語句返回的所有結果,即可通過該條件來執行外層查詢語句。

       >all 大於所有值    <all小於所有值

比如,需要查詢哪些同學能獲得一等獎學金,必須從獎學金錶中查詢出各種獎學金的最低分,
只要一個同學的成績高於所有不同獎學金分數最低即可獲得一等獎學金。
eg: select * from compture_stu where score >=all(select score from scholar);

6.合併查詢結果
將多個select語句查詢結果合併在一起顯示。
使用關鍵字 union 可將多個select語句查詢結果合併之後消除重複的記錄顯示。
而使用關鍵字 union all 只是將多個select語句查詢結果簡單進行合併,而不取消重複記錄。
eg:
select 語句1 union | union all select 語句2 union | union all…..語句n;

7.爲表和字段取別名

1)爲表取別名
當表的名稱特別長時,在查詢中直接使用表名很不方便,這時可以爲表取一個別名,用這個別名來代替表的名稱。
在爲表取別名的時候必須保證該名稱不與數據庫中的其他表名相同。
eg: 表名 表的別名
select * from department d where id=1;
以後查詢該表的時候就可以直接用表名d了。
select * from d where id=2;

2)爲字段取別名
當需要更直觀的名字來表示這一列時,我們需要爲字段取個別名。
屬性名 [as] 別名
as關鍵字可有可無,實現的作用都是一樣的。
爲字段取名必須保證該表中沒有其他字段與該別名相同,
而且字段的別名只是在顯示的時候代替原來的字段名,在查詢條件中是不能使用別名的,否則數據庫系統會報錯。
select id as depart_id ,name as depart_name from department;
如果下次查詢如:
select depart_id,depart_name from department;//系統報錯

8.正則表達式查詢
正則表達式查詢:利用某種模式去匹配一類字符串的一個方式。比通配字符查詢的能力更強大,更加靈活。
正則表達式的模式字符:

1.使用REGEXP關鍵字,基本用法形式:
屬性名 REGEXP ‘匹配方式’
匹配方式中有很多模式匹配的字符,分別表示不同的意思。

1)查詢以特定字符或字符串開頭的記錄。
eg:select * from employee where name REGEXP ‘^L’;//以L開頭的。
eg:select * from employee where name REGEXP ‘^Lily’;//以Lily開頭的。

2)查詢以特定字符或字符串結尾的記錄。
eg:select * from employee where name REGEXP ‘L;//Leg:selectfromemployeewherenameREGEXPLily ’; //以Lily結尾的。

3)用符號‘.’來代替字符串中任意一個字符。兩個點則可以代表任意兩個字符。
eg:select * from employee where name REGEXP ‘^L..y$’;//以L開頭,以Y結尾,中間隔兩個任意字符。

4)匹配指定字符中的任意一個。使用方括號[]可將查詢字符組成字符集。
eg:select * from employee where name REGEXP ‘[abc]’;
從表的name字段可查出包含任意一個含有a,b,c的記錄。
使用方括號也可以指定集合的區間,[a-z]包含小寫字母 [0-9]包含數字0-9 [a-z0-9]包含所有的小寫字母和數字

5)匹配指定字符以外的字符 [^字符集合]
eg:select * from employee where name REGEXP ‘[^abc]’;查詢name字段不包含abc字符的記錄

6)匹配指定字符串,指定多個字符串時,需要用該符號‘|’隔開。字符串不能與該符號之間有空格。
eg:select * from employee where name REGEXP ‘ic|oc|ac’;查詢name字段包含ic,oc,ac任意一個字符串的記錄

7)使用*和+來匹配多個字符
正則表達式中,和+都可以匹配多個該符號之前的字符,但是+至少表示一個字符,而至少可以表示0個字符。
eg:
查詢的是c之前有0個或多個a出現的記錄。c和a是連續的,如jack
select * from employee where name REGEXP ‘a*c’;
查詢的是c之前至少出現過一個a的記錄,c和a是連續的,如jack.
eg:select * from employee where name REGEXP ‘a+c’;

8)使用{M}{M,N}來制定字符串連續出現的次數。
{M}表示字符串至少連續出現M次
{M,N}表示字符串至少連續出現M次,最多連續出現N次。
eg:select * from employee where name REGEXP ‘a{M}’;//name字段中a連續出現M次的記錄。
eg:select * from employee where name REGEXP ‘ac{M,N}’;//name字段中ac連續出現至少M次,最多N次的記錄。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章