欢迎光临散文网 会员登陆 & 注册

SQL15题

2023-06-08 18:54 作者:furiousiTy  | 我要投稿

创建一个名为 "Students" 的表,包含以下列: StudentID(整数,主键) FirstName(最多50个字符) LastName(最多50个字符) BirthDate(日期)


以下是创建名为 "Students" 的表的SQL语句,包含了所需的列和数据类型:


```sql

CREATE TABLE Students (

  StudentID INT PRIMARY KEY,

  FirstName VARCHAR(50),

  LastName VARCHAR(50),

  BirthDate DATE

);

```

使用上述语句可以创建一个名为 "Students" 的表,其中包含了"StudentID"、"FirstName"、"LastName"和"BirthDate"这四列。"StudentID"列是主键,使用整数数据类型(INT),"FirstName"和"LastName"列使用最多50个字符的字符串数据类型(VARCHAR(50)),"BirthDate"列使用日期数据类型(DATE)。


给 "Students" 表插入以下数据: StudentID - 1, FirstName - 'John', LastName - 'Doe', BirthDate - '2000-07-22' StudentID - 2, FirstName - 'Jane', LastName - 'Doe', BirthDate - '2001-05-15'


要将上述数据插入到 "Students" 表中,可以使用以下的SQL语句:

```sql

INSERT INTO Students (StudentID, FirstName, LastName, BirthDate)

VALUES (1, 'John', 'Doe', '2000-07-22');


INSERT INTO Students (StudentID, FirstName, LastName, BirthDate)

VALUES (2, 'Jane', 'Doe', '2001-05-15');

```

上述语句将会分别插入两行数据到 "Students" 表中。每个INSERT语句插入一行数据,指定了要插入的列和相应的值。首先,插入了StudentID为1,FirstName为'John',LastName为'Doe',BirthDate为'2000-07-22'的行;然后,插入了StudentID为2,FirstName为'Jane',LastName为'Doe',BirthDate为'2001-05-15'的行。


问题3:数据控制语言(DCL) 对用户 'user1' 授予对 "Students" 表的所有权限


要将用户 'user1' 授予对 "Students" 表的所有权限,可以使用数据控制语言(DCL)中的GRANT语句。具体的语法如下:


```sql

GRANT ALL PRIVILEGES ON Students TO user1;

```


上述语句将授予用户 'user1' 对 "Students" 表的所有权限,包括SELECT、INSERT、UPDATE、DELETE等操作。这使得用户 'user1' 可以执行与该表相关的所有操作。


请注意,执行此操作需要具有足够的权限。通常,只有数据库管理员或具有管理员权限的用户才能执行此操作。

上述语法将授予用户 'user1' 对 "Students" 表的所有权限。用户 'user1' 将获得对该表的SELECT、INSERT、UPDATE、DELETE等操作的权限。请确保在执行此语句时具有足够的权限,通常只有数据库管理员或具有管理员权限的用户才能执行此操作。


问题4:WHERE语句 找出 "Students" 表中所有2001年以后出生的学生。


要找出 "Students" 表中所有2001年以后出生的学生,可以使用WHERE语句来过滤出符合条件的行。具体的SQL语句如下:

```sql

SELECT *

FROM Students

WHERE YEAR(BirthDate) >= 2001;

```

上述语句将会检索 "Students" 表中所有满足条件的行,即出生日期(BirthDate)的年份大于等于2001年的学生。使用YEAR()函数从日期中提取年份,并将其与条件进行比较。


上述查询将返回满足条件的行,包括StudentID、FirstName、LastName和BirthDate列的所有数据。如果需要特定的列,可以将 * 替换为列名的列表。

问题5:聚合函数 计算 "Students" 表中所有学生的平均年龄


要计算 "Students" 表中所有学生的平均年龄,可以使用聚合函数来实现。在这种情况下,我们可以使用AVG()函数来计算平均值。具体的SQL查询如下:


```sql

SELECT AVG(DATEDIFF(CURRENT_DATE, BirthDate)) AS AverageAge

FROM Students;

```

上述查询将计算出 "Students" 表中所有学生的平均年龄。使用DATEDIFF()函数来计算当前日期(CURRENT_DATE)与每个学生的出生日期(BirthDate)之间的天数差,然后使用AVG()函数计算这些天数差的平均值。通过AS关键字,将结果的列命名为"AverageAge"。


执行上述查询后,将返回一个结果集,其中只包含一个列 "AverageAge",该列显示了所有学生的平均年龄。

