用sql查询选English课程的学生名称
时间: 2024-03-06 17:50:06 浏览: 18
好的,以下是查询语句:
```
SELECT students.name AS student_name
FROM students
INNER JOIN student_course ON students.id = student_course.student_id
INNER JOIN courses ON student_course.course_id = courses.id
WHERE courses.name = 'English';
```
这个查询语句会从 students, student_course 和 courses 三个表中筛选出选了 English 课程的学生名称。首先使用 INNER JOIN 连接 students 和 student_course 表,以获取学生ID,然后使用 INNER JOIN 连接 student_course 和 courses 表,以获取课程信息。最后使用 WHERE 子句选择课程名称为 English 的记录,并用 student_name 别名作为结果返回。
相关问题
查询所有课程的成绩第2名到第3名的学生信息及该课程成绩 sql语句怎么写
假设有以下三张表:
**student表**
```
id name age gender
1 Tom 18 M
2 Jack 19 M
3 Lily 18 F
4 Lucy 20 F
5 Bob 19 M
```
**course表**
```
id name
1 Math
2 English
3 Science
```
**score表**
```
id student_id course_id score
1 1 1 80
2 2 1 90
3 3 1 85
4 4 1 95
5 5 1 88
6 1 2 75
7 2 2 85
8 3 2 90
9 4 2 95
10 5 2 80
11 1 3 90
12 2 3 85
13 3 3 92
14 4 3 88
15 5 3 95
```
则查询所有课程的成绩第2名到第3名的学生信息及该课程成绩的 SQL 语句如下:
```
SELECT s.name, c.name, sc.score
FROM (
SELECT course_id, student_id, score, DENSE_RANK() OVER(PARTITION BY course_id ORDER BY score DESC) AS rank
FROM score
) AS sc
INNER JOIN student AS s ON sc.student_id = s.id
INNER JOIN course AS c ON sc.course_id = c.id
WHERE sc.rank BETWEEN 2 AND 3
ORDER BY c.name, sc.score DESC;
```
解释:
1. 内层子查询使用了窗口函数 `DENSE_RANK()`,按照课程分组,按照成绩从高到低排名,生成一个排名列 `rank`。
2. 外层查询将内层查询结果进行关联,得到学生姓名、课程名称和成绩,并筛选出排名在 2-3 之间的结果。
3. 最后按照课程名称和成绩从高到低排序。
怎么运用IntelliJ IDEA创建:1-建立学生和课程表35 要求:学生可以选择多个课程,每个课程可以被多个学生选择。 查询某个学生所选的所有课程列表 查询某个课程的学生列表 学生可以修改所选的课程
可以按照以下步骤在IntelliJ IDEA中创建一个Java项目,并使用JDBC连接MySQL数据库,实现学生和课程表的创建和操作:
1. 打开IntelliJ IDEA,点击"Create New Project",选择"Java"并点击"Next"。
2. 填写项目名称和项目路径,点击"Next"。
3. 在"Project SDK"中选择Java版本,点击"Next"。
4. 在"Additional Libraries and Frameworks"中选择"JDBC",点击"Next"。
5. 在"Project Template"中选择"Command Line App",点击"Next"。
6. 在"Command Line Options"中填写"run",点击"Finish"。
7. 在项目根目录下创建一个名为"lib"的文件夹,并将MySQL JDBC驱动程序(mysql-connector-java.jar)复制到该文件夹中。
8. 在项目根目录下创建一个名为"src"的文件夹,并在该文件夹下创建一个名为"main"的文件夹和一个名为"test"的文件夹。
9. 在"main"文件夹下创建一个名为"java"的文件夹,并在该文件夹下创建一个名为"com.example"的包。
10. 在"com.example"包下创建一个名为"Student"的类,用于表示学生信息,包括学生ID和姓名。在类中定义以下属性和方法:
```java
public class Student {
private int id;
private String name;
public Student(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
```
11. 在"com.example"包下创建一个名为"Course"的类,用于表示课程信息,包括课程ID和名称。在类中定义以下属性和方法:
```java
public class Course {
private int id;
private String name;
public Course(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
```
12. 在"com.example"包下创建一个名为"StudentCourse"的类,用于表示学生和课程之间的关系。在类中定义以下属性和方法:
```java
public class StudentCourse {
private int id;
private int studentId;
private int courseId;
public StudentCourse(int id, int studentId, int courseId) {
this.id = id;
this.studentId = studentId;
this.courseId = courseId;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getStudentId() {
return studentId;
}
public void setStudentId(int studentId) {
this.studentId = studentId;
}
public int getCourseId() {
return courseId;
}
public void setCourseId(int courseId) {
this.courseId = courseId;
}
}
```
13. 在"com.example"包下创建一个名为"Database"的类,用于封装与MySQL数据库的连接和操作。在类中定义以下方法:
```java
import java.sql.*;
public class Database {
private Connection conn;
public Database(String url, String user, String password) throws SQLException {
conn = DriverManager.getConnection(url, user, password);
}
public void createStudentTable() throws SQLException {
String sql = "CREATE TABLE student (id INT PRIMARY KEY, name VARCHAR(255))";
try (Statement stmt = conn.createStatement()) {
stmt.executeUpdate(sql);
}
}
public void createCourseTable() throws SQLException {
String sql = "CREATE TABLE course (id INT PRIMARY KEY, name VARCHAR(255))";
try (Statement stmt = conn.createStatement()) {
stmt.executeUpdate(sql);
}
}
public void createStudentCourseTable() throws SQLException {
String sql = "CREATE TABLE student_course (id INT PRIMARY KEY, student_id INT, course_id INT, FOREIGN KEY (student_id) REFERENCES student(id), FOREIGN KEY (course_id) REFERENCES course(id))";
try (Statement stmt = conn.createStatement()) {
stmt.executeUpdate(sql);
}
}
public void addStudent(Student student) throws SQLException {
String sql = "INSERT INTO student (id, name) VALUES (?, ?)";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setInt(1, student.getId());
pstmt.setString(2, student.getName());
pstmt.executeUpdate();
}
}
public void addCourse(Course course) throws SQLException {
String sql = "INSERT INTO course (id, name) VALUES (?, ?)";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setInt(1, course.getId());
pstmt.setString(2, course.getName());
pstmt.executeUpdate();
}
}
public void addStudentCourse(StudentCourse studentCourse) throws SQLException {
String sql = "INSERT INTO student_course (id, student_id, course_id) VALUES (?, ?, ?)";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setInt(1, studentCourse.getId());
pstmt.setInt(2, studentCourse.getStudentId());
pstmt.setInt(3, studentCourse.getCourseId());
pstmt.executeUpdate();
}
}
public void updateStudentCourse(int studentId, int oldCourseId, int newCourseId) throws SQLException {
String sql = "UPDATE student_course SET course_id = ? WHERE student_id = ? AND course_id = ?";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setInt(1, newCourseId);
pstmt.setInt(2, studentId);
pstmt.setInt(3, oldCourseId);
pstmt.executeUpdate();
}
}
public ResultSet queryStudentCourses(int studentId) throws SQLException {
String sql = "SELECT course.* FROM student_course INNER JOIN course ON student_course.course_id = course.id WHERE student_course.student_id = ?";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setInt(1, studentId);
return pstmt.executeQuery();
}
}
public ResultSet queryCourseStudents(int courseId) throws SQLException {
String sql = "SELECT student.* FROM student_course INNER JOIN student ON student_course.student_id = student.id WHERE student_course.course_id = ?";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setInt(1, courseId);
return pstmt.executeQuery();
}
}
public void close() throws SQLException {
conn.close();
}
}
```
14. 在"com.example"包下创建一个名为"Main"的类,用于测试数据库操作。在类中定义以下方法:
```java
public class Main {
public static void main(String[] args) {
try {
Database db = new Database("jdbc:mysql://localhost:3306/test", "root", "password");
db.createStudentTable();
db.createCourseTable();
db.createStudentCourseTable();
Student s1 = new Student(1, "Tom");
Student s2 = new Student(2, "Jerry");
db.addStudent(s1);
db.addStudent(s2);
Course c1 = new Course(1, "Math");
Course c2 = new Course(2, "English");
db.addCourse(c1);
db.addCourse(c2);
StudentCourse sc1 = new StudentCourse(1, 1, 1);
StudentCourse sc2 = new StudentCourse(2, 1, 2);
StudentCourse sc3 = new StudentCourse(3, 2, 1);
db.addStudentCourse(sc1);
db.addStudentCourse(sc2);
db.addStudentCourse(sc3);
ResultSet rs1 = db.queryStudentCourses(1);
while (rs1.next()) {
System.out.println(rs1.getString("name"));
}
ResultSet rs2 = db.queryCourseStudents(1);
while (rs2.next()) {
System.out.println(rs2.getString("name"));
}
db.updateStudentCourse(1, 1, 2);
db.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
```
其中,"jdbc:mysql://localhost:3306/test"是MySQL数据库的连接字符串,"root"和"password"分别是数据库的用户名和密码。
以上就是使用IntelliJ IDEA创建学生和课程表的简单示例。通过这个示例,你可以了解到如何使用JDBC连接MySQL数据库,如何创建表、插入数据和查询数据等基本操作。