要期末考试了。
学校对数据库学习的安排SQL占了很大的一部分,实验课也全是SQL查询,足以说明SQL的重要性。
老师说SQL只考最基本的内容,只要实验课上的代码都没问题那考试也就没问题。
所以我现在根据我保存下来的实验课代码来进行复习,把各种不熟悉的知识点都过一遍,也留做以后重拾SQL的资料。
--CREATE DATABASE TEXTBOOK;
USE TEXTBOOK;
CREATE TABLE T_STUDENT(
NO_ID SMALLINT PRIMARY KEY,
AGE SMALLINT NOT NULL,
SEX CHAR(2) NOT NULL,
DEPT CHAR(20) NOT NULL
);
CREATE TABLE T_PRESS(
NO_ID SMALLINT PRIMARY KEY,
P_NAME CHAR(20) NOT NULL,
P_ADDRESS CHAR(40) NOT NULL
);
CREATE TABLE T_TEXTBOOK(
NO_ID SMALLINT PRIMARY KEY,
TITLE CHAR(20) NOT NULL,
PRESS_NO SMALLINT NOT NULL,
PRICE SMALLINT CHECK(PRICE >= 0) NOT NULL,
FOREIGN KEY(PRESS_NO) REFERENCES T_PRESS(NO_ID)
);
CREATE TABLE T_BUY(
S_NO SMALLINT,
B_NO SMALLINT,
AMOUNT SMALLINT CHECK(AMOUNT >= 0) NOT NULL,
PRIMARY KEY (S_NO, B_NO),
FOREIGN KEY (S_NO) REFERENCES T_STUDENT(NO_ID),
FOREIGN KEY (B_NO) REFERENCES T_TEXTBOOK(NO_ID)
);
USE TEXTBOOK
GO
SELECT NAME
FROM T_STUDENT
WHERE T_STUDENT.NO_ID IN (
SELECT S_NO
FROM T_BUY
WHERE B_NO IN (
SELECT NO_ID
FROM T_TEXTBOOK
WHERE PRESS_NO IN (
SELECT NO_ID
FROM T_PRESS
WHERE P_NAME = '高教出版社'
)
)
)
USE TEXTBOOK
GO
SELECT T_STUDENT.NAME
FROM T_STUDENT, T_PRESS, T_BUY, T_TEXTBOOK
WHERE
T_STUDENT.NO_ID = T_BUY.S_NO AND
T_TEXTBOOK.NO_ID = T_BUY.B_NO AND
T_TEXTBOOK.PRESS_NO = T_PRESS.NO_ID AND
T_PRESS.P_NAME = '高教出版社'
USE TEXTBOOK
GO
SELECT T_TEXTBOOK.*
FROM T_TEXTBOOK
WHERE PRICE >= (
SELECT MAX(PRICE)
FROM T_TEXTBOOK
WHERE PRESS_NO IN (
SELECT NO_ID
FROM T_PRESS
WHERE P_NAME = '高教出版社'
)
)
USE TEXTBOOK
GO
SELECT T_STUDENT.NAME, T_TEXTBOOK.TITLE, T_TEXTBOOK.PRICE
FROM T_STUDENT, T_TEXTBOOK, T_BUY
WHERE
T_STUDENT.NO_ID = T_BUY.S_NO AND
T_TEXTBOOK.NO_ID = T_BUY.B_NO
SELECT T_STUDENT.NO_ID AS '学号', SUM(AMOUNT) AS '数量'
FROM T_STUDENT LEFT JOIN T_BUY ON T_STUDENT.NO_ID = T_BUY.S_NO
GROUP BY T_STUDENT.NO_ID
SELECT T_STUDENT.NO_ID AS '学号', SUM(PRICE*AMOUNT) AS '总价格'
FROM T_STUDENT LEFT JOIN
(T_BUY LEFT JOIN T_TEXTBOOK ON T_BUY.B_NO = T_TEXTBOOK.NO_ID)
ON T_STUDENT.NO_ID = T_BUY.S_NO
GROUP BY T_STUDENT.NO_ID
SELECT *
FROM T_TEXTBOOK
WHERE NO_ID IN (
SELECT B_NO
FROM T_BUY
GROUP BY B_NO
HAVING SUM(AMOUNT) >= 1000
)
--嵌套
SELECT *
FROM T_TEXTBOOK
WHERE NO_ID NOT IN(
SELECT B_NO
FROM T_BUY
GROUP BY B_NO
HAVING SUM(AMOUNT) > 0
)
--连接
SELECT T_TEXTBOOK.NO_ID, SUM(T_BUY.AMOUNT)
FROM T_TEXTBOOK LEFT JOIN T_BUY ON T_TEXTBOOK.NO_ID = T_BUY.B_NO
GROUP BY T_TEXTBOOK.NO_ID
HAVING SUM(T_BUY.AMOUNT) IS NULL
--组合
SELECT *
FROM T_TEXTBOOK
EXCEPT
SELECT *
FROM T_TEXTBOOK
WHERE NO_ID IN(
SELECT B_NO
FROM T_BUY
GROUP BY B_NO
HAVING SUM(AMOUNT) > 0
)
USE TEXTBOOK
--创建视图1
GO
CREATE VIEW FEE
AS
SELECT T_STUDENT.NAME AS '学号', SUM(PRICE*AMOUNT) AS '总价格'
FROM T_STUDENT LEFT JOIN
(T_BUY LEFT JOIN T_TEXTBOOK ON T_BUY.B_NO = T_TEXTBOOK.NO_ID)
ON T_STUDENT.NO_ID = T_BUY.S_NO
GROUP BY T_STUDENT.NAME, T_STUDENT.NO_ID
--创建视图2
DROP VIEW FEE
GO
CREATE VIEW FEE(NAME, COST)
AS
SELECT T_STUDENT.NAME, SUM(PRICE*AMOUNT)
FROM T_STUDENT LEFT JOIN
(T_BUY LEFT JOIN T_TEXTBOOK ON T_BUY.B_NO = T_TEXTBOOK.NO_ID)
ON T_STUDENT.NO_ID = T_BUY.S_NO
GROUP BY T_STUDENT.NAME, T_STUDENT.NO_ID
GO
SELECT *
FROM FEE
--观察变化
INSERT INTO T_BUY
VALUES(11588, 1101, 2)
GO
SELECT *
FROM FEE
--利用视图查询缴费最高的学生
SELECT NAME
FROM FEE
WHERE COST IN(
SELECT MAX(COST)
FROM FEE
)
USE TEXTBOOK
GO
CREATE VIEW BUY_AMOUNTS(B_NO, AMOUNT) AS
SELECT B_NO, SUM(AMOUNT)
FROM T_BUY
GROUP BY B_NO
GO
CREATE TRIGGER STUDENT_INSERT
ON T_STUDENT
AFTER INSERT
AS
BEGIN
--MAX_BOOK_NO
DECLARE @MAX_BOOK_NO SMALLINT
SELECT @MAX_BOOK_NO = B_NO
FROM BUY_AMOUNTS
WHERE AMOUNT = (
SELECT MAX(AMOUNT)
FROM BUY_AMOUNTS
)
--IN_SNO
DECLARE @IN_SNO SMALLINT
SELECT @IN_SNO = NO_ID FROM INSERTED
--插入
INSERT INTO T_BUY
VALUES(@IN_SNO, @MAX_BOOK_NO, 1)
END