问题6:JOIN操作 假设有一个名为 "Courses" 的表,包含列 CourseID 和 CourseName,以及一个名为 "Enrollments" 的表,包含列 StudentID 和 CourseID。编写一个 SQL 查询,列出所有选课学生的姓名和他们所选的课程名。

问题7:子查询 找出 "Students" 表中年龄大于所有2001年以后出生的学生平均年龄的所有学生。

问题8:事务处理 在 "Students" 表中插入一个新学生,然后在 "Enrollments" 表中为该学生添加一个新的选课记录。确保这两个操作要么都成功,要么都不发生。

问题9:GROUP BY语句 列出 "Enrollments" 表中每个课程的学生数量。

问题10:HAVING语句 找出 "Enrollments" 表中选课学生数量超过5的所有课程。


问题6:JOIN操作


要列出所有选课学生的姓名和他们所选的课程名,需要使用JOIN操作连接 "Students"、"Courses" 和 "Enrollments" 表。具体的SQL查询如下:


```sql

SELECT Students.FirstName, Students.LastName, Courses.CourseName

FROM Students

JOIN Enrollments ON Students.StudentID = Enrollments.StudentID

JOIN Courses ON Courses.CourseID = Enrollments.CourseID;

```


上述查询将会连接三个表,并根据学生ID(StudentID)和课程ID(CourseID)进行关联。通过JOIN操作,将学生表、选课表和课程表关联在一起。然后,查询会选择学生的姓名(FirstName和LastName)以及所选课程的名称(CourseName),并将结果返回。


问题7:子查询


要找出 "Students" 表中年龄大于所有2001年以后出生的学生平均年龄的所有学生,可以使用子查询来解决。具体的SQL查询如下:


```sql

SELECT *

FROM Students

WHERE BirthDate < (

    SELECT AVG(DATEDIFF(CURRENT_DATE, BirthDate))

    FROM Students

    WHERE YEAR(BirthDate) >= 2001

);

```


上述查询中,子查询部分计算了2001年以后出生的学生的平均年龄。然后,外部查询使用WHERE子句过滤出 "Students" 表中出生日期早于该平均年龄的学生,以找出年龄大于所有2001年以后出生的学生平均年龄的所有学生。


问题8:事务处理


要在 "Students" 表中插入一个新学生,并在 "Enrollments" 表中为该学生添加一个新的选课记录,并确保这两个操作要么都成功,要么都不发生,可以使用事务处理。具体的SQL语句如下:


```sql

BEGIN TRANSACTION;

INSERT INTO Students (StudentID, FirstName, LastName, BirthDate)

VALUES (3, 'Alice', 'Smith', '2002-09-10');

 

INSERT INTO Enrollments (StudentID, CourseID)

VALUES (3, 101);

 

COMMIT;

```

上述语句中,事务从BEGIN TRANSACTION开始,然后在事务中依次执行插入操作,即首先向 "Students" 表插入新学生的记录,然后向 "Enrollments" 表插入新选课记录。如果两个插入操作都成功执行,最后通过COMMIT提交事务。如果在事务执行过程中发生错误,可以使用ROLLBACK回滚事务,以确保所有操作都不发生。


问题9:GROUP BY语句


要列出 "Enrollments" 表中每个课程的学生数量,可以使用GROUP BY语句对课程ID进行分组,并使用COUNT函数计算每个分组中的学生数量。具体的SQL查询如下:


```sql

SELECT CourseID, COUNT(StudentID) AS StudentCount

FROM Enrollments

GROUP BY CourseID;

```


问题10:HAVING语句

要找出 "Enrollments" 表中选课学生数量超过5的所有课程,可以使用HAVING语句结合聚合函数和GROUP BY子句来实现。具体的SQL查询如下:


```sql

SELECT CourseID, COUNT(StudentID) AS StudentCount

FROM Enrollments

GROUP BY CourseID

HAVING COUNT(StudentID) > 5;

```


上述查询中,使用GROUP BY语句按照课程ID(CourseID)进行分组,并使用COUNT函数计算每个课程的学生数量(StudentCount)。然后,通过HAVING子句筛选出学生数量超过5的课程。


执行上述查询后,将返回一个结果集,其中包含满足条件的课程ID(CourseID)和相应的学生数量(StudentCount)。这些课程是选课学生数量超过5的课程。


问题11:ORDER BY语句 列出 "Students" 表中所有学生,按姓氏和名字排序。 

问题12:视图(VIEW) 创建一个视图,列出每个课程的名称以及选课的学生数量。 

问题13:索引(INDEX) 在 "Students" 表的 LastName 列上创建一个索引。 

问题14:存储过程(Stored Procedure) 创建一个存储过程,给定学生ID,返回他们的全名。 

