對關係表實施的運算
(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 數據庫.表名;