where写在on前后的区别
时间: 2024-09-27 20:03:54 浏览: 18
`where`关键字在SQL查询中通常用于过滤结果集,它被放在`ON`条件之后,特别是在连接两个表(JOIN)的时候。这里有两点需要注意:
1. **INNER JOIN** 和 `WHERE`: 当你在`FROM`部分指定了一个`JOIN`操作,比如`INNER JOIN`,并且想基于某个特定的条件限制返回的数据,这时可以在`ON`后面紧接着使用`WHERE`来进一步筛选行。例如:
```
SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id WHERE table1.status = 'active';
```
这里`WHERE`会根据`table1.status`是否为'active'来选择哪些行。
2. **独立的`WHERE`**: 如果你只是对单个表进行查询,并想要基于某条件过滤结果,那么`WHERE`就单独出现在`SELECT`语句的最后:
```
SELECT * FROM table1 WHERE column_name = 'some_value';
```
这种情况下的`WHERE`不会涉及到`JOIN`操作。
所以,`where`在`ON`之前与之后的主要区别在于它能否与`JOIN`一起使用,以及它是在限定整个查询的结果还是仅仅在一个表上应用条件。
相关问题
mysql union where
MySQL中的UNION和WHERE用法如下:
1. 使用UNION操作符合并查询结果。UNION操作符用于将多个SELECT语句的结果合并为一个结果集。使用UNION时,前后查询的结果集中的字段需要一致。例如,要查询id小于3或者名字为"英文"的课程,可以使用以下语句:
```
SELECT * FROM course WHERE id < 3
UNION
SELECT * FROM course WHERE name = '英文';
```
或者可以使用OR关键字来实现相同的结果:
```
SELECT * FROM course WHERE id < 3 OR name = '英文';
```
2. 使用UNION ALL操作符合并查询结果。UNION ALL与UNION类似,但不会去除重复的行。如果想要保留重复的行,可以使用UNION ALL操作符。例如,要查询id小于3或者名字为"Java"的课程,可以使用以下语句:
```
SELECT * FROM course WHERE id < 3
UNION ALL
SELECT * FROM course WHERE name = 'Java';
```
3. 使用WHERE子句进行条件查询。WHERE子句用于对查询结果进行筛选,只返回满足指定条件的行。例如,要查询左表t1和右表t2的连接结果,并根据指定条件进行筛选,可以使用以下语句:
```
SELECT * FROM t1 LEFT JOIN t2 ON 连接条件 WHERE 条件查询;
```
在上述语句中,连接条件是指定左表和右表之间的关联条件,条件查询是对连接结果进行进一步的筛选。
以上是MySQL中使用UNION和WHERE的基本用法。根据具体的需求,可以灵活运用这些语法来实现所需的查询操作。
SELECT s.student_num, s.student_name, '计算机学院' AS college_name, c.level, c.class_name FROM student_info s JOIN classes c ON s.class_id = c.id JOIN volunteer_time_table_item t ON s.student_num = t.student_num INNER JOIN student_info s ON c.id = s.college_id INNER JOIN volunteer_time_table_item t ON s.student_num = t.student_num INNER JOIN volunteer_time_table vtt ON vtt.id = t.volunteer_time_table_id WHERE c.college_id = 1 AND s.level = 2021 AND vtt.volunteer_status = 5 AND vtt.deleted = 0 AND t.deleted = 0 AND s.deleted = 0 AND c.deleted = 0 ORDER BY t.volunteer_time_value DESC LIMIT 5;哪里有问题
这个 SQL 查询语句有以下问题:
1. 语法错误:在SELECT语句中,没有为 '计算机学院' 添加引号,应该在前后添加单引号。
2. 重复声明表别名:在JOIN语句中,重复声明了表别名 s 和 t,应该将它们改成不同的别名。
3. 错误的表连接方式:在JOIN语句中,没有为 student_info 表声明别名,应该将其改为 s 或其他合适的别名。此外,使用 INNER JOIN 连接 volunteer_time_table_item 表和 student_info 表时,应该使用 ON 关键字指定连接条件。
4. SELECT语句中重复声明列名:在SELECT语句中,声明了 student_num, student_name, level, class_name 列名,但是其中的 level 和 class_name 列名已经在 JOIN 语句中声明过了,应该删除重复的声明。
5. 语法错误:在 ORDER BY 语句中,应该为 t.volunteer_time_value 添加列名,否则会报 Unknown column 'volunteer_time_value' in 'order clause' 的错误。
修改后的 SQL 查询语句如下:
SELECT s.student_num, s.student_name, '计算机学院' AS college_name, c.level, c.class_name
FROM student_info s
JOIN classes c ON s.class_id = c.id
JOIN volunteer_time_table_item t ON s.student_num = t.student_num
INNER JOIN student_info si ON c.id = si.college_id
INNER JOIN volunteer_time_table_item ti ON si.student_num = ti.student_num
INNER JOIN volunteer_time_table vtt ON vtt.id = ti.volunteer_time_table_id
WHERE c.college_id = 1
AND s.level = 2021
AND vtt.volunteer_status = 5
AND vtt.deleted = 0
AND ti.deleted = 0
AND si.deleted = 0
AND c.deleted = 0
ORDER BY ti.volunteer_time_value DESC LIMIT 5;