Multi-table query of MySQL database summary

A 12,000-word blog is worth savoring carefully!

For more information about MySQL, please pay attention to this handsome guy's MySQL column!

Table of contents

1. Multi-table relationship

1.1 One-to-many

1.2 Many-to-many

1.3 One to one

2 Multi-table query

2.1 Data preparation

2.2 Overview

2.3 Classification - inner join, outer join and self join

3. Inner join

Case - A

Case - B

4. Outer join

Case——query all the data in the emp table, and the corresponding department information (left outer join)

Case - query all the data in the dept table, and the corresponding employee information (right outer join)

5. Self-join

5.1 Self-join query

Case—Query the name of the leader that the employee belongs to together

Case—Query the names of all employees and their leaders. If the employee has no leader, it also needs to be queried

5.2 Joint query

Case—A

6. Subqueries

6.1 Overview

(1) Definition

(2) classification

6.2 Scalar Subqueries

Case — Query all employee information of "Sales Department"

Case — Query employee information after "Fang Dongbai" joined the company

6.3 Column query

Case — Query all employee information of "Sales Department" and "Marketing Department"

Case — Query information about employees whose salary is higher than that of everyone in the finance department

Case — Query information about employees whose salary is higher than that of any one in the R&D department

6.4 Row Subqueries

Case — Query the same employee information as "Zhang Wuji" with the same salary and immediate leadership;

6.5 Table subqueries

Case — Query employee information with the same position and salary as "Luzhangke" and "Song Yuanqiao"

Case — Query employee information and department information whose entry date is after "2006-01-01"

7. Multi-table query case


1. Multi-table relationship

During project development, when designing the database table structure, the table structure will be analyzed and designed according to the business requirements and the relationship between the business modules. Since the business is interrelated, there are also various connections between the tables , basically There are three types:

  • One-to-many (many-to-one)
  • many to many
  • one to one

1.1 One-to-many

Case: the relationship between departments and employees

Relationship: One department corresponds to multiple employees, and one employee corresponds to one department

Implementation: Create a foreign key in the employee table emp and point to the id in the department table dept. Generally, the side with more points to the side with less.

1.2 Many-to-many

Case: Student-Course Relationship

Relationship: A student can choose multiple courses, and a course can also be chosen by multiple students

Implementation: Create a third intermediate table, the intermediate table contains at least two foreign keys, which are associated with the primary keys of the two parties

The implemented SQL statement is as follows:

-- 多对多
CREATE TABLE student ( id INT auto_increment PRIMARY KEY COMMENT '主键ID', NAME VARCHAR ( 10 ) COMMENT '姓名', NO VARCHAR ( 10 ) COMMENT '学号' ) COMMENT '学生表';

INSERT INTO student
VALUES
	( NULL, '黛绮丝', '2000100101' ),
	( NULL, '谢逊', '2000100102' ),
	( NULL, '殷天正', '2000100103' ),
	( NULL, '韦一笑', '2000100104' );
	
CREATE TABLE course ( id INT auto_increment PRIMARY KEY COMMENT '主键ID', NAME VARCHAR ( 10 ) COMMENT '课程名称' ) COMMENT '课程表';


INSERT INTO course
VALUES
	( NULL, 'Java' ),
	( NULL, 'PHP' ),
	( NULL, 'MySQL' ),
	( NULL, 'Hadoop' );
	
CREATE TABLE student_course (
	id INT auto_increment COMMENT '主键' PRIMARY KEY,
	studentid INT NOT NULL COMMENT '学生ID',
	courseid INT NOT NULL COMMENT '课程ID',
	CONSTRAINT fk_courseid FOREIGN KEY ( courseid ) REFERENCES course ( id ),
	CONSTRAINT fk_studentid FOREIGN KEY ( studentid ) REFERENCES student ( id ) 
) COMMENT '学生课程中间表';

INSERT INTO student_course
VALUES
	( NULL, 1, 1 ),
	( NULL, 1, 2 ),
	( NULL, 1, 3 ),
	( NULL, 2, 2 ),
	( NULL, 2, 3 ),
	( NULL, 3, 4 );

After executing the above SQL statement, the relationship between multiple tables is shown in the following figure: 

Open Navicat >>> Open the database >>> Click "Table" on the upper menu bar >>> Click to view >>> Select the ER diagram to get the following table structure relationship diagram:

