數據庫查詢

對關係表實施的運算

(1)選擇運算

根據給定條件,從二維關係表中將制定的記錄挑選出來。

(2)投影運算

把二維關係中指定的列提取出來構成一張新表

(3)連接運算

 select 語句:用於數據查詢

一、基本查詢

1、選擇列--select語句

select 列名1,列名2...

from 表名;

select 學號,姓名,性別,出生日期

from xs;

select *from xs;

給指定列起別名

select 列名 as 別名,列名as 別名...

from 表名;

查詢計算列

select 姓名,總學分,總學分+10 as 提高後的總學分

from xs;

消除查詢結果中的重複行

selectdistinct 列名

from 表名;

替換查詢結果中的數據

select 學號,姓名,

case

when 總學分<50 then '不及格'

when 總學分>=50 and 總學分<60then '及格'

when 總學分>=60 then '優秀'

end as 等級

from xs;

使用聚合函數

selectmax(總學分),min(總學分)

from xs;

max(數值型列) 求這一列的最大值

min(數值型列) 求這一列的最小值

avg(數值型列) 求這一列的平均值

sum(數值型列) 求這一列的總和

count(*) 求的是表格中的記錄的行數

count(指定某一列) 求的是指定列不爲空的取值的個數(包括重複值)

count(distinct指定某一列) 指定列的取值去掉null值,去掉重複值後的記錄的個數

 

2、選擇運算---where子句

(1)關係表達式

>  >= <  <=  = <>(不等) !=   <=>(相等關係的比較)

select *

from xs

where 總學分>45;

select *from xs

where 備註<=>null;

select *from xs

where isnull;

或where is not null;

(2)邏輯表達式

select 學號,姓名,總學分

from xs

where 總學分>=40 and 總學分<=50;

select 學號,姓名,總學分

from xs

where 總學分<45 or 總學分>50;

and  &&

or   ||

not!

 

select 學號,姓名,總學分

from xs

wherenot(總學分>=40 and 總學分<=50);

 

select 學號,姓名,總學分

from xs

wherenot(學號='081101');或

select 學號,姓名,總學分

from xs

where !(學號='081101');

 

(3)betweenand

select 學號,姓名,總學分

from xs

where 總學分 between 45 and 50;

select 姓名,出生日期

from xs

where 出生日期 between '1989-01-01'and '1989-12-31';

select 姓名,出生日期

from xs

where 出生日期>'1989-01-01'and 出生日期<'1989-12-31';

 

(4)

select 姓名,總學分

from xs

where 總學分=38 or 總學分=40or 總學分=48;

select 姓名,總學分

from xs

where 總學分 in(38,40,48);

select 姓名,專業名,總學分

from xs

where 專業名='計算機'or 專業名='通信工程';

select 姓名,專業名,總學分

from xs

where 專業名 in('計算機','通信工程');

(5)模糊查詢like '模式匹配字符串'

在'模式匹配字符串'中可以:%任意個任意的字符  _一個任意的字符

select 學號,姓名,總學分

from xs

where 姓名 like '王%';

select 學號,姓名

from xs

where 學號 like '__11__';

select 姓名,專業名

from xs

where 姓名 like '%#_%' escape '#';//轉義字符

正則表達式

rlike '正則表達式的字符串'

或者 REGEXP'正則表達式的字符串'

select 學號,姓名,專業名

from xs

where 姓名 rlike '^王';

select 學號,姓名,專業名

from xs

where 姓名 rlike '林$';

rlike'.*'

rlike'^08.*08$'

rlike'a+'

rlike'[abc]'

rlike'[a-z]'

rlike'^[a-z]'

3、order by 對查詢結果進行相應的排序

不會影響原有的順序

select 列名1,列名2,...

from 表名

where 查詢條件

order by 列名1[,列名2,...]

 

select 學號,姓名,出生日期

from xs

order by 出生日期;

desc 降序   asc  升序

 

select 學號,課程號,成績

fromxs_kc

order by 課程號 asc,成績desc;

