一.緒論
1.1關系模型
關系:一個關系對應一張表
元組:對應行
屬性:對應列
主碼:也稱碼鍵,某個屬性組,可以唯一確定一個元組,
域:屬性的取值范圍來自某個域,
例如,學生年齡屬性的域(15-28歲)
分量:元組中的一個屬性值,
關系模式:對關系的描述,
三.SQL陳述句
1.概述
1.1基本表
一個關系對應一個基本表,
一個或多個基本表對應一個存盤檔案,
1.2視圖
從一個或幾個基本表匯出的表,
資料庫中只存放視圖的定義而不存放資料,
視圖是一個虛表,
用戶可以再視圖上再定義視圖,
2.資料定義
2.1定義模式
2.1.1為用戶Z創建一個模式TEST,并在其中定義一個表TAB1,
CREATE SCHEMA TEST AUTHORIZATION Z
CREATE TABLE TAB1 (COL SAMLLINT,
COL2 INT,
COL3 CHAR(20)
2.1.2洗掉模式
DROP SCHEMA<模式名><CASCADE|RESTRICT>
前者:級聯,洗掉模式時把資料庫物件全部洗掉,
后者:限制,如果該模式中定義了下屬的資料庫物件,如表、視圖等,則拒絕該洗掉陳述句的執行,
2.2基本表定義
建立學生表
CREATE TABLE Student
(Sno CHAR(9) PRIMARY KEY,
Sname CHAR(20) UNIQUE,
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20)
);
建立課程表
CREATE TABLE Course
(Cno CHAR(4) PRIMARY KEY,
Cname CHAR(40) ,
Cpno CHAR(4).
FOREIGN KEY(Cpno) REFERENCES Course(Cno)
);
修改基本表
增加 入學時間列 型別為日期型
ALTER TABLE Student ADD S_entrance DATE;
建立索引
CREATE UNIQUE INDEX Stusno ON Student(Sno);
3.資料查詢
3.1消除取值重復的行 DISTINCT
SELECT DISTINCT Sno
FROM SC;
3.2查詢年齡不在20-23歲之間的學生姓名,系別,
SELECT Sname,Sdept
FROM Student
WHERE Sage NOT BETWEEN 20 AND 23;
3.3查詢所有姓劉學生的姓名、學號和性別
SELECT Sname,Sno,Ssex
FROM Student
WHERE Sname LIKE’劉%’;
查詢姓“歐陽”且全名為三個漢字的學生的姓名
SELECT Sname
FROM Student
WHERE Sname LIKE’歐陽_’;
3.4查詢所有有成績的學生學號
SELECT Sno
FROM SC
WHERE Grade IS NOT NULL;
3.5 AND優先級高于OR,可以用括號改變優先級
3.6查詢選修3號課程的學生的學號及其成績,結果按分數降序排列
SELECT Sno,Grade
FROM SC
WHERE Cno=‘3’
ORDER BY Grade DESC;
3.7聚集函式
COUNT(*):統計元組個數
COUNT(DISTINCT|ALL)統計一列中值的個數
SUM 一列值總和
AVG 一列值平均值
MAX MIN
3.8查詢選修了課程的學生人數
SELECT COUNT(DISTINCT SNO)
FROM SC;
3.9 GROUP BY子句分組
求各個課程號及相應的選課人數
SELECT Cno,COUNT(Cno)
FROM SC
ORDER BY Cno;
查詢選修了3門以上課程的學生學號
SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*)>3;
查詢平均成績大于等于90分的學生學號和平均成績
錯誤示例:
SELECT Sno,AVG(Grade)
FROM SC
WHERE AVG(Grade)>=90 WHERE子句中不能用聚集函式作為條件運算式
GROUP BY Sno;
正確
SELECT Sno,AVG(Grade)
FROM SC
GROUP BY Sno
HAVING AVG(Grade)>=90;
3.10二者區別
WHERE子句作用于基表或視圖,從中選擇滿足條件的元組
HAVING短語作用于組
3.11按系并區分男女統計各系學生的人數、并按照人數降序排列
SELECT Sdept,Ssex,Count(Sno)
FROM Student
GROUP BY Sdept,Ssex
ORDER BY COUNT(Sno) DESC;
4.連接查詢
4.1等值與非等值連接查詢
查詢選修2號課程且成績在90分以上的所有學生的學號和姓名
SELECT Student.Sno,Sname
FROM SC
WHERE Student.Sno=SC.Sno AND
SC.Cno=‘2’ AND SC.Grade>90;
4.2自身連接
需要給表起別名以示區別
屬性都是同名屬性,必須使用別名前綴
查詢每一門課的直接先修課的名稱
SELECT FIRST.Cname,SECOND.Cname
FROM Course FIRST,Course SECOND
WHERE FIRST.Cpno=SECOND.Cno;
4.3外連接
1 外連接以指定表為連接主體,將主體表中不滿足連接條件的元組一并輸出,
2 左外連接
列出左邊關系中所有的元組
3 右外連接同上
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM Student LEFT OUT JOIN SC ON
(Student.Sno=SC.Sno )
5.嵌套查詢
1 將一個查詢塊嵌套在另一個查詢塊的WHERE子句或HAVING短語的條件中查詢,
2 子查詢不能用ORDER BY
5.1帶有IN謂詞子查詢
查詢劉晨所在系
SELECT Sno,Sname,Sdept
FROM Student
WHERE Sdept IN
(SELECT Sdept
FROM Student
WHERE Sname='劉晨’);
5.2帶有比較運算子的子查詢
找出每個學生超過他選修課程平均成績的課程號
SELECT Sno,Cno
FROM SC x
WHERE Grade>=(SELECT AVG(Grade)
FROM SC x
WHERE y.Sno=x.Sno)
5.3帶有ANY(SOME)或ALL謂詞
1 使用ANY或ALL必須同時使用比較運算
5.4帶有EXISTS謂詞
只回傳邏輯真值,true或false,子查詢運算式用*表示,
查詢所有選修了1號課程的學生姓名
SELECT Sname
FROM Student
WHERE EXISTS
(SELECT*
FROM SC
WHERE Sno=Student.Sno AND Cno=‘1’)
6.集合查詢
并操作UNION
交操作INTERSECT
差操作EXCEPT
7.插入資料
1 插入元組
INSERT INTO Student
VALUES(‘20121516’,‘張三‘,’男‘,’18‘,’CS’);
2 插入子查詢結果
2.1對每一個系,求學生的平均年齡,并把結果存入資料庫,
第一步:建表
CREATE TABLE D
(Sdept CHAR(15)
Avg_age SMALLINT);
第二步:插入資料
INSERT INTO D(Sdept ,Avg_age)
SELECT Sdept,AVG(Sage)
FROM Student
GROUP BY Sdept;
8.修改陳述句
將所有學生年齡增加1歲,
UPDATE Student
SET Sage=Sage+1;
9.洗掉資料
DELETE FROM Student
WHERE Sno=‘201215128’;
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/258802.html
標籤:其他
下一篇:找大佬教教我關于編碼的東西