Supplement: ER diagrams are also called entity-relationship diagrams (Entity Relationship Diagram), which provide methods for representing entity types, attributes, and connections. ER diagrams are often required for development. Many visualization software can export ER diagrams,

1.3 One to one

Case: Relationship between users and user details

Relationship: One-to-one relationship, mostly used for single table splitting, put the basic fields of one table in one table, and put other detailed fields in another table, and improve the operation efficiency.

Implementation: Add a foreign key to any party, associate the primary key of the other party, and set the foreign key to a unique (UNIQUE) state.

The implemented SQL statement is as follows:

-- 一对一
CREATE TABLE tb_user (
	id INT auto_increment PRIMARY KEY COMMENT '主键ID',
	NAME VARCHAR ( 10 ) COMMENT '姓名',
	age INT COMMENT '年龄',
	gender CHAR ( 1 ) COMMENT '1: 男 , 2: 女',
	phone CHAR ( 11 ) COMMENT '手机号' 
) COMMENT '用户基本信息表';

CREATE TABLE tb_user_edu (
	id INT auto_increment PRIMARY KEY COMMENT '主键ID',
	degree VARCHAR ( 20 ) COMMENT '学历',
	major VARCHAR ( 50 ) COMMENT '专业',
	primaryschool VARCHAR ( 50 ) COMMENT '小学',
	middleschool VARCHAR ( 50 ) COMMENT '中学',
	university VARCHAR ( 50 ) COMMENT '大学',
	userid INT UNIQUE COMMENT '用户ID',
	CONSTRAINT fk_userid FOREIGN KEY ( userid ) REFERENCES tb_user ( id ) 
) COMMENT '用户教育信息表';

INSERT INTO tb_user ( id, NAME, age, gender, phone )
VALUES
	( NULL, '黄渤', 45, '1', '18800001111' ),
	( NULL, '冰冰', 35, '2', '18800002222' ),
	( NULL, '码云', 55, '1', '18800008888' ),
	( NULL, '李彦宏', 50, '1', '18800009999' );
	
INSERT INTO tb_user_edu ( id, degree, major, primaryschool, middleschool, university, userid )
VALUES
	( NULL, '本科', '舞蹈', '静安区第一小学', '静安区第一中学', '北京舞蹈学院', 1 ),
	( NULL, '硕士', '表演', '朝阳区第一小学', '朝阳区第一中学', '北京电影学院', 2 ),
	( NULL, '本科', '英语', '杭州市第一小学', '杭州市第一中学', '杭州师范大学', 3 ),
	( NULL, '本科', '应用数学', '阳泉第一小学', '阳泉区第一中学', '清华大学', 4 );

Run the above SQL command to get the table relationship shown in the following figure:

2 Multi-table query

2.1 Data preparation

1). Delete the test data of the previous emp and dept tables ( if exists )

2). Execute the following script to create emp table and dept table and insert test data

-- 创建dept表,并插入数据
CREATE TABLE dept ( id INT auto_increment COMMENT 'ID' PRIMARY KEY, NAME VARCHAR ( 50 ) NOT NULL COMMENT '部门名称' ) COMMENT '部门表';

INSERT INTO dept ( id, NAME )
VALUES
	( 1, '研发部' ),
	( 2, '市场部' ),
	( 3, '财务部' ),
	( 4, '销售部' ),
	( 5, '总经办' ),
	( 6, '人事部' );
	
-- 创建emp表,并插入数据
CREATE TABLE emp (
	id INT auto_increment COMMENT 'ID' PRIMARY KEY,
	NAME VARCHAR ( 50 ) NOT NULL COMMENT '姓名',
	age INT COMMENT '年龄',
	job VARCHAR ( 20 ) COMMENT '职位',
	salary INT COMMENT '薪资',
	entrydate date COMMENT '入职时间',
	managerid INT COMMENT '直属领导ID',
	dept_id INT COMMENT '部门ID' 
) COMMENT '员工表';-- 添加外键