如果order by子句中的排序列有多個,先按第一個指定列排序,在第一個指定列的值相同的情況下,再按第二個指定列

進行排序。

如果排序列有多個,每一列中需指明是升序還是降序

4、limit子句:限制的是顯示的記錄的行數,一般是和order by子句一起用。

limit[位置量,]顯示記錄的行數

select 學號,課程號,成績

fromxs_kc

where 課程號='101'

order by 成績 desc;

limit5;//取前五條記錄

 

select 學號,課程號,成績

fromxs_kc

where 課程號='101'

order by 成績 desc

limit3,3;//前3表示位移量,從第四行記錄開始

 

二、高級查詢:多表連接查詢、子查詢、分組彙總

1、多表連接查詢

姓名,課程名,成績

xs   kc    xs_kc

 

(1) 全連接--不是標準呢的sql語句

select 列名1,列名2,...

from 表名1,表名2,...

where 表名1.列名=表名2.列名

查看:學生學號,姓名,選修的課程號,得分

      xs xs_kc xs    xs_kc      xs_kc

selectxs.學號,姓名,課程號,成績

fromxs,xs_kc

where xs.學號=xs_kc.學號;

 

查看:學號、課程號、課程名、學時

     xs_kc kc xs_kc   kc   kc

select 學號,xs_kc.課程號,課程名,學時

fromxs_kc,kc

wherexs_kc.課程號=kc.課程號;

 

查看:學生姓名,課程名,得分

      xs      kc     xs_kc

select 姓名,課程名,成績

fromxs,xs_kc,kc

where xs.學號=xs_kc.學號and kc.課程號=xs_kc.課程號;

 

(2)--標準的sql語句,推薦使用

內連接,外連接,自然連接,交叉連接

1)內連接:多個表通過連接條件中的共享列的值進行的比較連接

from 表名1[inner] join biao 表名2 on 連接條件

 

select 列名錶

from 表名1 join 表名2

on 連接條件

 

selectxs.學號,姓名,課程號,成績

from xsjoin xs_kc

using(學號)//on xs.學號=xs_kc.學號; using  共享

 

select 姓名,課程名,成績

from xsjoin xs_kc

on xs.學號=xs_kc.學號  

join kc

on xs_kc.課程號=kc.課程號;

 

2)外連接:包含來自一張表的所有記錄行和另一張的匹配記錄行

左外連接 from 表名1 left[outer] join 表名2 on 連接條件

右外連接 from 表名1 right[outer] join 表名2 on 連接條件

查詢:所有學生的學號,姓名以及他們所選課程的課程號,成績

          xs xs_kc  xs                    xs_kc    xs_kc

 

selectxs.學號,姓名,課程號,成績

from xsleft outer join xs_kc

on xs.學號=xs_kc.學號;

 

查詢:學生選修課程的信息(學號、課程號、課程名),還有沒有被學生選修的課程的情況

select 學號,xs_kc.課程號,課程名

fromxs_kc right outer join kc

on xs_kc.課程號=kc.課程號;

 

3)自然連接

 

naturaljoin 自然內連接

naturalleft join

naturalright join

 

selectxs.學號,姓名,課程號,成績

from xsnatural join xs_kc;

 

4)交叉連接--笛卡爾積

 

selectxs.學號,姓名,課程號,成績

from xscross join xs_kc

on xs.學號=xs_kc.學號;

 

2、嵌套查詢 :在一個select語句中又包含另一個select語句

 

子查詢一般都可以寫成多表的連接查詢

(1)子查詢

select 學號,課程名

fromxs_kc natural join kc

where 課程名='計算機基礎';

換一種思路:

 

select 學號

from xs_kc

where 課程號=(

       select 課程號

       from kc

       where 課程名='計算機基礎'

)

第一步:執行子查詢,101  只執行一次

第二步:執行外部查詢,外部查詢的查詢條件好似依賴與子查詢

查詢: 所有成績比平均成績高的學生的學號,課程號

 

