SQL-結構化查詢語言

數據庫語言分類:

根據功能不同,可以將數據庫系統提供的語言分成三種類型:1)數據定義語言(DDL),用於定義數據庫模式;2)數據操縱語言(DML),用於對數據庫進行查詢和更新;3)數據控制語言(DCL),用於對數據進行權限管理。

 

數據庫模式:

根據數據的不同抽象層次,數據庫有三級模式:物理模式(內模式)在物理層描述數據庫中全體存儲結構和存取方法,而邏輯模式(概念模式)則在邏輯層描述數據庫中全體數據的邏輯結構和特徵。在視圖層也可分爲若干模式,稱爲子模式(外模式),它描述了數據庫用戶能夠看見和使用的局部數據的邏輯結構和特徵。通常一個數據庫只有一個物理模式和一個邏輯模式,但是子模式有若干個。

事務:

事務是一系列的數據庫操作,是數據庫應用程序的基本單元,是反映現實世界需要以完整單位提交的一項工作。事務是用戶定義的一個數據庫操作序列。

事務的四個特徵:原子性、一致性、隔離性和持久性。

觸發器:

一個觸發器用來定義一個條件以及在該條件爲真時需要執行的動作。通常,觸發器的條件以斷言的形式定義。動作以過程的形式定義。

 

SQL執行優先級

( 8 ) SELECT ( 9 ) DISTINCT ( 11 ) < Top Num > < select list >
( 1 ) FROM [ left_table ]
( 3 ) < join_type > JOIN < right_table >
( 2 ) ON < join_condition >
( 4 ) WHERE < where_condition >
( 5 ) GROUP BY < group_by_list >
( 6 ) WITH < CUBE | RollUP >
( 7 ) HAVING < having_condition >
( 10 ) ORDER BY < order_by_list >

 

------------------------------------SQL練習解答---------------------------
CREATE TABLE STUDENT(
Sno VARCHAR(255) NOT NULL,
Sname VARCHAR(255),
Ssex VARCHAR(255),
Sage int,
Sdept VARCHAR(255)
)
SELECT * FROM STUDENT
INSERT INTO STUDENT (SNO,SNAME,SSEX,SAGE,SDEPT) VALUES ('9512101','李勇','男',19,'計算機系'),
('9512102','劉晨','男',20,'計算機系'),
('9512103','王敏','女',20,'計算機系'),
('9521101','張力','男',22,'信息系'),
('9521102','吳賓','女',21,'信息系'),
('9521103','張海','男',20,'信息系'),
('9531101','錢小力','女',18,'數學系'),
('9531102','王大力','男',19,'數學系')
CREATE TABLE COURSE(
CNO VARCHAR(255) NOT NULL PRIMARY KEY,
CNAME VARCHAR(255),
Hours INT
)
INSERT INTO COURSE (CNO,CNAME,Hours) VALUES ('C01','計算機文化學',70),
('C02','VB',90),
('C03','計算機網絡',80),
('C04','數據庫基礎',108),
('C05','高等數學',180),
('C06','數據結構',72)
select * from course
CREATE TABLE SC(
SNO VARCHAR(255),
CNO VARCHAR(255),
GRADE INT
)
INSERT INTO SC(SNO,CNO,GRADE) VALUES ('9512101','C01',90),
('9512101','C02',86),
('9512101','C06',NULL),
('9512102','C02',78),
('9512102','C04',66),
('9521102','C01',82),
('9521102','C02',75),
('9521102','C04',92),
('9521102','C05',50),
('9521103','C02',68),
('9521103','C06',NULL),
('9531101','C01',80),
('9531101','C05',95),
('9531102','C05',85)
select * from student
SELECT SNO,CNO,GRADE FROM SC WHERE GRADE BETWEEN 70 AND 80  查詢成績在70到80之間的學生號、課程號和成績