问题15:触发器(Trigger) 创建一个触发器,当 "Students" 表中插入新记录时,向 "AuditLog" 表插入一条新记录,记录学生ID和插入日期。


问题11:ORDER BY语句


要列出 "Students" 表中所有学生,并按姓氏和名字排序,可以使用ORDER BY语句。具体的SQL查询如下:


```sql

SELECT *

FROM Students

ORDER BY LastName, FirstName;

```


上述查询将返回 "Students" 表中所有学生的记录,并按照姓氏(LastName)和名字(FirstName)进行升序排序。首先按姓氏排序,如果姓氏相同,则按名字排序。


问题12:视图(VIEW)


要创建一个视图,列出每个课程的名称以及选课的学生数量,可以使用CREATE VIEW语句创建视图。具体的SQL语句如下:


```sql

CREATE VIEW CourseEnrollment AS

SELECT Courses.CourseName, COUNT(Enrollments.StudentID) AS StudentCount

FROM Courses

LEFT JOIN Enrollments ON Courses.CourseID = Enrollments.CourseID

GROUP BY Courses.CourseID, Courses.CourseName;

```


上述语句中,创建了名为 "CourseEnrollment" 的视图。视图的定义是基于 "Courses" 表和 "Enrollments" 表的连接,使用LEFT JOIN将两个表连接起来。然后,使用GROUP BY语句按课程ID(CourseID)和课程名称(CourseName)分组,并使用COUNT函数计算每个课程的学生数量(StudentCount)。


创建成功后,可以通过查询视图来获取每个课程的名称以及选课的学生数量,例如:


```sql

SELECT * FROM CourseEnrollment;

```


问题13:索引(INDEX)


要在 "Students" 表的 LastName 列上创建一个索引,可以使用CREATE INDEX语句来实现。具体的SQL语句如下:


```sql

CREATE INDEX idx_LastName ON Students (LastName);

```


上述语句将在 "Students" 表的 LastName 列上创建名为 "idx_LastName" 的索引。这将提高根据姓氏进行检索、排序和连接的查询性能。


索引可以加快数据访问速度,但也会增加数据插入、更新和删除的开销。因此,在创建索引之前,需要评估索引的使用场景和数据更新频率,以确保索引的性能收益超过其维护成本。


问题14:存储过程(Stored Procedure)

要创建一个存储过程,给定学生ID,返回他们的全名,可以使用CREATE PROCEDURE语句来定义存储过程。具体的SQL语句如下:

```sql

CREATE PROCEDURE GetStudentFullName

    @StudentID INT

AS

BEGIN

    SELECT FirstName + ' ' + LastName AS FullName

    FROM Students

    WHERE StudentID = @StudentID;

END;

```

上述语句中,定义了名为 "GetStudentFullName" 的存储过程。存储过程接受一个参数 @StudentID,用于指定学生ID。在存储过程的主体中,使用SELECT语句查询 "Students" 表,根据给定的学生ID获取对应学生的全名(FirstName + LastName)。

创建成功后,可以通过调用存储过程并传递相应的学生ID来获取学生的全名。例如:

```sql

EXEC GetStudentFullName @StudentID = 1;

```

上述示例中,通过执行存储过程 GetStudentFullName 并传递学生ID为1,将返回学生ID为1的学生的全名。

问题15:触发器(Trigger) 创建一个触发器,当 "Students" 表中插入新记录时,向 "AuditLog" 表插入一条新记录,记录学生ID和插入日期。

要创建一个触发器,当 "Students" 表中插入新记录时向 "AuditLog" 表插入一条新记录,可以使用CREATE TRIGGER语句来实现。具体的SQL语句如下:


sql

CREATE TRIGGER InsertStudentAudit AFTER INSERTON StudentsFOR EACH ROWBEGININSERT INTO AuditLog (StudentID, InsertDate) VALUES (NEW.StudentID,NOW());

END;


上述语句中,创建了名为 "InsertStudentAudit" 的触发器。触发器使用AFTER INSERT指定在 "Students" 表中插入新记录之后触发。FOR EACH ROW表示触发器对每个插入的行执行操作。

触发器的主体部分使用INSERT INTO语句向 "AuditLog" 表插入一条新记录。这条记录包含了插入的学生ID(NEW.StudentID)以及当前的插入日期(NOW())。

当在 "Students" 表中插入新记录时,触发器将自动执行,并在 "AuditLog" 表中插入相应的记录,记录了新插入的学生ID和插入日期。

请确保 "AuditLog" 表已经存在,并且具有与触发器中的INSERT语句相对应的列。


SQL15题的评论 (共 条)

分享到微博请遵守国家法律