ALTER TABLE emp ADD CONSTRAINT fk_emp_dept_id FOREIGN KEY ( dept_id ) REFERENCES dept ( id );
INSERT INTO emp ( id, NAME, age, job, salary, entrydate, managerid, dept_id )
VALUES
	( 1, '金庸', 66, '总裁', 20000, '2000-01-01', NULL, 5 ),
	( 2, '张无忌', 20, '项目经理', 12500, '2005-12-05', 1, 1 ),
	( 3, '杨逍', 33, '开发', 8400, '2000-11-03', 2, 1 ),
	( 4, '韦一笑', 48, '开发', 11000, '2002-02-05', 2, 1 ),
	( 5, '常遇春', 43, '开发', 10500, '2004-09-07', 3, 1 ),
	( 6, '小昭', 19, '程序员鼓励师', 6600, '2004-10-12', 2, 1 ),
	( 7, '灭绝', 60, '财务总监', 8500, '2002-09-12', 1, 3 ),
	( 8, '周芷若', 19, '会计', 48000, '2006-06-02', 7, 3 ),
	( 9, '丁敏君', 23, '出纳', 5250, '2009-05-13', 7, 3 ),
	( 10, '赵敏', 20, '市场部总监', 12500, '2004-10-12', 1, 2 ),
	( 11, '鹿杖客', 56, '职员', 3750, '2006-10-03', 10, 2 ),
	( 12, '鹤笔翁', 19, '职员', 3750, '2007-05-09', 10, 2 ),
	( 13, '方东白', 19, '职员', 5500, '2009-02-12', 10, 2 ),
	( 14, '张三丰', 88, '销售总监', 14000, '2004-10-12', 1, 4 ),
	( 15, '俞莲舟', 38, '销售', 4600, '2004-10-12', 14, 4 ),
	( 16, '宋远桥', 40, '销售', 4600, '2004-10-12', 14, 4 ),
	( 17, '陈友谅', 42, NULL, 2000, '2011-10-12', 1, NULL );

Execute the above SQL statement, the table emp and table dept are shown in the following figure:

There are 6 records in the dept table and 17 records in the emp table. 

2.2 Overview

Multi-table query refers to querying data from multiple tables.

Originally, to query single-table data, the executed SQL form is: select * from emp;

To execute a multi-table query, you only need to use commas to separate multiple tables, such as: select * from emp , dept ; the specific execution results are as follows:

At this point, we see that the query results contain a large number of result sets, a total of 102 records , which are actually all combinations of all records (17) in the employee table emp and all records in the department table dept (6). The phenomenon is called the Cartesian product. Next, let’s briefly introduce the Cartesian product.

Cartesian product: Cartesian product refers to all combinations of two sets A and B in mathematics.

 In multi-table queries, we need to eliminate invalid Cartesian products, and only keep the data in the associated part of the two tables.

 In the SQL statement, how to remove the invalid Cartesian product? We can add conditions for join queries to multi-table queries.

select * from emp , dept where emp.dept_id = dept.id;

However, since the employee with id 17 does not have a dept_id field value, it is not queried according to the conditions of the connection query during multi-table query.

2.3 Classification - inner join, outer join and self join

Connection query:

  • Inner join: equivalent to querying part of the data at the intersection of table A and table B
  • Left outer join: query all the data in the left table, and some data in the intersection of the two tables
  • Right outer join: query all the data in the right table, and some data in the intersection of the two tables
  • Self-join: the connection query between the current table and itself, the self-join must use the table alias

subquery:

  • Sub query (Sub Query) or inner query (Inner Query), also known as nested query (Nested Query), is a query nested in the WHERE clause of other SQL queries.

3. Inner join

The inner join query is the data in the intersection part of the two tables (the data in the green part) . There are two syntaxes for inner joins: implicit inner joins and explicit inner joins . The syntax is as follows:

-- 隐式内连接
SELECT 字段列表 FROM 表1 , 表2 WHERE 条件 ... ;

-- 显式内连接
SELECT 字段列表 FROM 表1 [ INNER ] JOIN 表2 ON 连接条件 ... ;

Case - A

Query the name of each employee, and the name of the associated department (implicit inner connection implementation)

  • Table structure: emp, dept
  • Join condition: emp.dept_id = dept.id
select emp.name , dept.name from emp , dept where emp.dept_id = dept.id ;

-- 为每一张表起别名,简化SQL编写
select e.name,d.name from emp e , dept d where e.dept_id = d.id;

Case - B

Query the name of each employee, and the name of the associated department (explicit inner connection implementation) --- INNER JOIN ... ON ...

  • Table structure: emp, dept
  • Join condition: emp.dept_id = dept.id
select e.name, d.name from emp e inner join dept d on e.dept_id = d.id;

-- 简化SQL编写
select e.name, d.name from emp e join dept d on e.dept_id = d.id;

