SQL功能極強,因爲其巧妙的設計,完成核心功能只須要9個動詞。sql
SQL功能 | 動詞 |
數據查詢 | select |
數據定義 | create(建立,)drop(刪除),alter(改變) |
數據操縱 | insert(插入 )update(更新) delete(刪除) |
數據控制 | grant(受權)revoke(取消受權) |
關係數據庫系統支持三級模式結構,其模式、外模式和內模式中的基本對象有模式,表,視圖和索引等,所以SQL的數據定義功能包括模式定義、表定義、視圖和索引定義.SQL數據定義語句以下表:數據庫
操做對象/操做方式 | 建立 | 刪除 | 修改 |
模式 | create schema | drop schema | |
表 | create table | drop table | alter table |
視圖 | create view | drop view | |
索引 | create index | drop index | alter index |
咱們定義三個表 學生表:Student(Sno,Sname,Ssex,Sage,Sdept) 課程表:Course(Cno,Cname,Cpno,Ccredit)函數
學生選課表:SC(Sno,Cno,Grade)spa
學生表:Student設計
CREATE TABLE Student (Sno CHAR(9) PRIMARY KEY,/*列級完整性約束條件,Sno是主碼*/ Sname CHAR(20)UNIQUE, /*Sname 取惟一的值*/ Ssex CHAR(20), Sage SMALLINT, Sdept CHAR(20) );
課程表:Coursecode
CREATE TABLE Course (Cno CHAR(4) PRIMARY KEY, Cname CHAR(40) NOT NULL, Cpno CHAR(4), Ccredit SMALLINT, FOREIGN KEY(Cpno) REFERENCES Course(Cno) /*表級完整性約束條件,Cpno是外碼,被參照表是Course,被參照表是Cno*/ );
選課表SC對象
CREATE TABLE SC (Sno CHAR(9), Cno CHAR(4), Grade SMALLINT, PRIMARY KEY(Sno,Cno), FOREIGN KEY(Sno)REFERENCES Student(Sno), FOREIGN KEY(Cno)REFERENCES Course(Cno) );
而後會創建三個表 :以下排序
接下來插入數據:索引
insert into Student(Sno,Sname,Ssex,Sage,Sdept) values('201215121','李勇','男',20,'CS');
按上述方式插入全部的數據:以下:數學
數據的查詢:
查詢條件 | 謂詞 |
比較 | =,>,<,<=,!=,!>,<>,NOT+上述比較運算符 |
肯定範圍 | beetween and ,not between (上限)and(下線) |
肯定集合 | IN, NOT IN |
字符匹配 | like,not like |
空值 | IS NULL,IS NOT NULL |
多重條件(邏輯運算) | AND,OR,NOT |
列如:查詢既不是計算機,數學系,也不是信息系的學生的姓名和性別。
select Sname,Ssex from Student where Sdept NOT IN('CS','MA','IS');
order by子句對查詢結果按照一個或者多個屬性列升序(ASC)降序(DESC)排列,默認爲升序。
查詢全體學生,查詢結果在同一系號升序,同一系按年齡降序。
select * from student order by Sdept,Sage DESC;
彙集函數
COUNT(*) | 統計元組個數 |
COUNT([DISTINCT|ALL]<列明>) | 統計一列中值的個數 |
SUM([DISTINCT|ALL]<列明>) | 計算一列中的和(必須爲數值型) |
AVG([DISTINCT|ALL]<列明>) | 計算平均值(數值型) |
MAX([DISTINCT|ALL]<列明>) | 最大 |
MIN([DISTINCT|ALL]<列明>) | 最小 |
GROUP BY(group by)將查詢結果分組。分組後的彙集函數(只能用於select子句或者group by中的having)做用於每一個組,每組由一個函數值。
查詢成績大於90分的學號和平均成績:
select Sno,AVG(Grade) from SC group by Sno having AVG(Grade)>=90;
鏈接查詢:
查詢每門課的間接先修課。要對Course表取兩個別名。
select FIRST.Cno,SECOND.Cpno from Course FIRST,Course SECOND where First.Cpno=SECOND.Cno;
嵌套查詢:
列如:
select Sname from Student where Sno IN (select Sno from SC where Cno='2');
子查詢select中不能使用order by子句,order by只對最終結果排序。
若是子查詢的查詢條件依賴於父查詢,這類查詢稱爲相關子查詢。
找出每一個學生中比他選修課平均成績高的課程號:
select Sno from SC x where Grade>=(select AVG(Grade) from SC y where y.Sno=x.Sno );
從外層查詢中取出一個元組x,將元組x的Sno值傳送給內層查詢,執行內層查詢獲得成績的平均值,用該值代替內層查詢獲得外層查詢。
列題:查詢非計算機科學系中比計算機科學系中任意一個學生小的學生姓名和Sage。
select Sname,Sage from student where Sage<any(select Sage from Student where Sdept='CS') AND Sdept!='CS';
any | 大於查詢結果中的某個值 >= <= != 等均可以。 |
all | 大於查詢結果中的全部值 >= <= != 等均可以。 |
本查詢也能夠用聚焦函數實現。首先用子查詢查出CS中最大年齡(20),而後在父類查詢中查詢非CS系小於20的學生。
select Sname,Sage from Student where Sage< (select MAX(Sage) from Student where Sdeot='CS') AND Sdept!='CS';
帶有EXISTS謂詞的子查詢不返回任何數據,只產生邏輯真值true或者假false。
列如:選修了一號課程的學生姓名。
select Sname from Student where EXISTS (select * from SC where Sno=Student.Sno AND Cno='1');
集合運算:
並操做UNION 交操做INTERSECT 差操做EXCEPT
列如查詢計算機科學系的學生及年齡不大於19歲的學生。
select * from Student where Sdept='CS' UNION select * from Student where Sage<10;
查詢計算機科學系的學生與年齡不大於19歲學生的交集。(也就是查詢計算機科學系中年齡不大於19歲的學生。)
select * from Student where Sdept='CS' INTERSERT select* FROM Student where Sage<=19;
參考書籍:數據庫系統概論