select 學號,課程號

fromxs_kc

where 成績>(

       select avg(成績)

       from xs_kc

)

子查詢只做一次 75.2

 

 

(2)子查詢的結果不是單列單行,而是單列多行。

解決辦法:in

= ><  all或any子查詢的結果集

選修了206的課程的學生的姓名

 

xs:學號,姓名

xs_kc:學號,課程號

 

select 姓名

from xsjoin xs_kc

on xs.學號=xs_kc.學號

where 課程號='206';

 

select 姓名

from xs

where 學號 in (select 學號from xs_kc where 課程號='206');

先執行子查詢 ,也只執行一次

 

select 姓名

from xs

where 學號 not in (select 學號 from xs_kc where 課程號='206')

 

select 姓名

from xs

where 學號 = any (select 學號from xs_kc where 課程號='206');

 

select 姓名

from xs

where 學號 <>all (select 學號 from xs_kc where 課程號='206');

 

where 列名> all(子查詢)    (1,8,9) 列的取值>9  查找的是比最大值還要大的記錄行

<=all(子查詢) (1,8,9)   列的取值<=1  查找的是比最小值還要小的記錄行

>=all(子查詢)

<=all(子查詢)

=all(子查詢)

<>all(子查詢)

>any(子查詢) (1,8,9) 查找的是比最小值大的記錄行

<any(子查詢) (1,8,9) 查找的是比最大值小的記錄行

>any(子查詢)

<any(子查詢)

=any(子查詢)

<>any(子查詢) (1,8,9)

 

select 出生日期

from xs

where 專業名='計算機基礎';

 

select 學號,姓名,專業名,出生日期

from xs

where 出生日期< all(

select 出生日期

from xs

where 專業名='計算機'

);

 

select 學號,姓名,專業名,出生日期

from xs

where 出生日期> all(

select 出生日期

from xs

where 專業名='計算機'

);

 

(3) whereexists(子查詢)

如果子查詢的結果集是非空,該判定爲true,否則,該判定的false

 

查詢: 選修206課程的學生姓名

select 姓名

from xs

whereexists (select * from sx_kc where 學號=xs.學號 and 課程號='206');

 

selectcount(*)

from xs;

3.分組group by

默認按升序顯示分組的信息,可以使用desc來指明顯示分組信息按降序

select 專業名,count(*)

from xs

group by 專業名;//分組

 

查詢:每個學生的總成績

查詢:每門功課的平均分

 

select 學號,sum(成績)

fromxs_kc

group by 學號;

 

select 課程號,avg(成績)

fromxs_kc

group by 課程號;

 

select 課程號,學號,avg(成績)

fromxs_kc

group by 課程號;

 

帶有with rollup的分組彙總在原有的分組彙總的結果上又增加了彙總的信息。

select 專業名,性別,count(*)

from xs

group by 專業名,性別with rollup;

 

selectxs_kc.課程號,課程名,avg(成績)

from kcjoin xs_kc

on kc.課程號=xs_kc.課程號

group by 課程號;

 

having子句,having條件:對分組彙總的信息進行篩選

selectxs_kc.課程號,課程名,avg(成績)

from kcjoin xs_kc

on kc.課程號=xs_kc.課程號

group by 課程號

havingavg(成績)>77.0;

 

where子句

having子句

對錶中的記錄按where中設定的條件進行篩選,然後,進行分組彙總,最後用having對分組彙總的結果再進行篩選

 

出生時間是:1989-10以後出生的學生按專業分組,統計每個專業的學生人數,將人數>3人的信息顯示出來

select 專業名,count(*)

from xs

where 出生日期>'1989-10-01'

group by 專業名

havingcount(*)>3;

 

union

select 學號,姓名

from xs

where 專業名='計算機'

union

select 課程號,課程名

from kc

where 學分>4

order by1 desc

limit 5;

 

select 專業名,

 

引用一張表

(1)use數據庫

select...

from 表名;

(2)

select...

from 數據庫.表名;

發佈了42 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章