Table aliases:

  1. tablea as alias 1 , tableb as alias 2 ;
  2. tablea alias 1 , tableb alias 2 ;

Precautions:

Once an alias is created for the table, you can no longer use the table name to specify the corresponding field. At this time, you can only use the alias to specify the field.

4. Outer join

There are two types of outer joins: left outer join and right outer join . The specific grammatical structure is:

-- 左外连接
SELECT 字段列表 FROM 表1 LEFT [ OUTER ] JOIN 表2 ON 条件 ... ;

-- 右外连接
SELECT 字段列表 FROM 表1 RIGHT [ OUTER ] JOIN 表2 ON 条件 ... ;

Case——query all the data in the emp table, and the corresponding department information (left outer join)

As mentioned in the requirements, all the data of emp should be queried, so inner join query is not possible, and outer join query should be considered .

  • Table structure: emp, dept
  • Join condition: emp.dept_id = dept.id
select e.*, d.name from emp e left outer join dept d on e.dept_id = d.id;

select e.*, d.name from emp e left join dept d on e.dept_id = d.id;

Case - query all the data in the dept table, and the corresponding employee information (right outer join)

As mentioned in the requirements, all data in the dept table needs to be queried, so inner join query is not possible, and outer join query should be considered.

  • Table structure: emp, dept
  • Join condition: emp.dept_id = dept.id
select d.*, e.* from emp e right outer join dept d on e.dept_id = d.id;

select d.*, e.* from dept d left outer join emp e on e.dept_id = d.id;

Note: Left outer join and right outer join can be replaced with each other , you only need to adjust the order of the table structure in the connection query in SQL. In our daily development and use, we prefer the left outer connection.

5. Self-join

5.1 Self-join query

Self-join query, as the name suggests, is to connect itself, that is, to connect a table to query multiple times.

Query syntax for self-join:

select 字段列表 from 表A 别名A join 表A 别名B on 条件 ... ;

For a self-join query, it can be an inner join query or an outer join query.

Case—Query the name of the leader that the employee belongs to together

  • Table structure: emp
select a.name, b.name from emp a, emp b where a.managerid = b.id;

Case—Query the names of all employees and their leaders. If the employee has no leader, it also needs to be queried

  • Table structure: emp a, emp b
select a.name '员工', b.name '领导' from emp a left join emp b on a.managerid = b.id;

Note: In the self-join query, the table must be aliased , otherwise we don't know the specified conditions, the returned fields, and which table's field it is.

5.2 Joint query

For union queries, the results of multiple queries are combined to form a new query result set.

SELECT 字段列表 FROM 表A ...
UNION [ ALL ]
SELECT 字段列表 FROM 表B ....;

For the joint query , the number of columns and field types of multiple tables must be consistent .

The difference between union all and union: union all will directly merge all the data together, and union will automatically deduplicate the merged data.

Case—A

Query all employees whose salary is less than 5000 and employees whose age is greater than 50.

Currently, for this requirement, we can directly use multi-condition query, and use the logical operator or to connect. Here, we can also combine queries through union/union all.

 The results of the union all query are simply merged without deduplication. 

SELECT * FROM emp WHERE salary < 5000 
UNION 
SELECT * FROM emp WHERE age > 50;

 The union joint query will deduplicate the query results.

Notice:

When performing a joint query, the number of fields in multiple query statements must be consistent , otherwise an error will be reported.

6. Subqueries

6.1 Overview

(1) Definition

Nested SELECT statements in SQL statements are called nested queries, also known as subqueries.

select * from t1 where column1 = ( select column1 from t2 ) ;

 The statement outside the subquery can be any one of INSERT/UPDATE/DELETE/SELECT .

(2) classification

According to different subquery results, it is divided into:

  • Scalar subquery (subquery result is a single value)
  • Column subquery (the result of the subquery is a column)
  • Row subquery (subquery result is one row)
  • Table subquery (the result of the subquery is multiple rows and multiple columns)

According to the position of the subquery, it is divided into:

  • after where
  • after from
  • after select

6.2 Scalar Subqueries

A subquery returns a single value (number, string, date, etc.), and in its simplest form, such a subquery is called a scalar subquery.

Commonly used operators: = <> > >= < <=

Case — Query all employee information of "Sales Department"

Query all employee information of "sales department"

(1) Query the department ID of "Sales Department"

select id from dept where name = '销售部';

(2) Query employee information according to the department ID of "Sales Department"