SELECT MAX(GRADE) FROM (SELECT * FROM SC WHERE CNO='C01')  查詢C01課程中成績最高的分數
with zuida as (select row_number() over(order by grade desc) as rowno,sc.* from sc) select * from zuida where rowno=1  當GRADE中沒有null時 可得出最大值

 

SELECT DISTINCT CNO FROM SC  查詢學生都選修了哪些課程 要求列出課程名、課程號

SELECT COURSE.CNAME,SC.CNO FROM COURSE INNER JOIN SC ON COURSE.CNO=SC.CNO 查詢學生都選修了哪些課程 要求列出課程名和課程號 有重複!  
SELECT COURSE.CNAME,SC.CNO FROM COURSE,SC WHERE COURSE.CNO=SC.CNO
select cname,cno from course where cno in (select distinct cno from sc)   人家的方法思路!


select AVG(GRADE),MAX(GRADE),MIN(GRADE) from sc where CNO='C02'  統計C02課程學生平均、最大、最小分數


select SDEPT,COUNT(*) from student where SDEPT IN (select DISTINCT(SDEPT) FROM STUDENT) GROUP BY SDEPT 統計每個系的人數


先where 再group by
SELECT COURSE.CNAME,A.* FROM (select cno,count(distinct sno),max(grade) from sc group by cno) AS A INNER JOIN COURSE ON A.CNO=COURSE.CNO  統計每門課程的修課人數和考試最高分
SELECT CNAME,COUNT(*),MAX(GRADE) FROM SC,COURSE WHERE SC.CNO IN (SELECT DISTINCT CNO FROM SC) AND COURSE.CNO=SC.CNO GROUP BY COURSE.CNAME 人家的思路!

 

SELECT STUDENT.SNAME,COUNT(CNO) NUMC FROM STUDENT,SC WHERE STUDENT.SNO=SC.SNO GROUP BY STUDENT.SNAME ORDER BY NUMC ASC 統計每個學生選課門數並按照門數遞增排序
SELECT STUDENT.SNAME,STUDENT.SNO,COUNT(SC.CNO) FROM STUDENT INNER JOIN SC ON STUDENT.SNO=SC.SNO GROUP BY STUDENT.SNAME,STUDENT.SNO ORDER BY COUNT(SC.CNO) ASC  其他思路!

 

SELECT COUNT(DISTINCT SNO),AVG(GRADE) FROM SC  統計選修課的學生總數和考試的平均成績    WITH AS 必須加括號!


WITH A AS (SELECT SNO,COUNT(SC.CNO) NUMC,AVG(GRADE) AVG_GRADE FROM SC GROUP BY SNO) SELECT STUDENT.SNAME,A.* FROM A INNER JOIN STUDENT ON A.SNO=STUDENT.SNO WHERE NUMC>1  查詢選課門數超過2門的學生平均成績和選課門數
SELECT STUDENT.SNAME,AVG(SC.GRADE),COUNT(SC.CNO) FROM SC INNER JOIN STUDENT ON SC.SNO=STUDENT.SNO INNER JOIN COURSE ON SC.CNO=COURSE.CNO GROUP BY STUDENT.SNAME HAVING COUNT(DISTINCT COURSE.CNO)>1  別人的思路!

 

select sno,sum(grade) from sc group by sno having sum(grade)>200 查詢總成績超過200分的學生


with A as (select SNO from sc where CNO='C02') select student.SNAME,student.SDEPT from student,A where student.SNO=A.SNO 查詢選修了C02號課程的學生姓名和所在系
SELECT SNAME,SDEPT,SC.CNO FROM STUDENT INNER JOIN SC ON STUDENT.SNO=SC.SNO WHERE SC.CNO='C02'

 

SELECT STUDENT.SNAME,SC.CNO,SC.GRADE FROM STUDENT INNER JOIN SC ON STUDENT.SNO=SC.SNO WHERE SC.GRADE>80 ORDER BY SC.GRADE DESC 查詢成績80分以上的學生姓名、課程號、成績,並按成績降序排列結果

 