select * from emp where dept_id = (select id from dept where name = '销售部');

Case — Query employee information after "Fang Dongbai" joined the company

When completing this requirement, we can decompose the requirement into two steps:

(1) Query Fang Dongbai's entry date

select entrydate from emp where name = '方东白';

(2) Query the information of employees who joined after the specified entry date

select * from emp where entrydate > (select entrydate from emp where name = '方东白');

6.3 Column query

The result returned by a subquery is a column (can be multiple rows), this subquery is called a column subquery.

Commonly used operators: IN , NOT IN , ANY , SOME , ALL

operator describe
IN Within the specified collection range, choose one more
NOT IN is not within the specified collection range
ANY In the list returned by the subquery, any one can satisfy
SOME Equivalent to ANY, ANY can be used wherever SOME is used
ALL All values ​​in the list returned by the subquery must satisfy

Case — Query all employee information of "Sales Department" and "Marketing Department"

Break it down into two steps:

Query the department IDs of "Sales Department" and "Marketing Department"

select id from dept where name = '销售部' or name = '市场部';

According to the department ID, query employee information

select * from emp where dept_id in (select id from dept where name = '销售部' or name = '市场部');

Case — Query information about employees whose salary is higher than that of everyone in the finance department

Break down into the following two steps:

(1) Query the salary of all financial department personnel

select id from dept where name = '财务部';

select salary from emp where dept_id = 
( select id from dept where name = '财务部' );

(2) Information about employees whose salary is higher than that of everyone in the finance department

select * from emp where salary > all 
( select salary from emp where dept_id = 
( select id from dept where name = '财务部' ) );

Case — Query information about employees whose salary is higher than that of any one in the R&D department

Break down into the following two steps:

(1) Query the salary of the owner of the R&D department

select salary from emp where dept_id = (select id from dept where name = '研发部');

(2) Information about employees whose salary is higher than that of anyone in the R&D department

select * from emp where salary > any 
( select salary from emp where dept_id =
( select id from dept where name = '研发部' ) );

6.4 Row Subqueries

The result returned by a subquery is a row (can be multiple columns), this subquery is called a row subquery.

Commonly used operators: = , <> , IN , NOT IN

Case — Query the same employee information as "Zhang Wuji" with the same salary and immediate leadership;

This requirement can also be broken down into two steps:

(1) Query the salary and direct leadership of "Zhang Wuji"

select salary, managerid from emp where name = '张无忌';

(2) Query the same employee information as "Zhang Wuji"'s salary and direct leadership;

select * from emp where (salary,managerid) = 
( select salary, managerid from emp where name = '张无忌' );

6.5 Table subqueries

The result returned by a subquery is multiple rows and multiple columns. This kind of subquery is called a table subquery.

Commonly used operators: IN

Case — Query employee information with the same position and salary as "Luzhangke" and "Song Yuanqiao"

Decomposed into two steps:

(1) Query the positions and salaries of "Luzhangke" and "Song Yuanqiao"

select job, salary from emp where name = '鹿杖客' or name = '宋远桥';

(2) Query the employee information with the same position and salary as "Luzhangke" and "Song Yuanqiao"

select * from emp where (job,salary) in 
( select job, salary from emp where name = '鹿杖客' or name = '宋远桥' );

Case — Query employee information and department information whose entry date is after "2006-01-01"

Decomposed into two steps:

(1) Employee information whose entry date is after "2006-01-01"

select * from emp where entrydate > '2006-01-01';

(2) Query this part of employees, the corresponding department information

select e.*, d.* from 
( select * from emp where entrydate > '2006-01-01' ) e 
left join dept d on e.dept_id = d.id ;

7. Multi-table query case

Data environment preparation

-- 多表查询案例
CREATE TABLE salgrade ( grade INT, losal INT, hisal INT ) COMMENT '薪资等级表';

INSERT INTO salgrade
VALUES
	( 1, 0, 3000 );
INSERT INTO salgrade
VALUES
	( 2, 3001, 5000 );
INSERT INTO salgrade
VALUES
	( 3, 5001, 8000 );
INSERT INTO salgrade
VALUES
	( 4, 8001, 10000 );
INSERT INTO salgrade
VALUES
	( 5, 10001, 15000 );
INSERT INTO salgrade
VALUES
	( 6, 15001, 20000 );
INSERT INTO salgrade
VALUES
	( 7, 20001, 25000 );
INSERT INTO salgrade
VALUES
	( 8, 25001, 30000 );

In this case, we mainly use the multi-table query syntax explained above to complete the following 12 requirements, and there are only three tables involved here: emp employee table, dept department table, and salary grade table .

(1) Query employee's name, age, position, department information (implicit inner connection)

  • Table: emp , dept
  • Join condition: emp.dept_id = dept.id
select e.name, e.age, e.job, d.name from emp e, dept d where e.dept_id = d.id;

(2) Query the name, age, position, and department information of employees younger than 30 years old (explicit inner connection)

  • Table: emp , dept
  • Join condition: emp.dept_id = dept.id
select e.name , e.age , e.job , d.name 
from 
  emp e inner join dept d on e.dept_id = d.id 
where 
  e.age < 30;

(3) Query the department ID and department name of the employee

  • Table: emp , dept
  • Join condition: emp.dept_id = dept.id
select distinct d.id , d.name from emp e , dept d where e.dept_id = d.id;

(4) Query all employees who are older than 40 years old, and the name of the department they belong to; if the employee is not assigned a department, it also needs to be displayed (outer connection)

  • Table: emp , dept
  • Join condition: emp.dept_id = dept.id
select e.*, d.name from emp e left join dept d on e.dept_id = d.id where e.age > 40 ;

(5) Query the salary level of all employees

  • Table: emp, salgrade
  • Join condition: emp.salary >= salgrade.losal and emp.salary <= salgrade.hisal
           or: emp.salary between salgrade.losal and salgrade.hisal
-- 方式一
select e.* , s.grade , s.losal, s.hisal 
from 
  emp e , salgrade s 
where 
  e.salary >= s.losal and e.salary <= s.hisal;

-- 方式二
select e.* , s.grade , s.losal, s.hisal 
from 
  emp e , salgrade s 
where 
  e.salary between s.losal and s.hisal;

(6) Query the information and salary levels of all employees in the "R&D Department"

  • Table: emp , salgrade , dept
  • Join condition 1: emp.salary between salgrade.losal and salgrade.hisal
  • Join condition 2: emp.dept_id = dept.id
  • Query conditions: dept.name = 'R&D Department'
select e.* , s.grade 
from 
  emp e , dept d , salgrade s 
where 
  e.dept_id = d.id and 
  ( e.salary between s.losal and s.hisal ) and 
  d.name = '研发部';

(7) Query the average salary of employees in the "R&D Department"

  • Table: emp , dept
  • Join condition: emp.dept_id = dept.id
select avg(e.salary) 
from 
  emp e, dept d 
where 
  e.dept_id = d.id and d.name = '研发部';

(8) Query information about employees whose salary is higher than "Extinction".

-- 查询 "灭绝" 的薪资
select salary from emp where name = '灭绝';

-- 查询比她工资高的员工数据
select * from emp where salary > ( select salary from emp where name = '灭绝' );

(9) Query employee information with higher than average salary

-- 查询员工的平均薪资
select avg(salary) from emp;

-- 查询比平均薪资高的员工信息
select * from emp where salary > ( select avg(salary) from emp );

(10) Query the information of employees whose salary is lower than the average salary of the department

-- 查询指定部门平均薪资
select avg(e1.salary) from emp e1 where e1.dept_id = 1;
select avg(e1.salary) from emp e1 where e1.dept_id = 2;

-- 查询低于本部门平均工资的员工信息
select * 
from 
  emp e2 
where 
  e2.salary < 
  ( select avg(e1.salary) 
  from 
    emp e1 
  where 
    e1.dept_id = e2.dept_id );

(11) Query all department information, and count the number of employees in the department

select 
  d.id, d.name , ( select count(*) from emp e where e.dept_id = d.id ) '人数' 
from 
  dept d;

(12) Query the course selection of all students, showing the student name, student number, and course name

  • 表: student , course , student_course
  • Join condition 1: student.id = student_course.studentid
  • Join condition 2: course.id = student_course.courseid
select s.name , s.no , c.name 
from 
  student s , student_course sc , course c 
where 
  s.id = sc.studentid and sc.courseid = c.id ;

Remarks: There may be many ways to realize the above requirements, and there are also many SQL writing methods. As long as our needs can be met, we can query the records that meet the conditions.

>>> If you have any questions, welcome to discuss in the comment area.

Guess you like

Origin blog.csdn.net/qq_54185421/article/details/131527591
Recommended