查詢計算機系修了數據庫基礎的學生姓名、性別、成績
WITH A AS (SELECT SC.SNO,SC.GRADE FROM SC INNER JOIN (SELECT CNO CNO2 FROM COURSE WHERE COURSE.CNAME='數據庫基礎') ON SC.CNO=CNO2)   SELECT STUDENT.SNAME,STUDENT.SSEX,A.GRADE FROM STUDENT INNER JOIN A ON STUDENT.SNO=A.SNO WHERE STUDENT.SDEPT='計算機系'

查詢哪些學生的年齡相同,要求列出年齡相同的學生姓名和年齡  答案很巧妙啊!
SELECT A.SNAME,A.SAGE FROM STUDENT A WHERE A.SAGE IN
(SELECT A.SAGE FROM STUDENT A,STUDENT B WHERE A.SAGE=B.SAGE AND A.SNAME!=B.SNAME) ORDER BY A.SAGE

SELECT A.CNO,A.CNAME FROM COURSE A WHERE A.CNO NOT IN (SELECT DISTINCT SC.CNO FROM SC)  查詢哪些課程沒有人選,列出課程號和課程名


查詢有考試成績的所有學生姓名,課程名,成績  精妙!
SELECT STUDENT.SNAME,COURSE.CNAME,SC.GRADE FROM STUDENT,COURSE,SC WHERE SC.GRADE IS NOT NULL AND STUDENT.SNO=SC.SNO AND COURSE.CNO=SC.CNO


分別查詢計算機系和信息系的學生姓名,性別,修課名稱,修課成績
SELECT '計算機系',STUDENT.SNAME,STUDENT.SSEX,COURSE.CNAME,SC.GRADE FROM STUDENT,COURSE,SC WHERE STUDENT.SDEPT='計算機系' AND STUDENT.SNO=SC.SNO AND COURSE.CNO=SC.CNO
UNION SELECT '信息系',STUDENT.SNAME,STUDENT.SSEX,COURSE.CNAME,SC.GRADE FROM STUDENT,COURSE,SC WHERE STUDENT.SDEPT='信息系' AND STUDENT.SNO=SC.SNO AND COURSE.CNO=SC.CNO
第二種方法 : SELECT '計算機系',STUDENT.SNAME,STUDENT.SSEX,COURSE.CNAME,SC.GRADE FROM SC INNER JOIN STUDENT ON SC.SNO=STUDENT.SNO INNER JOIN COURSE ON SC.CNO=COURSE.CNO WHERE STUDENT.SDEPT='計算機系'


查詢選修了c01課程的學生姓名和所在系
SELECT A.SNAME,A.SDEPT FROM STUDENT AS A WHERE A.SNO IN (SELECT SNO FROM SC WHERE CNO='C01')

查詢數學系成績80分以上的學生的學號姓名!!  兩個條件同時滿足
SELECT STUDENT.SNO,STUDENT.SNAME FROM STUDENT WHERE STUDENT.SNO IN (SELECT SNO FROM STUDENT WHERE SDEPT='數學系') AND STUDENT.SNO IN (SELECT SNO FROM SC WHERE SC.GRADE>80)

查詢計算機系學生所選課程名
with A as (select distinct cno from sc where sno in (SELECT STUDENT.SNO FROM STUDENT WHERE STUDENT.SDEPT='計算機系')) select course.CNAME from course,A where course.CNO=A.cno

查詢計算機系的成績80分以上的修課情況
select A.sno,student.SNAME,A.cno,course.CNAME,A.grade from sc as A,student,course where A.SNO in (select distinct sno from student where sdept='計算機系') and A.GRADE>80 and A.SNO=student.SNO and A.CNO=course.CNO

DELETE FROM SC WHERE GRADE<50 OR GRADE IS NULL  刪除修課成績小於50的學生記錄
UPDATE SC SET GRADE=GRADE+10 WHERE CNO='C01'  修了c01課程的加10分

 

 



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